diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000000000000000000000000000000000000..76734a399d0192bda3013a2049f354681930010b --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,113 @@ +{ + "permissions": { + "allow": [ + "Bash(.venv/bin/python:*)", + "Bash(python -m scripts.create_sample_data:*)", + "Bash(python:*)", + "Bash(git add:*)", + "Bash(gh repo view:*)", + "Bash(git config:*)", + "Bash(git commit:*)", + "Bash(git push:*)", + "Bash(git pull:*)", + "WebFetch(domain:www.solarwine.ai)", + "WebFetch(domain:cdn.prod.website-files.com)", + "Bash(curl:*)", + "Bash(export IMS_API_TOKEN=\"1a901e45-9028-44ff-bd2c-35e82407fb9b\")", + "Bash(streamlit run:*)", + "Bash(pip install:*)", + "Bash(git checkout:*)", + "Bash(lsof:*)", + "Bash(kill:*)", + "WebSearch", + "Bash(python3:*)", + "WebFetch(domain:doi.org)", + "WebFetch(domain:link.springer.com)", + "WebFetch(domain:localhost)", + "Bash(git status:*)", + "Bash(git merge:*)", + "Bash(git -C /Users/elisafra/Documents/GitHub/Baseline log --oneline --all)", + "Bash(wc:*)", + "Bash(pip show:*)", + "Bash(head:*)", + "Bash(tail:*)", + "Bash(conda run:*)", + "Bash(pkill:*)", + "Bash(git:*)", + "Bash(sed:*)", + "Bash(ls:*)", + "Bash(GOOGLE_API_KEY=\"AIzaSyBpuIjLdpcMpThsNSJoXnHFzn5qEGy3gEI\" conda run:*)", + "Bash(sleep 55 && GOOGLE_API_KEY=\"AIzaSyBpuIjLdpcMpThsNSJoXnHFzn5qEGy3gEI\" conda run -n solarwine python3 -m src.routing_agent 2>&1)", + "Bash(sleep 35 && GOOGLE_API_KEY=\"AIzaSyBpuIjLdpcMpThsNSJoXnHFzn5qEGy3gEI\" conda run -n solarwine python3 -c \"\nfrom google import genai\nclient = genai.Client\\(api_key='AIzaSyBpuIjLdpcMpThsNSJoXnHFzn5qEGy3gEI'\\)\n# Try gemini-2.0-flash-lite\nresponse = client.models.generate_content\\(\n model='gemini-2.0-flash-lite',\n contents='Reply only MODEL_A or MODEL_B. Temp=38C, GHI=950, CWSI=0.72',\n config={'system_instruction': 'Reply only MODEL_A or MODEL_B.'},\n\\)\nprint\\('gemini-2.0-flash-lite response:', response.text\\)\n\" 2>&1)", + "Bash(grep:*)", + "Bash(THINGSBOARD_HOST=\"https://web.seymouragri.com/\" THINGSBOARD_USERNAME=\"eli@solarwine.ai\" THINGSBOARD_PASSWORD=\"Xcs4007255%\" python:*)", + "WebFetch(domain:knowledge-center.solaredge.com)", + "WebFetch(domain:solar.ece.ksu.edu)", + "WebFetch(domain:github.com)", + "WebFetch(domain:solaredge-interface.readthedocs.io)", + "Bash(pip list:*)", + "Bash(conda:*)", + "Bash(cp:*)", + "Bash(npm install:*)", + "Bash(brew list:*)", + "Bash(rm:*)", + "Bash(find:*)", + "Read(//private/tmp/hf-api/**)", + "Bash(sed -i '' 's/slowapi>=0.2.0/slowapi>=0.1.9/' backend/requirements.txt)", + "Bash(npx vercel:*)", + "Bash(node:*)", + "Bash(echo $PATH)", + "Bash(/opt/homebrew/bin/brew list:*)", + "Bash(/opt/homebrew/bin/brew --prefix)", + "Read(//opt/homebrew/bin/**)", + "Bash(/opt/homebrew/bin/brew install:*)", + "Bash(/opt/homebrew/bin/node --version)", + "Bash(/opt/homebrew/bin/npm install:*)", + "Bash(/opt/homebrew/bin/npm --version)", + "Bash(/opt/homebrew/bin/wrangler --version)", + "Bash(wrangler whoami:*)", + "Bash(wrangler pages:*)", + "Bash(VITE_API_URL=https://solarwine-solarwine-api.hf.space /opt/homebrew/bin/npm run build)", + "Bash(VITE_API_URL=https://solarwine-api.hf.space /opt/homebrew/bin/npm run build)", + "Read(//Users/elisafra/Documents/GitHub/Research/**)", + "Read(//Users/elisafra/Documents/GitHub/**)", + "Bash(python -c \"import sys,json;d=json.load\\(sys.stdin\\);print\\(len\\(d\\), ''''rows''''\\)\" echo \"=== Temp/Humidity ===\")", + "Bash(python -c \"import sys,json;d=json.load\\(sys.stdin\\);print\\(len\\(d\\), ''''rows''''\\)\" echo \"=== NDVI ===\")", + "Bash(python -c \"import sys,json;d=json.load\\(sys.stdin\\);print\\(len\\(d\\), ''''rows''''\\)\" echo \"=== VPD ===\")", + "Bash(python -c \":*)", + "Bash(python -c \"import sys,json;d=json.load\\(sys.stdin\\);print\\(len\\(d\\),''''rows''''\\);print\\(d[0] if d else ''''empty''''\\)\")", + "Bash(VITE_API_URL=https://solarwine-api.hf.space VITE_GOOGLE_MAPS_KEY=AIzaSyCrGbjxN613vCo_g0ppRgZZjCE0d5xzojg /opt/homebrew/bin/npm run build)", + "Bash(pdftoppm -v)", + "Bash(/opt/homebrew/bin/pdftoppm -png -r 150 -f 1 -l 1 \"/Users/elisafra/Downloads/SolarWine Dashboard-2026-03-20_11_14_02.pdf\" /tmp/tb_dash_1)", + "Read(//private/tmp/**)", + "Bash(npx tsc:*)", + "Bash(PYTHONPATH=. python -c \"from backend.api.events import event_bus; print\\(''EventBus OK:'', event_bus.versions\\)\")", + "Bash(PYTHONPATH=. python -c \"from backend.api.routes.events import router; print\\(''SSE route OK:'', [r.path for r in router.routes]\\)\")", + "Bash(npm run:*)", + "Read(//Library/Frameworks/Python.framework/Versions/3.12/bin/**)", + "Bash(/Users/elisafra/Documents/GitHub/Baseline/.venv/bin/python --version)", + "Bash(.venv/bin/pip install:*)", + "Bash(.venv/bin/pip show:*)", + "Bash(.venv/bin/huggingface-cli whoami:*)", + "Bash(GIT_LFS_SKIP_SMUDGE=1 git fetch hf 2>&1)", + "Bash(rm -rf solarwine-hf)", + "Bash(GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 https://huggingface.co/spaces/SolarWine/api solarwine-hf)", + "Read(//tmp/**)", + "Bash(cd:*)", + "Bash(.venv/bin/streamlit run:*)", + "Bash(npx vite:*)", + "Bash(awk '{print $9, $5}')", + "Bash(open http://127.0.0.1:8501)", + "Bash(unzip -l \"sw research.zip\")", + "Bash(unzip -o \"sw research.zip\" -d design_handoff/)", + "Bash(npx --prefix /Users/elisafra/Documents/GitHub/Baseline/frontend tsc --noEmit -p /Users/elisafra/Documents/GitHub/Baseline/frontend)", + "Bash(echo \"---tsc exit=$?\")", + "Bash(echo \"---exit=$?\")", + "Bash(open http://localhost:8080/)", + "Bash(./node_modules/.bin/tsc --noEmit -p tsconfig.app.json)", + "Bash(open http://127.0.0.1:8501/)", + "Bash(xargs -r kill -9)", + "Bash(open http://127.0.0.1:8080/)" + ] + } +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000000000000000000000000000000000..19ff7d1d65c3a10438b77d0248e2e7a38c34318c --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,33 @@ +{ + "name": "Python 3", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm", + "customizations": { + "codespaces": { + "openFiles": [ + "README.md", + "app.py" + ] + }, + "vscode": { + "settings": {}, + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance" + ] + } + }, + "updateContentCommand": "[ -f packages.txt ] && sudo apt update && sudo apt upgrade -y && sudo xargs apt install -y +JWT_SECRET= +ADMIN_PASSWORD= +# Optional +SENTRY_DSN= +ALLOWED_ORIGINS=http://localhost:5173,https://solarwine.pages.dev +``` + +## Common Commands + +### Backend + +```bash +# Dev server (auto-reload) +uvicorn backend.api.main:app --reload --port 7860 + +# Production +uvicorn backend.api.main:app --host 0.0.0.0 --port 7860 +``` + +### Frontend + +```bash +cd frontend +npm run dev # Vite dev server → http://localhost:5173 +npm run build # Production build → dist/ +npm run lint # ESLint +npm run test # Vitest +npm run test:watch # Watch mode +``` + +### Legacy Streamlit + +```bash +streamlit run app.py +``` + +### Data & Pipelines + +```bash +# Download IMS weather data +python -m scripts.download_ims_data --from 2024-01-01 --to 2025-12-31 + +# Full Stage 1 → Stage 2 pipeline +python -m scripts.run_pipeline + +# Fine-tune Chronos (long-context forecasting) +python scripts/run_chronos_long_training.py --device cpu --context-days 28 --num-steps 4000 + +# Generate trimmed sample CSV for cloud deploy +python -m scripts.create_sample_data + +# Control system simulation / validation +python -m scripts.run_control_simulation +python -m scripts.verify_control_system + +# Budget audit (compliance report) +python -m src.budget_audit --report # weekly rollup +python -m src.budget_audit --daily 2026-03-29 # single day + +# Load test (requires: pip install locust) +locust -f scripts/load_test.py --host https://solarwine-api.hf.space \ + --users 10 --spawn-rate 2 --run-time 5m --headless +``` + +## Architecture Notes + +### Backend (FastAPI) + +- **`DataHub`** (`src/data/data_providers.py`) — singleton facade over all providers; injected via `backend/api/deps.py` +- **Routes** (`backend/api/routes/`): `health`, `weather`, `sensors`, `energy`, `photosynthesis`, `control`, `chatbot`, `biology`, `login`, `events` (~27 endpoints) +- **Auth**: JWT issued at `/api/auth/login`; guest read-only mode when `JWT_SECRET` unset +- **Middleware**: CORS, rate-limiting (60 req/min via slowapi), request logging, global exception handler → JSON errors +- **Workers** (`backend/workers/`): async background tasks for daily planner and control ticks +- **Services** (`backend/services/`): `DataFlowMonitor` (per-source health), `EmailAlerter` (SMTP alerts on red status) +- **Background loops**: IMS refresh (2h), sensor poll (2min), data flow alert check (5min) — all push SSE events + +### Core Python Modules + +| Module | Purpose | +|---|---| +| `src/models/farquhar_model.py` | Leaf photosynthesis (FvCB mechanistic, Semillon sigmoid 28–32°C transition, vectorized `compute_all()`) | +| `src/data/ims_client.py` | IMS REST API client | +| `src/data/data_providers.py` | DataHub facade (6 services: Weather, VineSensor, PS, Energy, Advisory, Biology) | +| `src/data/thingsboard_client.py` | ThingsBoard REST client (22 devices, 4 trackers, plant asset) | +| `src/forecasting/predictor.py` | Multi-model ML regressor (LR/DT/RF/GBR/XGB) | +| `src/forecasting/ts_predictor.py` | Multi-horizon lag-based time-series | +| `src/forecasting/chronos_forecaster.py` | HuggingFace Chronos wrapper | +| `src/shading/tracker_optimizer.py` | Tilt-angle simulation & stress scheduling | +| `src/shading/solar_geometry.py` | Sun position, shadow projection, canopy PAR | +| `src/shading/tradeoff_engine.py` | InterventionGate (pipeline pattern) + minimum-dose offset search | +| `src/control_loop.py` | Real-time 15-min control orchestration (DI via `__init__()`) | +| `src/budget_audit.py` | Slot-level budget audit log (parquet) + weekly compliance report | +| `src/energy_budget.py` | Hierarchical Year→Month→Week→Day→Slot budget planner | +| `src/command_arbiter.py` | 5-level priority stack + hysteresis filter | +| `src/tracker_dispatcher.py` | Send tilt commands to TB trackers, verify execution | +| `src/advisor/day_ahead_advisor.py` | Gemini-powered daily planning engine | +| `src/day_ahead_planner.py` | DP trajectory optimizer for daily slot plans | +| `src/chatbot/vineyard_chatbot.py` | Gemini chatbot with tool dispatch + guardrails | +| `src/chatbot/guardrails.py` | Query classifier (EN+HE), response validator, confidence estimation, range validation, cross-source consistency | +| `backend/services/data_flow_monitor.py` | Per-source data freshness monitor (green/yellow/red) | +| `backend/services/email_alerter.py` | SMTP email alerts with per-source cooldown | + +### Frontend + +- **Pages**: Home, Agro, Trackers, Power, Monitoring (alarms + system health), Advisor, Control, Photosynthesis, Shading, Docs, Research +- **Custom hooks** (`src/hooks/`): `useWeather`, `useEnergy`, `useSensors`, `useChatbot`, `useControl`, `useAuth`, `useDataFlowStatus`, `useEventStream` +- **API client**: `src/lib/` — typed wrappers around backend endpoints +- **Auth**: JWT stored in `localStorage`; TanStack React Query for server state + +### Data Flow + +``` +IMS API ──→ [Redis/CSV cache] ──→ Backend ──→ API Routes ──→ React Frontend +ThingsBoard sensors ────────────→ DataHub ──→ API Routes +Farquhar + ML models ───────────→ PhotosynthesisService ──→ /photosynthesis/* +TrackerOptimizer + EnergyBudget → ControlSystem ──→ /control/* +DataFlowMonitor ────────────────→ /health/data-sources ──→ DataFlowStatus component + → EmailAlerter ──→ SMTP alerts +Backend events ─────────────────→ SSE /events/stream ──→ auto-invalidate React Query +``` + +## Key Files to Know + +- `config/settings.py` — central config (site coordinates, IMS channel IDs, panel geometry, budget params) +- `backend/api/main.py` — FastAPI app entry point (middleware, router registration) +- `backend/api/routes/` — all API endpoint implementations (~27 endpoints) +- `backend/workers/control_tick.py` — 15-min control loop cron entry point +- `backend/workers/daily_planner.py` — daily plan generation cron entry point +- `src/models/farquhar_model.py` — core mechanistic model +- `src/control_loop.py` — main control loop (sensors → plan → gate → arbiter → dispatch) +- `src/energy_budget.py` — hierarchical energy budget planner +- `src/chatbot/guardrails.py` — anti-hallucination guardrails (query classifier, range validation, cross-source checks) +- `backend/services/data_flow_monitor.py` — data source health monitoring +- `backend/services/email_alerter.py` — SMTP email alerts for data outages +- `backend/api/routes/events.py` — SSE event stream for live frontend updates +- `frontend/src/lib/api.ts` — API client with JWT auth +- `frontend/src/hooks/` — TanStack Query hooks for all API endpoints +- `scripts/load_test.py` — Locust load test (16 weighted endpoints) +- `context/3_todo.md` — current work items and backlog +- `ims_api_documentation.md` — IMS API reference (Hebrew + English) + +## Deployment + +| Platform | Target | Notes | +|---|---|---| +| HuggingFace Spaces | Backend | Docker, port 7860, see `backend/HF_README.md` | +| Cloudflare Pages | Frontend | `VITE_API_URL` env var points to HF backend | +| Streamlit Cloud | Legacy app | `IMS_API_TOKEN` secret, falls back to `sensors_wide_sample.csv` | + +Large files (`Data/Seymour/sensors_wide.csv` ~982 MB, `outputs/`) are gitignored. Cloud deployments use `Data/Seymour/sensors_wide_sample.csv`. diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000000000000000000000000000000000000..3449618de789f15db0dc598bde98b377a4ca7dfa --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,79 @@ +ש# Deploy Streamlit app (free – Streamlit Community Cloud) + +## 1. Prerequisites + +- App code in a **public** GitHub repo (e.g. `solarwine-ai/Baseline`). +- A [Streamlit Community Cloud](https://share.streamlit.io) account (sign in with GitHub). +- `sensors_wide_sample.csv` committed under `Data/Seymour/` (already in the repo). + +## 2. Deploy steps + +1. Go to **https://share.streamlit.io** and sign in with GitHub. +2. Click **"New app"**. +3. Set: + - **Repository:** `solarwine-ai/Baseline` (or your fork). + - **Branch:** `main`. + - **Main file path:** `app.py`. +4. Click **"Advanced settings"** and set: + - **Python version:** 3.11 (or match your local). + - Leave **Requirements file** as `requirements.txt` (repo root). +5. Under **Secrets**, add your IMS API token so the app can fetch IMS data: + + ```toml + IMS_API_TOKEN = "your-ims-api-token-here" + ``` + + Streamlit Cloud injects secrets as environment variables; the app reads `IMS_API_TOKEN` from the environment via `os.environ`. + +6. Click **"Deploy"**. The first build may take a few minutes. + +## 3. How data works on Community Cloud + +- **Sensor data (Stage 1):** + The full `sensors_wide.csv` (982 MB) is gitignored. Instead, a trimmed + `sensors_wide_sample.csv` (~2.7 MB, Stage 1 columns only, growing season May-Sep) + is committed. The app automatically falls back to the sample when the full file + is absent — no code changes needed. + +- **IMS data (Stage 2):** + Click **Download IMS 2024–2025** in the sidebar (requires `IMS_API_TOKEN` in + Secrets), then **Run Stage 2**. IMS data is fetched at runtime; free-tier memory + and CPU limits apply to very large or long-running fetches. + +- **Secrets:** + Never commit `.env` or real tokens. Use only the **Secrets** field in the + Streamlit Cloud app settings. + +## 4. Regenerating the sample CSV locally + +If you update the full sensor data and need to refresh the sample: + +```bash +python -m scripts.create_sample_data +``` + +This reads `sensors_wide.csv`, extracts Stage 1 columns for May-Sep, and writes +`sensors_wide_sample.csv`. Commit the updated sample. + +## 5. Configuration files + +- `.streamlit/config.toml` — sets `headless = true` and light theme for Cloud. +- `requirements.txt` — Python dependencies (already in repo root). +- No `packages.txt` needed (no OS-level dependencies). + +## 6. Chronos-2 long training (local) + +To run LoRA fine-tuning with a large context window until results converge (single run, tuned for 32 GB RAM / 10 CPU cores): + +```bash +cd /path/to/Baseline +PYTHONPATH=. conda run -n solarwine python scripts/run_chronos_long_training.py \ + --device cpu \ + --context-days 28 \ + --num-steps 4000 \ + --batch-size 16 +``` + +- **Output:** Checkpoints in `outputs/chronos_finetuned_long/`; benchmark row `lora / all` appended to `outputs/chronos_benchmark.csv`; sample plot `outputs/chronos_forecast_sample.png`. +- **Convergence:** Chronos does not support resuming LoRA across multiple `fit()` calls; use one large `--num-steps` (e.g. 4000–6000). Training uses built-in validation; adjust `--learning-rate` (default `1e-5`) if needed. +- **Resources:** Script sets `OMP_NUM_THREADS` from CPU count; use `--batch-size 8` on lower memory. diff --git a/Data/2026/manual_observations.csv b/Data/2026/manual_observations.csv new file mode 100644 index 0000000000000000000000000000000000000000..989d75459e38ac0df300af3a529fd003b10a830e --- /dev/null +++ b/Data/2026/manual_observations.csv @@ -0,0 +1 @@ +date,row,position,phenology,observer,spad,brix,ta_g_l,ph,yield_kg,berry_count,berry_weight_g,cluster_count,anthocyanin_mg_g,phenolics_mg_g,sunburn_pct,pruning_weight_kg,lai,notes,photo_url,recorded_at diff --git a/Data/2026/sensor_history.parquet b/Data/2026/sensor_history.parquet new file mode 100644 index 0000000000000000000000000000000000000000..1bac9c2e7805231458d3ffef5e7bd69ab602d015 --- /dev/null +++ b/Data/2026/sensor_history.parquet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5797b2bf7aaab71ac9de1beb9ba6b93f7e3520f9a897768bc62ea67c93bbed7b +size 151423 diff --git a/Data/energy_predictor_model.pkl b/Data/energy_predictor_model.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2601acf59662c39784485b7a7c0633673e7351ca --- /dev/null +++ b/Data/energy_predictor_model.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6631097b6219c92f9adf18dca080f2e386cb969c2002aa52d881a2c3b76b312 +size 2505097 diff --git a/Data/energy_weather_merged.csv b/Data/energy_weather_merged.csv new file mode 100644 index 0000000000000000000000000000000000000000..1b59be46fea66527df347998bdd20e390e751441 --- /dev/null +++ b/Data/energy_weather_merged.csv @@ -0,0 +1,3478 @@ +timestamp_utc,production,airTemperature,tdmax_c,tdmin_c,GSR,airHumidity,rain_mm,windSpeed,tracker_angle_mean,tracker_angle_std,hour,month,day_of_year,hour_sin,hour_cos,doy_sin,doy_cos,sin_elevation,clearness,production_kwh +2025-12-17 00:00:00+00:00,0.0,,,9.4875,0.0,84.125,0.23750000000000002,2.0625,,,0,12,351,0.0,1.0,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 01:00:00+00:00,0.0,,,8.625,0.0,88.875,0.15000000000000002,1.4125,,,1,12,351,0.25881904510252074,0.9659258262890683,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 02:00:00+00:00,0.0,,,8.2875,0.0,89.125,0.025,1.475,,,2,12,351,0.49999999999999994,0.8660254037844387,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 03:00:00+00:00,0.0,,,8.1625,0.0,89.625,0.0,0.8,,,3,12,351,0.7071067811865475,0.7071067811865476,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 04:00:00+00:00,0.0,,,8.225,1.375,85.125,0.0,0.7125,,,4,12,351,0.8660254037844386,0.5000000000000001,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 05:00:00+00:00,1800.0,,,7.875,59.375,87.375,0.0,0.75,,,5,12,351,0.9659258262890683,0.25881904510252074,-0.23867276600594997,0.9711000518829505,0.0002589166336443016,0.0,1.8 +2025-12-17 06:00:00+00:00,7700.0,,,10.05,257.125,71.25,0.0,1.3,,,6,12,351,1.0,6.123233995736766e-17,-0.23867276600594997,0.9711000518829505,0.1902847011646702,1.3512647019241288,7.7 +2025-12-17 07:00:00+00:00,18700.0,,,12.5125,421.125,53.5,0.0,1.3,,,7,12,351,0.9659258262890683,-0.25881904510252063,-0.23867276600594997,0.9711000518829505,0.3534635416887836,1.1914241508132424,18.7 +2025-12-17 08:00:00+00:00,19700.0,,,13.2625,531.625,44.5,0.0,2.55,,,8,12,351,0.8660254037844387,-0.49999999999999983,-0.23867276600594997,0.9711000518829505,0.4786750698900507,1.1106176892022215,19.7 +2025-12-17 09:00:00+00:00,9700.0,,,14.175,582.375,41.25,0.0,1.9249999999999998,,,9,12,351,0.7071067811865476,-0.7071067811865475,-0.23867276600594997,0.9711000518829505,0.5573863270433891,1.0448318728756074,9.7 +2025-12-17 10:00:00+00:00,21800.0,,,14.9,562.25,39.75,0.0,2.45,,,10,12,351,0.49999999999999994,-0.8660254037844387,-0.23867276600594997,0.9711000518829505,0.5842332710503013,0.9623724424136594,21.8 +2025-12-17 11:00:00+00:00,28700.0,,,15.0375,487.5,37.875,0.0,4.15,,,11,12,351,0.258819045102521,-0.9659258262890682,-0.23867276600594997,0.9711000518829505,0.5573863270433891,0.8746177944225947,28.7 +2025-12-17 12:00:00+00:00,28700.0,,,15.025,349.5,41.125,0.0,3.3499999999999996,,,12,12,351,1.2246467991473532e-16,-1.0,-0.23867276600594997,0.9711000518829505,0.4786750698900507,0.7301403853772422,28.7 +2025-12-17 13:00:00+00:00,27200.0,,,14.737499999999999,119.375,41.0,0.0,3.375,,,13,12,351,-0.2588190451025208,-0.9659258262890683,-0.23867276600594997,0.9711000518829505,0.3534635416887836,0.33772931553180363,27.2 +2025-12-17 14:00:00+00:00,5500.0,,,14.0,12.0,50.375,0.0,3.55,,,14,12,351,-0.4999999999999998,-0.8660254037844388,-0.23867276600594997,0.9711000518829505,0.1902847011646702,0.06306339882582225,5.5 +2025-12-17 15:00:00+00:00,0.0,,,12.425,0.0,58.875,0.0,0.7625000000000001,,,15,12,351,-0.7071067811865471,-0.7071067811865479,-0.23867276600594997,0.9711000518829505,0.0002589166336443016,0.0,0.0 +2025-12-17 16:00:00+00:00,0.0,,,11.6875,0.0,63.125,0.0,0.6625,,,16,12,351,-0.8660254037844384,-0.5000000000000004,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 17:00:00+00:00,0.0,,,10.9875,0.0,66.25,0.0,0.5625,,,17,12,351,-0.9659258262890683,-0.25881904510252063,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 18:00:00+00:00,0.0,,,10.9875,0.0,65.75,0.0,0.48750000000000004,,,18,12,351,-1.0,-1.8369701987210297e-16,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 19:00:00+00:00,0.0,,,10.625,0.0,64.0,0.0,0.7375,,,19,12,351,-0.9659258262890684,0.2588190451025203,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 20:00:00+00:00,0.0,,,10.4125,0.0,59.25,0.0,1.5,,,20,12,351,-0.8660254037844386,0.5000000000000001,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 21:00:00+00:00,0.0,,,10.2,0.0,61.625,0.0,1.2875,,,21,12,351,-0.7071067811865477,0.7071067811865474,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 22:00:00+00:00,0.0,,,10.2375,0.0,65.25,0.0,0.95,,,22,12,351,-0.5000000000000004,0.8660254037844384,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-17 23:00:00+00:00,0.0,,,10.45,0.0,66.5,0.0,1.3,,,23,12,351,-0.25881904510252157,0.9659258262890681,-0.23867276600594997,0.9711000518829505,0.0,0.0,0.0 +2025-12-18 00:00:00+00:00,0.0,,,10.7375,0.0,71.625,0.0,0.95,,,0,12,352,0.0,1.0,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 01:00:00+00:00,0.0,,,10.225,0.0,73.0,0.0,1.175,,,1,12,352,0.25881904510252074,0.9659258262890683,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 02:00:00+00:00,0.0,,,10.125,0.0,68.0,0.0,1.1875,,,2,12,352,0.49999999999999994,0.8660254037844387,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 03:00:00+00:00,0.0,,,10.4375,0.0,61.375,0.0,0.9875,,,3,12,352,0.7071067811865475,0.7071067811865476,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 04:00:00+00:00,100.0,,,10.9,1.625,61.875,0.0,0.925,,,4,12,352,0.8660254037844386,0.5000000000000001,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.1 +2025-12-18 05:00:00+00:00,5700.0,,,11.1125,68.0,62.375,0.0,0.6875,,,5,12,352,0.9659258262890683,0.25881904510252074,-0.22192151300416674,0.9750645322571945,3.8750039563467675e-05,0.0,5.7 +2025-12-18 06:00:00+00:00,12800.0,,,13.675,261.5,55.375,0.0,0.3125,,,6,12,352,1.0,6.123233995736766e-17,-0.22192151300416674,0.9750645322571945,0.19003212259207597,1.3760831402243365,12.8 +2025-12-18 07:00:00+00:00,20900.0,,,15.575,416.75,48.75,0.0,0.375,,,7,12,352,0.9659258262890683,-0.25881904510252063,-0.22192151300416674,0.9750645322571945,0.3531831303192563,1.1799827461274357,20.9 +2025-12-18 08:00:00+00:00,25600.0,,,16.200000000000003,511.75,49.375,0.0,0.8125,,,8,12,352,0.8660254037844387,-0.49999999999999983,-0.22192151300416674,0.9750645322571945,0.4783733016642857,1.0697712397819759,25.6 +2025-12-18 09:00:00+00:00,28500.0,,,17.2375,562.75,43.75,0.0,1.5875000000000001,,,9,12,352,0.7071067811865476,-0.7071067811865475,-0.22192151300416674,0.9750645322571945,0.5570711333365405,1.0101941499453513,28.5 +2025-12-18 10:00:00+00:00,7600.0,,,17.325,548.25,48.5,0.0,2.1500000000000004,,,10,12,352,0.49999999999999994,-0.8660254037844387,-0.22192151300416674,0.9750645322571945,0.5839134981618724,0.9389233195085588,7.6 +2025-12-18 11:00:00+00:00,28800.0,,,17.8375,464.75,55.875,0.0,2.45,,,11,12,352,0.258819045102521,-0.9659258262890682,-0.22192151300416674,0.9750645322571945,0.5570711333365405,0.8342740669695283,28.8 +2025-12-18 12:00:00+00:00,28800.0,,,17.7625,274.375,57.875,0.0,2.275,,,12,12,352,1.2246467991473532e-16,-1.0,-0.22192151300416674,0.9750645322571945,0.4783733016642857,0.5735583466833016,28.8 +2025-12-18 13:00:00+00:00,22800.0,,,16.85,87.75,59.0,0.0,1.975,,,13,12,352,-0.2588190451025208,-0.9659258262890683,-0.22192151300416674,0.9750645322571945,0.3531831303192563,0.24845467539935806,22.8 +2025-12-18 14:00:00+00:00,3800.0,,,16.45,13.0,57.25,0.0,2.575,,,14,12,352,-0.4999999999999998,-0.8660254037844388,-0.22192151300416674,0.9750645322571945,0.19003212259207597,0.06840948689451769,3.8 +2025-12-18 15:00:00+00:00,0.0,,,16.125,0.0,56.25,0.0,1.9625,,,15,12,352,-0.7071067811865471,-0.7071067811865479,-0.22192151300416674,0.9750645322571945,3.8750039563467675e-05,0.0,0.0 +2025-12-18 16:00:00+00:00,0.0,,,15.8,0.0,57.625,0.0,2.225,,,16,12,352,-0.8660254037844384,-0.5000000000000004,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 17:00:00+00:00,0.0,,,15.2375,0.0,60.5,0.0,1.6125,,,17,12,352,-0.9659258262890683,-0.25881904510252063,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 18:00:00+00:00,0.0,,,14.25,0.0,68.0,0.0,1.0125,,,18,12,352,-1.0,-1.8369701987210297e-16,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 19:00:00+00:00,0.0,,,13.95,0.0,72.5,0.0,1.225,,,19,12,352,-0.9659258262890684,0.2588190451025203,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 20:00:00+00:00,0.0,,,13.8375,0.0,71.875,0.0,1.6875,,,20,12,352,-0.8660254037844386,0.5000000000000001,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 21:00:00+00:00,0.0,,,13.1875,0.0,73.875,0.0,1.3624999999999998,,,21,12,352,-0.7071067811865477,0.7071067811865474,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 22:00:00+00:00,0.0,,,12.7875,0.0,76.625,0.0,1.0750000000000002,,,22,12,352,-0.5000000000000004,0.8660254037844384,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-18 23:00:00+00:00,0.0,,,12.8375,0.0,76.75,0.0,1.2750000000000001,,,23,12,352,-0.25881904510252157,0.9659258262890681,-0.22192151300416674,0.9750645322571945,0.0,0.0,0.0 +2025-12-19 00:00:00+00:00,0.0,,,13.2,0.0,74.75,0.0,1.65,,,0,12,353,0.0,1.0,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 01:00:00+00:00,0.0,,,12.7375,0.0,77.875,0.0,1.1875,,,1,12,353,0.25881904510252074,0.9659258262890683,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 02:00:00+00:00,0.0,,,12.5875,0.0,80.25,0.0,0.925,,,2,12,353,0.49999999999999994,0.8660254037844387,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 03:00:00+00:00,0.0,,,12.5125,0.0,82.25,0.0,0.975,,,3,12,353,0.7071067811865475,0.7071067811865476,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 04:00:00+00:00,0.0,,,12.375,1.625,83.875,0.0,1.275,,,4,12,353,0.8660254037844386,0.5000000000000001,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 05:00:00+00:00,4100.0,,,12.825,65.375,82.875,0.0,0.875,,,5,12,353,0.9659258262890683,0.25881904510252074,-0.20510449986861926,0.9787400799669153,0.0,0.0,4.1 +2025-12-19 06:00:00+00:00,12200.0,,,15.225,213.875,74.375,0.0,0.5125,,,6,12,353,1.0,6.123233995736766e-17,-0.20510449986861926,0.9787400799669153,0.1898571957050291,1.1265045773260345,12.2 +2025-12-19 07:00:00+00:00,20700.0,,,16.5,396.125,68.75,0.0,0.85,,,7,12,353,0.9659258262890683,-0.25881904510252063,-0.20510449986861926,0.9787400799669153,0.35298891449822434,1.1222023801033352,20.7 +2025-12-19 08:00:00+00:00,24800.0,,,17.137500000000003,436.875,63.875,0.0,0.95,,,8,12,353,0.8660254037844387,-0.49999999999999983,-0.20510449986861926,0.9787400799669153,0.4781642849236377,0.9136504205239178,24.8 +2025-12-19 09:00:00+00:00,21300.0,,,17.0375,272.875,64.75,0.0,1.0,,,9,12,353,0.7071067811865476,-0.7071067811865475,-0.20510449986861926,0.9787400799669153,0.5568528123488575,0.49003074771049027,21.3 +2025-12-19 10:00:00+00:00,27900.0,,,18.275,500.0,64.25,0.0,1.925,,,10,12,353,0.49999999999999994,-0.8660254037844387,-0.20510449986861926,0.9787400799669153,0.5836920036687951,0.8566161551935796,27.9 +2025-12-19 11:00:00+00:00,24000.0,,,18.224999999999998,302.625,63.375,0.0,2.125,,,11,12,353,0.258819045102521,-0.9659258262890682,-0.20510449986861926,0.9787400799669153,0.5568528123488575,0.5434559964301864,24.0 +2025-12-19 12:00:00+00:00,14000.0,,,18.0375,203.375,66.25,0.0,1.7625,,,12,12,353,1.2246467991473532e-16,-1.0,-0.20510449986861926,0.9787400799669153,0.4781642849236377,0.42532453052715713,14.0 +2025-12-19 13:00:00+00:00,7700.0,,,17.325,97.875,71.375,0.0,1.775,,,13,12,353,-0.2588190451025208,-0.9659258262890683,-0.20510449986861926,0.9787400799669153,0.35298891449822434,0.2772749964092494,7.7 +2025-12-19 14:00:00+00:00,1000.0,,,16.65,9.25,72.0,0.0,1.2375,,,14,12,353,-0.4999999999999998,-0.8660254037844388,-0.20510449986861926,0.9787400799669153,0.1898571957050291,0.04872082917716339,1.0 +2025-12-19 15:00:00+00:00,0.0,,,15.075,0.0,75.5,0.0,1.2750000000000001,,,15,12,353,-0.7071067811865471,-0.7071067811865479,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 16:00:00+00:00,0.0,,,15.1375,0.0,75.75,0.0,1.325,,,16,12,353,-0.8660254037844384,-0.5000000000000004,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 17:00:00+00:00,0.0,,,15.325,0.0,75.25,0.0,1.25,,,17,12,353,-0.9659258262890683,-0.25881904510252063,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 18:00:00+00:00,0.0,,,15.25,0.0,77.5,0.0,1.1875,,,18,12,353,-1.0,-1.8369701987210297e-16,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 19:00:00+00:00,0.0,,,15.4125,0.0,78.25,0.0,1.25,,,19,12,353,-0.9659258262890684,0.2588190451025203,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 20:00:00+00:00,0.0,,,15.875,0.0,70.875,0.0,1.5625,,,20,12,353,-0.8660254037844386,0.5000000000000001,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 21:00:00+00:00,0.0,,,16.1,0.0,68.75,0.0,1.75,,,21,12,353,-0.7071067811865477,0.7071067811865474,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 22:00:00+00:00,0.0,,,15.725,0.0,68.625,0.0,1.2,,,22,12,353,-0.5000000000000004,0.8660254037844384,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-19 23:00:00+00:00,0.0,,,15.8625,0.0,67.25,0.0,1.6125,,,23,12,353,-0.25881904510252157,0.9659258262890681,-0.20510449986861926,0.9787400799669153,0.0,0.0,0.0 +2025-12-20 00:00:00+00:00,0.0,,,15.8625,0.0,69.375,0.0,1.2750000000000001,,,0,12,354,0.0,1.0,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 01:00:00+00:00,0.0,,,15.05,0.0,75.875,0.0,0.7375,,,1,12,354,0.25881904510252074,0.9659258262890683,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 02:00:00+00:00,0.0,,,14.7875,0.0,75.375,0.0,0.6875,,,2,12,354,0.49999999999999994,0.8660254037844387,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 03:00:00+00:00,0.0,,,14.9125,0.0,70.875,0.0,1.125,,,3,12,354,0.7071067811865475,0.7071067811865476,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 04:00:00+00:00,0.0,,,14.825,3.0,68.875,0.0,0.8125000000000001,,,4,12,354,0.8660254037844386,0.5000000000000001,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 05:00:00+00:00,3500.0,,,14.425,42.25,72.125,0.0,0.41250000000000003,,,5,12,354,0.9659258262890683,0.25881904510252074,-0.1882267098432439,0.9821256058680006,0.0,0.0,3.5 +2025-12-20 06:00:00+00:00,11200.0,,,15.587499999999999,241.875,69.625,0.0,0.5125,,,6,12,354,1.0,6.123233995736766e-17,-0.1882267098432439,0.9821256058680006,0.18975999119192505,1.2746364419640246,11.2 +2025-12-20 07:00:00+00:00,20800.0,,,16.3,346.125,69.75,0.0,0.95,,,7,12,354,0.9659258262890683,-0.25881904510252063,-0.1882267098432439,0.9821256058680006,0.35288098681048896,0.9808547723935119,20.8 +2025-12-20 08:00:00+00:00,25800.0,,,16.925,281.625,65.375,0.0,1.1,,,8,12,354,0.8660254037844387,-0.49999999999999983,-0.1882267098432439,0.9821256058680006,0.4780481290546109,0.589114323189471,25.8 +2025-12-20 09:00:00+00:00,23600.0,,,17.125,240.25,59.5,0.0,0.975,,,9,12,354,0.7071067811865476,-0.7071067811865475,-0.1882267098432439,0.9821256058680006,0.5567314840288364,0.4315365789292348,23.6 +2025-12-20 10:00:00+00:00,28600.0,,,17.95,304.625,54.25,0.0,0.5,,,10,12,354,0.49999999999999994,-0.8660254037844387,-0.1882267098432439,0.9821256058680006,0.5835689111220643,0.52200347584363,28.6 +2025-12-20 11:00:00+00:00,28700.0,,,18.7375,389.375,51.625,0.0,1.025,,,11,12,354,0.258819045102521,-0.9659258262890682,-0.1882267098432439,0.9821256058680006,0.5567314840288364,0.6993946115320324,28.7 +2025-12-20 12:00:00+00:00,28700.0,,,17.7125,185.125,55.0,0.0,1.0375,,,12,12,354,1.2246467991473532e-16,-1.0,-0.1882267098432439,0.9821256058680006,0.4780481290546109,0.3872518032150939,28.7 +2025-12-20 13:00:00+00:00,25000.0,,,15.2625,60.25,68.875,0.0,0.775,,,13,12,354,-0.2588190451025208,-0.9659258262890683,-0.1882267098432439,0.9821256058680006,0.35288098681048896,0.17073745044914146,25.0 +2025-12-20 14:00:00+00:00,4500.0,,,13.85,15.0,75.625,0.0,1.1625,,,14,12,354,-0.4999999999999998,-0.8660254037844388,-0.1882267098432439,0.9821256058680006,0.18975999119192505,0.07904722120707129,4.5 +2025-12-20 15:00:00+00:00,0.0,,,13.425,0.0,75.5,0.0,0.9875,,,15,12,354,-0.7071067811865471,-0.7071067811865479,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 16:00:00+00:00,0.0,,,13.0875,0.0,76.75,0.0,1.1375,,,16,12,354,-0.8660254037844384,-0.5000000000000004,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 17:00:00+00:00,0.0,,,12.825,0.0,78.875,0.0,1.225,,,17,12,354,-0.9659258262890683,-0.25881904510252063,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 18:00:00+00:00,0.0,,,13.0,0.0,77.875,0.0,1.0375,,,18,12,354,-1.0,-1.8369701987210297e-16,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 19:00:00+00:00,0.0,,,13.775,0.0,71.875,0.0,2.05,,,19,12,354,-0.9659258262890684,0.2588190451025203,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 20:00:00+00:00,0.0,,,13.7125,0.0,69.0,0.0,2.3375,,,20,12,354,-0.8660254037844386,0.5000000000000001,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 21:00:00+00:00,0.0,,,13.7125,0.0,67.25,0.0,2.85,,,21,12,354,-0.7071067811865477,0.7071067811865474,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 22:00:00+00:00,0.0,,,13.5625,0.0,67.25,0.0,2.3375,,,22,12,354,-0.5000000000000004,0.8660254037844384,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-20 23:00:00+00:00,0.0,,,13.2125,0.0,68.875,0.0,2.4875,,,23,12,354,-0.25881904510252157,0.9659258262890681,-0.1882267098432439,0.9821256058680006,0.0,0.0,0.0 +2025-12-21 00:00:00+00:00,0.0,,,13.075,0.0,69.0,0.0,2.7750000000000004,,,0,12,355,0.0,1.0,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 01:00:00+00:00,0.0,,,12.737499999999999,0.0,69.0,0.0,2.4625,,,1,12,355,0.25881904510252074,0.9659258262890683,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 02:00:00+00:00,0.0,,,12.575,0.0,69.0,0.0,2.7625,,,2,12,355,0.49999999999999994,0.8660254037844387,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 03:00:00+00:00,0.0,,,12.4625,0.0,68.625,0.0,2.5125,,,3,12,355,0.7071067811865475,0.7071067811865476,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 04:00:00+00:00,0.0,,,12.45,0.75,67.25,0.0,2.6375,,,4,12,355,0.8660254037844386,0.5000000000000001,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 05:00:00+00:00,4300.0,,,12.5,42.25,66.125,0.0,2.1875,,,5,12,355,0.9659258262890683,0.25881904510252074,-0.1712931441814778,0.9852201067560606,0.0,0.0,4.3 +2025-12-21 06:00:00+00:00,11000.0,,,13.15,152.75,62.875,0.0,3.0875000000000004,,,6,12,355,1.0,6.123233995736766e-17,-0.1712931441814778,0.9852201067560606,0.18974054832562687,0.8050466879533581,11.0 +2025-12-21 07:00:00+00:00,19800.0,,,14.3,341.125,59.125,0.0,3.225,,,7,12,355,0.9659258262890683,-0.25881904510252063,-0.1712931441814778,0.9852201067560606,0.3528593987005275,0.96674483167023,19.8 +2025-12-21 08:00:00+00:00,24300.0,,,15.4,354.0,55.0,0.0,3.125,,,8,12,355,0.8660254037844387,-0.49999999999999983,-0.1712931441814778,0.9852201067560606,0.47802489484129085,0.7405472054285617,24.3 +2025-12-21 09:00:00+00:00,27300.0,,,15.875,322.875,53.0,0.0,3.45,,,9,12,355,0.7071067811865476,-0.7071067811865475,-0.1712931441814778,0.9852201067560606,0.556707215031686,0.5799727240496119,27.3 +2025-12-21 10:00:00+00:00,23400.0,,,16.225,336.625,51.625,0.0,3.2,,,10,12,355,0.49999999999999994,-0.8660254037844387,-0.1712931441814778,0.9852201067560606,0.5835442891794197,0.5768628127153164,23.4 +2025-12-21 11:00:00+00:00,28700.0,,,16.775,340.0,50.625,0.0,3.2125,,,11,12,355,0.258819045102521,-0.9659258262890682,-0.1712931441814778,0.9852201067560606,0.556707215031686,0.610733956413064,28.7 +2025-12-21 12:00:00+00:00,28900.0,,,17.1625,364.5,49.125,0.0,3.4375,,,12,12,355,1.2246467991473532e-16,-1.0,-0.1712931441814778,0.9852201067560606,0.47802489484129085,0.7625125886404258,28.9 +2025-12-21 13:00:00+00:00,25200.0,,,16.575,150.625,50.5,0.0,2.525,,,13,12,355,-0.2588190451025208,-0.9659258262890683,-0.1712931441814778,0.9852201067560606,0.3528593987005275,0.42686974062390143,25.2 +2025-12-21 14:00:00+00:00,4500.0,,,15.4,12.0,53.875,0.0,1.6875,,,14,12,355,-0.4999999999999998,-0.8660254037844388,-0.1712931441814778,0.9852201067560606,0.18974054832562687,0.06324425699142584,4.5 +2025-12-21 15:00:00+00:00,0.0,,,15.225,0.0,54.875,0.0,2.225,,,15,12,355,-0.7071067811865471,-0.7071067811865479,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 16:00:00+00:00,0.0,,,14.7875,0.0,56.125,0.0,2.025,,,16,12,355,-0.8660254037844384,-0.5000000000000004,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 17:00:00+00:00,0.0,,,13.975,0.0,58.5,0.0,1.375,,,17,12,355,-0.9659258262890683,-0.25881904510252063,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 18:00:00+00:00,0.0,,,13.45,0.0,58.25,0.0,0.8,,,18,12,355,-1.0,-1.8369701987210297e-16,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 19:00:00+00:00,0.0,,,13.7375,0.0,54.75,0.0,0.8875,,,19,12,355,-0.9659258262890684,0.2588190451025203,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 20:00:00+00:00,0.0,,,14.025,0.0,52.0,0.0,2.425,,,20,12,355,-0.8660254037844386,0.5000000000000001,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 21:00:00+00:00,0.0,,,14.5125,0.0,48.5,0.0,2.775,,,21,12,355,-0.7071067811865477,0.7071067811865474,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 22:00:00+00:00,0.0,14.175,14.275,14.075,0.0,49.5,0.0,1.9625000000000001,,,22,12,355,-0.5000000000000004,0.8660254037844384,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-21 23:00:00+00:00,0.0,14.0875,14.1875,13.9375,0.0,48.25,0.0,1.9875,,,23,12,355,-0.25881904510252157,0.9659258262890681,-0.1712931441814778,0.9852201067560606,0.0,0.0,0.0 +2025-12-22 00:00:00+00:00,0.0,14.075,14.212499999999999,13.9875,0.0,46.875,0.0,2.1625,,,0,12,356,0.0,1.0,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 01:00:00+00:00,0.0,14.0,14.125,13.8625,0.0,45.625,0.0,2.125,,,1,12,356,0.25881904510252074,0.9659258262890683,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 02:00:00+00:00,0.0,13.9,14.0,13.775,0.0,45.0,0.0,2.1125,,,2,12,356,0.49999999999999994,0.8660254037844387,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 03:00:00+00:00,0.0,13.6125,13.725,13.5125,0.0,45.0,0.0,2.275,,,3,12,356,0.7071067811865475,0.7071067811865476,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 04:00:00+00:00,100.0,13.35,13.525,13.1375,1.625,46.0,0.0,2.2,,,4,12,356,0.8660254037844386,0.5000000000000001,-0.154308820664281,0.9880226656636976,0.0,0.0,0.1 +2025-12-22 05:00:00+00:00,5300.0,13.625,13.75,13.4875,68.375,45.125,0.0,2.5375,,,5,12,356,0.9659258262890683,0.25881904510252074,-0.154308820664281,0.9880226656636976,0.0,0.0,5.3 +2025-12-22 06:00:00+00:00,12500.0,14.625,14.7,14.5125,253.375,43.5,0.0,3.0999999999999996,,,6,12,356,1.0,6.123233995736766e-17,-0.154308820664281,0.9880226656636976,0.1897988749608376,1.334965763375997,12.5 +2025-12-22 07:00:00+00:00,20300.0,14.8875,15.0125,14.775,408.0,45.625,0.0,3.7625,,,7,12,356,0.9659258262890683,-0.25881904510252063,-0.154308820664281,0.9880226656636976,0.3529241604579614,1.1560557358004937,20.3 +2025-12-22 08:00:00+00:00,25300.0,16.0875,16.2875,15.875,513.25,43.875,0.0,3.3,,,8,12,356,0.8660254037844387,-0.49999999999999983,-0.154308820664281,0.9880226656636976,0.47809459444167735,1.0735323217769852,25.3 +2025-12-22 09:00:00+00:00,28400.0,17.25,17.4125,17.0375,548.0,40.625,0.0,2.6750000000000003,,,9,12,356,0.7071067811865476,-0.7071067811865475,-0.154308820664281,0.9880226656636976,0.5567800186899178,0.9842307223765377,28.4 +2025-12-22 10:00:00+00:00,28900.0,18.7375,18.9875,18.4375,542.625,35.75,0.0,2.1375,,,10,12,356,0.49999999999999994,-0.8660254037844387,-0.154308820664281,0.9880226656636976,0.5836181515739769,0.9297603210876474,28.9 +2025-12-22 11:00:00+00:00,28600.0,19.3375,19.5875,19.025,461.875,34.0,0.0,1.675,,,11,12,356,0.258819045102521,-0.9659258262890682,-0.154308820664281,0.9880226656636976,0.5567800186899178,0.8295466512731083,28.6 +2025-12-22 12:00:00+00:00,28600.0,19.0125,19.225,18.8625,302.625,34.375,0.0,1.8625,,,12,12,356,1.2246467991473532e-16,-1.0,-0.154308820664281,0.9880226656636976,0.47809459444167735,0.6329814298641211,28.6 +2025-12-22 13:00:00+00:00,21400.0,18.2,18.3625,18.025,135.375,38.375,0.0,1.7000000000000002,,,13,12,356,-0.2588190451025208,-0.9659258262890683,-0.154308820664281,0.9880226656636976,0.3529241604579614,0.3835809932205682,21.4 +2025-12-22 14:00:00+00:00,4000.0,17.0625,17.2625,16.875,18.75,43.75,0.0,2.025,,,14,12,356,-0.4999999999999998,-0.8660254037844388,-0.154308820664281,0.9880226656636976,0.1897988749608376,0.09878878367360609,4.0 +2025-12-22 15:00:00+00:00,0.0,16.4875,16.6875,16.275,0.0,43.25,0.0,2.0500000000000003,,,15,12,356,-0.7071067811865471,-0.7071067811865479,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 16:00:00+00:00,0.0,16.1,16.275,15.9,0.0,43.25,0.0,1.875,,,16,12,356,-0.8660254037844384,-0.5000000000000004,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 17:00:00+00:00,0.0,16.175,16.2875,16.025,0.0,41.375,0.0,2.225,,,17,12,356,-0.9659258262890683,-0.25881904510252063,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 18:00:00+00:00,0.0,15.9625,16.0875,15.85,0.0,42.0,0.0,2.1625,,,18,12,356,-1.0,-1.8369701987210297e-16,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 19:00:00+00:00,0.0,15.775,15.8875,15.6625,0.0,42.25,0.0,2.05,,,19,12,356,-0.9659258262890684,0.2588190451025203,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 20:00:00+00:00,0.0,15.6625,15.775,15.5375,0.0,42.75,0.0,2.075,,,20,12,356,-0.8660254037844386,0.5000000000000001,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 21:00:00+00:00,0.0,15.0875,15.225,14.925,0.0,44.125,0.0,1.9,,,21,12,356,-0.7071067811865477,0.7071067811865474,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 22:00:00+00:00,0.0,14.6875,14.8875,14.45,0.0,44.375,0.0,1.9125,,,22,12,356,-0.5000000000000004,0.8660254037844384,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-22 23:00:00+00:00,0.0,14.8125,15.05,14.6375,0.0,43.25,0.0,2.4625,,,23,12,356,-0.25881904510252157,0.9659258262890681,-0.154308820664281,0.9880226656636976,0.0,0.0,0.0 +2025-12-23 00:00:00+00:00,0.0,14.975,15.1,14.825,0.0,42.5,0.0,2.4875,,,0,12,357,0.0,1.0,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 01:00:00+00:00,0.0,14.7375,14.8875,14.5625,0.0,42.875,0.0,2.0625,,,1,12,357,0.25881904510252074,0.9659258262890683,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 02:00:00+00:00,0.0,14.5,14.675,14.3625,0.0,43.375,0.0,2.4,,,2,12,357,0.49999999999999994,0.8660254037844387,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 03:00:00+00:00,0.0,13.9875,14.1625,13.8625,0.0,45.125,0.0,1.9375,,,3,12,357,0.7071067811865475,0.7071067811865476,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 04:00:00+00:00,100.0,13.212499999999999,13.375,13.025,0.75,48.875,0.0,2.55,,,4,12,357,0.8660254037844386,0.5000000000000001,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.1 +2025-12-23 05:00:00+00:00,5400.0,12.9125,13.025,12.8375,56.875,51.875,0.0,1.7625000000000002,,,5,12,357,0.9659258262890683,0.25881904510252074,-0.13727877211326517,0.9905324521322227,0.0,0.0,5.4 +2025-12-23 06:00:00+00:00,12500.0,13.7125,13.875,13.525,197.5,50.375,0.0,2.75,,,6,12,357,1.0,6.123233995736766e-17,-0.13727877211326517,0.9905324521322227,0.18993494753357823,1.0398297025621595,12.5 +2025-12-23 07:00:00+00:00,20600.0,14.875,15.0375,14.6625,331.875,47.625,0.0,2.8249999999999997,,,7,12,357,0.9659258262890683,-0.25881904510252063,-0.13727877211326517,0.9905324521322227,0.35307524121465195,0.9399554578176631,20.6 +2025-12-23 08:00:00+00:00,25400.0,15.5125,15.75,15.3,341.75,47.875,0.0,2.425,,,8,12,357,0.8660254037844387,-0.49999999999999983,-0.13727877211326517,0.9905324521322227,0.4782571913829534,0.7145736774219283,25.4 +2025-12-23 09:00:00+00:00,28700.0,16.675,16.9375,16.4625,543.5,47.75,0.0,3.4,,,9,12,357,0.7071067811865476,-0.7071067811865475,-0.13727877211326517,0.9905324521322227,0.5569498550074665,0.9758508690027646,28.7 +2025-12-23 10:00:00+00:00,28800.0,16.2125,16.387500000000003,16.05,196.75,52.25,0.0,1.8375,,,10,12,357,0.49999999999999994,-0.8660254037844387,-0.13727877211326517,0.9905324521322227,0.5837904571079563,0.33702161041597223,28.8 +2025-12-23 11:00:00+00:00,28800.0,15.375,15.7125,15.125,63.5,63.875,0.0625,1.375,,,11,12,357,0.258819045102521,-0.9659258262890682,-0.13727877211326517,0.9905324521322227,0.5569498550074665,0.11401385498008382,28.8 +2025-12-23 12:00:00+00:00,28800.0,14.675,14.875,14.4625,120.0,72.0,0.0,2.4,,,12,12,357,1.2246467991473532e-16,-1.0,-0.13727877211326517,0.9905324521322227,0.4782571913829534,0.25091102060170123,28.8 +2025-12-23 13:00:00+00:00,24900.0,14.9,15.1,14.7,65.375,67.625,0.0,1.9625,,,13,12,357,-0.2588190451025208,-0.9659258262890683,-0.13727877211326517,0.9905324521322227,0.35307524121465195,0.18515883406351705,24.9 +2025-12-23 14:00:00+00:00,4400.0,15.087499999999999,15.1625,14.9625,16.75,63.875,0.0,4.4,,,14,12,357,-0.4999999999999998,-0.8660254037844388,-0.13727877211326517,0.9905324521322227,0.18993494753357823,0.08818808869830973,4.4 +2025-12-23 15:00:00+00:00,0.0,15.125,15.225,15.05,0.0,68.375,0.0,5.0,,,15,12,357,-0.7071067811865471,-0.7071067811865479,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 16:00:00+00:00,0.0,15.3625,15.425,15.2875,0.0,72.5,0.0,4.3125,,,16,12,357,-0.8660254037844384,-0.5000000000000004,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 17:00:00+00:00,0.0,15.3125,15.3625,15.1875,0.0,74.375,0.0,5.95,,,17,12,357,-0.9659258262890683,-0.25881904510252063,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 18:00:00+00:00,0.0,15.4125,15.5125,15.25,0.0,73.75,0.0,6.2875,,,18,12,357,-1.0,-1.8369701987210297e-16,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 19:00:00+00:00,0.0,14.85,15.075000000000001,14.7375,0.0,74.5,0.0,2.9250000000000003,,,19,12,357,-0.9659258262890684,0.2588190451025203,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 20:00:00+00:00,0.0,14.9125,15.125,14.65,0.0,75.375,0.0,2.2875,,,20,12,357,-0.8660254037844386,0.5000000000000001,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 21:00:00+00:00,0.0,14.475000000000001,14.6875,14.3375,0.0,77.75,0.0,1.0625,,,21,12,357,-0.7071067811865477,0.7071067811865474,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 22:00:00+00:00,0.0,13.850000000000001,13.9625,13.725,0.0,78.5,0.0,2.1625,,,22,12,357,-0.5000000000000004,0.8660254037844384,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-23 23:00:00+00:00,0.0,13.575,13.862499999999999,13.2375,0.0,79.25,0.0,1.7375,,,23,12,357,-0.25881904510252157,0.9659258262890681,-0.13727877211326517,0.9905324521322227,0.0,0.0,0.0 +2025-12-24 00:00:00+00:00,0.0,14.0,14.175,13.8125,0.0,77.25,0.0,1.9,,,0,12,358,0.0,1.0,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 01:00:00+00:00,0.0,13.8,13.9,13.7,0.0,74.625,0.0,2.025,,,1,12,358,0.25881904510252074,0.9659258262890683,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 02:00:00+00:00,0.0,12.65,12.8625,12.5,0.0,74.125,0.0,1.6,,,2,12,358,0.49999999999999994,0.8660254037844387,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 03:00:00+00:00,0.0,12.6,12.7125,12.55,0.0,70.875,0.0,1.675,,,3,12,358,0.7071067811865475,0.7071067811865476,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 04:00:00+00:00,0.0,12.4,12.5625,12.275,1.125,73.75,0.0,1.05,,,4,12,358,0.8660254037844386,0.5000000000000001,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 05:00:00+00:00,4800.0,12.0,12.2,11.875,58.375,74.625,0.0,1.1625,,,5,12,358,0.9659258262890683,0.25881904510252074,-0.12020804489935275,0.9927487224577402,0.00014037417793166806,0.0,4.8 +2025-12-24 06:00:00+00:00,12200.0,12.35,12.5125,12.0875,237.5,73.25,0.0,1.7125,,,6,12,358,1.0,6.123233995736766e-17,-0.12020804489935275,0.9927487224577402,0.19014871106275752,1.2490224029002988,12.2 +2025-12-24 07:00:00+00:00,20300.0,13.9625,14.1375,13.775,391.625,66.25,0.0,2.8,,,7,12,358,0.9659258262890683,-0.25881904510252063,-0.12020804489935275,0.9927487224577402,0.353312568953415,1.108437781197749,20.3 +2025-12-24 08:00:00+00:00,25200.0,15.6375,15.924999999999999,15.3375,502.625,61.625,0.0,3.0,,,8,12,358,0.8660254037844387,-0.49999999999999983,-0.12020804489935275,0.9927487224577402,0.47851260057568046,1.050390312387408,25.2 +2025-12-24 09:00:00+00:00,28500.0,16.4375,16.6375,16.2125,555.375,60.75,0.0,3.35,,,9,12,358,0.7071067811865476,-0.7071067811865475,-0.12020804489935275,0.9927487224577402,0.5572166306773313,0.996694946676138,28.5 +2025-12-24 10:00:00+00:00,28800.0,17.625,17.8,17.3625,544.75,58.0,0.0,2.675,,,10,12,358,0.49999999999999994,-0.8660254037844387,-0.12020804489935275,0.9927487224577402,0.5840611096714994,0.9326934989840197,28.8 +2025-12-24 11:00:00+00:00,28800.0,18.35,18.6125,18.1,468.25,56.375,0.0,2.2625,,,11,12,358,0.258819045102521,-0.9659258262890682,-0.12020804489935275,0.9927487224577402,0.5572166306773313,0.8403374454757625,28.8 +2025-12-24 12:00:00+00:00,28700.0,18.425,18.6625,18.2,324.125,56.25,0.0,2.2,,,12,12,358,1.2246467991473532e-16,-1.0,-0.12020804489935275,0.9927487224577402,0.47851260057568046,0.677359383243111,28.7 +2025-12-24 13:00:00+00:00,24800.0,17.675,17.95,17.5,136.0,59.5,0.0,1.8250000000000002,,,13,12,358,-0.2588190451025208,-0.9659258262890683,-0.12020804489935275,0.9927487224577402,0.353312568953415,0.3849282815011653,24.8 +2025-12-24 14:00:00+00:00,4600.0,16.237499999999997,16.425,16.1,13.125,64.25,0.0,1.9,,,14,12,358,-0.4999999999999998,-0.8660254037844388,-0.12020804489935275,0.9927487224577402,0.19014871106275752,0.06902492226554283,4.6 +2025-12-24 15:00:00+00:00,0.0,15.425,15.5625,15.2875,0.0,66.875,0.0,1.7375,,,15,12,358,-0.7071067811865471,-0.7071067811865479,-0.12020804489935275,0.9927487224577402,0.00014037417793166806,0.0,0.0 +2025-12-24 16:00:00+00:00,0.0,14.725,14.875,14.5625,0.0,67.375,0.0,1.6375,,,16,12,358,-0.8660254037844384,-0.5000000000000004,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 17:00:00+00:00,0.0,14.45,14.55,14.275,0.0,66.375,0.0,1.9249999999999998,,,17,12,358,-0.9659258262890683,-0.25881904510252063,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 18:00:00+00:00,0.0,13.9625,14.125,13.8875,0.0,66.75,0.0,1.7125,,,18,12,358,-1.0,-1.8369701987210297e-16,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 19:00:00+00:00,0.0,13.8,13.8375,13.7,0.0,65.625,0.0,2.4375,,,19,12,358,-0.9659258262890684,0.2588190451025203,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 20:00:00+00:00,0.0,13.6875,13.8125,13.5625,0.0,63.25,0.0,2.425,,,20,12,358,-0.8660254037844386,0.5000000000000001,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 21:00:00+00:00,0.0,13.55,13.6625,13.4375,0.0,63.0,0.0,2.625,,,21,12,358,-0.7071067811865477,0.7071067811865474,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 22:00:00+00:00,0.0,13.0125,13.075,12.912500000000001,0.0,64.25,0.0,2.7750000000000004,,,22,12,358,-0.5000000000000004,0.8660254037844384,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-24 23:00:00+00:00,0.0,12.6375,12.7125,12.575,0.0,64.875,0.0,2.825,,,23,12,358,-0.25881904510252157,0.9659258262890681,-0.12020804489935275,0.9927487224577402,0.0,0.0,0.0 +2025-12-25 00:00:00+00:00,0.0,12.662500000000001,12.7125,12.5375,0.0,64.125,0.0,2.7249999999999996,,,0,12,359,0.0,1.0,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 01:00:00+00:00,0.0,12.275,12.35,12.2125,0.0,64.875,0.0,2.3125,,,1,12,359,0.25881904510252074,0.9659258262890683,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 02:00:00+00:00,0.0,12.7,12.7125,12.575,0.0,60.5,0.0,3.275,,,2,12,359,0.49999999999999994,0.8660254037844387,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 03:00:00+00:00,0.0,12.6875,12.75,12.6,0.0,60.0,0.0,3.5875,,,3,12,359,0.7071067811865475,0.7071067811865476,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 04:00:00+00:00,0.0,12.3625,12.4375,12.2625,0.5,61.375,0.0,3.775,,,4,12,359,0.8660254037844386,0.5000000000000001,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 05:00:00+00:00,4700.0,11.7875,11.850000000000001,11.6875,48.5,63.5,0.0,3.2750000000000004,,,5,12,359,0.9659258262890683,0.25881904510252074,-0.10310169744743544,0.9946708199115211,0.0003943686155258863,0.0,4.7 +2025-12-25 06:00:00+00:00,9100.0,12.2625,12.3875,12.15,240.125,62.25,0.0,3.3249999999999997,,,6,12,359,1.0,6.123233995736766e-17,-0.10310169744743544,0.9946708199115211,0.1904400791538755,1.2608952961313311,9.1 +2025-12-25 07:00:00+00:00,20800.0,13.375,13.525,13.1875,392.125,59.75,0.0,3.4875000000000003,,,7,12,359,0.9659258262890683,-0.25881904510252063,-0.10310169744743544,0.9946708199115211,0.3536360305283895,1.1088378053958523,20.8 +2025-12-25 08:00:00+00:00,25800.0,14.5875,14.8625,14.425,498.75,56.625,0.0,3.8249999999999997,,,8,12,359,0.8660254037844387,-0.49999999999999983,-0.10310169744743544,0.9946708199115211,0.47886068834695633,1.0415346511773649,25.8 +2025-12-25 09:00:00+00:00,28600.0,16.0125,16.2125,15.7625,550.5,52.0,0.0,4.3375,,,9,12,359,0.7071067811865476,-0.7071067811865475,-0.10310169744743544,0.9946708199115211,0.557580199122772,0.9873019179412915,28.6 +2025-12-25 10:00:00+00:00,28800.0,17.0125,17.3,16.8125,541.125,49.25,0.0,3.8375,,,10,12,359,0.49999999999999994,-0.8660254037844387,-0.10310169744743544,0.9946708199115211,0.5844299582866075,0.9259022271658248,28.8 +2025-12-25 11:00:00+00:00,28700.0,17.6,17.8125,17.3875,466.75,47.5,0.0,3.525,,,11,12,359,0.258819045102521,-0.9659258262890682,-0.10310169744743544,0.9946708199115211,0.557580199122772,0.837099310080105,28.7 +2025-12-25 12:00:00+00:00,28700.0,17.775,17.875,17.6375,335.25,46.625,0.0,2.675,,,12,12,359,1.2246467991473532e-16,-1.0,-0.10310169744743544,0.9946708199115211,0.47886068834695633,0.7000992316936573,28.7 +2025-12-25 13:00:00+00:00,24400.0,17.2875,17.4375,17.1125,144.875,49.875,0.0,1.7875,,,13,12,359,-0.2588190451025208,-0.9659258262890683,-0.10310169744743544,0.9946708199115211,0.3536360305283895,0.40967262239521607,24.4 +2025-12-25 14:00:00+00:00,4900.0,15.875,16.0375,15.6875,15.125,57.625,0.0,1.375,,,14,12,359,-0.4999999999999998,-0.8660254037844388,-0.10310169744743544,0.9946708199115211,0.1904400791538755,0.07942130704419108,4.9 +2025-12-25 15:00:00+00:00,0.0,15.1375,15.375,14.9625,0.0,57.375,0.0,1.725,,,15,12,359,-0.7071067811865471,-0.7071067811865479,-0.10310169744743544,0.9946708199115211,0.0003943686155258863,0.0,0.0 +2025-12-25 16:00:00+00:00,0.0,15.0375,15.15,14.875,0.0,56.5,0.0,1.8625,,,16,12,359,-0.8660254037844384,-0.5000000000000004,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 17:00:00+00:00,0.0,14.8375,14.95,14.725,0.0,55.5,0.0,2.075,,,17,12,359,-0.9659258262890683,-0.25881904510252063,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 18:00:00+00:00,0.0,14.700000000000001,14.9125,14.575,0.0,54.375,0.0,1.875,,,18,12,359,-1.0,-1.8369701987210297e-16,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 19:00:00+00:00,0.0,14.425,14.5625,14.275,0.0,54.125,0.0,2.0125,,,19,12,359,-0.9659258262890684,0.2588190451025203,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 20:00:00+00:00,0.0,14.2875,14.4125,14.15,0.0,53.875,0.0,2.0125,,,20,12,359,-0.8660254037844386,0.5000000000000001,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 21:00:00+00:00,0.0,14.137500000000001,14.225,14.0125,0.0,54.5,0.0,2.2875,,,21,12,359,-0.7071067811865477,0.7071067811865474,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 22:00:00+00:00,0.0,13.6,13.85,13.3625,0.0,57.375,0.0,1.8,,,22,12,359,-0.5000000000000004,0.8660254037844384,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-25 23:00:00+00:00,0.0,12.3625,12.65,12.0,0.0,63.25,0.0,1.5625,,,23,12,359,-0.25881904510252157,0.9659258262890681,-0.10310169744743544,0.9946708199115211,0.0,0.0,0.0 +2025-12-26 00:00:00+00:00,0.0,12.412500000000001,12.9,12.05,0.0,62.5,0.0,1.725,,,0,12,360,0.0,1.0,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 01:00:00+00:00,0.0,12.725,12.9375,12.325,0.0,60.625,0.0,1.9,,,1,12,360,0.25881904510252074,0.9659258262890683,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 02:00:00+00:00,0.0,12.925,13.225,12.55,0.0,58.875,0.0,1.7875,,,2,12,360,0.49999999999999994,0.8660254037844387,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 03:00:00+00:00,0.0,13.225,13.5125,12.9125,0.0,57.25,0.0,1.9375,,,3,12,360,0.7071067811865475,0.7071067811865476,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 04:00:00+00:00,0.0,12.5125,12.725,12.2625,1.0,60.875,0.0,1.5250000000000001,,,4,12,360,0.8660254037844386,0.5000000000000001,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 05:00:00+00:00,2400.0,13.025,13.325,12.6625,66.25,59.0,0.0,1.4,,,5,12,360,0.9659258262890683,0.25881904510252074,-0.0859647987374467,0.9962981749346077,0.0007159596986232863,0.0,2.4 +2025-12-26 06:00:00+00:00,10100.0,13.5375,13.8875,13.225,201.25,62.25,0.0,0.3875,,,6,12,360,1.0,6.123233995736766e-17,-0.0859647987374467,0.9962981749346077,0.1908089340049639,1.054720005902682,10.1 +2025-12-26 07:00:00+00:00,20400.0,14.9875,15.5375,14.5,356.5,61.5,0.0,0.6625,,,7,12,360,0.9659258262890683,-0.25881904510252063,-0.0859647987374467,0.9962981749346077,0.3540454716971642,1.0069328052441109,20.4 +2025-12-26 08:00:00+00:00,25700.0,16.0375,16.5125,15.65,456.375,58.5,0.0,0.8625,,,8,12,360,0.8660254037844387,-0.49999999999999983,-0.0859647987374467,0.9962981749346077,0.4793012724926345,0.9521673030964323,25.7 +2025-12-26 09:00:00+00:00,28500.0,17.2125,17.5,16.9,499.0,54.375,0.0,1.125,,,9,12,360,0.7071067811865476,-0.7071067811865475,-0.0859647987374467,0.9962981749346077,0.5580403605621609,0.8942005547722667,28.5 +2025-12-26 10:00:00+00:00,28800.0,18.3125,18.7625,17.825,339.5,60.0,0.0,1.65,,,10,12,360,0.49999999999999994,-0.8660254037844387,-0.0859647987374467,0.9962981749346077,0.584896797176301,0.5804442794677623,28.8 +2025-12-26 11:00:00+00:00,28900.0,17.612499999999997,17.8625,17.4,151.25,66.875,0.0,1.9125,,,11,12,360,0.258819045102521,-0.9659258262890682,-0.0859647987374467,0.9962981749346077,0.5580403605621609,0.2710377433052211,28.9 +2025-12-26 12:00:00+00:00,28700.0,17.237499999999997,17.4375,17.0125,274.75,73.875,0.0,2.5,,,12,12,360,1.2246467991473532e-16,-1.0,-0.0859647987374467,0.9962981749346077,0.4793012724926345,0.5732302745017689,28.7 +2025-12-26 13:00:00+00:00,23200.0,17.725,17.9125,17.5625,151.125,63.875,0.0,2.0,,,13,12,360,-0.2588190451025208,-0.9659258262890683,-0.0859647987374467,0.9962981749346077,0.3540454716971642,0.42685195004913395,23.2 +2025-12-26 14:00:00+00:00,4200.0,16.0375,16.1875,15.925,15.625,72.0,0.0,1.75,,,14,12,360,-0.4999999999999998,-0.8660254037844388,-0.0859647987374467,0.9962981749346077,0.1908089340049639,0.08188819921604674,4.2 +2025-12-26 15:00:00+00:00,0.0,15.25,15.4,15.15,0.0,71.5,0.0,1.8875,,,15,12,360,-0.7071067811865471,-0.7071067811865479,-0.0859647987374467,0.9962981749346077,0.0007159596986232863,0.0,0.0 +2025-12-26 16:00:00+00:00,0.0,15.275,15.3625,15.1625,0.0,71.875,0.0,1.9375,,,16,12,360,-0.8660254037844384,-0.5000000000000004,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 17:00:00+00:00,0.0,15.525,15.5875,15.4375,0.0,73.0,0.0,1.8375000000000001,,,17,12,360,-0.9659258262890683,-0.25881904510252063,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 18:00:00+00:00,0.0,15.2625,15.4125,15.175,0.0,74.125,0.0,1.4375,,,18,12,360,-1.0,-1.8369701987210297e-16,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 19:00:00+00:00,0.0,15.1125,15.2375,14.95,0.0,75.625,0.0,2.475,,,19,12,360,-0.9659258262890684,0.2588190451025203,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 20:00:00+00:00,0.0,15.4625,15.5875,15.375,0.0,73.75,0.0,2.575,,,20,12,360,-0.8660254037844386,0.5000000000000001,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 21:00:00+00:00,0.0,15.375,15.4875,15.2625,0.0,76.0,0.0,2.5875,,,21,12,360,-0.7071067811865477,0.7071067811865474,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 22:00:00+00:00,0.0,13.5125,13.7375,13.2375,0.0,87.75,0.42500000000000004,3.8125,,,22,12,360,-0.5000000000000004,0.8660254037844384,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-26 23:00:00+00:00,0.0,13.8625,13.9875,13.7375,0.0,87.125,0.07500000000000001,3.625,,,23,12,360,-0.25881904510252157,0.9659258262890681,-0.0859647987374467,0.9962981749346077,0.0,0.0,0.0 +2025-12-27 00:00:00+00:00,0.0,13.9375,14.0125,13.8375,0.0,86.0,0.1875,3.3000000000000003,,,0,12,361,0.0,1.0,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 01:00:00+00:00,0.0,13.8875,14.0,13.725,0.0,80.75,0.025,4.15,,,1,12,361,0.25881904510252074,0.9659258262890683,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 02:00:00+00:00,0.0,14.45,14.575,14.350000000000001,0.0,81.25,0.0,3.0,,,2,12,361,0.49999999999999994,0.8660254037844387,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 03:00:00+00:00,0.0,14.35,14.475,14.2,0.0,80.125,0.0,4.05,,,3,12,361,0.7071067811865475,0.7071067811865476,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 04:00:00+00:00,0.0,14.1875,14.350000000000001,14.0,0.625,81.5,0.1,4.1875,,,4,12,361,0.8660254037844386,0.5000000000000001,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 05:00:00+00:00,5000.0,12.6875,12.8875,12.5,5.625,93.75,0.875,1.35,,,5,12,361,0.9659258262890683,0.25881904510252074,-0.06880242680232064,0.9976303053065857,0.0011050519035173678,0.0,5.0 +2025-12-27 06:00:00+00:00,13800.0,13.175,13.35,12.9875,109.25,96.25,0.15,1.3,,,6,12,361,1.0,6.123233995736766e-17,-0.06880242680232064,0.9976303053065857,0.19125512641492104,0.5712265184619736,13.8 +2025-12-27 07:00:00+00:00,22200.0,15.575,15.837499999999999,15.3125,298.5,82.25,0.0,2.925,,,7,12,361,0.9659258262890683,-0.25881904510252063,-0.06880242680232064,0.9976303053065857,0.3545406971648134,0.8419343742115956,22.2 +2025-12-27 08:00:00+00:00,26900.0,16.9,17.075,16.7375,300.75,70.875,0.0,4.3125,,,8,12,361,0.8660254037844387,-0.49999999999999983,-0.06880242680232064,0.9976303053065857,0.4798341223487538,0.6267791013441274,26.9 +2025-12-27 09:00:00+00:00,28400.0,14.6375,14.9875,14.3625,185.375,81.875,0.0625,5.6125,,,9,12,361,0.7071067811865476,-0.7071067811865475,-0.06880242680232064,0.9976303053065857,0.5585968620976317,0.3318582909755052,28.4 +2025-12-27 10:00:00+00:00,24500.0,16.1125,16.25,15.925,227.625,76.125,0.0,4.1,,,10,12,361,0.49999999999999994,-0.8660254037844387,-0.06880242680232064,0.9976303053065857,0.5854613658591428,0.38879593645939176,24.5 +2025-12-27 11:00:00+00:00,21900.0,14.9875,15.225,14.6875,115.25,80.0,0.45,4.7,,,11,12,361,0.258819045102521,-0.9659258262890682,-0.06880242680232064,0.9976303053065857,0.5585968620976317,0.20632052884653793,21.9 +2025-12-27 12:00:00+00:00,10500.0,14.4875,14.762500000000001,14.1375,102.625,84.625,0.15,4.975,,,12,12,361,1.2246467991473532e-16,-1.0,-0.06880242680232064,0.9976303053065857,0.4798341223487538,0.21387599426580575,10.5 +2025-12-27 13:00:00+00:00,5900.0,14.7375,14.875,14.575,60.125,79.75,0.0,4.2375,,,13,12,361,-0.2588190451025208,-0.9659258262890683,-0.06880242680232064,0.9976303053065857,0.3545406971648134,0.16958560887595373,5.9 +2025-12-27 14:00:00+00:00,1400.0,15.4875,15.525,15.4125,18.625,76.75,0.0,4.2125,,,14,12,361,-0.4999999999999998,-0.8660254037844388,-0.06880242680232064,0.9976303053065857,0.19125512641492104,0.09738301058447835,1.4 +2025-12-27 15:00:00+00:00,0.0,15.35,15.425,15.2375,0.0,73.625,0.0,4.175,,,15,12,361,-0.7071067811865471,-0.7071067811865479,-0.06880242680232064,0.9976303053065857,0.0011050519035173678,0.0,0.0 +2025-12-27 16:00:00+00:00,0.0,13.75,14.025,13.45,0.0,82.875,0.2625,4.05,,,16,12,361,-0.8660254037844384,-0.5000000000000004,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 17:00:00+00:00,0.0,14.4625,14.625,14.3,0.0,76.25,0.0125,3.9000000000000004,,,17,12,361,-0.9659258262890683,-0.25881904510252063,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 18:00:00+00:00,0.0,13.15,13.549999999999999,12.85,0.0,81.375,0.45,3.875,,,18,12,361,-1.0,-1.8369701987210297e-16,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 19:00:00+00:00,0.0,13.55,13.7375,13.3875,0.0,84.25,0.0,3.8,,,19,12,361,-0.9659258262890684,0.2588190451025203,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 20:00:00+00:00,0.0,13.95,14.125,13.7875,0.0,73.125,0.0,4.175,,,20,12,361,-0.8660254037844386,0.5000000000000001,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 21:00:00+00:00,0.0,14.475,14.5375,14.425,0.0,64.625,0.0,5.0625,,,21,12,361,-0.7071067811865477,0.7071067811865474,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 22:00:00+00:00,0.0,14.3125,14.65,14.0375,0.0,65.5,0.05,5.75,,,22,12,361,-0.5000000000000004,0.8660254037844384,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-27 23:00:00+00:00,0.0,12.3875,12.625,12.2,0.0,82.25,0.1125,4.4125,,,23,12,361,-0.25881904510252157,0.9659258262890681,-0.06880242680232064,0.9976303053065857,0.0,0.0,0.0 +2025-12-28 00:00:00+00:00,0.0,12.4875,12.6375,12.35,0.0,82.125,0.0125,3.7624999999999997,,,0,12,362,0.0,1.0,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 01:00:00+00:00,0.0,12.3875,12.4875,12.262500000000001,0.0,81.625,0.1875,3.0,,,1,12,362,0.25881904510252074,0.9659258262890683,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 02:00:00+00:00,0.0,11.525,11.637500000000001,11.425,0.0,88.75,0.3375,3.2375,,,2,12,362,0.49999999999999994,0.8660254037844387,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 03:00:00+00:00,0.0,11.175,11.325,11.1,0.0,85.375,0.0,2.4875,,,3,12,362,0.7071067811865475,0.7071067811865476,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 04:00:00+00:00,0.0,10.9375,11.05,10.8875,0.625,82.625,0.0,2.0,,,4,12,362,0.8660254037844386,0.5000000000000001,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 05:00:00+00:00,1200.0,11.3125,11.475,11.1875,40.5,79.0,0.0,2.25,,,5,12,362,0.9659258262890683,0.25881904510252074,-0.05161966722325418,0.9986668162884759,0.0015615295072695934,0.0,1.2 +2025-12-28 06:00:00+00:00,3400.0,11.5875,11.8625,11.35,152.375,82.25,0.05,2.25,,,6,12,362,1.0,6.123233995736766e-17,-0.05161966722325418,0.9986668162884759,0.19177847579445623,0.7945365055633878,3.4 +2025-12-28 07:00:00+00:00,13600.0,12.9,13.0125,12.725,271.5,76.25,0.0,1.6,,,7,12,362,0.9659258262890683,-0.25881904510252063,-0.05161966722325418,0.9986668162884759,0.3551214706400469,0.7645271335204452,13.6 +2025-12-28 08:00:00+00:00,21300.0,12.649999999999999,12.8625,12.4625,111.5,79.5,0.0875,0.9,,,8,12,362,0.8660254037844387,-0.49999999999999983,-0.05161966722325418,0.9986668162884759,0.48045895888237683,0.2320697698287624,21.3 +2025-12-28 09:00:00+00:00,26100.0,12.2875,12.4375,12.0875,177.625,79.5,0.0375,2.1375,,,9,12,362,0.7071067811865476,-0.7071067811865475,-0.05161966722325418,0.9986668162884759,0.559249397827724,0.3176132163752765,26.1 +2025-12-28 10:00:00+00:00,22000.0,13.2625,13.475,13.075,217.75,68.0,0.0,3.1,,,10,12,362,0.49999999999999994,-0.8660254037844387,-0.05161966722325418,0.9986668162884759,0.5861233492693199,0.3715088304730636,22.0 +2025-12-28 11:00:00+00:00,25600.0,14.125,14.4375,13.875,391.0,68.125,0.0,2.6625,,,11,12,362,0.258819045102521,-0.9659258262890682,-0.05161966722325418,0.9986668162884759,0.559249397827724,0.6991514010006087,25.6 +2025-12-28 12:00:00+00:00,21900.0,13.925,14.0,13.8625,176.875,65.5,0.0,2.3375000000000004,,,12,12,362,1.2246467991473532e-16,-1.0,-0.05161966722325418,0.9986668162884759,0.48045895888237683,0.36813758330459506,21.9 +2025-12-28 13:00:00+00:00,18500.0,13.975,14.0625,13.8875,105.5,65.25,0.0,2.5625,,,13,12,362,-0.2588190451025208,-0.9659258262890683,-0.05161966722325418,0.9986668162884759,0.3551214706400469,0.2970814459904493,18.5 +2025-12-28 14:00:00+00:00,4500.0,13.5125,13.5875,13.45,13.125,69.75,0.0,1.8624999999999998,,,14,12,362,-0.4999999999999998,-0.8660254037844388,-0.05161966722325418,0.9986668162884759,0.19177847579445623,0.06843833723064456,4.5 +2025-12-28 15:00:00+00:00,0.0,13.4,13.475,13.3125,0.0,71.625,0.0,2.575,,,15,12,362,-0.7071067811865471,-0.7071067811865479,-0.05161966722325418,0.9986668162884759,0.0015615295072695934,0.0,0.0 +2025-12-28 16:00:00+00:00,0.0,13.712499999999999,13.7625,13.674999999999999,0.0,70.375,0.0,3.1375,,,16,12,362,-0.8660254037844384,-0.5000000000000004,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 17:00:00+00:00,0.0,13.975,14.0625,13.875,0.0,65.5,0.0,2.55,,,17,12,362,-0.9659258262890683,-0.25881904510252063,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 18:00:00+00:00,0.0,14.325000000000001,14.375,14.2375,0.0,59.5,0.0,3.95,,,18,12,362,-1.0,-1.8369701987210297e-16,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 19:00:00+00:00,0.0,14.275,14.35,14.1875,0.0,58.0,0.0,3.2875,,,19,12,362,-0.9659258262890684,0.2588190451025203,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 20:00:00+00:00,0.0,14.5625,14.587499999999999,14.5,0.0,55.625,0.0,3.4625,,,20,12,362,-0.8660254037844386,0.5000000000000001,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 21:00:00+00:00,0.0,14.2125,14.35,14.100000000000001,0.0,62.125,0.0125,3.975,,,21,12,362,-0.7071067811865477,0.7071067811865474,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 22:00:00+00:00,0.0,14.3125,14.4375,14.25,0.0,56.875,0.0,4.6875,,,22,12,362,-0.5000000000000004,0.8660254037844384,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-28 23:00:00+00:00,0.0,14.3,14.375,14.225,0.0,56.25,0.0,5.075,,,23,12,362,-0.25881904510252157,0.9659258262890681,-0.05161966722325418,0.9986668162884759,0.0,0.0,0.0 +2025-12-29 00:00:00+00:00,0.0,13.975,14.2375,13.7125,0.0,63.875,0.15,3.6375,,,0,12,363,0.0,1.0,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 01:00:00+00:00,0.0,13.1875,13.575,12.875,0.0,77.25,0.1,4.625,,,1,12,363,0.25881904510252074,0.9659258262890683,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 02:00:00+00:00,0.0,12.95,13.0375,12.875,0.0,85.625,0.1,3.5875,,,2,12,363,0.49999999999999994,0.8660254037844387,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 03:00:00+00:00,0.0,13.7375,13.9375,13.575,0.375,75.375,0.0,3.575,,,3,12,363,0.7071067811865475,0.7071067811865476,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 04:00:00+00:00,0.0,14.15,14.3375,13.9875,0.875,74.5,0.0,4.525,,,4,12,363,0.8660254037844386,0.5000000000000001,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 05:00:00+00:00,2700.0,14.725,14.8625,14.5875,55.5,78.0,0.0,5.0125,,,5,12,363,0.9659258262890683,0.25881904510252074,-0.034421611622745804,0.9994074007397048,0.0020852565378325916,0.0,2.7 +2025-12-29 06:00:00+00:00,8200.0,14.9125,15.3375,14.7125,103.5,81.75,0.475,5.4625,,,6,12,363,1.0,6.123233995736766e-17,-0.034421611622745804,0.9994074007397048,0.19237877017991653,0.5380011521188367,8.2 +2025-12-29 07:00:00+00:00,18000.0,12.9,13.275,12.575,29.75,92.5,2.325,5.2875,,,7,12,363,0.9659258262890683,-0.25881904510252063,-0.034421611622745804,0.9994074007397048,0.3557875149037407,0.08361732425616156,18.0 +2025-12-29 08:00:00+00:00,19300.0,12.5,12.6625,12.3,98.5,97.625,0.4375,5.2875,,,8,12,363,0.8660254037844387,-0.49999999999999983,-0.034421611622745804,0.9994074007397048,0.48117545480209556,0.20470703361315976,19.3 +2025-12-29 09:00:00+00:00,25600.0,14.475,14.6625,14.2125,220.75,83.125,0.0,4.575,,,9,12,363,0.7071067811865476,-0.7071067811865475,-0.034421611622745804,0.9994074007397048,0.5599976089842763,0.3941981116676486,25.6 +2025-12-29 10:00:00+00:00,24300.0,15.5625,15.675,15.4375,176.625,71.125,0.0,4.5875,,,10,12,363,0.49999999999999994,-0.8660254037844387,-0.034421611622745804,0.9994074007397048,0.5868823779025358,0.30095468300009565,24.3 +2025-12-29 11:00:00+00:00,13800.0,15.5875,15.7125,15.4125,227.0,75.25,0.0,3.1875,,,11,12,363,0.258819045102521,-0.9659258262890682,-0.034421611622745804,0.9994074007397048,0.5599976089842763,0.4053588736061438,13.8 +2025-12-29 12:00:00+00:00,11900.0,15.025,15.1375,14.8875,76.75,75.375,0.0,3.1875,,,12,12,363,1.2246467991473532e-16,-1.0,-0.034421611622745804,0.9994074007397048,0.48117545480209556,0.15950522669857878,11.9 +2025-12-29 13:00:00+00:00,14100.0,15.2375,15.4125,15.1125,87.25,67.375,0.0,3.6625,,,13,12,363,-0.2588190451025208,-0.9659258262890683,-0.034421611622745804,0.9994074007397048,0.3557875149037407,0.24523064004538137,14.1 +2025-12-29 14:00:00+00:00,2700.0,14.8375,14.9125,14.7625,17.375,68.375,0.0,2.75,,,14,12,363,-0.4999999999999998,-0.8660254037844388,-0.034421611622745804,0.9994074007397048,0.19237877017991653,0.09031661853202694,2.7 +2025-12-29 15:00:00+00:00,0.0,14.2875,14.4,14.2125,0.0,75.125,0.0,2.5374999999999996,,,15,12,363,-0.7071067811865471,-0.7071067811865479,-0.034421611622745804,0.9994074007397048,0.0020852565378325916,0.0,0.0 +2025-12-29 16:00:00+00:00,0.0,14.1,14.2375,13.95,0.0,73.125,0.025,4.2125,,,16,12,363,-0.8660254037844384,-0.5000000000000004,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 17:00:00+00:00,0.0,14.275,14.3375,14.1875,0.0,61.25,0.0,4.675,,,17,12,363,-0.9659258262890683,-0.25881904510252063,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 18:00:00+00:00,0.0,14.0375,14.1625,13.9625,0.0,61.0,0.0,4.0625,,,18,12,363,-1.0,-1.8369701987210297e-16,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 19:00:00+00:00,0.0,14.25,14.399999999999999,14.1125,0.0,66.625,0.0375,3.7874999999999996,,,19,12,363,-0.9659258262890684,0.2588190451025203,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 20:00:00+00:00,0.0,13.125,13.3375,12.8375,0.0,81.25,0.48749999999999993,4.425,,,20,12,363,-0.8660254037844386,0.5000000000000001,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 21:00:00+00:00,0.0,12.425,12.4625,12.3375,0.0,84.75,0.0125,3.1500000000000004,,,21,12,363,-0.7071067811865477,0.7071067811865474,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 22:00:00+00:00,0.0,12.725,12.775,12.6375,0.625,74.125,0.0,2.4875,,,22,12,363,-0.5000000000000004,0.8660254037844384,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-29 23:00:00+00:00,0.0,12.55,12.6625,12.35,0.0,73.875,0.0,2.2125,,,23,12,363,-0.25881904510252157,0.9659258262890681,-0.034421611622745804,0.9994074007397048,0.0,0.0,0.0 +2025-12-30 00:00:00+00:00,0.0,12.6,12.7,12.5125,0.0,72.5,0.0,2.0,,,0,12,364,0.0,1.0,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 01:00:00+00:00,0.0,12.5625,12.6625,12.475,0.0,73.625,0.0,1.85,,,1,12,364,0.25881904510252074,0.9659258262890683,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 02:00:00+00:00,0.0,12.525,12.6375,12.45,0.0,73.25,0.0,1.875,,,2,12,364,0.49999999999999994,0.8660254037844387,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 03:00:00+00:00,0.0,12.025,12.1625,11.9375,0.0,76.125,0.0,1.725,,,3,12,364,0.7071067811865475,0.7071067811865476,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 04:00:00+00:00,0.0,12.3,12.4,12.2,0.75,76.0,0.0,1.6375,,,4,12,364,0.8660254037844386,0.5000000000000001,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 05:00:00+00:00,5500.0,12.775,12.85,12.7,38.875,75.5,0.0,1.45,,,5,12,364,0.9659258262890683,0.25881904510252074,-0.01721335615583528,0.9998518392091162,0.0026760767163362953,0.0,5.5 +2025-12-30 06:00:00+00:00,12600.0,14.275,14.5875,14.025,182.5,71.0,0.0,1.0750000000000002,,,6,12,364,1.0,6.123233995736766e-17,-0.01721335615583528,0.9998518392091162,0.19305576625031995,0.9453227093117067,12.6 +2025-12-30 07:00:00+00:00,19100.0,15.075,15.225,14.9625,177.625,66.75,0.0,1.65,,,7,12,364,0.9659258262890683,-0.25881904510252063,-0.01721335615583528,0.9998518392091162,0.35653851189015684,0.49819302565194723,19.1 +2025-12-30 08:00:00+00:00,25600.0,15.9875,16.375,15.712499999999999,338.75,62.875,0.0,1.4875,,,8,12,364,0.8660254037844387,-0.49999999999999983,-0.01721335615583528,0.9998518392091162,0.48198323468850335,0.7028252761092981,25.6 +2025-12-30 09:00:00+00:00,27000.0,16.425,16.9,16.0375,483.625,61.25,0.0,2.3000000000000003,,,9,12,364,0.7071067811865476,-0.7071067811865475,-0.01721335615583528,0.9998518392091162,0.5608410840938586,0.8623209206960732,27.0 +2025-12-30 10:00:00+00:00,20000.0,17.112499999999997,17.5375,16.762500000000003,474.875,56.75,0.0,2.3,,,10,12,364,0.49999999999999994,-0.8660254037844387,-0.01721335615583528,0.9998518392091162,0.5877380279880051,0.8079705198345469,20.0 +2025-12-30 11:00:00+00:00,28400.0,16.200000000000003,16.4125,16.025000000000002,192.125,62.0,0.0,1.6875,,,11,12,364,0.258819045102521,-0.9659258262890682,-0.01721335615583528,0.9998518392091162,0.5608410840938586,0.3425658452080291,28.4 +2025-12-30 12:00:00+00:00,28400.0,16.125,16.3375,15.875,178.625,65.0,0.0,1.3,,,12,12,364,1.2246467991473532e-16,-1.0,-0.01721335615583528,0.9998518392091162,0.48198323468850335,0.3706041769594786,28.4 +2025-12-30 13:00:00+00:00,18300.0,15.9625,16.1625,15.825,109.125,59.625,0.0,2.4625,,,13,12,364,-0.2588190451025208,-0.9659258262890683,-0.01721335615583528,0.9998518392091162,0.35653851189015684,0.30606791794099225,18.3 +2025-12-30 14:00:00+00:00,4800.0,14.725,14.95,14.4875,11.625,65.125,0.0,1.4000000000000001,,,14,12,364,-0.4999999999999998,-0.8660254037844388,-0.01721335615583528,0.9998518392091162,0.19305576625031995,0.06021576162054022,4.8 +2025-12-30 15:00:00+00:00,0.0,14.1625,14.375,13.975,0.0,67.875,0.0,1.325,,,15,12,364,-0.7071067811865471,-0.7071067811865479,-0.01721335615583528,0.9998518392091162,0.0026760767163362953,0.0,0.0 +2025-12-30 16:00:00+00:00,0.0,14.275,14.35,14.2125,0.0,72.375,0.0,2.175,,,16,12,364,-0.8660254037844384,-0.5000000000000004,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 17:00:00+00:00,0.0,14.15,14.25,14.125,0.0,68.875,0.0,2.0,,,17,12,364,-0.9659258262890683,-0.25881904510252063,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 18:00:00+00:00,0.0,14.075,14.149999999999999,14.0375,0.0,69.125,0.0,1.85,,,18,12,364,-1.0,-1.8369701987210297e-16,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 19:00:00+00:00,0.0,14.174999999999999,14.2125,14.0875,0.0,67.25,0.0,2.0,,,19,12,364,-0.9659258262890684,0.2588190451025203,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 20:00:00+00:00,0.0,14.15,14.2125,14.075,0.0,64.5,0.0,2.7875,,,20,12,364,-0.8660254037844386,0.5000000000000001,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 21:00:00+00:00,0.0,14.1125,14.175,14.05,0.0,61.875,0.0,2.5625,,,21,12,364,-0.7071067811865477,0.7071067811865474,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 22:00:00+00:00,0.0,13.6875,13.8875,13.4875,0.0,60.375,0.0,2.1125,,,22,12,364,-0.5000000000000004,0.8660254037844384,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-30 23:00:00+00:00,0.0,13.4875,13.5875,13.3625,0.0,58.75,0.0,2.75,,,23,12,364,-0.25881904510252157,0.9659258262890681,-0.01721335615583528,0.9998518392091162,0.0,0.0,0.0 +2025-12-31 00:00:00+00:00,0.0,13.412500000000001,13.475,13.325,0.0,57.5,0.0,1.5625,,,0,12,365,0.0,1.0,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 01:00:00+00:00,0.0,13.475,13.5625,13.4125,0.0,58.125,0.0,2.3625,,,1,12,365,0.25881904510252074,0.9659258262890683,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 02:00:00+00:00,0.0,13.45,13.55,13.3625,0.0,57.625,0.0,2.85,,,2,12,365,0.49999999999999994,0.8660254037844387,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 03:00:00+00:00,0.0,13.4875,13.6125,13.3875,0.0,57.75,0.0,1.625,,,3,12,365,0.7071067811865475,0.7071067811865476,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 04:00:00+00:00,100.0,13.825,14.0,13.6625,0.5,57.25,0.0,1.475,,,4,12,365,0.8660254037844386,0.5000000000000001,6.432490598706546e-16,1.0,0.0,0.0,0.1 +2025-12-31 05:00:00+00:00,4900.0,13.9,14.0125,13.787500000000001,47.5,56.5,0.0,1.6375,,,5,12,365,0.9659258262890683,0.25881904510252074,6.432490598706546e-16,1.0,0.003333813391935281,0.0,4.9 +2025-12-31 06:00:00+00:00,10200.0,14.5875,14.675,14.4875,159.125,58.875,0.0,1.6875,,,6,12,365,1.0,6.123233995736766e-17,6.432490598706546e-16,1.0,0.1938091893479775,0.8210395004248056,10.2 +2025-12-31 07:00:00+00:00,18000.0,15.125,15.225,15.05,181.0,64.0,0.0,1.6,,,7,12,365,0.9659258262890683,-0.25881904510252063,6.432490598706546e-16,1.0,0.3573741027812217,0.5064720655229041,18.0 +2025-12-31 08:00:00+00:00,23700.0,16.0875,16.3125,15.8625,403.625,65.5,0.0,2.125,,,8,12,365,0.8660254037844387,-0.49999999999999983,6.432490598706546e-16,1.0,0.4828818751449925,0.835866949611239,23.7 +2025-12-31 09:00:00+00:00,25100.0,17.0375,17.3625,16.799999999999997,456.0,62.125,0.0,2.175,,,9,12,365,0.7071067811865476,-0.7071067811865475,6.432490598706546e-16,1.0,0.5617793591640992,0.8117065758316686,25.1 +2025-12-31 10:00:00+00:00,25300.0,17.1875,17.3875,17.075,299.5,53.375,0.0,5.3,,,10,12,365,0.49999999999999994,-0.8660254037844387,6.432490598706546e-16,1.0,0.588689821686897,0.5087568851484124,25.3 +2025-12-31 11:00:00+00:00,23100.0,16.8875,17.0,16.775,254.5,53.875,0.0,5.125,,,11,12,365,0.258819045102521,-0.9659258262890682,6.432490598706546e-16,1.0,0.5617793591640992,0.45302483234464835,23.1 +2025-12-31 12:00:00+00:00,23900.0,16.8375,17.0375,16.7,260.25,52.375,0.0,5.175,,,12,12,365,1.2246467991473532e-16,-1.0,6.432490598706546e-16,1.0,0.4828818751449925,0.5389516844504798,23.9 +2025-12-31 13:00:00+00:00,15800.0,16.6375,16.725,16.525,142.5,52.0,0.0,4.1375,,,13,12,365,-0.2588190451025208,-0.9659258262890683,6.432490598706546e-16,1.0,0.3573741027812217,0.3987418195415129,15.8 +2025-12-31 14:00:00+00:00,4600.0,15.9625,16.05,15.875,21.625,56.375,0.0,4.6,,,14,12,365,-0.4999999999999998,-0.8660254037844388,6.432490598706546e-16,1.0,0.1938091893479775,0.11157881663275047,4.6 +2025-12-31 15:00:00+00:00,0.0,15.775,15.8625,15.775,0.0,56.5,0.0,3.7875,,,15,12,365,-0.7071067811865471,-0.7071067811865479,6.432490598706546e-16,1.0,0.003333813391935281,0.0,0.0 +2025-12-31 16:00:00+00:00,0.0,15.9875,16.025,15.8875,0.0,55.375,0.0,3.225,,,16,12,365,-0.8660254037844384,-0.5000000000000004,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 17:00:00+00:00,0.0,16.0625,16.1125,15.9875,0.0,54.25,0.0,3.2,,,17,12,365,-0.9659258262890683,-0.25881904510252063,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 18:00:00+00:00,0.0,16.125,16.15,16.075,0.0,55.125,0.0,3.5875,,,18,12,365,-1.0,-1.8369701987210297e-16,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 19:00:00+00:00,0.0,16.05,16.15,16.0,0.0,57.0,0.0,3.575,,,19,12,365,-0.9659258262890684,0.2588190451025203,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 20:00:00+00:00,0.0,16.3375,16.4375,16.25,0.0,56.5,0.0,3.3375,,,20,12,365,-0.8660254037844386,0.5000000000000001,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 21:00:00+00:00,0.0,16.7,16.8,16.6,0.0,56.625,0.0,3.7375,,,21,12,365,-0.7071067811865477,0.7071067811865474,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 22:00:00+00:00,0.0,16.7625,16.825000000000003,16.675,0.0,54.25,0.0,4.6625,,,22,12,365,-0.5000000000000004,0.8660254037844384,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2025-12-31 23:00:00+00:00,0.0,16.7875,16.85,16.725,0.0,52.625,0.0,5.1,,,23,12,365,-0.25881904510252157,0.9659258262890681,6.432490598706546e-16,1.0,0.0,0.0,0.0 +2026-01-01 00:00:00+00:00,0.0,16.875,17.0,16.7,0.0,54.0,0.0,5.1375,,,0,1,1,0.0,1.0,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 01:00:00+00:00,0.0,14.5375,14.85,14.3875,0.0,82.875,0.325,3.9875000000000003,,,1,1,1,0.25881904510252074,0.9659258262890683,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 02:00:00+00:00,0.0,13.575,13.6875,13.4375,0.125,90.25,0.1875,4.075,,,2,1,1,0.49999999999999994,0.8660254037844387,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 03:00:00+00:00,0.0,13.3,13.45,13.1875,0.0,88.5,0.075,3.9125,,,3,1,1,0.7071067811865475,0.7071067811865476,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 04:00:00+00:00,0.0,14.35,14.525,14.1875,1.25,81.875,0.0,3.55,,,4,1,1,0.8660254037844386,0.5000000000000001,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 05:00:00+00:00,2500.0,14.1875,14.6625,13.725000000000001,18.875,80.0,2.075,2.65,,,5,1,1,0.9659258262890683,0.25881904510252074,0.017213356155834685,0.9998518392091162,0.004058269469669529,0.0,2.5 +2026-01-01 06:00:00+00:00,10200.0,12.5125,12.649999999999999,12.2875,17.625,93.25,0.6,3.1500000000000004,,,6,1,1,1.0,6.123233995736766e-17,0.017213356155834685,0.9998518392091162,0.19463873350313363,0.09055237712855464,10.2 +2026-01-01 07:00:00+00:00,12100.0,12.375,12.475,12.225,46.75,86.5,0.1625,4.625,,,7,1,1,0.9659258262890683,-0.25881904510252063,0.017213356155834685,0.9998518392091162,0.35829388811427343,0.13047947941855392,12.1 +2026-01-01 08:00:00+00:00,25100.0,13.375,13.55,13.2625,163.75,81.75,0.0125,3.4499999999999997,,,8,1,1,0.8660254037844387,-0.49999999999999983,0.017213356155834685,0.9998518392091162,0.48387090496927043,0.33841671056952555,25.1 +2026-01-01 09:00:00+00:00,28400.0,14.525,14.6,14.425,147.5,79.75,0.0,3.175,,,9,1,1,0.7071067811865476,-0.7071067811865475,0.017213356155834685,0.9998518392091162,0.5628119178952891,0.26207689515814825,28.4 +2026-01-01 10:00:00+00:00,26700.0,15.0125,15.0875,14.9,126.75,76.875,0.0,3.5374999999999996,,,10,1,1,0.49999999999999994,-0.8660254037844387,0.017213356155834685,0.9998518392091162,0.5897372273176131,0.2149262317668418,26.7 +2026-01-01 11:00:00+00:00,20600.0,13.5625,13.7375,13.4,93.125,89.0,0.5,3.8625,,,11,1,1,0.258819045102521,-0.9659258262890682,0.017213356155834685,0.9998518392091162,0.5628119178952891,0.16546380245154274,20.6 +2026-01-01 12:00:00+00:00,22800.0,13.35,13.4375,13.25,131.625,88.375,0.0125,3.925,,,12,1,1,1.2246467991473532e-16,-1.0,0.017213356155834685,0.9998518392091162,0.48387090496927043,0.2720250352898553,22.8 +2026-01-01 13:00:00+00:00,14100.0,14.4625,14.575,14.3625,61.875,83.625,0.0,3.15,,,13,1,1,-0.2588190451025208,-0.9659258262890683,0.017213356155834685,0.9998518392091162,0.35829388811427343,0.17269342864220372,14.1 +2026-01-01 14:00:00+00:00,1900.0,13.4625,13.675,13.275,3.875,89.125,0.6625,3.75,,,14,1,1,-0.4999999999999998,-0.8660254037844388,0.017213356155834685,0.9998518392091162,0.19463873350313363,0.01990867865946946,1.9 +2026-01-01 15:00:00+00:00,0.0,12.55,12.6375,12.4625,0.0,93.25,0.4,4.1,,,15,1,1,-0.7071067811865471,-0.7071067811865479,0.017213356155834685,0.9998518392091162,0.004058269469669529,0.0,0.0 +2026-01-01 16:00:00+00:00,0.0,13.0125,13.1,12.875,0.0,91.125,0.0,3.8375,,,16,1,1,-0.8660254037844384,-0.5000000000000004,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 17:00:00+00:00,0.0,13.1875,13.275,13.1375,0.0,92.5,0.9125,3.025,,,17,1,1,-0.9659258262890683,-0.25881904510252063,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 18:00:00+00:00,0.0,13.0125,13.1,12.975,0.0,92.5,0.175,2.725,,,18,1,1,-1.0,-1.8369701987210297e-16,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 19:00:00+00:00,0.0,12.75,12.825,12.6625,0.125,88.875,0.11249999999999999,3.0875,,,19,1,1,-0.9659258262890684,0.2588190451025203,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 20:00:00+00:00,0.0,12.7625,12.825,12.7375,0.5,85.0,0.025,3.1875,,,20,1,1,-0.8660254037844386,0.5000000000000001,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 21:00:00+00:00,0.0,12.8875,12.975,12.850000000000001,0.75,78.25,0.0,3.4875,,,21,1,1,-0.7071067811865477,0.7071067811865474,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 22:00:00+00:00,0.0,12.8625,12.9125,12.762500000000001,0.0,73.875,0.0,3.4375,,,22,1,1,-0.5000000000000004,0.8660254037844384,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-01 23:00:00+00:00,0.0,12.8875,12.95,12.8125,0.0,68.625,0.0,3.4,,,23,1,1,-0.25881904510252157,0.9659258262890681,0.017213356155834685,0.9998518392091162,0.0,0.0,0.0 +2026-01-02 00:00:00+00:00,0.0,12.7375,12.8125,12.7,0.0,65.0,0.0,3.0125,,,0,1,2,0.0,1.0,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 01:00:00+00:00,0.0,12.7625,12.787500000000001,12.6625,0.0,63.25,0.0,2.675,,,1,1,2,0.25881904510252074,0.9659258262890683,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 02:00:00+00:00,0.0,12.5875,12.6375,12.5,0.0,65.625,0.0,2.2875,,,2,1,2,0.49999999999999994,0.8660254037844387,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 03:00:00+00:00,0.0,12.825,12.8875,12.787500000000001,0.0,66.25,0.0,3.05,,,3,1,2,0.7071067811865475,0.7071067811865476,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 04:00:00+00:00,0.0,12.575,12.625,12.475,0.25,64.75,0.0,2.4875,,,4,1,2,0.8660254037844386,0.5000000000000001,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 05:00:00+00:00,500.0,12.625,12.675,12.5375,39.625,62.25,0.0,2.725,,,5,1,2,0.9659258262890683,0.25881904510252074,0.03442161162274574,0.9994074007397048,0.004849227331846256,0.0,0.5 +2026-01-02 06:00:00+00:00,5400.0,13.35,13.524999999999999,13.1625,216.25,55.625,0.0,3.175,,,6,1,2,1.0,6.123233995736766e-17,0.03442161162274574,0.9994074007397048,0.1955440614631092,1.1058888640338336,5.4 +2026-01-02 07:00:00+00:00,5600.0,14.4875,14.7625,14.25,429.125,50.0,0.0,3.1,,,7,1,2,0.9659258262890683,-0.25881904510252063,0.03442161162274574,0.9994074007397048,0.359297427903741,1.1943447591697385,5.6 +2026-01-02 08:00:00+00:00,7000.0,15.049999999999999,15.2625,14.8,531.625,50.875,0.0,4.025,,,8,1,2,0.8660254037844387,-0.49999999999999983,0.03442161162274574,0.9994074007397048,0.48494980534604604,1.0962474757993725,7.0 +2026-01-02 09:00:00+00:00,15500.0,14.487499999999999,14.7625,14.25,334.5,59.0,0.0,4.05,,,9,1,2,0.7071067811865476,-0.7071067811865475,0.03442161162274574,0.9994074007397048,0.5639381919177029,0.5931501089906933,15.5 +2026-01-02 10:00:00+00:00,15600.0,14.425,14.5875,14.2875,186.25,64.875,0.0,2.675,,,10,1,2,0.49999999999999994,-0.8660254037844387,0.03442161162274574,0.9994074007397048,0.5908796596083338,0.3152080071997339,15.6 +2026-01-02 11:00:00+00:00,9400.0,14.6375,14.775,14.3875,238.5,61.625,0.0,2.075,,,11,1,2,0.258819045102521,-0.9659258262890682,0.03442161162274574,0.9994074007397048,0.5639381919177029,0.42291868757632395,9.4 +2026-01-02 12:00:00+00:00,4900.0,15.0125,15.2875,14.7875,203.875,59.0,0.0,2.1374999999999997,,,12,1,2,1.2246467991473532e-16,-1.0,0.03442161162274574,0.9994074007397048,0.48494980534604604,0.42040433412385997,4.9 +2026-01-02 13:00:00+00:00,4300.0,12.9625,13.175,12.8375,146.75,76.875,0.0125,1.9625,,,13,1,2,-0.2588190451025208,-0.9659258262890683,0.03442161162274574,0.9994074007397048,0.359297427903741,0.4084359881343644,4.3 +2026-01-02 14:00:00+00:00,1500.0,12.3625,12.55,12.1875,24.875,78.125,0.0,0.95,,,14,1,2,-0.4999999999999998,-0.8660254037844388,0.03442161162274574,0.9994074007397048,0.1955440614631092,0.1272091814697878,1.5 +2026-01-02 15:00:00+00:00,0.0,11.6125,11.8375,11.3,0.0,81.625,0.0,0.425,,,15,1,2,-0.7071067811865471,-0.7071067811865479,0.03442161162274574,0.9994074007397048,0.004849227331846256,0.0,0.0 +2026-01-02 16:00:00+00:00,0.0,11.1125,11.25,10.9875,0.0,83.625,0.0,0.7749999999999999,,,16,1,2,-0.8660254037844384,-0.5000000000000004,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 17:00:00+00:00,0.0,10.0125,10.15,9.95,0.0,83.75,0.0,0.4625,,,17,1,2,-0.9659258262890683,-0.25881904510252063,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 18:00:00+00:00,0.0,10.1875,10.3625,9.8875,0.0,79.75,0.0,1.5125000000000002,,,18,1,2,-1.0,-1.8369701987210297e-16,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 19:00:00+00:00,0.0,10.4625,10.7,10.275,0.0,80.125,0.0,0.8250000000000001,,,19,1,2,-0.9659258262890684,0.2588190451025203,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 20:00:00+00:00,0.0,9.75,9.8875,9.65,0.0,80.125,0.0,0.9625,,,20,1,2,-0.8660254037844386,0.5000000000000001,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 21:00:00+00:00,0.0,9.7875,9.9125,9.6875,0.0,79.5,0.0,0.8125,,,21,1,2,-0.7071067811865477,0.7071067811865474,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 22:00:00+00:00,0.0,9.075,9.225,8.975,0.0,82.0,0.0,0.9625,,,22,1,2,-0.5000000000000004,0.8660254037844384,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-02 23:00:00+00:00,0.0,9.1375,9.4125,8.925,0.0,80.25,0.0,1.0875,,,23,1,2,-0.25881904510252157,0.9659258262890681,0.03442161162274574,0.9994074007397048,0.0,0.0,0.0 +2026-01-03 00:00:00+00:00,0.0,9.2125,9.475,9.025,0.0,77.875,0.0,1.3625,,,0,1,3,0.0,1.0,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 01:00:00+00:00,0.0,9.4875,9.8,9.2125,0.0,73.75,0.0,1.8125,,,1,1,3,0.25881904510252074,0.9659258262890683,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 02:00:00+00:00,0.0,10.5625,10.8,10.35,0.0,67.625,0.0,1.725,,,2,1,3,0.49999999999999994,0.8660254037844387,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 03:00:00+00:00,0.0,10.275,10.5625,10.0125,0.0,68.5,0.0,1.8,,,3,1,3,0.7071067811865475,0.7071067811865476,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 04:00:00+00:00,100.0,9.15,9.475,8.775,1.0,74.625,0.0,1.55,,,4,1,3,0.8660254037844386,0.5000000000000001,0.051619667223253764,0.998666816288476,0.0,0.0,0.1 +2026-01-03 05:00:00+00:00,4300.0,10.9625,11.05,10.775,57.125,63.75,0.0,2.2375,,,5,1,3,0.9659258262890683,0.25881904510252074,0.051619667223253764,0.998666816288476,0.005706448753502985,0.0,4.3 +2026-01-03 06:00:00+00:00,12200.0,12.3,12.3875,12.075,257.875,60.375,0.0,1.3375,,,6,1,3,1.0,6.123233995736766e-17,0.051619667223253764,0.998666816288476,0.19652480472647693,1.3121753274804686,12.2 +2026-01-03 07:00:00+00:00,21300.0,12.9,13.2125,12.65,391.25,63.375,0.0,1.6375,,,7,1,3,0.9659258262890683,-0.25881904510252063,0.051619667223253764,0.998666816288476,0.3603842417772606,1.0856468031746414,21.3 +2026-01-03 08:00:00+00:00,26500.0,13.6125,13.9,13.3375,537.875,59.875,0.0,2.4,,,8,1,3,0.8660254037844387,-0.49999999999999983,0.051619667223253764,0.998666816288476,0.48611801006136657,1.1064700111236359,26.5 +2026-01-03 09:00:00+00:00,28800.0,13.775,13.95,13.475,589.5,62.125,0.0,2.5625,,,9,1,3,0.7071067811865476,-0.7071067811865475,0.051619667223253764,0.998666816288476,0.5651575610551094,1.0430719512969888,28.8 +2026-01-03 10:00:00+00:00,28800.0,14.75,15.1,14.375,582.625,55.625,0.0,1.6625,,,10,1,3,0.49999999999999994,-0.8660254037844387,0.051619667223253764,0.998666816288476,0.5921164799772994,0.9839702485942236,28.8 +2026-01-03 11:00:00+00:00,28900.0,15.0625,15.4,14.7625,486.125,52.375,0.0,1.35,,,11,1,3,0.258819045102521,-0.9659258262890682,0.051619667223253764,0.998666816288476,0.5651575610551094,0.8601583584804897,28.9 +2026-01-03 12:00:00+00:00,27400.0,14.925,15.275,14.55,367.75,51.125,0.0,2.2125,,,12,1,3,1.2246467991473532e-16,-1.0,0.051619667223253764,0.998666816288476,0.48611801006136657,0.7565035493204129,27.4 +2026-01-03 13:00:00+00:00,22000.0,14.125,14.3625,13.975,177.75,55.25,0.0,1.8375,,,13,1,3,-0.2588190451025208,-0.9659258262890683,0.051619667223253764,0.998666816288476,0.3603842417772606,0.4932235636148051,22.0 +2026-01-03 14:00:00+00:00,6300.0,12.55,12.7375,12.4125,16.625,62.375,0.0,1.7125,,,14,1,3,-0.4999999999999998,-0.8660254037844388,0.051619667223253764,0.998666816288476,0.19652480472647693,0.08459491931890563,6.3 +2026-01-03 15:00:00+00:00,0.0,11.6625,11.825,11.5375,0.0,62.0,0.0,1.775,,,15,1,3,-0.7071067811865471,-0.7071067811865479,0.051619667223253764,0.998666816288476,0.005706448753502985,0.0,0.0 +2026-01-03 16:00:00+00:00,0.0,11.0125,11.1375,10.9375,0.0,63.5,0.0,1.45,,,16,1,3,-0.8660254037844384,-0.5000000000000004,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 17:00:00+00:00,0.0,10.4375,10.5625,10.35,0.0,66.5,0.0,1.575,,,17,1,3,-0.9659258262890683,-0.25881904510252063,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 18:00:00+00:00,0.0,10.125,10.3,9.9375,0.0,66.375,0.0,1.4875,,,18,1,3,-1.0,-1.8369701987210297e-16,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 19:00:00+00:00,0.0,9.55,9.6875,9.35,0.0,69.125,0.0,1.35,,,19,1,3,-0.9659258262890684,0.2588190451025203,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 20:00:00+00:00,0.0,9.85,9.975,9.7,0.0,66.125,0.0,1.8125,,,20,1,3,-0.8660254037844386,0.5000000000000001,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 21:00:00+00:00,0.0,10.25,10.35,10.15,0.0,60.875,0.0,2.45,,,21,1,3,-0.7071067811865477,0.7071067811865474,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 22:00:00+00:00,0.0,10.350000000000001,10.4125,10.225,0.0,58.375,0.0,2.425,,,22,1,3,-0.5000000000000004,0.8660254037844384,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-03 23:00:00+00:00,0.0,10.2,10.2875,10.075,0.0,56.75,0.0,3.3375,,,23,1,3,-0.25881904510252157,0.9659258262890681,0.051619667223253764,0.998666816288476,0.0,0.0,0.0 +2026-01-04 00:00:00+00:00,0.0,9.6625,9.775,9.5875,0.0,58.625,0.0,3.0125,,,0,1,4,0.0,1.0,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 01:00:00+00:00,0.0,9.3375,9.4375,9.225,0.0,58.875,0.0,3.075,,,1,1,4,0.25881904510252074,0.9659258262890683,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 02:00:00+00:00,0.0,9.2,9.2625,9.125,0.0,59.0,0.0,2.8375,,,2,1,4,0.49999999999999994,0.8660254037844387,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 03:00:00+00:00,0.0,9.174999999999999,9.2625,9.1125,0.0,57.5,0.0,2.675,,,3,1,4,0.7071067811865475,0.7071067811865476,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 04:00:00+00:00,0.0,9.3125,9.375,9.1875,0.75,55.0,0.0,3.425,,,4,1,4,0.8660254037844386,0.5000000000000001,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 05:00:00+00:00,4200.0,9.5,9.625,9.4,57.75,54.125,0.0,3.025,,,5,1,4,0.9659258262890683,0.25881904510252074,0.06880242680231986,0.9976303053065857,0.006629674812562741,0.0,4.2 +2026-01-04 06:00:00+00:00,12000.0,10.525,10.625,10.425,269.375,50.625,0.0,5.2875,,,6,1,4,1.0,6.123233995736766e-17,0.06880242680231986,0.9976303053065857,0.19758056358284737,1.3633679098554072,12.0 +2026-01-04 07:00:00+00:00,21300.0,11.4625,11.649999999999999,11.3,434.625,49.5,0.0,4.675,,,7,1,4,0.9659258262890683,-0.25881904510252063,0.06880242680231986,0.9976303053065857,0.3615538091267782,1.2021032251041766,21.3 +2026-01-04 08:00:00+00:00,27100.0,13.175,13.3625,12.9375,552.0,47.875,0.0,5.1,,,8,1,4,0.8660254037844387,-0.49999999999999983,0.06880242680231986,0.9976303053065857,0.48737490573913717,1.1325983211278687,27.1 +2026-01-04 09:00:00+00:00,28800.0,14.3125,14.475,14.125,607.5,45.75,0.0,5.1375,,,9,1,4,0.7071067811865476,-0.7071067811865475,0.06880242680231986,0.9976303053065857,0.5664693536149854,1.0724322439037048,28.8 +2026-01-04 10:00:00+00:00,28200.0,15.1125,15.2375,15.0,600.875,47.125,0.0,5.725,,,10,1,4,0.49999999999999994,-0.8660254037844387,0.06880242680231986,0.9976303053065857,0.593446996841339,1.0125167086499671,28.2 +2026-01-04 11:00:00+00:00,25900.0,15.775,15.8625,15.625,528.375,50.375,0.0,6.4375,,,11,1,4,0.258819045102521,-0.9659258262890682,0.06880242680231986,0.9976303053065857,0.5664693536149854,0.9327512541113087,25.9 +2026-01-04 12:00:00+00:00,16700.0,15.7875,15.950000000000001,15.7,263.625,52.0,0.0,4.7875,,,12,1,4,1.2246467991473532e-16,-1.0,0.06880242680231986,0.9976303053065857,0.48737490573913717,0.5409080297234319,16.7 +2026-01-04 13:00:00+00:00,9800.0,15.4375,15.4875,15.35,134.625,53.875,0.0,3.4625,,,13,1,4,-0.2588190451025208,-0.9659258262890683,0.06880242680231986,0.9976303053065857,0.3615538091267782,0.37235121467851545,9.8 +2026-01-04 14:00:00+00:00,1200.0,14.925,14.987499999999999,14.8375,34.125,53.875,0.0,4.1875,,,14,1,4,-0.4999999999999998,-0.8660254037844388,0.06880242680231986,0.9976303053065857,0.19758056358284737,0.1727143570257662,1.2 +2026-01-04 15:00:00+00:00,0.0,14.5375,14.625,14.4625,0.0,49.75,0.0,4.425,,,15,1,4,-0.7071067811865471,-0.7071067811865479,0.06880242680231986,0.9976303053065857,0.006629674812562741,0.0,0.0 +2026-01-04 16:00:00+00:00,0.0,14.7625,14.825,14.6625,0.0,44.625,0.0,5.275,,,16,1,4,-0.8660254037844384,-0.5000000000000004,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 17:00:00+00:00,0.0,14.3625,14.4125,14.2625,0.0,45.0,0.0,5.25,,,17,1,4,-0.9659258262890683,-0.25881904510252063,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 18:00:00+00:00,0.0,14.225,14.287500000000001,14.1625,0.0,44.75,0.0,5.0375,,,18,1,4,-1.0,-1.8369701987210297e-16,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 19:00:00+00:00,0.0,14.25,14.3125,14.149999999999999,0.0,43.5,0.0,5.6375,,,19,1,4,-0.9659258262890684,0.2588190451025203,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 20:00:00+00:00,0.0,14.0125,14.05,13.925,0.0,44.75,0.0,5.975,,,20,1,4,-0.8660254037844386,0.5000000000000001,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 21:00:00+00:00,0.0,13.9125,13.9625,13.825000000000001,0.0,43.375,0.0,5.9125,,,21,1,4,-0.7071067811865477,0.7071067811865474,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 22:00:00+00:00,0.0,13.8875,13.9875,13.850000000000001,0.0,41.25,0.0,5.8,,,22,1,4,-0.5000000000000004,0.8660254037844384,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-04 23:00:00+00:00,0.0,13.525,13.625,13.4375,0.0,42.625,0.0,5.85,,,23,1,4,-0.25881904510252157,0.9659258262890681,0.06880242680231986,0.9976303053065857,0.0,0.0,0.0 +2026-01-05 00:00:00+00:00,0.0,12.9875,13.05,12.9,0.0,44.75,0.0,5.2875,,,0,1,5,0.0,1.0,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 01:00:00+00:00,0.0,12.5875,12.625,12.5,0.0,45.25,0.0,4.324999999999999,,,1,1,5,0.25881904510252074,0.9659258262890683,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 02:00:00+00:00,0.0,12.2625,12.3125,12.225,0.0,46.375,0.0,3.6625,,,2,1,5,0.49999999999999994,0.8660254037844387,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 03:00:00+00:00,0.0,11.9625,12.0375,11.9125,0.0,47.875,0.0,4.025,,,3,1,5,0.7071067811865475,0.7071067811865476,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 04:00:00+00:00,0.0,11.8375,11.9,11.75,1.0,48.0,0.0,4.0874999999999995,,,4,1,5,0.8660254037844386,0.5000000000000001,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 05:00:00+00:00,4600.0,11.7875,11.8875,11.65,58.25,47.75,0.0,3.7125,,,5,1,5,0.9659258262890683,0.25881904510252074,0.08596479873744647,0.9962981749346078,0.007618625795341061,0.0,4.6 +2026-01-05 06:00:00+00:00,12000.0,12.75,12.825,12.6375,245.75,46.0,0.0,4.0375,,,6,1,5,1.0,6.123233995736766e-17,0.08596479873744647,0.9962981749346078,0.19871090715888629,1.2367212425008054,12.0 +2026-01-05 07:00:00+00:00,20400.0,14.0875,14.2125,13.9375,408.625,43.0,0.0,4.9375,,,7,1,5,0.9659258262890683,-0.25881904510252063,0.08596479873744647,0.9962981749346078,0.3628055692752254,1.1262919718027147,20.4 +2026-01-05 08:00:00+00:00,26100.0,15.325,15.4625,15.1125,525.5,40.125,0.0,4.8875,,,8,1,5,0.8660254037844387,-0.49999999999999983,0.08596479873744647,0.9962981749346078,0.4887198321003812,1.0752581857412005,26.1 +2026-01-05 09:00:00+00:00,28900.0,16.262500000000003,16.4375,16.1125,579.0,40.0,0.0,4.525,,,9,1,5,0.7071067811865476,-0.7071067811865475,0.08596479873744647,0.9962981749346078,0.567872846705977,1.0195944450567895,28.9 +2026-01-05 10:00:00+00:00,28800.0,16.9375,17.112499999999997,16.724999999999998,572.75,40.875,0.0,4.6625,,,10,1,5,0.49999999999999994,-0.8660254037844387,0.08596479873744647,0.9962981749346078,0.5948704659531829,0.9628146508875028,28.8 +2026-01-05 11:00:00+00:00,28800.0,17.6375,17.7375,17.5,508.0,41.0,0.0,5.0375,,,11,1,5,0.258819045102521,-0.9659258262890682,0.08596479873744647,0.9962981749346078,0.567872846705977,0.8945664561120019,28.8 +2026-01-05 12:00:00+00:00,28800.0,17.8125,17.9375,17.7125,373.625,41.375,0.0,5.137499999999999,,,12,1,5,1.2246467991473532e-16,-1.0,0.08596479873744647,0.9962981749346078,0.4887198321003812,0.7644973161704206,28.8 +2026-01-05 13:00:00+00:00,26300.0,17.5,17.5875,17.387500000000003,187.25,44.125,0.0,3.975,,,13,1,5,-0.2588190451025208,-0.9659258262890683,0.08596479873744647,0.9962981749346078,0.3628055692752254,0.516116663738289,26.3 +2026-01-05 14:00:00+00:00,6600.0,16.7875,16.85,16.6625,20.25,46.75,0.0,3.425,,,14,1,5,-0.4999999999999998,-0.8660254037844388,0.08596479873744647,0.9962981749346078,0.19871090715888629,0.10190683686934408,6.6 +2026-01-05 15:00:00+00:00,0.0,16.725,16.775,16.65,0.0,44.75,0.0,3.925,,,15,1,5,-0.7071067811865471,-0.7071067811865479,0.08596479873744647,0.9962981749346078,0.007618625795341061,0.0,0.0 +2026-01-05 16:00:00+00:00,0.0,16.775,16.8375,16.6875,0.0,42.75,0.0,4.475,,,16,1,5,-0.8660254037844384,-0.5000000000000004,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 17:00:00+00:00,0.0,16.35,16.425,16.25,0.0,41.0,0.0,4.2625,,,17,1,5,-0.9659258262890683,-0.25881904510252063,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 18:00:00+00:00,0.0,16.025,16.125,15.9625,0.0,38.625,0.0,4.3,,,18,1,5,-1.0,-1.8369701987210297e-16,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 19:00:00+00:00,0.0,15.75,15.825000000000001,15.7,0.0,37.625,0.0,3.8625,,,19,1,5,-0.9659258262890684,0.2588190451025203,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 20:00:00+00:00,0.0,15.7,15.75,15.65,0.0,35.5,0.0,4.125,,,20,1,5,-0.8660254037844386,0.5000000000000001,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 21:00:00+00:00,0.0,15.375,15.4625,15.325,0.0,36.0,0.0,3.8875,,,21,1,5,-0.7071067811865477,0.7071067811865474,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 22:00:00+00:00,0.0,15.0,15.125,14.9375,0.0,36.0,0.0,2.9875,,,22,1,5,-0.5000000000000004,0.8660254037844384,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-05 23:00:00+00:00,0.0,14.875,14.95,14.8125,0.0,36.625,0.0,2.8375,,,23,1,5,-0.25881904510252157,0.9659258262890681,0.08596479873744647,0.9962981749346078,0.0,0.0,0.0 +2026-01-06 00:00:00+00:00,0.0,14.7625,14.8,14.6625,0.0,37.25,0.0,3.1625,,,0,1,6,0.0,1.0,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 01:00:00+00:00,0.0,14.6,14.65,14.5,0.0,37.0,0.0,3.425,,,1,1,6,0.25881904510252074,0.9659258262890683,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 02:00:00+00:00,0.0,14.225,14.3125,14.175,0.0,37.875,0.0,2.9749999999999996,,,2,1,6,0.49999999999999994,0.8660254037844387,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 03:00:00+00:00,0.0,13.825000000000001,13.8375,13.75,0.0,38.75,0.0,2.8375,,,3,1,6,0.7071067811865475,0.7071067811865476,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 04:00:00+00:00,0.0,13.8875,13.9875,13.8125,0.75,37.0,0.0,2.875,,,4,1,6,0.8660254037844386,0.5000000000000001,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 05:00:00+00:00,4300.0,13.8625,14.0,13.725,52.75,36.5,0.0,2.675,,,5,1,6,0.9659258262890683,0.25881904510252074,0.10310169744743485,0.9946708199115211,0.008673001098112781,0.0,4.3 +2026-01-06 06:00:00+00:00,11700.0,14.575,14.725,14.425,206.0,35.625,0.0,3.05,,,6,1,6,1.0,6.123233995736766e-17,0.10310169744743485,0.9946708199115211,0.199915373471227,1.030436011113716,11.7 +2026-01-06 07:00:00+00:00,19900.0,15.4875,15.6125,15.3625,331.0,34.75,0.0,3.225,,,7,1,6,0.9659258262890683,-0.25881904510252063,0.10310169744743485,0.9946708199115211,0.3641389216593959,0.9089937392345194,19.9 +2026-01-06 08:00:00+00:00,25900.0,16.15,16.45,15.925,508.0,34.25,0.0,3.375,,,8,1,6,0.8660254037844387,-0.49999999999999983,0.10310169744743485,0.9946708199115211,0.49015208224584117,1.0364130203678439,25.9 +2026-01-06 09:00:00+00:00,28700.0,17.3125,17.4625,17.1625,562.125,34.0,0.0,3.0,,,9,1,6,0.7071067811865476,-0.7071067811865475,0.10310169744743485,0.9946708199115211,0.5693672665831907,0.9872801493723866,28.7 +2026-01-06 10:00:00+00:00,28800.0,18.175,18.3125,17.9625,554.75,34.875,0.0,3.125,,,10,1,6,0.49999999999999994,-0.8660254037844387,0.10310169744743485,0.9946708199115211,0.5963860907681359,0.9301860130330852,28.8 +2026-01-06 11:00:00+00:00,28600.0,18.95,19.1625,18.7625,475.75,34.25,0.0,2.5375,,,11,1,6,0.258819045102521,-0.9659258262890682,0.10310169744743485,0.9946708199115211,0.5693672665831907,0.8355766618882151,28.6 +2026-01-06 12:00:00+00:00,28900.0,18.9125,19.1,18.8,338.25,35.625,0.0,2.1125000000000003,,,12,1,6,1.2246467991473532e-16,-1.0,0.10310169744743485,0.9946708199115211,0.49015208224584117,0.6900919372823291,28.9 +2026-01-06 13:00:00+00:00,24500.0,18.5875,18.825,18.325,127.75,39.25,0.0,1.45,,,13,1,6,-0.2588190451025208,-0.9659258262890683,0.10310169744743485,0.9946708199115211,0.3641389216593959,0.35082764407012046,24.5 +2026-01-06 14:00:00+00:00,6100.0,17.375,17.5125,17.2625,26.75,40.125,0.0,1.9625,,,14,1,6,-0.4999999999999998,-0.8660254037844388,0.10310169744743485,0.9946708199115211,0.199915373471227,0.13380661794801896,6.1 +2026-01-06 15:00:00+00:00,0.0,15.4,15.725,15.15,0.0,45.0,0.0,1.7375,,,15,1,6,-0.7071067811865471,-0.7071067811865479,0.10310169744743485,0.9946708199115211,0.008673001098112781,0.0,0.0 +2026-01-06 16:00:00+00:00,0.0,15.9,16.15,15.649999999999999,0.0,42.0,0.0,1.8624999999999998,,,16,1,6,-0.8660254037844384,-0.5000000000000004,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 17:00:00+00:00,0.0,16.0375,16.2,15.9125,0.0,41.5,0.0,1.9,,,17,1,6,-0.9659258262890683,-0.25881904510252063,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 18:00:00+00:00,0.0,14.75,15.0625,14.525,0.0,49.0,0.0,1.3875,,,18,1,6,-1.0,-1.8369701987210297e-16,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 19:00:00+00:00,0.0,14.95,15.15,14.7125,0.0,48.375,0.0,1.85,,,19,1,6,-0.9659258262890684,0.2588190451025203,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 20:00:00+00:00,0.0,15.924999999999999,16.1,15.6875,0.0,40.625,0.0,2.15,,,20,1,6,-0.8660254037844386,0.5000000000000001,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 21:00:00+00:00,0.0,15.3,15.587499999999999,14.9875,0.0,40.625,0.0,1.675,,,21,1,6,-0.7071067811865477,0.7071067811865474,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 22:00:00+00:00,0.0,14.475,14.825,14.2125,0.0,43.375,0.0,1.675,,,22,1,6,-0.5000000000000004,0.8660254037844384,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-06 23:00:00+00:00,0.0,15.0375,15.4125,14.7125,0.0,40.25,0.0,1.7375,,,23,1,6,-0.25881904510252157,0.9659258262890681,0.10310169744743485,0.9946708199115211,0.0,0.0,0.0 +2026-01-07 00:00:00+00:00,0.0,15.575,15.725,15.325,0.0,37.375,0.0,1.8624999999999998,,,0,1,7,0.0,1.0,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 01:00:00+00:00,0.0,15.625,15.85,15.425,0.0,36.75,0.0,2.225,,,1,1,7,0.25881904510252074,0.9659258262890683,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 02:00:00+00:00,0.0,15.8,15.9375,15.6125,0.0,35.125,0.0,2.125,,,2,1,7,0.49999999999999994,0.8660254037844387,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 03:00:00+00:00,0.0,15.3625,15.675,15.0,0.0,36.75,0.0,1.95,,,3,1,7,0.7071067811865475,0.7071067811865476,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 04:00:00+00:00,0.0,14.775,15.025,14.525,1.125,39.25,0.0,1.7,,,4,1,7,0.8660254037844386,0.5000000000000001,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 05:00:00+00:00,5300.0,15.725,15.8375,15.575,59.375,35.625,0.0,2.575,,,5,1,7,0.9659258262890683,0.25881904510252074,0.1202080448993527,0.9927487224577402,0.009792479125490527,0.0,5.3 +2026-01-07 06:00:00+00:00,12100.0,16.6875,16.775000000000002,16.5625,251.125,33.875,0.0,2.5875000000000004,,,6,1,7,1.0,6.123233995736766e-17,0.1202080448993527,0.9927487224577402,0.20119346948697975,1.2481766959948546,12.1 +2026-01-07 07:00:00+00:00,18500.0,17.575,17.725,17.425,412.875,33.5,0.0,2.475,,,7,1,7,0.9659258262890683,-0.25881904510252063,0.1202080448993527,0.9927487224577402,0.36555322602967893,1.1294524862611364,18.5 +2026-01-07 08:00:00+00:00,23900.0,18.2625,18.475,18.125,508.625,34.375,0.0,2.9875,,,8,1,7,0.8660254037844387,-0.49999999999999983,0.1202080448993527,0.9927487224577402,0.4916709029625435,1.0344826121198147,23.9 +2026-01-07 09:00:00+00:00,24600.0,19.1125,19.349999999999998,18.8375,555.0,34.0,0.0,2.7,,,9,1,7,0.7071067811865476,-0.7071067811865475,0.1202080448993527,0.9927487224577402,0.5709517890219142,0.9720610578184877,24.6 +2026-01-07 10:00:00+00:00,25600.0,19.725,19.975,19.5375,564.625,34.375,0.0,2.6625,,,10,1,7,0.49999999999999994,-0.8660254037844387,0.1202080448993527,0.9927487224577402,0.5979930228407042,0.9441999796549583,25.6 +2026-01-07 11:00:00+00:00,25600.0,20.55,20.7375,20.412499999999998,484.125,34.625,0.0,2.2875,,,11,1,7,0.258819045102521,-0.9659258262890682,0.1202080448993527,0.9927487224577402,0.5709517890219142,0.8479262335430187,25.6 +2026-01-07 12:00:00+00:00,28000.0,20.975,21.1625,20.775,352.375,34.0,0.0,1.8125,,,12,1,7,1.2246467991473532e-16,-1.0,0.1202080448993527,0.9927487224577402,0.4916709029625435,0.7166887401242954,28.0 +2026-01-07 13:00:00+00:00,26200.0,20.6625,20.9125,20.3875,181.375,36.375,0.0,1.5625,,,13,1,7,-0.2588190451025208,-0.9659258262890683,0.1202080448993527,0.9927487224577402,0.36555322602967893,0.4961657758295213,26.2 +2026-01-07 14:00:00+00:00,7000.0,19.049999999999997,19.2125,18.8875,28.25,40.125,0.0,1.8499999999999999,,,14,1,7,-0.4999999999999998,-0.8660254037844388,0.1202080448993527,0.9927487224577402,0.20119346948697975,0.1404121121427761,7.0 +2026-01-07 15:00:00+00:00,0.0,18.75,18.925,18.5625,0.0,39.125,0.0,2.1875,,,15,1,7,-0.7071067811865471,-0.7071067811865479,0.1202080448993527,0.9927487224577402,0.009792479125490527,0.0,0.0 +2026-01-07 16:00:00+00:00,0.0,19.1125,19.200000000000003,19.0125,0.0,37.125,0.0,2.0500000000000003,,,16,1,7,-0.8660254037844384,-0.5000000000000004,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 17:00:00+00:00,0.0,18.325000000000003,18.525,18.075,0.0,39.375,0.0,1.675,,,17,1,7,-0.9659258262890683,-0.25881904510252063,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 18:00:00+00:00,0.0,17.925,18.0625,17.7125,0.0,39.5,0.0,1.825,,,18,1,7,-1.0,-1.8369701987210297e-16,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 19:00:00+00:00,0.0,17.9375,18.162499999999998,17.775,0.0,37.75,0.0,1.9875,,,19,1,7,-0.9659258262890684,0.2588190451025203,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 20:00:00+00:00,0.0,16.65,17.112499999999997,16.2875,0.0,40.375,0.0,1.55,,,20,1,7,-0.8660254037844386,0.5000000000000001,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 21:00:00+00:00,0.0,17.3375,17.5,17.125,0.0,37.125,0.0,2.5,,,21,1,7,-0.7071067811865477,0.7071067811865474,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 22:00:00+00:00,0.0,17.425,17.549999999999997,17.325,0.0,37.25,0.0,2.625,,,22,1,7,-0.5000000000000004,0.8660254037844384,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-07 23:00:00+00:00,0.0,17.3125,17.425,17.2,0.0,37.0,0.0,3.0375,,,23,1,7,-0.25881904510252157,0.9659258262890681,0.1202080448993527,0.9927487224577402,0.0,0.0,0.0 +2026-01-08 00:00:00+00:00,0.0,16.987499999999997,17.15,16.8875,0.0,37.0,0.0,3.15,,,0,1,8,0.0,1.0,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 01:00:00+00:00,0.0,16.6125,16.7625,16.474999999999998,0.0,37.75,0.0,2.3875,,,1,1,8,0.25881904510252074,0.9659258262890683,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 02:00:00+00:00,0.0,16.0125,16.2,15.774999999999999,0.0,39.5,0.0,2.0749999999999997,,,2,1,8,0.49999999999999994,0.8660254037844387,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 03:00:00+00:00,0.0,16.2375,16.4125,16.075,0.0,38.0,0.0,2.55,,,3,1,8,0.7071067811865475,0.7071067811865476,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 04:00:00+00:00,0.0,15.9875,16.15,15.8375,1.125,38.875,0.0,3.475,,,4,1,8,0.8660254037844386,0.5000000000000001,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 05:00:00+00:00,4800.0,16.1375,16.3125,15.975,52.875,38.375,0.0,3.225,,,5,1,8,0.9659258262890683,0.25881904510252074,0.13727877211326478,0.9905324521322229,0.010976717186409746,0.0,4.8 +2026-01-08 06:00:00+00:00,11700.0,16.8375,16.975,16.675,230.75,38.0,0.0,3.4875,,,6,1,8,1.0,6.123233995736766e-17,0.13727877211326478,0.9905324521322229,0.20254467119257633,1.1392548549480548,11.7 +2026-01-08 07:00:00+00:00,18800.0,17.3625,17.5125,17.2,349.25,40.125,0.0,2.9125,,,7,1,8,0.9659258262890683,-0.25881904510252063,0.13727877211326478,0.9905324521322229,0.3670478026673426,0.9515109407058,18.8 +2026-01-08 08:00:00+00:00,24100.0,18.6875,18.8875,18.5125,507.125,38.5,0.0,3.425,,,8,1,8,0.8660254037844387,-0.49999999999999983,0.13727877211326478,0.9905324521322229,0.493275495054982,1.0280766125296257,24.1 +2026-01-08 09:00:00+00:00,27600.0,19.7125,19.8875,19.537499999999998,515.625,33.625,0.0,4.6125,,,9,1,8,0.7071067811865476,-0.7071067811865475,0.13727877211326478,0.9905324521322229,0.5726255397204014,0.9004575664783772,27.6 +2026-01-08 10:00:00+00:00,28800.0,20.35,20.4375,20.25,543.625,34.5,0.0,4.7375,,,10,1,8,0.49999999999999994,-0.8660254037844387,0.13727877211326478,0.9905324521322229,0.5996903622518015,0.9065094825915171,28.8 +2026-01-08 11:00:00+00:00,28700.0,20.95,21.0375,20.825,480.375,35.0,0.0,4.4375,,,11,1,8,0.258819045102521,-0.9659258262890682,0.13727877211326478,0.9905324521322229,0.5726255397204014,0.8388990128427645,28.7 +2026-01-08 12:00:00+00:00,28400.0,21.5,21.6625,21.387500000000003,342.0,36.125,0.0,3.3375,,,12,1,8,1.2246467991473532e-16,-1.0,0.13727877211326478,0.9905324521322229,0.493275495054982,0.693324528439994,28.4 +2026-01-08 13:00:00+00:00,19400.0,21.1,21.4625,20.775,173.375,44.375,0.0,0.7375,,,13,1,8,-0.2588190451025208,-0.9659258262890683,0.13727877211326478,0.9905324521322229,0.3670478026673426,0.47234991938401744,19.4 +2026-01-08 14:00:00+00:00,4000.0,18.9125,19.2,18.6125,28.875,53.625,0.0,0.5874999999999999,,,14,1,8,-0.4999999999999998,-0.8660254037844388,0.13727877211326478,0.9905324521322229,0.20254467119257633,0.14256114382069376,4.0 +2026-01-08 15:00:00+00:00,0.0,18.2875,18.8125,17.8375,0.0,53.375,0.0,0.975,,,15,1,8,-0.7071067811865471,-0.7071067811865479,0.13727877211326478,0.9905324521322229,0.010976717186409746,0.0,0.0 +2026-01-08 16:00:00+00:00,0.0,18.7375,19.2875,18.3125,0.0,49.125,0.0,1.2375,,,16,1,8,-0.8660254037844384,-0.5000000000000004,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 17:00:00+00:00,0.0,18.6625,19.175,18.325,0.0,44.375,0.0,1.325,,,17,1,8,-0.9659258262890683,-0.25881904510252063,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 18:00:00+00:00,0.0,17.9375,18.35,17.625,0.0,45.875,0.0,1.15,,,18,1,8,-1.0,-1.8369701987210297e-16,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 19:00:00+00:00,0.0,18.825,19.025,18.5875,0.0,49.625,0.0,1.7625,,,19,1,8,-0.9659258262890684,0.2588190451025203,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 20:00:00+00:00,0.0,18.575000000000003,18.725,18.4125,0.0,54.75,0.0,1.725,,,20,1,8,-0.8660254037844386,0.5000000000000001,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 21:00:00+00:00,0.0,18.0,18.175,17.7625,0.0,58.0,0.0,0.8125,,,21,1,8,-0.7071067811865477,0.7071067811865474,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 22:00:00+00:00,0.0,17.45,17.725,17.2125,0.0,58.125,0.0,0.8125,,,22,1,8,-0.5000000000000004,0.8660254037844384,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-08 23:00:00+00:00,0.0,17.75,17.875,17.612499999999997,0.0,60.375,0.0,0.925,,,23,1,8,-0.25881904510252157,0.9659258262890681,0.13727877211326478,0.9905324521322229,0.0,0.0,0.0 +2026-01-09 00:00:00+00:00,0.0,17.525,17.6,17.424999999999997,0.0,71.125,0.0,1.525,,,0,1,9,0.0,1.0,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 01:00:00+00:00,0.0,17.5,17.5625,17.424999999999997,0.0,74.25,0.0,3.3,,,1,1,9,0.25881904510252074,0.9659258262890683,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 02:00:00+00:00,0.0,16.2125,16.5,15.975,0.0,84.25,0.0,3.8375,,,2,1,9,0.49999999999999994,0.8660254037844387,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 03:00:00+00:00,0.0,14.6,14.8,14.375,0.0,89.625,0.65,4.8,,,3,1,9,0.7071067811865475,0.7071067811865476,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 04:00:00+00:00,0.0,13.5625,13.6625,13.475,0.0,95.0,0.525,4.475,,,4,1,9,0.8660254037844386,0.5000000000000001,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 05:00:00+00:00,200.0,13.55,13.625,13.4625,4.5,94.25,0.1875,2.95,,,5,1,9,0.9659258262890683,0.25881904510252074,0.15430882066428117,0.9880226656636976,0.012225351388555128,0.0,0.2 +2026-01-09 06:00:00+00:00,1700.0,13.9875,14.0875,13.8875,80.75,91.5,0.4625,2.8625000000000003,,,6,1,9,1.0,6.123233995736766e-17,0.15430882066428117,0.9880226656636976,0.20396842367172097,0.3958946122462755,1.7 +2026-01-09 07:00:00+00:00,7400.0,14.8625,15.287500000000001,14.4125,283.25,73.25,0.05,3.5625,,,7,1,9,0.9659258262890683,-0.25881904510252063,0.15430882066428117,0.9880226656636976,0.3686219326200803,0.7684024604470056,7.4 +2026-01-09 08:00:00+00:00,11600.0,14.825,15.2625,14.425,202.875,62.75,0.0,4.2875,,,8,1,9,0.8660254037844387,-0.49999999999999983,0.15430882066428117,0.9880226656636976,0.4949650137015917,0.4098774547372572,11.6 +2026-01-09 09:00:00+00:00,24100.0,13.425,13.675,13.175,166.875,78.875,0.4375,3.9375,,,9,1,9,0.7071067811865476,-0.7071067811865475,0.15430882066428117,0.9880226656636976,0.5743875947323636,0.2905268176583019,24.1 +2026-01-09 10:00:00+00:00,25700.0,13.975,14.1625,13.775,171.375,69.625,0.025,4.125,,,10,1,9,0.49999999999999994,-0.8660254037844387,0.15430882066428117,0.9880226656636976,0.6014771580671698,0.2849235381617962,25.7 +2026-01-09 11:00:00+00:00,20900.0,14.0125,14.325,13.7375,86.0,77.0,0.0125,5.625,,,11,1,9,0.258819045102521,-0.9659258262890682,0.15430882066428117,0.9880226656636976,0.5743875947323636,0.14972468205910988,20.9 +2026-01-09 12:00:00+00:00,7500.0,13.8,14.0,13.6125,69.75,67.0,0.0125,5.862500000000001,,,12,1,9,1.2246467991473532e-16,-1.0,0.15430882066428117,0.9880226656636976,0.4949650137015917,0.1409190509817557,7.5 +2026-01-09 13:00:00+00:00,4800.0,11.5625,12.05,11.2375,87.75,82.125,0.2,4.55,,,13,1,9,-0.2588190451025208,-0.9659258262890683,0.15430882066428117,0.9880226656636976,0.3686219326200803,0.23804877636089933,4.8 +2026-01-09 14:00:00+00:00,300.0,12.9375,13.05,12.8375,30.625,75.25,0.0125,5.0,,,14,1,9,-0.4999999999999998,-0.8660254037844388,0.15430882066428117,0.9880226656636976,0.20396842367172097,0.15014578947420665,0.3 +2026-01-09 15:00:00+00:00,0.0,13.5125,13.65,13.3875,0.25,63.125,0.0,5.325,,,15,1,9,-0.7071067811865471,-0.7071067811865479,0.15430882066428117,0.9880226656636976,0.012225351388555128,0.0,0.0 +2026-01-09 16:00:00+00:00,0.0,14.075,14.1375,14.0,0.0,58.5,0.0,5.2,,,16,1,9,-0.8660254037844384,-0.5000000000000004,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 17:00:00+00:00,0.0,14.0875,14.2,14.0,0.0,55.25,0.0,5.6,,,17,1,9,-0.9659258262890683,-0.25881904510252063,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 18:00:00+00:00,0.0,13.6875,13.8625,13.5375,0.0,63.25,0.05,5.675,,,18,1,9,-1.0,-1.8369701987210297e-16,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 19:00:00+00:00,0.0,13.3875,13.5625,13.1875,0.0,68.0,0.0,4.7375,,,19,1,9,-0.9659258262890684,0.2588190451025203,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 20:00:00+00:00,0.0,13.6375,13.7625,13.475,0.0,68.125,0.0,4.825,,,20,1,9,-0.8660254037844386,0.5000000000000001,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 21:00:00+00:00,0.0,13.775,13.825000000000001,13.6625,0.0,61.75,0.0,4.4875,,,21,1,9,-0.7071067811865477,0.7071067811865474,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 22:00:00+00:00,0.0,13.775,13.85,13.7375,0.0,63.0,0.0,4.625,,,22,1,9,-0.5000000000000004,0.8660254037844384,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-09 23:00:00+00:00,0.0,13.9875,14.05,13.9,0.0,64.875,0.0,4.2875,,,23,1,9,-0.25881904510252157,0.9659258262890681,0.15430882066428117,0.9880226656636976,0.0,0.0,0.0 +2026-01-10 00:00:00+00:00,0.0,14.1375,14.1875,14.075,0.0,65.375,0.0,4.15,,,0,1,10,0.0,1.0,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 01:00:00+00:00,0.0,14.0125,14.025,13.95,0.0,61.0,0.0,4.5625,,,1,1,10,0.25881904510252074,0.9659258262890683,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 02:00:00+00:00,0.0,13.9875,14.025,13.9,0.0,60.625,0.0,3.5625,,,2,1,10,0.49999999999999994,0.8660254037844387,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 03:00:00+00:00,0.0,14.125,14.15,14.075,0.0,62.5,0.0,3.675,,,3,1,10,0.7071067811865475,0.7071067811865476,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 04:00:00+00:00,0.0,14.125,14.212499999999999,14.0625,0.75,63.25,0.0,3.5125,,,4,1,10,0.8660254037844386,0.5000000000000001,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 05:00:00+00:00,3200.0,14.3,14.4375,14.175,76.375,61.875,0.0,3.075,,,5,1,10,0.9659258262890683,0.25881904510252074,0.1712931441814776,0.9852201067560606,0.013537996532102803,0.0,3.2 +2026-01-10 06:00:00+00:00,8300.0,15.625,15.75,15.4625,252.375,59.875,0.0,3.175,,,6,1,10,1.0,6.123233995736766e-17,0.1712931441814776,0.9852201067560606,0.20546414119325043,1.2283165253766948,8.3 +2026-01-10 07:00:00+00:00,17700.0,16.25,16.525,16.05,306.625,61.0,0.0,2.525,,,7,1,10,0.9659258262890683,-0.25881904510252063,0.1712931441814776,0.9852201067560606,0.3702748579565639,0.8281010536123667,17.7 +2026-01-10 08:00:00+00:00,23700.0,16.7,16.9875,16.375,391.25,59.625,0.0,3.275,,,8,1,10,0.8660254037844387,-0.49999999999999983,0.1712931441814776,0.9852201067560606,0.4967385688372108,0.7876376519662175,23.7 +2026-01-10 09:00:00+00:00,24300.0,17.299999999999997,17.675,16.9125,511.0,57.0,0.0,3.25,,,9,1,10,0.7071067811865476,-0.7071067811865475,0.1712931441814776,0.9852201067560606,0.5762369809298387,0.8867879308534318,24.3 +2026-01-10 10:00:00+00:00,27600.0,16.9875,17.3625,16.674999999999997,460.625,58.875,0.0,2.8875,,,10,1,10,0.49999999999999994,-0.8660254037844387,0.1712931441814776,0.9852201067560606,0.6033524088276726,0.7634427131815134,27.6 +2026-01-10 11:00:00+00:00,18400.0,16.9375,17.25,16.75,379.25,59.875,0.0,3.35,,,11,1,10,0.258819045102521,-0.9659258262890682,0.1712931441814776,0.9852201067560606,0.5762369809298387,0.6581493596402426,18.4 +2026-01-10 12:00:00+00:00,19000.0,16.9875,17.2375,16.7125,270.375,60.75,0.0,2.9875,,,12,1,10,1.2246467991473532e-16,-1.0,0.1712931441814776,0.9852201067560606,0.4967385688372108,0.5443003965504564,19.0 +2026-01-10 13:00:00+00:00,17500.0,16.7625,17.025,16.5375,165.625,64.25,0.0,2.275,,,13,1,10,-0.2588190451025208,-0.9659258262890683,0.1712931441814776,0.9852201067560606,0.3702748579565639,0.4473028520327705,17.5 +2026-01-10 14:00:00+00:00,7800.0,15.775,15.875,15.65,18.125,69.0,0.0,1.8625,,,14,1,10,-0.4999999999999998,-0.8660254037844388,0.1712931441814776,0.9852201067560606,0.20546414119325043,0.08821490647826684,7.8 +2026-01-10 15:00:00+00:00,0.0,14.2375,14.4875,14.0625,0.0,87.0,0.4375,4.225,,,15,1,10,-0.7071067811865471,-0.7071067811865479,0.1712931441814776,0.9852201067560606,0.013537996532102803,0.0,0.0 +2026-01-10 16:00:00+00:00,0.0,13.4125,13.4625,13.3,0.0,91.75,0.0625,2.325,,,16,1,10,-0.8660254037844384,-0.5000000000000004,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 17:00:00+00:00,0.0,13.9125,14.0125,13.825,0.25,84.5,0.0,1.7875,,,17,1,10,-0.9659258262890683,-0.25881904510252063,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 18:00:00+00:00,0.0,13.875,14.025,13.6625,0.0,82.375,0.0,1.3375,,,18,1,10,-1.0,-1.8369701987210297e-16,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 19:00:00+00:00,0.0,13.8625,14.025,13.7375,0.0,80.125,0.0,1.4875,,,19,1,10,-0.9659258262890684,0.2588190451025203,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 20:00:00+00:00,0.0,14.275,14.3625,14.1625,0.0,74.125,0.0,2.8125,,,20,1,10,-0.8660254037844386,0.5000000000000001,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 21:00:00+00:00,0.0,13.925,14.1125,13.775,0.0,75.5,0.0,1.7125,,,21,1,10,-0.7071067811865477,0.7071067811865474,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 22:00:00+00:00,0.0,13.375,13.5875,13.1125,0.0,76.0,0.0,0.675,,,22,1,10,-0.5000000000000004,0.8660254037844384,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-10 23:00:00+00:00,0.0,13.05,13.325,12.75,0.0,77.375,0.0,1.075,,,23,1,10,-0.25881904510252157,0.9659258262890681,0.1712931441814776,0.9852201067560606,0.0,0.0,0.0 +2026-01-11 00:00:00+00:00,0.0,13.5375,13.9125,13.3,0.0,73.75,0.0,1.7125000000000001,,,0,1,11,0.0,1.0,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 01:00:00+00:00,0.0,12.4,12.712499999999999,12.0625,0.0,82.125,0.0,1.45,,,1,1,11,0.25881904510252074,0.9659258262890683,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 02:00:00+00:00,0.0,12.9625,13.3,12.5875,0.0,73.375,0.0,2.0875,,,2,1,11,0.49999999999999994,0.8660254037844387,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 03:00:00+00:00,0.0,12.375,12.6625,12.0625,0.0,77.0,0.0,1.1625,,,3,1,11,0.7071067811865475,0.7071067811865476,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 04:00:00+00:00,0.0,11.125,11.3875,10.9125,0.75,85.125,0.0,1.1625,,,4,1,11,0.8660254037844386,0.5000000000000001,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 05:00:00+00:00,2200.0,11.9,12.1625,11.5625,64.375,81.0,0.0,0.9624999999999999,,,5,1,11,0.9659258262890683,0.25881904510252074,0.1882267098432442,0.9821256058680006,0.014914246003682796,0.0,2.2 +2026-01-11 06:00:00+00:00,7400.0,13.2875,13.412500000000001,13.1125,259.625,74.625,0.0,2.275,,,6,1,11,1.0,6.123233995736766e-17,0.1882267098432442,0.9821256058680006,0.20703120730972863,1.2540379944342814,7.4 +2026-01-11 07:00:00+00:00,19200.0,13.95,14.0625,13.837499999999999,424.875,72.125,0.0,3.0625,,,7,1,11,0.9659258262890683,-0.25881904510252063,0.1882267098432442,0.9821256058680006,0.3720057820407596,1.1421193446757976,19.2 +2026-01-11 08:00:00+00:00,23100.0,15.6875,15.899999999999999,15.4375,547.5,63.375,0.0,2.7125000000000004,,,8,1,11,0.8660254037844387,-0.49999999999999983,0.1882267098432442,0.9821256058680006,0.4985952255622317,1.0980851238248857,23.1 +2026-01-11 09:00:00+00:00,26400.0,16.5125,16.6625,16.3125,605.375,61.25,0.0,3.425,,,9,1,11,0.7071067811865476,-0.7071067811865475,0.1882267098432442,0.9821256058680006,0.5781726764971029,1.0470487876869314,26.4 +2026-01-11 10:00:00+00:00,28700.0,17.6,17.9,17.3375,596.75,56.625,0.0,2.45,,,10,1,11,0.49999999999999994,-0.8660254037844387,0.1882267098432442,0.9821256058680006,0.6053150630721175,0.9858502396609004,28.7 +2026-01-11 11:00:00+00:00,28600.0,19.0625,19.4375,18.6375,519.5,51.75,0.0,1.875,,,11,1,11,0.258819045102521,-0.9659258262890682,0.1882267098432442,0.9821256058680006,0.5781726764971029,0.8985204958965285,28.6 +2026-01-11 12:00:00+00:00,27700.0,18.3625,18.7625,17.9375,394.75,58.0,0.0,2.1,,,12,1,11,1.2246467991473532e-16,-1.0,0.1882267098432442,0.9821256058680006,0.4985952255622317,0.791724388365066,27.7 +2026-01-11 13:00:00+00:00,25400.0,17.3625,17.75,17.1125,224.625,61.0,0.0,2.275,,,13,1,11,-0.2588190451025208,-0.9659258262890683,0.1882267098432442,0.9821256058680006,0.3720057820407596,0.6038212598947951,25.4 +2026-01-11 14:00:00+00:00,9100.0,15.8,16.0375,15.6625,24.5,68.375,0.0,2.7625,,,14,1,11,-0.4999999999999998,-0.8660254037844388,0.1882267098432442,0.9821256058680006,0.20703120730972863,0.11833964704338909,9.1 +2026-01-11 15:00:00+00:00,0.0,15.075,15.175,15.0125,0.125,72.625,0.0,3.175,,,15,1,11,-0.7071067811865471,-0.7071067811865479,0.1882267098432442,0.9821256058680006,0.014914246003682796,0.0,0.0 +2026-01-11 16:00:00+00:00,0.0,14.825000000000001,14.9375,14.737499999999999,0.0,70.625,0.0,2.8125,,,16,1,11,-0.8660254037844384,-0.5000000000000004,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 17:00:00+00:00,0.0,14.5625,14.6625,14.4375,0.0,71.5,0.0,3.0125,,,17,1,11,-0.9659258262890683,-0.25881904510252063,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 18:00:00+00:00,0.0,14.2125,14.325000000000001,14.149999999999999,0.0,72.25,0.0,2.4,,,18,1,11,-1.0,-1.8369701987210297e-16,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 19:00:00+00:00,0.0,13.7375,14.0,13.475,0.0,74.75,0.0,1.325,,,19,1,11,-0.9659258262890684,0.2588190451025203,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 20:00:00+00:00,0.0,13.1125,13.45,12.8625,0.0,77.125,0.0,1.05,,,20,1,11,-0.8660254037844386,0.5000000000000001,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 21:00:00+00:00,0.0,12.2875,12.5125,12.100000000000001,0.0,79.75,0.0,0.6,,,21,1,11,-0.7071067811865477,0.7071067811865474,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 22:00:00+00:00,0.0,12.25,12.4875,12.0625,,,,,,,22,1,11,-0.5000000000000004,0.8660254037844384,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-11 23:00:00+00:00,0.0,12.524999999999999,12.8,12.35,,,,,,,23,1,11,-0.25881904510252157,0.9659258262890681,0.1882267098432442,0.9821256058680006,0.0,0.0,0.0 +2026-01-12 00:00:00+00:00,0.0,13.2,13.3375,12.95,,,,,,,0,1,12,0.0,1.0,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 01:00:00+00:00,0.0,12.9625,13.1125,12.8,,,,,,,1,1,12,0.25881904510252074,0.9659258262890683,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 02:00:00+00:00,0.0,13.3375,13.55,13.15,,,,,,,2,1,12,0.49999999999999994,0.8660254037844387,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 03:00:00+00:00,0.0,13.15,13.4125,12.95,,,,,,,3,1,12,0.7071067811865475,0.7071067811865476,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 04:00:00+00:00,0.0,13.0625,13.1625,12.9,,,,,,,4,1,12,0.8660254037844386,0.5000000000000001,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 05:00:00+00:00,5100.0,13.4,13.4375,13.2625,,,,,,,5,1,12,0.9659258262890683,0.25881904510252074,0.2051044998686192,0.9787400799669153,0.016353671671505338,0.0,5.1 +2026-01-12 06:00:00+00:00,13000.0,14.425,14.5375,14.2625,,,,,,,6,1,12,1.0,6.123233995736766e-17,0.2051044998686192,0.9787400799669153,0.2086689749676307,,13.0 +2026-01-12 07:00:00+00:00,19000.0,15.912500000000001,16.112499999999997,15.625,,,,,,,7,1,12,0.9659258262890683,-0.25881904510252063,0.2051044998686192,0.9787400799669153,0.373813869826787,,19.0 +2026-01-12 08:00:00+00:00,23200.0,16.1875,16.474999999999998,15.950000000000001,,,,,,,8,1,12,0.8660254037844387,-0.49999999999999983,0.2051044998686192,0.9787400799669153,0.5005340045791654,,23.2 +2026-01-12 09:00:00+00:00,26700.0,16.525,16.7875,16.325,,,,,,,9,1,12,0.7071067811865476,-0.7071067811865475,0.2051044998686192,0.9787400799669153,0.5801936114563156,,26.7 +2026-01-12 10:00:00+00:00,28700.0,16.7,16.925,16.5125,,,,,,,10,1,12,0.49999999999999994,-0.8660254037844387,0.2051044998686192,0.9787400799669153,0.6073640198932846,,28.7 +2026-01-12 11:00:00+00:00,28900.0,16.325000000000003,16.4875,16.1375,,,,,,,11,1,12,0.258819045102521,-0.9659258262890682,0.2051044998686192,0.9787400799669153,0.5801936114563156,,28.9 +2026-01-12 12:00:00+00:00,28200.0,15.45,15.700000000000001,15.25,,,,,,,12,1,12,1.2246467991473532e-16,-1.0,0.2051044998686192,0.9787400799669153,0.5005340045791654,,28.2 +2026-01-12 13:00:00+00:00,18100.0,15.325,15.4125,15.149999999999999,,,,,,,13,1,12,-0.2588190451025208,-0.9659258262890683,0.2051044998686192,0.9787400799669153,0.373813869826787,,18.1 +2026-01-12 14:00:00+00:00,3400.0,15.0875,15.1375,15.0375,,,,,,,14,1,12,-0.4999999999999998,-0.8660254037844388,0.2051044998686192,0.9787400799669153,0.2086689749676307,,3.4 +2026-01-12 15:00:00+00:00,100.0,14.9,14.9125,14.825,,,,,,,15,1,12,-0.7071067811865471,-0.7071067811865479,0.2051044998686192,0.9787400799669153,0.016353671671505338,0.0,0.1 +2026-01-12 16:00:00+00:00,0.0,13.274999999999999,13.65,12.875,,,,,,,16,1,12,-0.8660254037844384,-0.5000000000000004,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 17:00:00+00:00,0.0,11.35,11.5625,11.1875,,,,,,,17,1,12,-0.9659258262890683,-0.25881904510252063,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 18:00:00+00:00,0.0,10.7875,10.9,10.6625,,,,,,,18,1,12,-1.0,-1.8369701987210297e-16,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 19:00:00+00:00,0.0,10.5375,10.625,10.45,,,,,,,19,1,12,-0.9659258262890684,0.2588190451025203,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 20:00:00+00:00,0.0,10.9625,11.2,10.725,,,,,,,20,1,12,-0.8660254037844386,0.5000000000000001,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 21:00:00+00:00,0.0,9.837499999999999,9.9875,9.725,,,,,,,21,1,12,-0.7071067811865477,0.7071067811865474,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 22:00:00+00:00,0.0,10.6375,10.7625,10.4875,,,,,,,22,1,12,-0.5000000000000004,0.8660254037844384,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-12 23:00:00+00:00,0.0,10.75,10.9375,10.525,,,,,,,23,1,12,-0.25881904510252157,0.9659258262890681,0.2051044998686192,0.9787400799669153,0.0,0.0,0.0 +2026-01-13 00:00:00+00:00,0.0,9.95,10.1,9.8625,,,,,,,0,1,13,0.0,1.0,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 01:00:00+00:00,0.0,10.6625,10.8375,10.525,,,,,,,1,1,13,0.25881904510252074,0.9659258262890683,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 02:00:00+00:00,0.0,10.075,10.3625,9.8,,,,,,,2,1,13,0.49999999999999994,0.8660254037844387,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 03:00:00+00:00,0.0,11.4,11.675,11.0625,,,,,,,3,1,13,0.7071067811865475,0.7071067811865476,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 04:00:00+00:00,0.0,11.35,11.4375,11.15,,,,,,,4,1,13,0.8660254037844386,0.5000000000000001,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 05:00:00+00:00,6600.0,11.5125,11.9,11.125,,,,,,,5,1,13,0.9659258262890683,0.25881904510252074,0.22192151300416552,0.9750645322571948,0.017855823782616048,0.0,6.6 +2026-01-13 06:00:00+00:00,13300.0,11.4,11.8,11.0375,,,,,,,6,1,13,1.0,6.123233995736766e-17,0.22192151300416552,0.9750645322571948,0.21037676662998356,,13.3 +2026-01-13 07:00:00+00:00,19100.0,10.9,11.2125,10.6125,,,,,,,7,1,13,0.9659258262890683,-0.25881904510252063,0.22192151300416552,0.9750645322571948,0.3756982481751014,,19.1 +2026-01-13 08:00:00+00:00,21800.0,11.2,11.525,10.9125,,,,,,,8,1,13,0.8660254037844387,-0.49999999999999983,0.22192151300416552,0.9750645322571948,0.5025538826573361,,21.8 +2026-01-13 09:00:00+00:00,25700.0,12.55,12.7625,12.325,,,,,,,9,1,13,0.7071067811865476,-0.7071067811865475,0.22192151300416552,0.9750645322571948,0.5822986682255711,,25.7 +2026-01-13 10:00:00+00:00,22600.0,11.5,12.0125,11.05,,,,,,,10,1,13,0.49999999999999994,-0.8660254037844387,0.22192151300416552,0.9750645322571948,0.6094981295278206,,22.6 +2026-01-13 11:00:00+00:00,25500.0,12.75,12.975,12.462499999999999,,,,,,,11,1,13,0.258819045102521,-0.9659258262890682,0.22192151300416552,0.9750645322571948,0.5822986682255711,,25.5 +2026-01-13 12:00:00+00:00,19200.0,12.4375,12.6375,12.2875,,,,,,,12,1,13,1.2246467991473532e-16,-1.0,0.22192151300416552,0.9750645322571948,0.5025538826573361,,19.2 +2026-01-13 13:00:00+00:00,13500.0,12.7625,12.925,12.6625,,,,,,,13,1,13,-0.2588190451025208,-0.9659258262890683,0.22192151300416552,0.9750645322571948,0.3756982481751014,,13.5 +2026-01-13 14:00:00+00:00,1400.0,11.925,12.1,11.7875,,,,,,,14,1,13,-0.4999999999999998,-0.8660254037844388,0.22192151300416552,0.9750645322571948,0.21037676662998356,,1.4 +2026-01-13 15:00:00+00:00,0.0,10.9375,11.2,10.7125,,,,,,,15,1,13,-0.7071067811865471,-0.7071067811865479,0.22192151300416552,0.9750645322571948,0.017855823782616048,0.0,0.0 +2026-01-13 16:00:00+00:00,0.0,11.4375,11.575,11.325,,,,,,,16,1,13,-0.8660254037844384,-0.5000000000000004,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 17:00:00+00:00,0.0,10.837499999999999,11.1625,10.6,,,,,,,17,1,13,-0.9659258262890683,-0.25881904510252063,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 18:00:00+00:00,0.0,10.55,10.775,10.3625,,,,,,,18,1,13,-1.0,-1.8369701987210297e-16,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 19:00:00+00:00,0.0,9.4375,9.525,9.275,,,,,,,19,1,13,-0.9659258262890684,0.2588190451025203,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 20:00:00+00:00,0.0,9.5625,9.8625,9.35,,,,,,,20,1,13,-0.8660254037844386,0.5000000000000001,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 21:00:00+00:00,0.0,9.7625,9.975,9.6,,,,,,,21,1,13,-0.7071067811865477,0.7071067811865474,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 22:00:00+00:00,0.0,9.1875,9.3125,9.1125,,,,,,,22,1,13,-0.5000000000000004,0.8660254037844384,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-13 23:00:00+00:00,0.0,10.0,10.1375,9.8625,,,,,,,23,1,13,-0.25881904510252157,0.9659258262890681,0.22192151300416552,0.9750645322571948,0.0,0.0,0.0 +2026-01-14 00:00:00+00:00,0.0,11.0,11.1,10.875,,,,,,,0,1,14,0.0,1.0,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 01:00:00+00:00,0.0,11.587499999999999,11.6375,11.4875,,,,,,,1,1,14,0.25881904510252074,0.9659258262890683,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 02:00:00+00:00,0.0,11.7625,11.8,11.674999999999999,,,,,,,2,1,14,0.49999999999999994,0.8660254037844387,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 03:00:00+00:00,0.0,11.600000000000001,11.725,11.462499999999999,,,,,,,3,1,14,0.7071067811865475,0.7071067811865476,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 04:00:00+00:00,0.0,11.625,11.675,11.55,,,,,,,4,1,14,0.8660254037844386,0.5000000000000001,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 05:00:00+00:00,1300.0,11.875,11.9875,11.75,,,,,,,5,1,14,0.9659258262890683,0.25881904510252074,0.2386727660059501,0.9711000518829505,0.019420230863277488,0.0,1.3 +2026-01-14 06:00:00+00:00,4800.0,12.875,13.049999999999999,12.575,,,,,,,6,1,14,1.0,6.123233995736766e-17,0.2386727660059501,0.9711000518829505,0.2121538744123534,,4.8 +2026-01-14 07:00:00+00:00,15000.0,13.0125,13.2375,12.8125,,,,,,,7,1,14,0.9659258262890683,-0.25881904510252063,0.2386727660059501,0.9711000518829505,0.377658006190802,,15.0 +2026-01-14 08:00:00+00:00,14900.0,12.875,12.9875,12.8,,,,,,,8,1,14,0.8660254037844387,-0.49999999999999983,0.2386727660059501,0.9711000518829505,0.5046537931264319,,14.9 +2026-01-14 09:00:00+00:00,17200.0,12.7125,12.7875,12.6375,,,,,,,9,1,14,0.7071067811865476,-0.7071067811865475,0.2386727660059501,0.9711000518829505,0.5844866822100407,,17.2 +2026-01-14 10:00:00+00:00,15800.0,13.35,13.4625,13.1375,,,,,,,10,1,14,0.49999999999999994,-0.8660254037844387,0.2386727660059501,0.9711000518829505,0.6117161939806679,,15.8 +2026-01-14 11:00:00+00:00,4600.0,13.6625,13.7875,13.5875,,,,,,,11,1,14,0.258819045102521,-0.9659258262890682,0.2386727660059501,0.9711000518829505,0.5844866822100407,,4.6 +2026-01-14 12:00:00+00:00,3000.0,13.375,13.475,13.325,,,,,,,12,1,14,1.2246467991473532e-16,-1.0,0.2386727660059501,0.9711000518829505,0.5046537931264319,,3.0 +2026-01-14 13:00:00+00:00,2500.0,13.4625,13.5625,13.3375,,,,,,,13,1,14,-0.2588190451025208,-0.9659258262890683,0.2386727660059501,0.9711000518829505,0.377658006190802,,2.5 +2026-01-14 14:00:00+00:00,1200.0,13.225,13.275,13.15,,,,,,,14,1,14,-0.4999999999999998,-0.8660254037844388,0.2386727660059501,0.9711000518829505,0.2121538744123534,,1.2 +2026-01-14 15:00:00+00:00,0.0,12.6625,12.725,12.55,,,,,,,15,1,14,-0.7071067811865471,-0.7071067811865479,0.2386727660059501,0.9711000518829505,0.019420230863277488,0.0,0.0 +2026-01-14 16:00:00+00:00,0.0,12.4,12.462499999999999,12.3,,,,,,,16,1,14,-0.8660254037844384,-0.5000000000000004,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 17:00:00+00:00,0.0,11.725,11.775,11.6375,,,,,,,17,1,14,-0.9659258262890683,-0.25881904510252063,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 18:00:00+00:00,0.0,11.350000000000001,11.4375,11.25,,,,,,,18,1,14,-1.0,-1.8369701987210297e-16,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 19:00:00+00:00,0.0,11.0,11.1,10.9125,,,,,,,19,1,14,-0.9659258262890684,0.2588190451025203,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 20:00:00+00:00,0.0,10.725,10.8625,10.6,,,,,,,20,1,14,-0.8660254037844386,0.5000000000000001,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 21:00:00+00:00,0.0,10.45,10.6375,10.3,,,,,,,21,1,14,-0.7071067811865477,0.7071067811865474,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 22:00:00+00:00,0.0,10.4,10.475,10.2625,,,,,,,22,1,14,-0.5000000000000004,0.8660254037844384,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-14 23:00:00+00:00,0.0,10.3625,10.5,10.1875,,,,,,,23,1,14,-0.25881904510252157,0.9659258262890681,0.2386727660059501,0.9711000518829505,0.0,0.0,0.0 +2026-01-15 00:00:00+00:00,0.0,10.1375,10.2625,10.05,,,,,,,0,1,15,0.0,1.0,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 01:00:00+00:00,0.0,9.875,9.9625,9.775,,,,,,,1,1,15,0.25881904510252074,0.9659258262890683,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 02:00:00+00:00,0.0,10.0,10.15,9.85,,,,,,,2,1,15,0.49999999999999994,0.8660254037844387,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 03:00:00+00:00,0.0,10.1375,10.25,9.9625,,,,,,,3,1,15,0.7071067811865475,0.7071067811865476,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 04:00:00+00:00,0.0,10.55,10.6625,10.425,,,,,,,4,1,15,0.8660254037844386,0.5000000000000001,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 05:00:00+00:00,2900.0,10.4375,10.575,10.2875,,,,,,,5,1,15,0.9659258262890683,0.25881904510252074,0.255353295116187,0.9668478136052775,0.021046399623492584,0.0,2.9 +2026-01-15 06:00:00+00:00,8400.0,12.525,12.8375,12.1125,,,,,,,6,1,15,1.0,6.123233995736766e-17,0.255353295116187,0.9668478136052775,0.21399956023307648,,8.4 +2026-01-15 07:00:00+00:00,21900.0,14.3,14.625,14.0,,,,,,,7,1,15,0.9659258262890683,-0.25881904510252063,0.255353295116187,0.9668478136052775,0.3796921955848551,,21.9 +2026-01-15 08:00:00+00:00,26700.0,14.525,15.0,14.175,,,,,,,8,1,15,0.8660254037844387,-0.49999999999999983,0.255353295116187,0.9668478136052775,0.5068326263996318,,26.7 +2026-01-15 09:00:00+00:00,28900.0,14.8,15.137500000000001,14.375,,,,,,,9,1,15,0.7071067811865476,-0.7071067811865475,0.255353295116187,0.9668478136052775,0.5867564424268754,,28.9 +2026-01-15 10:00:00+00:00,28800.0,14.9,15.3125,14.45,,,,,,,10,1,15,0.49999999999999994,-0.8660254037844387,0.255353295116187,0.9668478136052775,0.6140169676846804,,28.8 +2026-01-15 11:00:00+00:00,27900.0,14.625,14.9125,14.35,,,,,,,11,1,15,0.258819045102521,-0.9659258262890682,0.255353295116187,0.9668478136052775,0.5867564424268754,,27.9 +2026-01-15 12:00:00+00:00,23600.0,14.2,14.475,14.0375,,,,,,,12,1,15,1.2246467991473532e-16,-1.0,0.255353295116187,0.9668478136052775,0.5068326263996318,,23.6 +2026-01-15 13:00:00+00:00,18100.0,14.5,14.675,14.3,,,,,,,13,1,15,-0.2588190451025208,-0.9659258262890683,0.255353295116187,0.9668478136052775,0.3796921955848551,,18.1 +2026-01-15 14:00:00+00:00,13500.0,12.925,13.275,12.7,,,,,,,14,1,15,-0.4999999999999998,-0.8660254037844388,0.255353295116187,0.9668478136052775,0.21399956023307648,,13.5 +2026-01-15 15:00:00+00:00,100.0,10.9,11.1125,10.7,,,,,,,15,1,15,-0.7071067811865471,-0.7071067811865479,0.255353295116187,0.9668478136052775,0.021046399623492584,0.0,0.1 +2026-01-15 16:00:00+00:00,0.0,10.425,10.575,10.2625,,,,,,,16,1,15,-0.8660254037844384,-0.5000000000000004,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 17:00:00+00:00,0.0,10.15,10.2,10.0125,,,,,,,17,1,15,-0.9659258262890683,-0.25881904510252063,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 18:00:00+00:00,0.0,9.9,10.0625,9.75,,,,,,,18,1,15,-1.0,-1.8369701987210297e-16,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 19:00:00+00:00,0.0,9.5375,9.65,9.4125,,,,,,,19,1,15,-0.9659258262890684,0.2588190451025203,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 20:00:00+00:00,0.0,9.2875,9.412500000000001,9.175,,,,,,,20,1,15,-0.8660254037844386,0.5000000000000001,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 21:00:00+00:00,0.0,9.6625,9.85,9.425,,,,,,,21,1,15,-0.7071067811865477,0.7071067811865474,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 22:00:00+00:00,0.0,9.6625,9.8125,9.5,,,,,,,22,1,15,-0.5000000000000004,0.8660254037844384,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-15 23:00:00+00:00,0.0,9.45,9.575,9.2875,,,,,,,23,1,15,-0.25881904510252157,0.9659258262890681,0.255353295116187,0.9668478136052775,0.0,0.0,0.0 +2026-01-16 00:00:00+00:00,0.0,9.8875,10.05,9.7125,,,,,,,0,1,16,0.0,1.0,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 01:00:00+00:00,0.0,10.5625,10.75,10.4,,,,,,,1,1,16,0.25881904510252074,0.9659258262890683,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 02:00:00+00:00,0.0,10.2,10.325,10.05,,,,,,,2,1,16,0.49999999999999994,0.8660254037844387,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 03:00:00+00:00,0.0,10.6875,10.8375,10.5375,,,,,,,3,1,16,0.7071067811865475,0.7071067811865476,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 04:00:00+00:00,0.0,11.3625,11.4875,11.225000000000001,,,,,,,4,1,16,0.8660254037844386,0.5000000000000001,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 05:00:00+00:00,6200.0,10.675,11.025,10.25,,,,,,,5,1,16,0.9659258262890683,0.25881904510252074,0.2719581575341055,0.9623090774541486,0.02273381486670828,0.0,6.2 +2026-01-16 06:00:00+00:00,14200.0,10.7875,11.2125,10.475,,,,,,,6,1,16,1.0,6.123233995736766e-17,0.2719581575341055,0.9623090774541486,0.21591305597864235,,14.2 +2026-01-16 07:00:00+00:00,22000.0,11.7375,11.9875,11.5,,,,,,,7,1,16,0.9659258262890683,-0.25881904510252063,0.2719581575341055,0.9623090774541486,0.3817998310590356,,22.0 +2026-01-16 08:00:00+00:00,27300.0,13.2,13.4875,12.8375,,,,,,,8,1,16,0.8660254037844387,-0.49999999999999983,0.2719581575341055,0.9623090774541486,0.5090892305270169,,27.3 +2026-01-16 09:00:00+00:00,28900.0,14.1125,14.3625,13.9125,,,,,,,9,1,16,0.7071067811865476,-0.7071067811865475,0.2719581575341055,0.9623090774541486,0.5891066921645222,,28.9 +2026-01-16 10:00:00+00:00,28700.0,15.0875,15.2625,14.8875,,,,,,,10,1,16,0.49999999999999994,-0.8660254037844387,0.2719581575341055,0.9623090774541486,0.6163991581960628,,28.7 +2026-01-16 11:00:00+00:00,28900.0,16.05,16.3,15.775,,,,,,,11,1,16,0.258819045102521,-0.9659258262890682,0.2719581575341055,0.9623090774541486,0.5891066921645222,,28.9 +2026-01-16 12:00:00+00:00,28800.0,15.875,16.15,15.649999999999999,,,,,,,12,1,16,1.2246467991473532e-16,-1.0,0.2719581575341055,0.9623090774541486,0.5090892305270169,,28.8 +2026-01-16 13:00:00+00:00,28500.0,16.174999999999997,16.5875,15.45,,,,,,,13,1,16,-0.2588190451025208,-0.9659258262890683,0.2719581575341055,0.9623090774541486,0.3817998310590356,,28.5 +2026-01-16 14:00:00+00:00,13000.0,12.8875,13.2375,12.625,,,,,,,14,1,16,-0.4999999999999998,-0.8660254037844388,0.2719581575341055,0.9623090774541486,0.21591305597864235,,13.0 +2026-01-16 15:00:00+00:00,0.0,12.8875,12.975,12.7625,,,,,,,15,1,16,-0.7071067811865471,-0.7071067811865479,0.2719581575341055,0.9623090774541486,0.02273381486670828,0.0,0.0 +2026-01-16 16:00:00+00:00,0.0,12.5375,12.7125,12.425,,,,,,,16,1,16,-0.8660254037844384,-0.5000000000000004,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 17:00:00+00:00,0.0,11.524999999999999,11.675,11.375,,,,,,,17,1,16,-0.9659258262890683,-0.25881904510252063,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 18:00:00+00:00,0.0,11.1,11.275,10.875,,,,,,,18,1,16,-1.0,-1.8369701987210297e-16,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 19:00:00+00:00,0.0,11.8,11.9625,11.6375,,,,,,,19,1,16,-0.9659258262890684,0.2588190451025203,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 20:00:00+00:00,0.0,11.675,11.8125,11.5875,,,,,,,20,1,16,-0.8660254037844386,0.5000000000000001,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 21:00:00+00:00,0.0,11.9125,12.0,11.825,,,,,,,21,1,16,-0.7071067811865477,0.7071067811865474,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 22:00:00+00:00,0.0,12.275,12.3375,12.225,,,,,,,22,1,16,-0.5000000000000004,0.8660254037844384,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-16 23:00:00+00:00,0.0,12.3625,12.425,12.3,,,,,,,23,1,16,-0.25881904510252157,0.9659258262890681,0.2719581575341055,0.9623090774541486,0.0,0.0,0.0 +2026-01-17 00:00:00+00:00,0.0,12.0125,12.1125,11.962499999999999,,,,,,,0,1,17,0.0,1.0,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 01:00:00+00:00,0.0,11.575,11.6875,11.45,,,,,,,1,1,17,0.25881904510252074,0.9659258262890683,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 02:00:00+00:00,0.0,11.5875,11.7125,11.525,,,,,,,2,1,17,0.49999999999999994,0.8660254037844387,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 03:00:00+00:00,0.0,11.425,11.5,11.35,,,,,,,3,1,17,0.7071067811865475,0.7071067811865476,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 04:00:00+00:00,0.0,10.775,10.875,10.6875,,,,,,,4,1,17,0.8660254037844386,0.5000000000000001,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 05:00:00+00:00,5800.0,10.9125,11.0,10.787500000000001,,,,,,,5,1,17,0.9659258262890683,0.25881904510252074,0.288482432880609,0.9574851883550393,0.02448193940575119,0.0,5.8 +2026-01-17 06:00:00+00:00,14100.0,11.725,11.8375,11.6125,,,,,,,6,1,17,1.0,6.123233995736766e-17,0.288482432880609,0.9574851883550393,0.21789356368513965,,14.1 +2026-01-17 07:00:00+00:00,21800.0,13.275,13.475,12.9625,,,,,,,7,1,17,0.9659258262890683,-0.25881904510252063,0.288482432880609,0.9574851883550393,0.3839798907153702,,21.8 +2026-01-17 08:00:00+00:00,26700.0,14.3625,14.575,14.05,,,,,,,8,1,17,0.8660254037844387,-0.49999999999999983,0.288482432880609,0.9574851883550393,0.5114224117799656,,26.7 +2026-01-17 09:00:00+00:00,25400.0,14.975,15.4875,14.6125,,,,,,,9,1,17,0.7071067811865476,-0.7071067811865475,0.288482432880609,0.9574851883550393,0.5915361296770976,,25.4 +2026-01-17 10:00:00+00:00,24900.0,16.5125,16.9,16.15,,,,,,,10,1,17,0.49999999999999994,-0.8660254037844387,0.288482432880609,0.9574851883550393,0.6188614269262553,,24.9 +2026-01-17 11:00:00+00:00,28800.0,17.575,17.924999999999997,17.0875,,,,,,,11,1,17,0.258819045102521,-0.9659258262890682,0.288482432880609,0.9574851883550393,0.5915361296770976,,28.8 +2026-01-17 12:00:00+00:00,28700.0,17.025,17.45,16.6625,,,,,,,12,1,17,1.2246467991473532e-16,-1.0,0.288482432880609,0.9574851883550393,0.5114224117799656,,28.7 +2026-01-17 13:00:00+00:00,28300.0,16.075,16.4125,15.787500000000001,,,,,,,13,1,17,-0.2588190451025208,-0.9659258262890683,0.288482432880609,0.9574851883550393,0.3839798907153702,,28.3 +2026-01-17 14:00:00+00:00,12600.0,15.075,15.325,14.8875,,,,,,,14,1,17,-0.4999999999999998,-0.8660254037844388,0.288482432880609,0.9574851883550393,0.21789356368513965,,12.6 +2026-01-17 15:00:00+00:00,0.0,13.5,13.675,13.4,,,,,,,15,1,17,-0.7071067811865471,-0.7071067811865479,0.288482432880609,0.9574851883550393,0.02448193940575119,0.0,0.0 +2026-01-17 16:00:00+00:00,0.0,13.05,13.212499999999999,12.9875,,,,,,,16,1,17,-0.8660254037844384,-0.5000000000000004,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 17:00:00+00:00,0.0,12.5625,12.7,12.4875,,,,,,,17,1,17,-0.9659258262890683,-0.25881904510252063,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 18:00:00+00:00,0.0,12.4375,12.55,12.3125,,,,,,,18,1,17,-1.0,-1.8369701987210297e-16,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 19:00:00+00:00,0.0,12.15,12.2625,12.0375,,,,,,,19,1,17,-0.9659258262890684,0.2588190451025203,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 20:00:00+00:00,0.0,12.6375,12.7875,12.375,,,,,,,20,1,17,-0.8660254037844386,0.5000000000000001,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 21:00:00+00:00,0.0,13.775,13.875,13.7125,,,,,,,21,1,17,-0.7071067811865477,0.7071067811865474,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 22:00:00+00:00,0.0,13.4,13.5125,13.2375,,,,,,,22,1,17,-0.5000000000000004,0.8660254037844384,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-17 23:00:00+00:00,0.0,13.850000000000001,13.95,13.7125,,,,,,,23,1,17,-0.25881904510252157,0.9659258262890681,0.288482432880609,0.9574851883550393,0.0,0.0,0.0 +2026-01-18 00:00:00+00:00,0.0,13.4125,13.5375,13.325,,,,,,,0,1,18,0.0,1.0,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 01:00:00+00:00,0.0,13.175,13.2625,13.1125,,,,,,,1,1,18,0.25881904510252074,0.9659258262890683,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 02:00:00+00:00,0.0,13.1625,13.2375,13.1125,,,,,,,2,1,18,0.49999999999999994,0.8660254037844387,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 03:00:00+00:00,0.0,12.3,12.5125,12.225,,,,,,,3,1,18,0.7071067811865475,0.7071067811865476,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 04:00:00+00:00,0.0,12.225,12.287500000000001,12.1625,,,,,,,4,1,18,0.8660254037844386,0.5000000000000001,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 05:00:00+00:00,3400.0,12.5625,12.675,12.5,,,,,,,5,1,18,0.9659258262890683,0.25881904510252074,0.30492122465628907,0.9523775757303974,0.02629021398606135,0.0,3.4 +2026-01-18 06:00:00+00:00,12900.0,12.975,13.025,12.875,,,,,,,6,1,18,1.0,6.123233995736766e-17,0.30492122465628907,0.9523775757303974,0.21994025573667703,,12.9 +2026-01-18 07:00:00+00:00,22000.0,12.325,12.55,12.1875,,,,,,,7,1,18,0.9659258262890683,-0.25881904510252063,0.30492122465628907,0.9523775757303974,0.386231316490868,,22.0 +2026-01-18 08:00:00+00:00,27100.0,10.962499999999999,11.05,10.8375,,,,,,,8,1,18,0.8660254037844387,-0.49999999999999983,0.30492122465628907,0.9523775757303974,0.5138309352672077,,27.1 +2026-01-18 09:00:00+00:00,21700.0,11.475,11.575,11.4125,,,,,,,9,1,18,0.7071067811865476,-0.7071067811865475,0.30492122465628907,0.9523775757303974,0.5940434089144286,,21.7 +2026-01-18 10:00:00+00:00,13000.0,12.5375,12.6875,12.3875,,,,,,,10,1,18,0.49999999999999994,-0.8660254037844387,0.30492122465628907,0.9523775757303974,0.6214023899108532,,13.0 +2026-01-18 11:00:00+00:00,12000.0,14.3125,14.6125,13.9375,,,,,,,11,1,18,0.258819045102521,-0.9659258262890682,0.30492122465628907,0.9523775757303974,0.5940434089144286,,12.0 +2026-01-18 12:00:00+00:00,12200.0,14.25,14.5625,13.85,,,,,,,12,1,18,1.2246467991473532e-16,-1.0,0.30492122465628907,0.9523775757303974,0.5138309352672077,,12.2 +2026-01-18 13:00:00+00:00,11100.0,14.2875,14.5125,14.075,,,,,,,13,1,18,-0.2588190451025208,-0.9659258262890683,0.30492122465628907,0.9523775757303974,0.386231316490868,,11.1 +2026-01-18 14:00:00+00:00,2500.0,13.1125,13.3125,12.9875,,,,,,,14,1,18,-0.4999999999999998,-0.8660254037844388,0.30492122465628907,0.9523775757303974,0.21994025573667703,,2.5 +2026-01-18 15:00:00+00:00,0.0,12.4125,12.525,12.275,,,,,,,15,1,18,-0.7071067811865471,-0.7071067811865479,0.30492122465628907,0.9523775757303974,0.02629021398606135,0.0,0.0 +2026-01-18 16:00:00+00:00,0.0,11.5125,11.65,11.375,,,,,,,16,1,18,-0.8660254037844384,-0.5000000000000004,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 17:00:00+00:00,0.0,10.3,10.525,10.1625,,,,,,,17,1,18,-0.9659258262890683,-0.25881904510252063,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 18:00:00+00:00,0.0,10.0375,10.125,9.925,,,,,,,18,1,18,-1.0,-1.8369701987210297e-16,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 19:00:00+00:00,0.0,9.8125,9.9125,9.7,,,,,,,19,1,18,-0.9659258262890684,0.2588190451025203,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 20:00:00+00:00,0.0,9.7125,9.8,9.649999999999999,,,,,,,20,1,18,-0.8660254037844386,0.5000000000000001,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 21:00:00+00:00,0.0,9.625,9.7375,9.5375,,,,,,,21,1,18,-0.7071067811865477,0.7071067811865474,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 22:00:00+00:00,0.0,,,,,,,,,,22,1,18,-0.5000000000000004,0.8660254037844384,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-18 23:00:00+00:00,0.0,,,,,,,,,,23,1,18,-0.25881904510252157,0.9659258262890681,0.30492122465628907,0.9523775757303974,0.0,0.0,0.0 +2026-01-19 00:00:00+00:00,0.0,,,,,,,,,,0,1,19,0.0,1.0,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 01:00:00+00:00,0.0,,,,,,,,,,1,1,19,0.25881904510252074,0.9659258262890683,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 02:00:00+00:00,0.0,,,,,,,,,,2,1,19,0.49999999999999994,0.8660254037844387,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 03:00:00+00:00,0.0,,,,,,,,,,3,1,19,0.7071067811865475,0.7071067811865476,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 04:00:00+00:00,0.0,,,,,,,,,,4,1,19,0.8660254037844386,0.5000000000000001,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 05:00:00+00:00,1700.0,,,,,,,,,,5,1,19,0.9659258262890683,0.25881904510252074,0.3212696616923644,0.9469877530760753,0.02815805721729908,0.0,1.7 +2026-01-19 06:00:00+00:00,4900.0,,,,,,,,,,6,1,19,1.0,6.123233995736766e-17,0.3212696616923644,0.9469877530760753,0.2220522750816873,,4.9 +2026-01-19 07:00:00+00:00,12000.0,,,,,,,,,,7,1,19,0.9659258262890683,-0.25881904510252063,0.3212696616923644,0.9469877530760753,0.3885530146182994,,12.0 +2026-01-19 08:00:00+00:00,6700.0,,,,,,,,,,8,1,19,0.8660254037844387,-0.49999999999999983,0.3212696616923644,0.9469877530760753,0.5163135255831974,,6.7 +2026-01-19 09:00:00+00:00,10100.0,,,,,,,,,,9,1,19,0.7071067811865476,-0.7071067811865475,0.3212696616923644,0.9469877530760753,0.5966271402883505,,10.1 +2026-01-19 10:00:00+00:00,13500.0,,,,,,,,,,10,1,19,0.49999999999999994,-0.8660254037844387,0.3212696616923644,0.9469877530760753,0.6240206186161265,,13.5 +2026-01-19 11:00:00+00:00,25800.0,,,,,,,,,,11,1,19,0.258819045102521,-0.9659258262890682,0.3212696616923644,0.9469877530760753,0.5966271402883505,,25.8 +2026-01-19 12:00:00+00:00,24800.0,,,,,,,,,,12,1,19,1.2246467991473532e-16,-1.0,0.3212696616923644,0.9469877530760753,0.5163135255831974,,24.8 +2026-01-19 13:00:00+00:00,25800.0,,,,,,,,,,13,1,19,-0.2588190451025208,-0.9659258262890683,0.3212696616923644,0.9469877530760753,0.3885530146182994,,25.8 +2026-01-19 14:00:00+00:00,13500.0,,,,,,,,,,14,1,19,-0.4999999999999998,-0.8660254037844388,0.3212696616923644,0.9469877530760753,0.2220522750816873,,13.5 +2026-01-19 15:00:00+00:00,200.0,,,,,,,,,,15,1,19,-0.7071067811865471,-0.7071067811865479,0.3212696616923644,0.9469877530760753,0.02815805721729908,0.0,0.2 +2026-01-19 16:00:00+00:00,0.0,,,,,,,,,,16,1,19,-0.8660254037844384,-0.5000000000000004,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 17:00:00+00:00,0.0,,,,,,,,,,17,1,19,-0.9659258262890683,-0.25881904510252063,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 18:00:00+00:00,0.0,,,,,,,,,,18,1,19,-1.0,-1.8369701987210297e-16,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 19:00:00+00:00,0.0,,,,,,,,,,19,1,19,-0.9659258262890684,0.2588190451025203,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 20:00:00+00:00,0.0,,,,,,,,,,20,1,19,-0.8660254037844386,0.5000000000000001,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 21:00:00+00:00,0.0,,,,,,,,,,21,1,19,-0.7071067811865477,0.7071067811865474,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 22:00:00+00:00,0.0,,,,,,,,,,22,1,19,-0.5000000000000004,0.8660254037844384,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-19 23:00:00+00:00,0.0,,,,,,,,,,23,1,19,-0.25881904510252157,0.9659258262890681,0.3212696616923644,0.9469877530760753,0.0,0.0,0.0 +2026-01-20 00:00:00+00:00,0.0,,,,,,,,,,0,1,20,0.0,1.0,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 01:00:00+00:00,0.0,,,,,,,,,,1,1,20,0.25881904510252074,0.9659258262890683,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 02:00:00+00:00,0.0,,,,,,,,,,2,1,20,0.49999999999999994,0.8660254037844387,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 03:00:00+00:00,0.0,,,,,,,,,,3,1,20,0.7071067811865475,0.7071067811865476,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 04:00:00+00:00,0.0,,,,,,,,,,4,1,20,0.8660254037844386,0.5000000000000001,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 05:00:00+00:00,6200.0,,,,,,,,,,5,1,20,0.9659258262890683,0.25881904510252074,0.3375228995941133,0.9413173175128471,0.03008486551440362,0.0,6.2 +2026-01-20 06:00:00+00:00,14300.0,,,,,,,,,,6,1,20,1.0,6.123233995736766e-17,0.3375228995941133,0.9413173175128471,0.22422873546801295,,14.3 +2026-01-20 07:00:00+00:00,21900.0,,,,,,,,,,7,1,20,0.9659258262890683,-0.25881904510252063,0.3375228995941133,0.9413173175128471,0.39094385611376803,,21.9 +2026-01-20 08:00:00+00:00,27000.0,,,,,,,,,,8,1,20,0.8660254037844387,-0.49999999999999983,0.3375228995941133,0.9413173175128471,0.5188688674894243,,27.0 +2026-01-20 09:00:00+00:00,29000.0,,,,,,,,,,9,1,20,0.7071067811865476,-0.7071067811865475,0.3375228995941133,0.9413173175128471,0.5992858914758077,,29.0 +2026-01-20 10:00:00+00:00,28800.0,,,,,,,,,,10,1,20,0.49999999999999994,-0.8660254037844387,0.3375228995941133,0.9413173175128471,0.6267146407836617,,28.8 +2026-01-20 11:00:00+00:00,28600.0,,,,,,,,,,11,1,20,0.258819045102521,-0.9659258262890682,0.3375228995941133,0.9413173175128471,0.5992858914758077,,28.6 +2026-01-20 12:00:00+00:00,22600.0,,,,,,,,,,12,1,20,1.2246467991473532e-16,-1.0,0.3375228995941133,0.9413173175128471,0.5188688674894243,,22.6 +2026-01-20 13:00:00+00:00,12600.0,,,,,,,,,,13,1,20,-0.2588190451025208,-0.9659258262890683,0.3375228995941133,0.9413173175128471,0.39094385611376803,,12.6 +2026-01-20 14:00:00+00:00,8700.0,,,,,,,,,,14,1,20,-0.4999999999999998,-0.8660254037844388,0.3375228995941133,0.9413173175128471,0.22422873546801295,,8.7 +2026-01-20 15:00:00+00:00,200.0,,,,,,,,,,15,1,20,-0.7071067811865471,-0.7071067811865479,0.3375228995941133,0.9413173175128471,0.03008486551440362,0.0,0.2 +2026-01-20 16:00:00+00:00,0.0,,,,,,,,,,16,1,20,-0.8660254037844384,-0.5000000000000004,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 17:00:00+00:00,0.0,,,,,,,,,,17,1,20,-0.9659258262890683,-0.25881904510252063,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 18:00:00+00:00,0.0,,,,,,,,,,18,1,20,-1.0,-1.8369701987210297e-16,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 19:00:00+00:00,0.0,,,,,,,,,,19,1,20,-0.9659258262890684,0.2588190451025203,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 20:00:00+00:00,0.0,,,,,,,,,,20,1,20,-0.8660254037844386,0.5000000000000001,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 21:00:00+00:00,0.0,,,,,,,,,,21,1,20,-0.7071067811865477,0.7071067811865474,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 22:00:00+00:00,0.0,,,,,,,,,,22,1,20,-0.5000000000000004,0.8660254037844384,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-20 23:00:00+00:00,0.0,,,,,,,,,,23,1,20,-0.25881904510252157,0.9659258262890681,0.3375228995941133,0.9413173175128471,0.0,0.0,0.0 +2026-01-21 00:00:00+00:00,0.0,,,,,,,,,,0,1,21,0.0,1.0,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 01:00:00+00:00,0.0,,,,,,,,,,1,1,21,0.25881904510252074,0.9659258262890683,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 02:00:00+00:00,0.0,,,,,,,,,,2,1,21,0.49999999999999994,0.8660254037844387,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 03:00:00+00:00,0.0,,,,,,,,,,3,1,21,0.7071067811865475,0.7071067811865476,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 04:00:00+00:00,0.0,,,,,,,,,,4,1,21,0.8660254037844386,0.5000000000000001,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 05:00:00+00:00,3000.0,,,,,,,,,,5,1,21,0.9659258262890683,0.25881904510252074,0.3536761221763716,0.9353679493131483,0.03207001304918669,0.0,3.0 +2026-01-21 06:00:00+00:00,4800.0,,,,,,,,,,6,1,21,1.0,6.123233995736766e-17,0.3536761221763716,0.9353679493131483,0.2264687216976625,,4.8 +2026-01-21 07:00:00+00:00,14800.0,,,,,,,,,,7,1,21,0.9659258262890683,-0.25881904510252063,0.3536761221763716,0.9353679493131483,0.393402677291799,,14.8 +2026-01-21 08:00:00+00:00,18700.0,,,,,,,,,,8,1,21,0.8660254037844387,-0.49999999999999983,0.3536761221763716,0.9353679493131483,0.5214956066292614,,18.7 +2026-01-21 09:00:00+00:00,24900.0,,,,,,,,,,9,1,21,0.7071067811865476,-0.7071067811865475,0.3536761221763716,0.9353679493131483,0.6020181882592759,,24.9 +2026-01-21 10:00:00+00:00,23000.0,,,,,,,,,,10,1,21,0.49999999999999994,-0.8660254037844387,0.3536761221763716,0.9353679493131483,0.6294829413136149,,23.0 +2026-01-21 11:00:00+00:00,24000.0,,,,,,,,,,11,1,21,0.258819045102521,-0.9659258262890682,0.3536761221763716,0.9353679493131483,0.6020181882592759,,24.0 +2026-01-21 12:00:00+00:00,10200.0,,,,,,,,,,12,1,21,1.2246467991473532e-16,-1.0,0.3536761221763716,0.9353679493131483,0.5214956066292614,,10.2 +2026-01-21 13:00:00+00:00,4100.0,,,,,,,,,,13,1,21,-0.2588190451025208,-0.9659258262890683,0.3536761221763716,0.9353679493131483,0.393402677291799,,4.1 +2026-01-21 14:00:00+00:00,1000.0,,,,,,,,,,14,1,21,-0.4999999999999998,-0.8660254037844388,0.3536761221763716,0.9353679493131483,0.2264687216976625,,1.0 +2026-01-21 15:00:00+00:00,100.0,,,,,,,,,,15,1,21,-0.7071067811865471,-0.7071067811865479,0.3536761221763716,0.9353679493131483,0.03207001304918669,0.0,0.1 +2026-01-21 16:00:00+00:00,0.0,,,,,,,,,,16,1,21,-0.8660254037844384,-0.5000000000000004,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 17:00:00+00:00,0.0,,,,,,,,,,17,1,21,-0.9659258262890683,-0.25881904510252063,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 18:00:00+00:00,0.0,,,,,,,,,,18,1,21,-1.0,-1.8369701987210297e-16,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 19:00:00+00:00,0.0,,,,,,,,,,19,1,21,-0.9659258262890684,0.2588190451025203,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 20:00:00+00:00,0.0,,,,,,,,,,20,1,21,-0.8660254037844386,0.5000000000000001,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 21:00:00+00:00,0.0,,,,,,,,,,21,1,21,-0.7071067811865477,0.7071067811865474,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 22:00:00+00:00,0.0,,,,,,,,,,22,1,21,-0.5000000000000004,0.8660254037844384,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-21 23:00:00+00:00,0.0,,,,,,,,,,23,1,21,-0.25881904510252157,0.9659258262890681,0.3536761221763716,0.9353679493131483,0.0,0.0,0.0 +2026-01-22 00:00:00+00:00,0.0,,,,,,,,,,0,1,22,0.0,1.0,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 01:00:00+00:00,0.0,,,,,,,,,,1,1,22,0.25881904510252074,0.9659258262890683,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 02:00:00+00:00,0.0,,,,,,,,,,2,1,22,0.49999999999999994,0.8660254037844387,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 03:00:00+00:00,0.0,,,,,,,,,,3,1,22,0.7071067811865475,0.7071067811865476,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 04:00:00+00:00,0.0,,,,,,,,,,4,1,22,0.8660254037844386,0.5000000000000001,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 05:00:00+00:00,1200.0,,,,,,,,,,5,1,22,0.9659258262890683,0.25881904510252074,0.3697245428906731,0.9291414114031743,0.034112851713539866,0.0,1.2 +2026-01-22 06:00:00+00:00,4200.0,,,,,,,,,,6,1,22,1.0,6.123233995736766e-17,0.3697245428906731,0.9291414114031743,0.2287712899021072,,4.2 +2026-01-22 07:00:00+00:00,4900.0,,,,,,,,,,7,1,22,0.9659258262890683,-0.25881904510252063,0.3697245428906731,0.9291414114031743,0.39592828030863303,,4.9 +2026-01-22 08:00:00+00:00,4800.0,,,,,,,,,,8,1,22,0.8660254037844387,-0.49999999999999983,0.3697245428906731,0.9291414114031743,0.5241923502769005,,4.8 +2026-01-22 09:00:00+00:00,11500.0,,,,,,,,-38.37336788617886,0.09311416371388452,9,1,22,0.7071067811865476,-0.7071067811865475,0.3697245428906731,0.9291414114031743,0.6048225154049698,,11.5 +2026-01-22 10:00:00+00:00,9100.0,,,,,,,,-38.37336788617886,0.09311416371388452,10,1,22,0.49999999999999994,-0.8660254037844387,0.3697245428906731,0.9291414114031743,0.6323239631870111,,9.1 +2026-01-22 11:00:00+00:00,5800.0,,,,,,,,-38.37336788617886,0.09311416371388452,11,1,22,0.258819045102521,-0.9659258262890682,0.3697245428906731,0.9291414114031743,0.6048225154049698,,5.8 +2026-01-22 12:00:00+00:00,3200.0,,,,,,,,-44.83421502474133,1.6896802917836855,12,1,22,1.2246467991473532e-16,-1.0,0.3697245428906731,0.9291414114031743,0.5241923502769005,,3.2 +2026-01-22 13:00:00+00:00,2400.0,,,,,,,,-50.696,0.01555634918610296,13,1,22,-0.2588190451025208,-0.9659258262890683,0.3697245428906731,0.9291414114031743,0.39592828030863303,,2.4 +2026-01-22 14:00:00+00:00,1100.0,,,,,,,,-72.29406565656565,1.0167392387426677,14,1,22,-0.4999999999999998,-0.8660254037844388,0.3697245428906731,0.9291414114031743,0.2287712899021072,,1.1 +2026-01-22 15:00:00+00:00,100.0,,,,,,,,-72.29214285714285,1.0164330419789267,15,1,22,-0.7071067811865471,-0.7071067811865479,0.3697245428906731,0.9291414114031743,0.034112851713539866,0.0,0.1 +2026-01-22 16:00:00+00:00,0.0,,,,,,,,-72.28163742690059,1.0158706347804458,16,1,22,-0.8660254037844384,-0.5000000000000004,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 17:00:00+00:00,0.0,,,,,,,,-72.28872222222222,1.0143892022807104,17,1,22,-0.9659258262890683,-0.25881904510252063,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 18:00:00+00:00,0.0,,,,,,,,-72.28872222222222,1.0143892022807104,18,1,22,-1.0,-1.8369701987210297e-16,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 19:00:00+00:00,0.0,,,,,,,,-72.36171296296295,1.038817439734574,19,1,22,-0.9659258262890684,0.2588190451025203,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 20:00:00+00:00,0.0,,,,,,,,-72.36171296296295,1.038817439734574,20,1,22,-0.8660254037844386,0.5000000000000001,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 21:00:00+00:00,0.0,,,,,,,,-72.36171296296295,1.038817439734574,21,1,22,-0.7071067811865477,0.7071067811865474,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 22:00:00+00:00,0.0,,,,,,,,-72.35971264367815,1.0415167803380483,22,1,22,-0.5000000000000004,0.8660254037844384,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-22 23:00:00+00:00,0.0,,,,,,,,-72.352898989899,1.0412839373777867,23,1,22,-0.25881904510252157,0.9659258262890681,0.3697245428906731,0.9291414114031743,0.0,0.0,0.0 +2026-01-23 00:00:00+00:00,0.0,,,,,,,,-72.352898989899,1.0412839373777867,0,1,23,0.0,1.0,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 01:00:00+00:00,0.0,,,,,,,,-72.352898989899,1.0412839373777867,1,1,23,0.25881904510252074,0.9659258262890683,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 02:00:00+00:00,0.0,,,,,,,,,,2,1,23,0.49999999999999994,0.8660254037844387,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 03:00:00+00:00,0.0,,,,,,,,,,3,1,23,0.7071067811865475,0.7071067811865476,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 04:00:00+00:00,0.0,,,,,,,,,,4,1,23,0.8660254037844386,0.5000000000000001,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 05:00:00+00:00,3300.0,,,,,,,,,,5,1,23,0.9659258262890683,0.25881904510252074,0.38566340624360707,0.9226395488404876,0.03621271109533006,0.0,3.3 +2026-01-23 06:00:00+00:00,8500.0,,,,,,,,,,6,1,23,1.0,6.123233995736766e-17,0.38566340624360707,0.9226395488404876,0.2311354678389689,,8.5 +2026-01-23 07:00:00+00:00,19800.0,,,,,,,,,,7,1,23,0.9659258262890683,-0.25881904510252063,0.38566340624360707,0.9226395488404876,0.39851943373438437,,19.8 +2026-01-23 08:00:00+00:00,24400.0,,,,,,,,,,8,1,23,0.8660254037844387,-0.49999999999999983,0.38566340624360707,0.9226395488404876,0.5269576681208866,,24.4 +2026-01-23 09:00:00+00:00,26300.0,,,,,,,,,,9,1,23,0.7071067811865476,-0.7071067811865475,0.38566340624360707,0.9226395488404876,0.6076973175792534,,26.3 +2026-01-23 10:00:00+00:00,26400.0,,,,,,,,,,10,1,23,0.49999999999999994,-0.8660254037844387,0.38566340624360707,0.9226395488404876,0.6352361084274766,,26.4 +2026-01-23 11:00:00+00:00,25600.0,,,,,,,,,,11,1,23,0.258819045102521,-0.9659258262890682,0.38566340624360707,0.9226395488404876,0.6076973175792534,,25.6 +2026-01-23 12:00:00+00:00,28800.0,,,,,,,,,,12,1,23,1.2246467991473532e-16,-1.0,0.38566340624360707,0.9226395488404876,0.5269576681208866,,28.8 +2026-01-23 13:00:00+00:00,25900.0,,,,,,,,,,13,1,23,-0.2588190451025208,-0.9659258262890683,0.38566340624360707,0.9226395488404876,0.39851943373438437,,25.9 +2026-01-23 14:00:00+00:00,8700.0,,,,,,,,,,14,1,23,-0.4999999999999998,-0.8660254037844388,0.38566340624360707,0.9226395488404876,0.2311354678389689,,8.7 +2026-01-23 15:00:00+00:00,200.0,,,,,,,,,,15,1,23,-0.7071067811865471,-0.7071067811865479,0.38566340624360707,0.9226395488404876,0.03621271109533006,0.0,0.2 +2026-01-23 16:00:00+00:00,0.0,,,,,,,,,,16,1,23,-0.8660254037844384,-0.5000000000000004,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 17:00:00+00:00,0.0,,,,,,,,,,17,1,23,-0.9659258262890683,-0.25881904510252063,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 18:00:00+00:00,0.0,,,,,,,,,,18,1,23,-1.0,-1.8369701987210297e-16,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 19:00:00+00:00,0.0,,,,,,,,,,19,1,23,-0.9659258262890684,0.2588190451025203,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 20:00:00+00:00,0.0,,,,,,,,,,20,1,23,-0.8660254037844386,0.5000000000000001,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 21:00:00+00:00,0.0,,,,,,,,,,21,1,23,-0.7071067811865477,0.7071067811865474,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 22:00:00+00:00,0.0,,,,,,,,,,22,1,23,-0.5000000000000004,0.8660254037844384,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-23 23:00:00+00:00,0.0,,,,,,,,,,23,1,23,-0.25881904510252157,0.9659258262890681,0.38566340624360707,0.9226395488404876,0.0,0.0,0.0 +2026-01-24 00:00:00+00:00,0.0,,,,,,,,,,0,1,24,0.0,1.0,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 01:00:00+00:00,0.0,,,,,,,,,,1,1,24,0.25881904510252074,0.9659258262890683,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 02:00:00+00:00,0.0,,,,,,,,,,2,1,24,0.49999999999999994,0.8660254037844387,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 03:00:00+00:00,0.0,,,,,,,,,,3,1,24,0.7071067811865475,0.7071067811865476,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 04:00:00+00:00,0.0,,,,,,,,,,4,1,24,0.8660254037844386,0.5000000000000001,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 05:00:00+00:00,4500.0,,,,,,,,,,5,1,24,0.9659258262890683,0.25881904510252074,0.401487989205973,0.9158642882672872,0.03836889846804731,0.0,4.5 +2026-01-24 06:00:00+00:00,13000.0,,,,,,,,,,6,1,24,1.0,6.123233995736766e-17,0.401487989205973,0.9158642882672872,0.2335602552109239,,13.0 +2026-01-24 07:00:00+00:00,20700.0,,,,,,,,,,7,1,24,0.9659258262890683,-0.25881904510252063,0.401487989205973,0.9158642882672872,0.40117487315468403,,20.7 +2026-01-24 08:00:00+00:00,26000.0,,,,,,,,,,8,1,24,0.8660254037844387,-0.49999999999999983,0.401487989205973,0.9158642882672872,0.5297900930827139,,26.0 +2026-01-24 09:00:00+00:00,28700.0,,,,,,,,,,9,1,24,0.7071067811865476,-0.7071067811865475,0.401487989205973,0.9158642882672872,0.6106410003036183,,28.7 +2026-01-24 10:00:00+00:00,28900.0,,,,,,,,,,10,1,24,0.49999999999999994,-0.8660254037844387,0.401487989205973,0.9158642882672872,0.6382177391027345,,28.9 +2026-01-24 11:00:00+00:00,28700.0,,,,,,,,,,11,1,24,0.258819045102521,-0.9659258262890682,0.401487989205973,0.9158642882672872,0.6106410003036183,,28.7 +2026-01-24 12:00:00+00:00,28600.0,,,,,,,,,,12,1,24,1.2246467991473532e-16,-1.0,0.401487989205973,0.9158642882672872,0.5297900930827139,,28.6 +2026-01-24 13:00:00+00:00,25700.0,,,,,,,,,,13,1,24,-0.2588190451025208,-0.9659258262890683,0.401487989205973,0.9158642882672872,0.40117487315468403,,25.7 +2026-01-24 14:00:00+00:00,9400.0,,,,,,,,,,14,1,24,-0.4999999999999998,-0.8660254037844388,0.401487989205973,0.9158642882672872,0.2335602552109239,,9.4 +2026-01-24 15:00:00+00:00,200.0,,,,,,,,,,15,1,24,-0.7071067811865471,-0.7071067811865479,0.401487989205973,0.9158642882672872,0.03836889846804731,0.0,0.2 +2026-01-24 16:00:00+00:00,0.0,,,,,,,,,,16,1,24,-0.8660254037844384,-0.5000000000000004,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 17:00:00+00:00,0.0,,,,,,,,,,17,1,24,-0.9659258262890683,-0.25881904510252063,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 18:00:00+00:00,0.0,,,,,,,,,,18,1,24,-1.0,-1.8369701987210297e-16,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 19:00:00+00:00,0.0,,,,,,,,,,19,1,24,-0.9659258262890684,0.2588190451025203,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 20:00:00+00:00,0.0,,,,,,,,,,20,1,24,-0.8660254037844386,0.5000000000000001,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 21:00:00+00:00,0.0,,,,,,,,,,21,1,24,-0.7071067811865477,0.7071067811865474,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 22:00:00+00:00,0.0,,,,,,,,,,22,1,24,-0.5000000000000004,0.8660254037844384,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-24 23:00:00+00:00,0.0,,,,,,,,,,23,1,24,-0.25881904510252157,0.9659258262890681,0.401487989205973,0.9158642882672872,0.0,0.0,0.0 +2026-01-25 00:00:00+00:00,0.0,,,,,,,,,,0,1,25,0.0,1.0,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 01:00:00+00:00,0.0,,,,,,,,,,1,1,25,0.25881904510252074,0.9659258262890683,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 02:00:00+00:00,0.0,,,,,,,,,,2,1,25,0.49999999999999994,0.8660254037844387,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 03:00:00+00:00,0.0,,,,,,,,,,3,1,25,0.7071067811865475,0.7071067811865476,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 04:00:00+00:00,0.0,,,,,,,,,,4,1,25,0.8660254037844386,0.5000000000000001,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 05:00:00+00:00,5800.0,,,,,,,,,,5,1,25,0.9659258262890683,0.25881904510252074,0.4171936026123168,0.9088176373395029,0.04058069879525647,0.0,5.8 +2026-01-25 06:00:00+00:00,14600.0,,,,,,,,,,6,1,25,1.0,6.123233995736766e-17,0.4171936026123168,0.9088176373395029,0.23604462400761989,,14.6 +2026-01-25 07:00:00+00:00,21800.0,,,,,,,,,,7,1,25,0.9659258262890683,-0.25881904510252063,0.4171936026123168,0.9088176373395029,0.40389330180238425,,21.8 +2026-01-25 08:00:00+00:00,27100.0,,,,,,,,,,8,1,25,0.8660254037844387,-0.49999999999999983,0.4171936026123168,0.9088176373395029,0.5326881221708919,,27.1 +2026-01-25 09:00:00+00:00,28800.0,,,,,,,,,,9,1,25,0.7071067811865476,-0.7071067811865475,0.4171936026123168,0.9088176373395029,0.6136519309485331,,28.8 +2026-01-25 10:00:00+00:00,28900.0,,,,,,,,,,10,1,25,0.49999999999999994,-0.8660254037844387,0.4171936026123168,0.9088176373395029,0.6412671783661319,,28.9 +2026-01-25 11:00:00+00:00,28800.0,,,,,,,,,,11,1,25,0.258819045102521,-0.9659258262890682,0.4171936026123168,0.9088176373395029,0.6136519309485331,,28.8 +2026-01-25 12:00:00+00:00,28700.0,,,,,,,,,,12,1,25,1.2246467991473532e-16,-1.0,0.4171936026123168,0.9088176373395029,0.5326881221708919,,28.7 +2026-01-25 13:00:00+00:00,28300.0,,,,,,,,,,13,1,25,-0.2588190451025208,-0.9659258262890683,0.4171936026123168,0.9088176373395029,0.40389330180238425,,28.3 +2026-01-25 14:00:00+00:00,14200.0,,,,,,,,,,14,1,25,-0.4999999999999998,-0.8660254037844388,0.4171936026123168,0.9088176373395029,0.23604462400761989,,14.2 +2026-01-25 15:00:00+00:00,200.0,,,,,,,,-72.37693693693693,1.096084882496429,15,1,25,-0.7071067811865471,-0.7071067811865479,0.4171936026123168,0.9088176373395029,0.04058069879525647,0.0,0.2 +2026-01-25 16:00:00+00:00,0.0,,,,,,,,-72.37693693693693,1.096084882496429,16,1,25,-0.8660254037844384,-0.5000000000000004,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 17:00:00+00:00,0.0,,,,,,,,-72.37693693693693,1.096084882496429,17,1,25,-0.9659258262890683,-0.25881904510252063,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 18:00:00+00:00,0.0,,,,,,,,-72.37551724137931,1.095556111127048,18,1,25,-1.0,-1.8369701987210297e-16,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 19:00:00+00:00,0.0,,,,,,,,-72.36287069299266,1.0965781798115815,19,1,25,-0.9659258262890684,0.2588190451025203,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 20:00:00+00:00,0.0,,,,,,,,-72.38541666666667,1.0979991272006213,20,1,25,-0.8660254037844386,0.5000000000000001,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 21:00:00+00:00,0.0,,,,,,,,-72.38541666666667,1.0979991272006213,21,1,25,-0.7071067811865477,0.7071067811865474,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 22:00:00+00:00,0.0,,,,,,,,-72.38541666666667,1.0979991272006213,22,1,25,-0.5000000000000004,0.8660254037844384,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-25 23:00:00+00:00,0.0,,,,,,,,-72.38183908045977,1.101107016916669,23,1,25,-0.25881904510252157,0.9659258262890681,0.4171936026123168,0.9088176373395029,0.0,0.0,0.0 +2026-01-26 00:00:00+00:00,0.0,,,,,,,,-72.35826826826826,1.0967998684304614,0,1,26,0.0,1.0,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 01:00:00+00:00,0.0,,,,,,,,-72.35826826826826,1.0967998684304614,1,1,26,0.25881904510252074,0.9659258262890683,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 02:00:00+00:00,0.0,,,,,,,,-72.35826826826826,1.0967998684304614,2,1,26,0.49999999999999994,0.8660254037844387,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 03:00:00+00:00,0.0,,,,,,,,,,3,1,26,0.7071067811865475,0.7071067811865476,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 04:00:00+00:00,100.0,,,,,,,,,,4,1,26,0.8660254037844386,0.5000000000000001,0.4327755925504312,0.901501684131884,0.0,0.0,0.1 +2026-01-26 05:00:00+00:00,7900.0,,,,,,,,,,5,1,26,0.9659258262890683,0.25881904510252074,0.4327755925504312,0.901501684131884,0.0428473747508864,0.0,7.9 +2026-01-26 06:00:00+00:00,15500.0,,,,,,,,,,6,1,26,1.0,6.123233995736766e-17,0.4327755925504312,0.901501684131884,0.23858751887136784,,15.5 +2026-01-26 07:00:00+00:00,21500.0,,,,,,,,,,7,1,26,0.9659258262890683,-0.25881904510252063,0.4327755925504312,0.901501684131884,0.40667339121985435,,21.5 +2026-01-26 08:00:00+00:00,26600.0,,,,,,,,,,8,1,26,0.8660254037844387,-0.49999999999999983,0.4327755925504312,0.901501684131884,0.5356502173708346,,26.6 +2026-01-26 09:00:00+00:00,28600.0,,,,,,,,,,9,1,26,0.7071067811865476,-0.7071067811865475,0.4327755925504312,0.901501684131884,0.6167284397664022,,28.6 +2026-01-26 10:00:00+00:00,26400.0,,,,,,,,,,10,1,26,0.49999999999999994,-0.8660254037844387,0.4327755925504312,0.901501684131884,0.6443827115383969,,26.4 +2026-01-26 11:00:00+00:00,26000.0,,,,,,,,,,11,1,26,0.258819045102521,-0.9659258262890682,0.4327755925504312,0.901501684131884,0.6167284397664022,,26.0 +2026-01-26 12:00:00+00:00,17000.0,,,,,,,,,,12,1,26,1.2246467991473532e-16,-1.0,0.4327755925504312,0.901501684131884,0.5356502173708346,,17.0 +2026-01-26 13:00:00+00:00,12100.0,,,,,,,,,,13,1,26,-0.2588190451025208,-0.9659258262890683,0.4327755925504312,0.901501684131884,0.40667339121985435,,12.1 +2026-01-26 14:00:00+00:00,16200.0,,,,,,,,,,14,1,26,-0.4999999999999998,-0.8660254037844388,0.4327755925504312,0.901501684131884,0.23858751887136784,,16.2 +2026-01-26 15:00:00+00:00,300.0,,,,,,,,,,15,1,26,-0.7071067811865471,-0.7071067811865479,0.4327755925504312,0.901501684131884,0.0428473747508864,0.0,0.3 +2026-01-26 16:00:00+00:00,0.0,,,,,,,,,,16,1,26,-0.8660254037844384,-0.5000000000000004,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 17:00:00+00:00,0.0,,,,,,,,,,17,1,26,-0.9659258262890683,-0.25881904510252063,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 18:00:00+00:00,0.0,,,,,,,,,,18,1,26,-1.0,-1.8369701987210297e-16,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 19:00:00+00:00,0.0,,,,,,,,,,19,1,26,-0.9659258262890684,0.2588190451025203,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 20:00:00+00:00,0.0,,,,,,,,-72.30375,0.9744541741405801,20,1,26,-0.8660254037844386,0.5000000000000001,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 21:00:00+00:00,0.0,,,,,,,,-72.30375,0.9744541741405801,21,1,26,-0.7071067811865477,0.7071067811865474,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 22:00:00+00:00,0.0,,,,,,,,-72.30375,0.9744541741405801,22,1,26,-0.5000000000000004,0.8660254037844384,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-26 23:00:00+00:00,0.0,,,,,,,,-72.30373446327684,0.9751160657400043,23,1,26,-0.25881904510252157,0.9659258262890681,0.4327755925504312,0.901501684131884,0.0,0.0,0.0 +2026-01-27 00:00:00+00:00,0.0,,,,,,,,-72.2996551724138,0.9747006461390179,0,1,27,0.0,1.0,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 01:00:00+00:00,0.0,,,,,,,,-72.30226176292842,0.9760542714732781,1,1,27,0.25881904510252074,0.9659258262890683,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 02:00:00+00:00,0.0,,,,,,,,-72.33016358024692,0.9794953049901381,2,1,27,0.49999999999999994,0.8660254037844387,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 03:00:00+00:00,0.0,,,,,,,,-72.33058166248956,0.9835470558122349,3,1,27,0.7071067811865475,0.7071067811865476,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 04:00:00+00:00,0.0,,,,,,,,-34.54591954022988,1.4411994855997219,4,1,27,0.8660254037844386,0.5000000000000001,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 05:00:00+00:00,2100.0,,,,,,,,57.46793103448277,0.7926943660120523,5,1,27,0.9659258262890683,0.25881904510252074,0.4482293417404106,0.893918596519257,0.045168166756369754,0.0,2.1 +2026-01-27 06:00:00+00:00,13400.0,,,,,,,,18.112634307359304,0.12656955664423944,6,1,27,1.0,6.123233995736766e-17,0.4482293417404106,0.893918596519257,0.24118785748733496,,13.4 +2026-01-27 07:00:00+00:00,20000.0,,,,,,,,-8.110233918128655,0.016590132060633585,7,1,27,0.9659258262890683,-0.25881904510252063,0.4482293417404106,0.893918596519257,0.4095137819523475,,20.0 +2026-01-27 08:00:00+00:00,26200.0,,,,,,,,-24.18779866332498,0.05141812504948293,8,1,27,0.8660254037844387,-0.49999999999999983,0.4482293417404106,0.893918596519257,0.5386748065708595,,26.2 +2026-01-27 09:00:00+00:00,28700.0,,,,,,,,-35.28964912280702,0.018688122479855615,9,1,27,0.7071067811865476,-0.7071067811865475,0.4482293417404106,0.893918596519257,0.619868820963805,,28.7 +2026-01-27 10:00:00+00:00,28900.0,,,,,,,,-44.379193817878026,0.05059073450526423,10,1,27,0.49999999999999994,-0.8660254037844387,0.4482293417404106,0.893918596519257,0.6475625872297575,,28.9 +2026-01-27 11:00:00+00:00,28800.0,,,,,,,,-52.99172413793104,0.017207725776441005,11,1,27,0.258819045102521,-0.9659258262890682,0.4482293417404106,0.893918596519257,0.619868820963805,,28.8 +2026-01-27 12:00:00+00:00,28700.0,,,,,,,,-61.681754385964915,0.004427869987414683,12,1,27,1.2246467991473532e-16,-1.0,0.4482293417404106,0.893918596519257,0.5386748065708595,,28.7 +2026-01-27 13:00:00+00:00,27200.0,,,,,,,,-70.29013636363636,0.38764347784998376,13,1,27,-0.2588190451025208,-0.9659258262890683,0.4482293417404106,0.893918596519257,0.4095137819523475,,27.2 +2026-01-27 14:00:00+00:00,10700.0,,,,,,,,-72.50913793103449,1.0464242381023037,14,1,27,-0.4999999999999998,-0.8660254037844388,0.4482293417404106,0.893918596519257,0.24118785748733496,,10.7 +2026-01-27 15:00:00+00:00,200.0,,,,,,,,-72.52742690058479,1.053168289098476,15,1,27,-0.7071067811865471,-0.7071067811865479,0.4482293417404106,0.893918596519257,0.045168166756369754,0.0,0.2 +2026-01-27 16:00:00+00:00,0.0,,,,,,,,-72.48384085213031,1.0454717601205104,16,1,27,-0.8660254037844384,-0.5000000000000004,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 17:00:00+00:00,0.0,,,,,,,,-72.47532163742692,1.0418322392265016,17,1,27,-0.9659258262890683,-0.25881904510252063,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 18:00:00+00:00,0.0,,,,,,,,-72.47979218880535,1.04316932949026,18,1,27,-1.0,-1.8369701987210297e-16,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 19:00:00+00:00,0.0,,,,,,,,-72.47436363636363,1.0419090393508417,19,1,27,-0.9659258262890684,0.2588190451025203,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 20:00:00+00:00,0.0,,,,,,,,-72.47576545530494,1.0467238298781716,20,1,27,-0.8660254037844386,0.5000000000000001,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 21:00:00+00:00,0.0,,,,,,,,-72.45332359307359,1.043278095364469,21,1,27,-0.7071067811865477,0.7071067811865474,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 22:00:00+00:00,0.0,,,,,,,,-72.4369590643275,1.038543655800065,22,1,27,-0.5000000000000004,0.8660254037844384,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-27 23:00:00+00:00,0.0,,,,,,,,-72.46413793103447,1.0413176077861008,23,1,27,-0.25881904510252157,0.9659258262890681,0.4482293417404106,0.893918596519257,0.0,0.0,0.0 +2026-01-28 00:00:00+00:00,0.0,,,,,,,,-72.52369696969697,1.0573058907224844,0,1,28,0.0,1.0,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 01:00:00+00:00,0.0,,,,,,,,-72.51249458874459,1.0516638658256696,1,1,28,0.25881904510252074,0.9659258262890683,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 02:00:00+00:00,0.0,,,,,,,,-72.52207289055973,1.055293477367482,2,1,28,0.49999999999999994,0.8660254037844387,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 03:00:00+00:00,0.0,,,,,,,,-72.53059001670844,1.0579932712907343,3,1,28,0.7071067811865475,0.7071067811865476,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 04:00:00+00:00,0.0,,,,,,,,-34.39435692640692,1.6940283901334987,4,1,28,0.8660254037844386,0.5000000000000001,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 05:00:00+00:00,3300.0,,,,,,,,57.663084795321645,0.8192048759639464,5,1,28,0.9659258262890683,0.25881904510252074,0.4635502709028509,0.886070621534138,0.04754229303562224,0.0,3.3 +2026-01-28 06:00:00+00:00,11700.0,,,,,,,,19.01298275862069,0.024968178320742954,6,1,28,1.0,6.123233995736766e-17,0.4635502709028509,0.886070621534138,0.24384453099892314,,11.7 +2026-01-28 07:00:00+00:00,20500.0,,,,,,,,-7.767555555555556,0.022163890045645857,7,1,28,0.9659258262890683,-0.25881904510252063,0.4635502709028509,0.886070621534138,0.41241308427286083,,20.5 +2026-01-28 08:00:00+00:00,24800.0,,,,,,,,-23.84138888888889,0.04931791479793507,8,1,28,0.8660254037844387,-0.49999999999999983,0.4635502709028509,0.886070621534138,0.5417602845245224,,24.8 +2026-01-28 09:00:00+00:00,27400.0,,,,,,,,-34.99912280701754,0.012470957335122065,9,1,28,0.7071067811865476,-0.7071067811865475,0.4635502709028509,0.886070621534138,0.6230713338131122,,27.4 +2026-01-28 10:00:00+00:00,24300.0,,,,,,,,-44.313878787878785,0.0148628254806126,10,1,28,0.49999999999999994,-0.8660254037844387,0.4635502709028509,0.886070621534138,0.6508050185024752,,24.3 +2026-01-28 11:00:00+00:00,23900.0,,,,,,,,-52.72865497076023,0.00844356153555045,11,1,28,0.258819045102521,-0.9659258262890682,0.4635502709028509,0.886070621534138,0.6230713338131122,,23.9 +2026-01-28 12:00:00+00:00,15300.0,,,,,,,,-61.375093984962405,0.032121233327891394,12,1,28,1.2246467991473532e-16,-1.0,0.4635502709028509,0.886070621534138,0.5417602845245224,,15.3 +2026-01-28 13:00:00+00:00,13700.0,,,,,,,,-70.16608187134504,0.3325485837930223,13,1,28,-0.2588190451025208,-0.9659258262890683,0.4635502709028509,0.886070621534138,0.41241308427286083,,13.7 +2026-01-28 14:00:00+00:00,3100.0,,,,,,,,-72.30616645781119,0.9109960375655023,14,1,28,-0.4999999999999998,-0.8660254037844388,0.4635502709028509,0.886070621534138,0.24384453099892314,,3.1 +2026-01-28 15:00:00+00:00,200.0,,,,,,,,-72.29713450292398,0.9108322565709526,15,1,28,-0.7071067811865471,-0.7071067811865479,0.4635502709028509,0.886070621534138,0.04754229303562224,0.0,0.2 +2026-01-28 16:00:00+00:00,0.0,,,,,,,,-72.2883312447786,0.9073814926045729,16,1,28,-0.8660254037844384,-0.5000000000000004,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 17:00:00+00:00,0.0,,,,,,,,-72.28736006683374,0.907318672466039,17,1,28,-0.9659258262890683,-0.25881904510252063,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 18:00:00+00:00,0.0,,,,,,,,-72.27896825396824,0.9071056214496755,18,1,28,-1.0,-1.8369701987210297e-16,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 19:00:00+00:00,0.0,,,,,,,,-72.27896825396824,0.9071056214496755,19,1,28,-0.9659258262890684,0.2588190451025203,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 20:00:00+00:00,0.0,,,,,,,,-72.27896825396824,0.9071056214496755,20,1,28,-0.8660254037844386,0.5000000000000001,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 21:00:00+00:00,0.0,,,,,,,,,,21,1,28,-0.7071067811865477,0.7071067811865474,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 22:00:00+00:00,0.0,,,,,,,,,,22,1,28,-0.5000000000000004,0.8660254037844384,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-28 23:00:00+00:00,0.0,,,,,,,,,,23,1,28,-0.25881904510252157,0.9659258262890681,0.4635502709028509,0.886070621534138,0.0,0.0,0.0 +2026-01-29 00:00:00+00:00,0.0,,,,,,,,,,0,1,29,0.0,1.0,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 01:00:00+00:00,0.0,,,,,,,,,,1,1,29,0.25881904510252074,0.9659258262890683,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 02:00:00+00:00,0.0,,,,,,,,,,2,1,29,0.49999999999999994,0.8660254037844387,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 03:00:00+00:00,0.0,,,,,,,,39.33638888888889,0.24388683243881248,3,1,29,0.7071067811865475,0.7071067811865476,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 04:00:00+00:00,100.0,,,,,,,,39.33638888888889,0.24388683243881248,4,1,29,0.8660254037844386,0.5000000000000001,0.47873384011578846,0.8779600847008882,0.0,0.0,0.1 +2026-01-29 05:00:00+00:00,6600.0,,,,,,,,39.33638888888889,0.24388683243881248,5,1,29,0.9659258262890683,0.25881904510252074,0.47873384011578846,0.8779600847008882,0.04996894968882021,0.0,6.6 +2026-01-29 06:00:00+00:00,16700.0,,,,,,,,19.700337719862716,2.0072191981525176,6,1,29,1.0,6.123233995736766e-17,0.47873384011578846,0.8779600847008882,0.24655640444897084,,16.7 +2026-01-29 07:00:00+00:00,20200.0,,,,,,,,-4.849504641909814,4.011937153231607,7,1,29,0.9659258262890683,-0.25881904510252063,0.47873384011578846,0.8779600847008882,0.415369878938852,,20.2 +2026-01-29 08:00:00+00:00,16700.0,,,,,,,,-20.22659523809524,5.715367675941925,8,1,29,0.8660254037844387,-0.49999999999999983,0.47873384011578846,0.8779600847008882,0.5449050138494356,,16.7 +2026-01-29 09:00:00+00:00,24900.0,,,,,,,,-31.588749999999997,5.826855145395043,9,1,29,0.7071067811865476,-0.7071067811865475,0.47873384011578846,0.8779600847008882,0.6263342038034972,,24.9 +2026-01-29 10:00:00+00:00,26200.0,,,,,,,,-40.65014423076923,6.402890687508912,10,1,29,0.49999999999999994,-0.8660254037844387,0.47873384011578846,0.8779600847008882,0.6541081840737665,,26.2 +2026-01-29 11:00:00+00:00,28800.0,,,,,,,,-48.38932967032967,8.289330151384508,11,1,29,0.258819045102521,-0.9659258262890682,0.47873384011578846,0.8779600847008882,0.6263342038034972,,28.8 +2026-01-29 12:00:00+00:00,28700.0,,,,,,,,-56.63221794871795,9.544126486454209,12,1,29,1.2246467991473532e-16,-1.0,0.47873384011578846,0.8779600847008882,0.5449050138494356,,28.7 +2026-01-29 13:00:00+00:00,25200.0,,,,,,,,-65.308125,7.959768147999502,13,1,29,-0.2588190451025208,-0.9659258262890683,0.47873384011578846,0.8779600847008882,0.415369878938852,,25.2 +2026-01-29 14:00:00+00:00,14900.0,,,,,,,,-63.075041666666664,18.664399922081316,14,1,29,-0.4999999999999998,-0.8660254037844388,0.47873384011578846,0.8779600847008882,0.24655640444897084,,14.9 +2026-01-29 15:00:00+00:00,200.0,,,,,,,,-54.47208333333333,36.110907006901826,15,1,29,-0.7071067811865471,-0.7071067811865479,0.47873384011578846,0.8779600847008882,0.04996894968882021,0.0,0.2 +2026-01-29 16:00:00+00:00,0.0,,,,,,,,-54.0665,36.83617144194005,16,1,29,-0.8660254037844384,-0.5000000000000004,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 17:00:00+00:00,0.0,,,,,,,,-54.051624999999994,36.830781122079124,17,1,29,-0.9659258262890683,-0.25881904510252063,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 18:00:00+00:00,0.0,,,,,,,,-54.05499999999999,36.83406462320804,18,1,29,-1.0,-1.8369701987210297e-16,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 19:00:00+00:00,0.0,,,,,,,,-54.04645833333333,36.83177074598399,19,1,29,-0.9659258262890684,0.2588190451025203,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 20:00:00+00:00,0.0,,,,,,,,-54.044125,36.83431812041365,20,1,29,-0.8660254037844386,0.5000000000000001,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 21:00:00+00:00,0.0,,,,,,,,-54.03668749999999,36.829147259009545,21,1,29,-0.7071067811865477,0.7071067811865474,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 22:00:00+00:00,0.0,,,,,,,,-54.03462499999999,36.833270791896375,22,1,29,-0.5000000000000004,0.8660254037844384,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-29 23:00:00+00:00,0.0,,,,,,,,-54.03370833333333,36.830643702798625,23,1,29,-0.25881904510252157,0.9659258262890681,0.47873384011578846,0.8779600847008882,0.0,0.0,0.0 +2026-01-30 00:00:00+00:00,0.0,,,,,,,,-54.04045833333333,36.82711806922614,0,1,30,0.0,1.0,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 01:00:00+00:00,0.0,,,,,,,,-54.046375,36.83311077317752,1,1,30,0.25881904510252074,0.9659258262890683,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 02:00:00+00:00,0.0,,,,,,,,-54.04645833333333,36.831806720343245,2,1,30,0.49999999999999994,0.8660254037844387,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 03:00:00+00:00,0.0,,,,,,,,-50.70795833333334,43.50310704428989,3,1,30,0.7071067811865475,0.7071067811865476,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 04:00:00+00:00,200.0,,,,,,,,6.42912843137255,22.44935336287165,4,1,30,0.8660254037844386,0.5000000000000001,0.4937755501599772,0.869589389346611,0.0,0.0,0.2 +2026-01-30 05:00:00+00:00,5100.0,,,,,,,,51.050051948051944,6.1043046456416405,5,1,30,0.9659258262890683,0.25881904510252074,0.4937755501599772,0.869589389346611,0.05244731078590556,,5.1 +2026-01-30 06:00:00+00:00,14100.0,,,,,,,,21.934007341269844,2.753450304387948,6,1,30,1.0,6.123233995736766e-17,0.4937755501599772,0.869589389346611,0.2493223172473693,,14.1 +2026-01-30 07:00:00+00:00,19600.0,,,,,,,,-4.3956152828652835,3.3341569431119273,7,1,30,0.9659258262890683,-0.25881904510252063,0.4937755501599772,0.869589389346611,0.41838271798111154,,19.6 +2026-01-30 08:00:00+00:00,26100.0,,,,,,,,-20.244006787802842,4.49458579275494,8,1,30,0.8660254037844387,-0.49999999999999983,0.4937755501599772,0.869589389346611,0.5481073260626501,,26.1 +2026-01-30 09:00:00+00:00,28500.0,,,,,,,,-31.52055208333333,5.083028835754324,9,1,30,0.7071067811865476,-0.7071067811865475,0.4937755501599772,0.869589389346611,0.6296556238312789,,28.5 +2026-01-30 10:00:00+00:00,26500.0,,,,,,,,-41.16714285714286,5.105046622745785,10,1,30,0.49999999999999994,-0.8660254037844387,0.4937755501599772,0.869589389346611,0.6574702295590003,,26.5 +2026-01-30 11:00:00+00:00,28800.0,,,,,,,,-49.42115384615385,6.054146596636491,11,1,30,0.258819045102521,-0.9659258262890682,0.4937755501599772,0.869589389346611,0.6296556238312789,,28.8 +2026-01-30 12:00:00+00:00,28200.0,,,,,,,,-56.816250000000004,8.239220815790807,12,1,30,1.2246467991473532e-16,-1.0,0.4937755501599772,0.869589389346611,0.5481073260626501,,28.2 +2026-01-30 13:00:00+00:00,18400.0,,,,,,,,-65.64973484848485,7.018475422121126,13,1,30,-0.2588190451025208,-0.9659258262890683,0.4937755501599772,0.869589389346611,0.41838271798111154,,18.4 +2026-01-30 14:00:00+00:00,6700.0,,,,,,,,-63.29887500000001,17.98233443491603,14,1,30,-0.4999999999999998,-0.8660254037844388,0.4937755501599772,0.869589389346611,0.2493223172473693,,6.7 +2026-01-30 15:00:00+00:00,200.0,,,,,,,,-54.551050000000004,35.646604614979346,15,1,30,-0.7071067811865471,-0.7071067811865479,0.4937755501599772,0.869589389346611,0.05244731078590556,,0.2 +2026-01-30 16:00:00+00:00,0.0,,,,,,,,-54.23579166666667,36.28456069107054,16,1,30,-0.8660254037844384,-0.5000000000000004,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 17:00:00+00:00,0.0,,,,,,,,-54.222854166666664,36.270805459710715,17,1,30,-0.9659258262890683,-0.25881904510252063,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 18:00:00+00:00,0.0,,,,,,,,-54.207812499999996,36.268148623238154,18,1,30,-1.0,-1.8369701987210297e-16,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 19:00:00+00:00,0.0,,,,,,,,-54.18920833333333,36.26418088534087,19,1,30,-0.9659258262890684,0.2588190451025203,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 20:00:00+00:00,0.0,,,,,,,,-54.17808333333334,36.264691528246715,20,1,30,-0.8660254037844386,0.5000000000000001,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 21:00:00+00:00,0.0,,,,,,,,-54.167541666666665,36.26123362346948,21,1,30,-0.7071067811865477,0.7071067811865474,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 22:00:00+00:00,0.0,,,,,,,,-54.158187500000004,36.260605819409925,22,1,30,-0.5000000000000004,0.8660254037844384,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-30 23:00:00+00:00,0.0,,,,,,,,-54.14845833333333,36.25882422951611,23,1,30,-0.25881904510252157,0.9659258262890681,0.4937755501599772,0.869589389346611,0.0,0.0,0.0 +2026-01-31 00:00:00+00:00,0.0,,,,,,,,-54.149812499999996,36.262285310966796,0,1,31,0.0,1.0,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 01:00:00+00:00,0.0,,,,,,,,-54.141312500000005,36.25925114446369,1,1,31,0.25881904510252074,0.9659258262890683,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 02:00:00+00:00,0.0,,,,,,,,-54.13693750000001,36.25625638560824,2,1,31,0.49999999999999994,0.8660254037844387,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 03:00:00+00:00,0.0,,,,,,,,-49.919625,44.68431789299798,3,1,31,0.7071067811865475,0.7071067811865476,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 04:00:00+00:00,100.0,,,,,,,,3.855159722222222,24.087680769793444,4,1,31,0.8660254037844386,0.5000000000000001,0.5086709438521044,0.8609610158889943,0.0,0.0,0.1 +2026-01-31 05:00:00+00:00,7300.0,,,,,,,,51.741754416282646,6.652434426689923,5,1,31,0.9659258262890683,0.25881904510252074,0.5086709438521044,0.8609610158889943,0.05497652848070925,,7.3 +2026-01-31 06:00:00+00:00,16100.0,,,,,,,,21.742008870433725,2.683957533012658,6,1,31,1.0,6.123233995736766e-17,0.5086709438521044,0.8609610158889943,0.2521410836656294,,16.1 +2026-01-31 07:00:00+00:00,22300.0,,,,,,,,-4.009107692307692,3.562028338125301,7,1,31,0.9659258262890683,-0.25881904510252063,0.5086709438521044,0.8609610158889943,0.4214501255250244,,22.3 +2026-01-31 08:00:00+00:00,26800.0,,,,,,,,-19.7400548245614,5.2569371640619025,8,1,31,0.8660254037844387,-0.49999999999999983,0.5086709438521044,0.8609610158889943,0.5513655226525978,,26.8 +2026-01-31 09:00:00+00:00,28900.0,,,,,,,,-31.530437499999998,5.064885624062794,9,1,31,0.7071067811865476,-0.7071067811865475,0.5086709438521044,0.8609610158889943,0.6330337554294503,,28.9 +2026-01-31 10:00:00+00:00,28800.0,,,,,,,,-40.55296703296703,5.643400002421269,10,1,31,0.49999999999999994,-0.8660254037844387,0.5086709438521044,0.8609610158889943,0.660889268754975,,28.8 +2026-01-31 11:00:00+00:00,28700.0,,,,,,,,-48.33550274725275,7.560243475837902,11,1,31,0.258819045102521,-0.9659258262890682,0.5086709438521044,0.8609610158889943,0.6330337554294503,,28.7 +2026-01-31 12:00:00+00:00,26800.0,,,,,,,,-56.39920787545787,8.615317569507699,12,1,31,1.2246467991473532e-16,-1.0,0.5086709438521044,0.8609610158889943,0.5513655226525978,,26.8 +2026-01-31 13:00:00+00:00,15500.0,,,,,,,,-64.89703525641025,8.081289271336804,13,1,31,-0.2588190451025208,-0.9659258262890683,0.5086709438521044,0.8609610158889943,0.4214501255250244,,15.5 +2026-01-31 14:00:00+00:00,3600.0,,,,,,,,-63.824015151515155,16.920611298295018,14,1,31,-0.4999999999999998,-0.8660254037844388,0.5086709438521044,0.8609610158889943,0.2521410836656294,,3.6 +2026-01-31 15:00:00+00:00,300.0,,,,,,,,-54.521274999999996,35.76321517755127,15,1,31,-0.7071067811865471,-0.7071067811865479,0.5086709438521044,0.8609610158889943,0.05497652848070925,,0.3 +2026-01-31 16:00:00+00:00,0.0,,,,,,,,-54.24133333333333,36.338356000696194,16,1,31,-0.8660254037844384,-0.5000000000000004,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 17:00:00+00:00,0.0,,,,,,,,-54.232375,36.3346247472774,17,1,31,-0.9659258262890683,-0.25881904510252063,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 18:00:00+00:00,0.0,,,,,,,,-54.225375,36.33198436725553,18,1,31,-1.0,-1.8369701987210297e-16,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 19:00:00+00:00,0.0,,,,,,,,-54.21670833333333,36.3292830006357,19,1,31,-0.9659258262890684,0.2588190451025203,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 20:00:00+00:00,0.0,,,,,,,,-54.2086875,36.32529287297339,20,1,31,-0.8660254037844386,0.5000000000000001,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 21:00:00+00:00,0.0,,,,,,,,-54.198,36.318311406333414,21,1,31,-0.7071067811865477,0.7071067811865474,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 22:00:00+00:00,0.0,,,,,,,,-54.18895833333333,36.31803542863839,22,1,31,-0.5000000000000004,0.8660254037844384,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-01-31 23:00:00+00:00,0.0,,,,,,,,-54.183458333333334,36.31279830715106,23,1,31,-0.25881904510252157,0.9659258262890681,0.5086709438521044,0.8609610158889943,0.0,0.0,0.0 +2026-02-01 00:00:00+00:00,0.0,,,,,,,,-54.183625,36.317030991843204,0,2,32,0.0,1.0,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 01:00:00+00:00,0.0,,,,,,,,-54.177145833333334,36.31718956639867,1,2,32,0.25881904510252074,0.9659258262890683,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 02:00:00+00:00,0.0,,,,,,,,-54.17695833333333,36.31861399943943,2,2,32,0.49999999999999994,0.8660254037844387,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 03:00:00+00:00,0.0,,,,,,,,-50.6565,43.32279504572707,3,2,32,0.7071067811865475,0.7071067811865476,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 04:00:00+00:00,100.0,,,,,,,,6.153147549019607,22.545681626469307,4,2,32,0.8660254037844386,0.5000000000000001,0.5234156073655503,0.8520775211013093,0.0,0.0,0.1 +2026-02-01 05:00:00+00:00,7000.0,,,,,,,,51.40056919642856,6.223255368256037,5,2,32,0.9659258262890683,0.25881904510252074,0.5234156073655503,0.8520775211013093,0.05755573314654558,,7.0 +2026-02-01 06:00:00+00:00,16100.0,,,,,,,,23.954983620255714,4.626605025237609,6,2,32,1.0,6.123233995736766e-17,0.5234156073655503,0.8520775211013093,0.2550114933588788,,16.1 +2026-02-01 07:00:00+00:00,22300.0,,,,,,,,-3.4182583333333327,4.308566518937111,7,2,32,0.9659258262890683,-0.25881904510252063,0.5234156073655503,0.8520775211013093,0.4245705986443785,,22.3 +2026-02-01 08:00:00+00:00,27300.0,,,,,,,,-19.142494736842107,5.434171544783511,8,2,32,0.8660254037844387,-0.49999999999999983,0.5234156073655503,0.8520775211013093,0.5546778761875085,,27.3 +2026-02-01 09:00:00+00:00,28800.0,,,,,,,,-30.389039682539682,6.42697975202429,9,2,32,0.7071067811865476,-0.7071067811865475,0.5234156073655503,0.8520775211013093,0.6364667300361466,,28.8 +2026-02-01 10:00:00+00:00,28700.0,,,,,,,,-38.8376913919414,8.628378955191222,10,2,32,0.49999999999999994,-0.8660254037844387,0.5234156073655503,0.8520775211013093,0.6643633849629799,,28.7 +2026-02-01 11:00:00+00:00,28700.0,,,,,,,,-47.88897435897436,7.615938479707734,11,2,32,0.258819045102521,-0.9659258262890682,0.5234156073655503,0.8520775211013093,0.6364667300361466,,28.7 +2026-02-01 12:00:00+00:00,30200.0,,,,,,,,-55.958035714285714,9.049204655076368,12,2,32,1.2246467991473532e-16,-1.0,0.5234156073655503,0.8520775211013093,0.5546778761875085,,30.2 +2026-02-01 13:00:00+00:00,16300.0,,,,,,,,-64.8053111888112,8.068018683648269,13,2,32,-0.2588190451025208,-0.9659258262890683,0.5234156073655503,0.8520775211013093,0.4245705986443785,,16.3 +2026-02-01 14:00:00+00:00,2100.0,,,,,,,,-65.23868055555556,14.182822618459893,14,2,32,-0.4999999999999998,-0.8660254037844388,0.5234156073655503,0.8520775211013093,0.2550114933588788,,2.1 +2026-02-01 15:00:00+00:00,100.0,,,,,,,,-55.69095833333333,33.560772018659314,15,2,32,-0.7071067811865471,-0.7071067811865479,0.5234156073655503,0.8520775211013093,0.05755573314654558,,0.1 +2026-02-01 16:00:00+00:00,0.0,,,,,,,,-54.297250000000005,36.40014684379721,16,2,32,-0.8660254037844384,-0.5000000000000004,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 17:00:00+00:00,0.0,,,,,,,,-54.294124999999994,36.3987819228873,17,2,32,-0.9659258262890683,-0.25881904510252063,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 18:00:00+00:00,0.0,,,,,,,,-54.292500000000004,36.39985067506001,18,2,32,-1.0,-1.8369701987210297e-16,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 19:00:00+00:00,0.0,,,,,,,,-54.29058333333333,36.39755472899244,19,2,32,-0.9659258262890684,0.2588190451025203,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 20:00:00+00:00,0.0,,,,,,,,-54.286,36.394491728373765,20,2,32,-0.8660254037844386,0.5000000000000001,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 21:00:00+00:00,0.0,,,,,,,,-54.28445833333333,36.394783509854356,21,2,32,-0.7071067811865477,0.7071067811865474,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 22:00:00+00:00,0.0,,,,,,,,-54.286437500000005,36.398542237507606,22,2,32,-0.5000000000000004,0.8660254037844384,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-01 23:00:00+00:00,0.0,,,,,,,,-54.29272916666666,36.403763620889876,23,2,32,-0.25881904510252157,0.9659258262890681,0.5234156073655503,0.8520775211013093,0.0,0.0,0.0 +2026-02-02 00:00:00+00:00,0.0,,,,,,,,-54.296583333333324,36.406664763397984,0,2,33,0.0,1.0,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 01:00:00+00:00,0.0,,,,,,,,-54.3035625,36.41123159386801,1,2,33,0.25881904510252074,0.9659258262890683,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 02:00:00+00:00,0.0,,,,,,,,-54.29356250000001,36.406322469670364,2,2,33,0.49999999999999994,0.8660254037844387,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 03:00:00+00:00,0.0,,,,,,,,-50.62475,43.676580511269506,3,2,33,0.7071067811865475,0.7071067811865476,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 04:00:00+00:00,0.0,,,,,,,,7.363745588235295,21.874953800607837,4,2,33,0.8660254037844386,0.5000000000000001,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 05:00:00+00:00,8400.0,,,,,,,,51.49921090367965,6.4517336294990875,5,2,33,0.9659258262890683,0.25881904510252074,0.5380051715382996,0.8429415373547828,0.0601840335340878,,8.4 +2026-02-02 06:00:00+00:00,16700.0,,,,,,,,23.244184829059826,3.49372804112882,6,2,33,1.0,6.123233995736766e-17,0.5380051715382996,0.8429415373547828,0.25793231191571103,,16.7 +2026-02-02 07:00:00+00:00,23800.0,,,,,,,,-3.408142857142857,3.4092530129476333,7,2,33,0.9659258262890683,-0.25881904510252063,0.5380051715382996,0.8429415373547828,0.4277426082478089,,23.8 +2026-02-02 08:00:00+00:00,29000.0,,,,,,,,-19.082104166666667,5.101290600760046,8,2,33,0.8660254037844387,-0.49999999999999983,0.5380051715382996,0.8429415373547828,0.5580426314601323,,29.0 +2026-02-02 09:00:00+00:00,32300.0,,,,,,,,-30.216887254901962,6.087331738775591,9,2,33,0.7071067811865476,-0.7071067811865475,0.5380051715382996,0.8429415373547828,0.639952650301731,,32.3 +2026-02-02 10:00:00+00:00,32400.0,,,,,,,,-38.45795192307693,8.78380726015801,10,2,33,0.49999999999999994,-0.8660254037844387,0.5380051715382996,0.8429415373547828,0.6678906323512561,,32.4 +2026-02-02 11:00:00+00:00,32300.0,,,,,,,,-47.92781593406593,7.533992621861193,11,2,33,0.258819045102521,-0.9659258262890682,0.5380051715382996,0.8429415373547828,0.639952650301731,,32.3 +2026-02-02 12:00:00+00:00,31400.0,,,,,,,,-55.92464285714286,8.924275890517283,12,2,33,1.2246467991473532e-16,-1.0,0.5380051715382996,0.8429415373547828,0.5580426314601323,,31.4 +2026-02-02 13:00:00+00:00,22800.0,,,,,,,,-64.39186625874126,8.499962690401269,13,2,33,-0.2588190451025208,-0.9659258262890683,0.5380051715382996,0.8429415373547828,0.4277426082478089,,22.8 +2026-02-02 14:00:00+00:00,6800.0,,,,,,,,-65.581875,13.484109069413275,14,2,33,-0.4999999999999998,-0.8660254037844388,0.5380051715382996,0.8429415373547828,0.25793231191571103,,6.8 +2026-02-02 15:00:00+00:00,300.0,,,,,,,,-55.634708333333336,33.42092641272414,15,2,33,-0.7071067811865471,-0.7071067811865479,0.5380051715382996,0.8429415373547828,0.0601840335340878,,0.3 +2026-02-02 16:00:00+00:00,0.0,,,,,,,,-54.21625,36.22875587269501,16,2,33,-0.8660254037844384,-0.5000000000000004,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 17:00:00+00:00,0.0,,,,,,,,-54.20545833333333,36.224306083217776,17,2,33,-0.9659258262890683,-0.25881904510252063,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 18:00:00+00:00,0.0,,,,,,,,-54.190625,36.21828960017991,18,2,33,-1.0,-1.8369701987210297e-16,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 19:00:00+00:00,0.0,,,,,,,,-54.1728125,36.217100765945155,19,2,33,-0.9659258262890684,0.2588190451025203,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 20:00:00+00:00,0.0,,,,,,,,-54.154937499999996,36.214487455744724,20,2,33,-0.8660254037844386,0.5000000000000001,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 21:00:00+00:00,0.0,,,,,,,,-54.15441666666666,36.21556819127192,21,2,33,-0.7071067811865477,0.7071067811865474,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 22:00:00+00:00,0.0,,,,,,,,-54.160041666666665,36.21880289767012,22,2,33,-0.5000000000000004,0.8660254037844384,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-02 23:00:00+00:00,0.0,,,,,,,,-54.154354166666664,36.21682083111171,23,2,33,-0.25881904510252157,0.9659258262890681,0.5380051715382996,0.8429415373547828,0.0,0.0,0.0 +2026-02-03 00:00:00+00:00,0.0,,,,,,,,-54.149249999999995,36.215914684247124,0,2,34,0.0,1.0,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 01:00:00+00:00,0.0,,,,,,,,-54.10785416666666,36.29474638982529,1,2,34,0.25881904510252074,0.9659258262890683,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 02:00:00+00:00,0.0,,,,,,,,-54.041225000000004,36.4401914032089,2,2,34,0.49999999999999994,0.8660254037844387,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 03:00:00+00:00,0.0,,,,,,,,-50.327,43.89697421952486,3,2,34,0.7071067811865475,0.7071067811865476,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 04:00:00+00:00,100.0,,,,,,,,5.200318014705883,23.935349492125045,4,2,34,0.8660254037844386,0.5000000000000001,0.5524353131676196,0.8335557718385699,0.0,0.0,0.1 +2026-02-03 05:00:00+00:00,8400.0,,,,,,,,51.62590476190476,5.974926676337032,5,2,34,0.9659258262890683,0.25881904510252074,0.5524353131676196,0.8335557718385699,0.06286051695228759,,8.4 +2026-02-03 06:00:00+00:00,17300.0,,,,,,,,24.567213200684638,4.841538070220601,6,2,34,1.0,6.123233995736766e-17,0.5524353131676196,0.8335557718385699,0.2609022814362431,,17.3 +2026-02-03 07:00:00+00:00,24300.0,,,,,,,,-2.5534342694342698,4.41962245201997,7,2,34,0.9659258262890683,-0.25881904510252063,0.5524353131676196,0.8335557718385699,0.43096459999788583,,24.3 +2026-02-03 08:00:00+00:00,28000.0,,,,,,,,-18.473403846153847,5.651618145733785,8,2,34,0.8660254037844387,-0.49999999999999983,0.5524353131676196,0.8335557718385699,0.5614580066685098,,28.0 +2026-02-03 09:00:00+00:00,28300.0,,,,,,,,-29.326375000000002,7.284710633980826,9,2,34,0.7071067811865476,-0.7071067811865475,0.5524353131676196,0.8335557718385699,0.6434895914340624,,28.3 +2026-02-03 10:00:00+00:00,28900.0,,,,,,,,-38.20910714285714,8.65766320090705,10,2,34,0.49999999999999994,-0.8660254037844387,0.5524353131676196,0.8335557718385699,0.6714690373563749,,28.9 +2026-02-03 11:00:00+00:00,24800.0,,,,,,,,-47.30990476190476,7.980003282866358,11,2,34,0.258819045102521,-0.9659258262890682,0.5524353131676196,0.8335557718385699,0.6434895914340624,,24.8 +2026-02-03 12:00:00+00:00,20900.0,,,,,,,,-55.49375595238095,9.358696161521603,12,2,34,1.2246467991473532e-16,-1.0,0.5524353131676196,0.8335557718385699,0.5614580066685098,,20.9 +2026-02-03 13:00:00+00:00,14300.0,,,,,,,,-64.29323717948718,8.536631132009324,13,2,34,-0.2588190451025208,-0.9659258262890683,0.5524353131676196,0.8335557718385699,0.43096459999788583,,14.3 +2026-02-03 14:00:00+00:00,4600.0,,,,,,,,-64.86041666666667,14.761449628640435,14,2,34,-0.4999999999999998,-0.8660254037844388,0.5524353131676196,0.8335557718385699,0.2609022814362431,,4.6 +2026-02-03 15:00:00+00:00,0.0,,,,,,,,-55.02547619047619,34.43990766241859,15,2,34,-0.7071067811865471,-0.7071067811865479,0.5524353131676196,0.8335557718385699,0.06286051695228759,,0.0 +2026-02-03 16:00:00+00:00,0.0,,,,,,,,-53.71958333333333,37.01934339526657,16,2,34,-0.8660254037844384,-0.5000000000000004,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 17:00:00+00:00,0.0,,,,,,,,-53.704125,37.05578127668425,17,2,34,-0.9659258262890683,-0.25881904510252063,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 18:00:00+00:00,0.0,,,,,,,,-53.6655,37.13521092126267,18,2,34,-1.0,-1.8369701987210297e-16,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 19:00:00+00:00,0.0,,,,,,,,-53.66355000000001,37.128184841303515,19,2,34,-0.9659258262890684,0.2588190451025203,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 20:00:00+00:00,0.0,,,,,,,,-53.66920833333334,37.11619776567932,20,2,34,-0.8660254037844386,0.5000000000000001,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 21:00:00+00:00,0.0,,,,,,,,-53.66338194444444,37.112932435612755,21,2,34,-0.7071067811865477,0.7071067811865474,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 22:00:00+00:00,0.0,,,,,,,,-53.637,37.145572237257745,22,2,34,-0.5000000000000004,0.8660254037844384,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-03 23:00:00+00:00,0.0,,,,,,,,-53.635250000000006,37.140722095161266,23,2,34,-0.25881904510252157,0.9659258262890681,0.5524353131676196,0.8335557718385699,0.0,0.0,0.0 +2026-02-04 00:00:00+00:00,0.0,,,,,,,,-53.66175,37.14440871674587,0,2,35,0.0,1.0,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 01:00:00+00:00,0.0,,,,,,,,-53.66175,37.14440871674587,1,2,35,0.25881904510252074,0.9659258262890683,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 02:00:00+00:00,0.0,,,,,,,,-53.66175,37.14440871674587,2,2,35,0.49999999999999994,0.8660254037844387,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 03:00:00+00:00,0.0,,,,,,,,,,3,2,35,0.7071067811865475,0.7071067811865476,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 04:00:00+00:00,200.0,,,,,,,,,,4,2,35,0.8660254037844386,0.5000000000000001,0.5667017562911176,0.8239230057575542,0.0,0.0,0.2 +2026-02-04 05:00:00+00:00,2200.0,,,,,,,,,,5,2,35,0.9659258262890683,0.25881904510252074,0.5667017562911176,0.8239230057575542,0.06558424947305214,,2.2 +2026-02-04 06:00:00+00:00,14300.0,,,,,,,,,,6,2,35,1.0,6.123233995736766e-17,0.5667017562911176,0.8239230057575542,0.26392012113867125,,14.3 +2026-02-04 07:00:00+00:00,19500.0,,,,,,,,,,7,2,35,0.9659258262890683,-0.25881904510252063,0.5667017562911176,0.8239230057575542,0.43423499526277165,,19.5 +2026-02-04 08:00:00+00:00,26000.0,,,,,,,,,,8,2,35,0.8660254037844387,-0.49999999999999983,0.5667017562911176,0.8239230057575542,0.5649221946324335,,26.0 +2026-02-04 09:00:00+00:00,25800.0,,,,,,,,,,9,2,35,0.7071067811865476,-0.7071067811865475,0.5667017562911176,0.8239230057575542,0.6470756025814225,,25.8 +2026-02-04 10:00:00+00:00,26700.0,,,,,,,,,,10,2,35,0.49999999999999994,-0.8660254037844387,0.5667017562911176,0.8239230057575542,0.675096600122941,,26.7 +2026-02-04 11:00:00+00:00,31100.0,,,,,,,,,,11,2,35,0.258819045102521,-0.9659258262890682,0.5667017562911176,0.8239230057575542,0.6470756025814225,,31.1 +2026-02-04 12:00:00+00:00,32300.0,,,,,,,,,,12,2,35,1.2246467991473532e-16,-1.0,0.5667017562911176,0.8239230057575542,0.5649221946324335,,32.3 +2026-02-04 13:00:00+00:00,32200.0,,,,,,,,,,13,2,35,-0.2588190451025208,-0.9659258262890683,0.5667017562911176,0.8239230057575542,0.43423499526277165,,32.2 +2026-02-04 14:00:00+00:00,22600.0,,,,,,,,,,14,2,35,-0.4999999999999998,-0.8660254037844388,0.5667017562911176,0.8239230057575542,0.26392012113867125,,22.6 +2026-02-04 15:00:00+00:00,700.0,,,,,,,,,,15,2,35,-0.7071067811865471,-0.7071067811865479,0.5667017562911176,0.8239230057575542,0.06558424947305214,,0.7 +2026-02-04 16:00:00+00:00,0.0,,,,,,,,-40.804078125,37.23540488382498,16,2,35,-0.8660254037844384,-0.5000000000000004,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 17:00:00+00:00,0.0,,,,,,,,-40.804078125,37.23540488382498,17,2,35,-0.9659258262890683,-0.25881904510252063,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 18:00:00+00:00,0.0,,,,,,,,-40.804078125,37.23540488382498,18,2,35,-1.0,-1.8369701987210297e-16,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 19:00:00+00:00,0.0,,,,,,,,-53.86975,36.977160713292555,19,2,35,-0.9659258262890684,0.2588190451025203,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 20:00:00+00:00,0.0,,,,,,,,-53.8539375,36.97206766509403,20,2,35,-0.8660254037844386,0.5000000000000001,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 21:00:00+00:00,0.0,,,,,,,,-53.85175,36.97140488156579,21,2,35,-0.7071067811865477,0.7071067811865474,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 22:00:00+00:00,0.0,,,,,,,,-53.85175,36.97140488156579,22,2,35,-0.5000000000000004,0.8660254037844384,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-04 23:00:00+00:00,0.0,,,,,,,,-53.85175,36.97140488156579,23,2,35,-0.25881904510252157,0.9659258262890681,0.5667017562911176,0.8239230057575542,0.0,0.0,0.0 +2026-02-05 00:00:00+00:00,0.0,,,,,,,,,,0,2,36,0.0,1.0,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 01:00:00+00:00,0.0,,,,,,,,,,1,2,36,0.25881904510252074,0.9659258262890683,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 02:00:00+00:00,0.0,,,,,,,,,,2,2,36,0.49999999999999994,0.8660254037844387,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 03:00:00+00:00,0.0,,,,,,,,,,3,2,36,0.7071067811865475,0.7071067811865476,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 04:00:00+00:00,100.0,,,,,,,,,,4,2,36,0.8660254037844386,0.5000000000000001,0.5808002734538009,0.8140460935082178,0.0,0.0,0.1 +2026-02-05 05:00:00+00:00,8400.0,,,,,,,,,,5,2,36,0.9659258262890683,0.25881904510252074,0.5808002734538009,0.8140460935082178,0.06835427616034073,,8.4 +2026-02-05 06:00:00+00:00,18600.0,,,,,,,,,,6,2,36,1.0,6.123233995736766e-17,0.5808002734538009,0.8140460935082178,0.2669845279945494,,18.6 +2026-02-05 07:00:00+00:00,24900.0,,,,,,,,,,7,2,36,0.9659258262890683,-0.25881904510252063,0.5808002734538009,0.8140460935082178,0.43755219210029517,,24.9 +2026-02-05 08:00:00+00:00,29800.0,,,,,,,,-41.01770833333333,9.32048762272999,8,2,36,0.8660254037844387,-0.49999999999999983,0.5808002734538009,0.8140460935082178,0.5684333640451641,,29.8 +2026-02-05 09:00:00+00:00,32400.0,,,,,,,,-41.01770833333333,9.32048762272999,9,2,36,0.7071067811865476,-0.7071067811865475,0.5808002734538009,0.8140460935082178,0.6507087082524766,,32.4 +2026-02-05 10:00:00+00:00,32300.0,,,,,,,,-41.01770833333333,9.32048762272999,10,2,36,0.49999999999999994,-0.8660254037844387,0.5808002734538009,0.8140460935082178,0.6787712959809393,,32.3 +2026-02-05 11:00:00+00:00,32300.0,,,,,,,,-46.354895891690006,7.933644796760641,11,2,36,0.258819045102521,-0.9659258262890682,0.5808002734538009,0.8140460935082178,0.6507087082524766,,32.3 +2026-02-05 12:00:00+00:00,32300.0,,,,,,,,-54.96807326007326,9.244394488146945,12,2,36,1.2246467991473532e-16,-1.0,0.5808002734538009,0.8140460935082178,0.5684333640451641,,32.3 +2026-02-05 13:00:00+00:00,32200.0,,,,,,,,-64.0528891941392,8.199246257688754,13,2,36,-0.2588190451025208,-0.9659258262890683,0.5808002734538009,0.8140460935082178,0.43755219210029517,,32.2 +2026-02-05 14:00:00+00:00,19800.0,,,,,,,,-65.86946428571429,12.497523637358183,14,2,36,-0.4999999999999998,-0.8660254037844388,0.5808002734538009,0.8140460935082178,0.2669845279945494,,19.8 +2026-02-05 15:00:00+00:00,300.0,,,,,,,,-51.415982142857146,32.46824813863156,15,2,36,-0.7071067811865471,-0.7071067811865479,0.5808002734538009,0.8140460935082178,0.06835427616034073,,0.3 +2026-02-05 16:00:00+00:00,0.0,,,,,,,,-46.148208333333336,34.549553846512346,16,2,36,-0.8660254037844384,-0.5000000000000004,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 17:00:00+00:00,0.0,,,,,,,,-53.93,36.701939095003326,17,2,36,-0.9659258262890683,-0.25881904510252063,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 18:00:00+00:00,0.0,,,,,,,,-53.91525,36.695446832679394,18,2,36,-1.0,-1.8369701987210297e-16,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 19:00:00+00:00,0.0,,,,,,,,-53.91365625,36.695434579706095,19,2,36,-0.9659258262890684,0.2588190451025203,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 20:00:00+00:00,0.0,,,,,,,,-53.91343749999999,36.691635859651875,20,2,36,-0.8660254037844386,0.5000000000000001,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 21:00:00+00:00,0.0,,,,,,,,-53.90354166666667,36.6869743155915,21,2,36,-0.7071067811865477,0.7071067811865474,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 22:00:00+00:00,0.0,,,,,,,,-53.90354166666667,36.6869743155915,22,2,36,-0.5000000000000004,0.8660254037844384,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-05 23:00:00+00:00,0.0,,,,,,,,-53.90354166666667,36.6869743155915,23,2,36,-0.25881904510252157,0.9659258262890681,0.5808002734538009,0.8140460935082178,0.0,0.0,0.0 +2026-02-06 00:00:00+00:00,0.0,,,,,,,,,,0,2,37,0.0,1.0,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 01:00:00+00:00,0.0,,,,,,,,,,1,2,37,0.25881904510252074,0.9659258262890683,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 02:00:00+00:00,0.0,,,,,,,,,,2,2,37,0.49999999999999994,0.8660254037844387,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 03:00:00+00:00,0.0,,,,,,,,,,3,2,37,0.7071067811865475,0.7071067811865476,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 04:00:00+00:00,0.0,,,,,,,,,,4,2,37,0.8660254037844386,0.5000000000000001,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 05:00:00+00:00,1200.0,,,,,,,,,,5,2,37,0.9659258262890683,0.25881904510252074,0.5947266869607634,0.8039279618328213,0.07116962132428381,,1.2 +2026-02-06 06:00:00+00:00,5100.0,,,,,,,,,,6,2,37,1.0,6.123233995736766e-17,0.5947266869607634,0.8039279618328213,0.2700941773929351,,5.1 +2026-02-06 07:00:00+00:00,16600.0,,,,,,,,,,7,2,37,0.9659258262890683,-0.25881904510252063,0.5947266869607634,0.8039279618328213,0.4409145662741959,,16.6 +2026-02-06 08:00:00+00:00,24200.0,,,,,,,,,,8,2,37,0.8660254037844387,-0.49999999999999983,0.5947266869607634,0.8039279618328213,0.5719896607598486,,24.2 +2026-02-06 09:00:00+00:00,31400.0,,,,,,,,,,9,2,37,0.7071067811865476,-0.7071067811865475,0.5947266869607634,0.8039279618328213,0.654386909772531,,31.4 +2026-02-06 10:00:00+00:00,31900.0,,,,,,,,,,10,2,37,0.49999999999999994,-0.8660254037844387,0.5947266869607634,0.8039279618328213,0.6824910769599213,,31.9 +2026-02-06 11:00:00+00:00,29900.0,,,,,,,,,,11,2,37,0.258819045102521,-0.9659258262890682,0.5947266869607634,0.8039279618328213,0.654386909772531,,29.9 +2026-02-06 12:00:00+00:00,22100.0,,,,,,,,,,12,2,37,1.2246467991473532e-16,-1.0,0.5947266869607634,0.8039279618328213,0.5719896607598486,,22.1 +2026-02-06 13:00:00+00:00,12400.0,,,,,,,,,,13,2,37,-0.2588190451025208,-0.9659258262890683,0.5947266869607634,0.8039279618328213,0.4409145662741959,,12.4 +2026-02-06 14:00:00+00:00,8400.0,,,,,,,,,,14,2,37,-0.4999999999999998,-0.8660254037844388,0.5947266869607634,0.8039279618328213,0.2700941773929351,,8.4 +2026-02-06 15:00:00+00:00,300.0,,,,,,,,,,15,2,37,-0.7071067811865471,-0.7071067811865479,0.5947266869607634,0.8039279618328213,0.07116962132428381,,0.3 +2026-02-06 16:00:00+00:00,0.0,,,,,,,,,,16,2,37,-0.8660254037844384,-0.5000000000000004,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 17:00:00+00:00,0.0,,,,,,,,,,17,2,37,-0.9659258262890683,-0.25881904510252063,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 18:00:00+00:00,0.0,,,,,,,,,,18,2,37,-1.0,-1.8369701987210297e-16,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 19:00:00+00:00,0.0,,,,,,,,,,19,2,37,-0.9659258262890684,0.2588190451025203,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 20:00:00+00:00,0.0,,,,,,,,,,20,2,37,-0.8660254037844386,0.5000000000000001,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 21:00:00+00:00,0.0,,,,,,,,,,21,2,37,-0.7071067811865477,0.7071067811865474,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 22:00:00+00:00,0.0,,,,,,,,,,22,2,37,-0.5000000000000004,0.8660254037844384,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-06 23:00:00+00:00,0.0,,,,,,,,,,23,2,37,-0.25881904510252157,0.9659258262890681,0.5947266869607634,0.8039279618328213,0.0,0.0,0.0 +2026-02-07 00:00:00+00:00,0.0,,,,,,,,,,0,2,38,0.0,1.0,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 01:00:00+00:00,0.0,,,,,,,,,,1,2,38,0.25881904510252074,0.9659258262890683,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 02:00:00+00:00,0.0,,,,,,,,,,2,2,38,0.49999999999999994,0.8660254037844387,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 03:00:00+00:00,0.0,,,,,,,,,,3,2,38,0.7071067811865475,0.7071067811865476,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 04:00:00+00:00,100.0,,,,,,,,,,4,2,38,0.8660254037844386,0.5000000000000001,0.6084768701151261,0.7935716089521474,0.0,0.0,0.1 +2026-02-07 05:00:00+00:00,7000.0,,,,,,,,,,5,2,38,0.9659258262890683,0.25881904510252074,0.6084768701151261,0.7935716089521474,0.0740292888008727,,7.0 +2026-02-07 06:00:00+00:00,17700.0,,,,,,,,,,6,2,38,1.0,6.123233995736766e-17,0.6084768701151261,0.7935716089521474,0.2732477238334825,,17.7 +2026-02-07 07:00:00+00:00,24400.0,,,,,,,,,,7,2,38,0.9659258262890683,-0.25881904510252063,0.6084768701151261,0.7935716089521474,0.4443204723022147,,24.4 +2026-02-07 08:00:00+00:00,29600.0,,,,,,,,,,8,2,38,0.8660254037844387,-0.49999999999999983,0.6084768701151261,0.7935716089521474,0.5755892091100093,,29.6 +2026-02-07 09:00:00+00:00,31000.0,,,,,,,,,,9,2,38,0.7071067811865476,-0.7071067811865475,0.6084768701151261,0.7935716089521474,0.6581081867752595,,31.0 +2026-02-07 10:00:00+00:00,31800.0,,,,,,,,,,10,2,38,0.49999999999999994,-0.8660254037844387,0.6084768701151261,0.7935716089521474,0.6862538733391369,,31.8 +2026-02-07 11:00:00+00:00,31300.0,,,,,,,,,,11,2,38,0.258819045102521,-0.9659258262890682,0.6084768701151261,0.7935716089521474,0.6581081867752595,,31.3 +2026-02-07 12:00:00+00:00,30900.0,,,,,,,,,,12,2,38,1.2246467991473532e-16,-1.0,0.6084768701151261,0.7935716089521474,0.5755892091100093,,30.9 +2026-02-07 13:00:00+00:00,27600.0,,,,,,,,,,13,2,38,-0.2588190451025208,-0.9659258262890683,0.6084768701151261,0.7935716089521474,0.4443204723022147,,27.6 +2026-02-07 14:00:00+00:00,13300.0,,,,,,,,,,14,2,38,-0.4999999999999998,-0.8660254037844388,0.6084768701151261,0.7935716089521474,0.2732477238334825,,13.3 +2026-02-07 15:00:00+00:00,700.0,,,,,,,,,,15,2,38,-0.7071067811865471,-0.7071067811865479,0.6084768701151261,0.7935716089521474,0.0740292888008727,,0.7 +2026-02-07 16:00:00+00:00,0.0,,,,,,,,,,16,2,38,-0.8660254037844384,-0.5000000000000004,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 17:00:00+00:00,0.0,,,,,,,,,,17,2,38,-0.9659258262890683,-0.25881904510252063,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 18:00:00+00:00,0.0,,,,,,,,,,18,2,38,-1.0,-1.8369701987210297e-16,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 19:00:00+00:00,0.0,,,,,,,,,,19,2,38,-0.9659258262890684,0.2588190451025203,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 20:00:00+00:00,0.0,,,,,,,,,,20,2,38,-0.8660254037844386,0.5000000000000001,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 21:00:00+00:00,0.0,,,,,,,,,,21,2,38,-0.7071067811865477,0.7071067811865474,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 22:00:00+00:00,0.0,,,,,,,,,,22,2,38,-0.5000000000000004,0.8660254037844384,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-07 23:00:00+00:00,0.0,,,,,,,,,,23,2,38,-0.25881904510252157,0.9659258262890681,0.6084768701151261,0.7935716089521474,0.0,0.0,0.0 +2026-02-08 00:00:00+00:00,0.0,,,,,,,,,,0,2,39,0.0,1.0,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 01:00:00+00:00,0.0,,,,,,,,,,1,2,39,0.25881904510252074,0.9659258262890683,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 02:00:00+00:00,0.0,,,,,,,,,,2,2,39,0.49999999999999994,0.8660254037844387,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 03:00:00+00:00,0.0,,,,,,,,,,3,2,39,0.7071067811865475,0.7071067811865476,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 04:00:00+00:00,100.0,,,,,,,,,,4,2,39,0.8660254037844386,0.5000000000000001,0.6220467484408675,0.7829801036770629,0.0,0.0,0.1 +2026-02-08 05:00:00+00:00,8100.0,,,,,,,,,,5,2,39,0.9659258262890683,0.25881904510252074,0.6220467484408675,0.7829801036770629,0.07693226225770289,,8.1 +2026-02-08 06:00:00+00:00,17000.0,,,,,,,,,,6,2,39,1.0,6.123233995736766e-17,0.6220467484408675,0.7829801036770629,0.2764438016484758,,17.0 +2026-02-08 07:00:00+00:00,15100.0,,,,,,,,,,7,2,39,0.9659258262890683,-0.25881904510252063,0.6220467484408675,0.7829801036770629,0.44776824453560315,,15.1 +2026-02-08 08:00:00+00:00,43400.0,,,,,,,,,,8,2,39,0.8660254037844387,-0.49999999999999983,0.6220467484408675,0.7829801036770629,0.579230113263356,,43.4 +2026-02-08 09:00:00+00:00,31800.0,,,,,,,,,,9,2,39,0.7071067811865476,-0.7071067811865475,0.6220467484408675,0.7829801036770629,0.6618704987289481,,31.8 +2026-02-08 10:00:00+00:00,31500.0,,,,,,,,,,10,2,39,0.49999999999999994,-0.8660254037844387,0.6220467484408675,0.7829801036770629,0.6900575952325935,,31.5 +2026-02-08 11:00:00+00:00,31700.0,,,,,,,,,,11,2,39,0.258819045102521,-0.9659258262890682,0.6220467484408675,0.7829801036770629,0.6618704987289481,,31.7 +2026-02-08 12:00:00+00:00,28500.0,,,,,,,,,,12,2,39,1.2246467991473532e-16,-1.0,0.6220467484408675,0.7829801036770629,0.579230113263356,,28.5 +2026-02-08 13:00:00+00:00,25000.0,,,,,,,,,,13,2,39,-0.2588190451025208,-0.9659258262890683,0.6220467484408675,0.7829801036770629,0.44776824453560315,,25.0 +2026-02-08 14:00:00+00:00,14700.0,,,,,,,,,,14,2,39,-0.4999999999999998,-0.8660254037844388,0.6220467484408675,0.7829801036770629,0.2764438016484758,,14.7 +2026-02-08 15:00:00+00:00,200.0,,,,,,,,,,15,2,39,-0.7071067811865471,-0.7071067811865479,0.6220467484408675,0.7829801036770629,0.07693226225770289,,0.2 +2026-02-08 16:00:00+00:00,0.0,,,,,,,,,,16,2,39,-0.8660254037844384,-0.5000000000000004,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 17:00:00+00:00,0.0,,,,,,,,,,17,2,39,-0.9659258262890683,-0.25881904510252063,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 18:00:00+00:00,0.0,,,,,,,,,,18,2,39,-1.0,-1.8369701987210297e-16,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 19:00:00+00:00,0.0,,,,,,,,,,19,2,39,-0.9659258262890684,0.2588190451025203,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 20:00:00+00:00,0.0,,,,,,,,,,20,2,39,-0.8660254037844386,0.5000000000000001,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 21:00:00+00:00,0.0,,,,,,,,,,21,2,39,-0.7071067811865477,0.7071067811865474,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 22:00:00+00:00,0.0,,,,,,,4.0125,,,22,2,39,-0.5000000000000004,0.8660254037844384,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-08 23:00:00+00:00,0.0,,,,,,,2.05,,,23,2,39,-0.25881904510252157,0.9659258262890681,0.6220467484408675,0.7829801036770629,0.0,0.0,0.0 +2026-02-09 00:00:00+00:00,0.0,,,,,,,3.35,,,0,2,40,0.0,1.0,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 01:00:00+00:00,0.0,,,,,,,1.4,,,1,2,40,0.25881904510252074,0.9659258262890683,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 02:00:00+00:00,0.0,,,,,,,0.8125,,,2,2,40,0.49999999999999994,0.8660254037844387,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 03:00:00+00:00,0.0,,,,,,,1.2,,,3,2,40,0.7071067811865475,0.7071067811865476,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 04:00:00+00:00,0.0,,,,,,,2.5625,,,4,2,40,0.8660254037844386,0.5000000000000001,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 05:00:00+00:00,3000.0,,,,,,,1.9875,,,5,2,40,0.9659258262890683,0.25881904510252074,0.6354323008901774,0.7721565844991642,0.07987750552619294,,3.0 +2026-02-09 06:00:00+00:00,9500.0,,,,,,,2.0375,,,6,2,40,1.0,6.123233995736766e-17,0.6354323008901774,0.7721565844991642,0.2796810257537265,,9.5 +2026-02-09 07:00:00+00:00,18300.0,,,,,,,3.125,,,7,2,40,0.9659258262890683,-0.25881904510252063,0.6354323008901774,0.7721565844991642,0.45125619826954844,,18.3 +2026-02-09 08:00:00+00:00,24800.0,,,,,,,2.1625,,,8,2,40,0.8660254037844387,-0.49999999999999983,0.6354323008901774,0.7721565844991642,0.5829104586080847,,24.8 +2026-02-09 09:00:00+00:00,28200.0,,,,,,,3.525,,,9,2,40,0.7071067811865476,-0.7071067811865475,0.6354323008901774,0.7721565844991642,0.6656717864962161,,28.2 +2026-02-09 10:00:00+00:00,30500.0,,,,,,,3.95,,,10,2,40,0.49999999999999994,-0.8660254037844387,0.6354323008901774,0.7721565844991642,0.6939001342079274,,30.5 +2026-02-09 11:00:00+00:00,31500.0,,,,,,,2.3875,,,11,2,40,0.258819045102521,-0.9659258262890682,0.6354323008901774,0.7721565844991642,0.6656717864962161,,31.5 +2026-02-09 12:00:00+00:00,22500.0,,,,,,,2.5999999999999996,,,12,2,40,1.2246467991473532e-16,-1.0,0.6354323008901774,0.7721565844991642,0.5829104586080847,,22.5 +2026-02-09 13:00:00+00:00,8700.0,,,,,,,3.1750000000000003,,,13,2,40,-0.2588190451025208,-0.9659258262890683,0.6354323008901774,0.7721565844991642,0.45125619826954844,,8.7 +2026-02-09 14:00:00+00:00,3200.0,,,,,,,1.625,,,14,2,40,-0.4999999999999998,-0.8660254037844388,0.6354323008901774,0.7721565844991642,0.2796810257537265,,3.2 +2026-02-09 15:00:00+00:00,200.0,,,,,,,1.1125,,,15,2,40,-0.7071067811865471,-0.7071067811865479,0.6354323008901774,0.7721565844991642,0.07987750552619294,,0.2 +2026-02-09 16:00:00+00:00,0.0,,,,,,,0.875,,,16,2,40,-0.8660254037844384,-0.5000000000000004,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 17:00:00+00:00,0.0,,,,,,,0.8999999999999999,,,17,2,40,-0.9659258262890683,-0.25881904510252063,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 18:00:00+00:00,0.0,,,,,,,0.65,,,18,2,40,-1.0,-1.8369701987210297e-16,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 19:00:00+00:00,0.0,,,,,,,0.4375,-54.18325,36.3292260067566,19,2,40,-0.9659258262890684,0.2588190451025203,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 20:00:00+00:00,0.0,,,,,,,0.5125000000000001,-54.18325,36.3292260067566,20,2,40,-0.8660254037844386,0.5000000000000001,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 21:00:00+00:00,0.0,,,,,,,0.9,-54.18325,36.3292260067566,21,2,40,-0.7071067811865477,0.7071067811865474,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 22:00:00+00:00,0.0,,,,,,,0.6625000000000001,-54.1758125,36.32409133032729,22,2,40,-0.5000000000000004,0.8660254037844384,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-09 23:00:00+00:00,0.0,,,,,,,0.9875,-54.170437500000006,36.32148311627191,23,2,40,-0.25881904510252157,0.9659258262890681,0.6354323008901774,0.7721565844991642,0.0,0.0,0.0 +2026-02-10 00:00:00+00:00,0.0,,,,,,,1.3125,-54.161375,36.316174347378144,0,2,41,0.0,1.0,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 01:00:00+00:00,0.0,,,,,,,1.65,-54.1610625,36.31511551588803,1,2,41,0.25881904510252074,0.9659258262890683,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 02:00:00+00:00,0.0,,,,,,,1.65,-54.1485,36.310253014816624,2,2,41,0.49999999999999994,0.8660254037844387,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 03:00:00+00:00,0.0,,,,,,,2.3125,-48.810066666666664,46.971188196705974,3,2,41,0.7071067811865475,0.7071067811865476,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 04:00:00+00:00,0.0,,,,,,,2.45,8.264674632352941,21.831494668330148,4,2,41,0.8660254037844386,0.5000000000000001,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 05:00:00+00:00,6900.0,,,,,,,2.4875,51.95079044117647,6.293440643315007,5,2,41,0.9659258262890683,0.25881904510252074,0.6486295610349814,0.7611042586607747,0.08286396296063003,,6.9 +2026-02-10 06:00:00+00:00,16000.0,,,,,,,2.375,26.458570799457995,5.051405189197583,6,2,41,1.0,6.123233995736766e-17,0.6486295610349814,0.7611042586607747,0.28295799242816694,,16.0 +2026-02-10 07:00:00+00:00,24400.0,,,,,,,3.3875,0.13614325909961655,5.156487578144883,7,2,41,0.9659258262890683,-0.25881904510252063,0.6486295610349814,0.7611042586607747,0.45478263088389953,,24.4 +2026-02-10 08:00:00+00:00,28500.0,,,,,,,3.8875,-11.183440656565658,6.216691326356445,8,2,41,0.8660254037844387,-0.49999999999999983,0.6486295610349814,0.7611042586607747,0.5866283131707106,,28.5 +2026-02-10 09:00:00+00:00,32300.0,,,,,,,4.3625,-23.864867708333332,5.760845104218304,9,2,41,0.7071067811865476,-0.7071067811865475,0.6486295610349814,0.7611042586607747,0.6695099739260462,,32.3 +2026-02-10 10:00:00+00:00,32400.0,,,,,,,4.65,-36.28158974358975,8.352397579989232,10,2,41,0.49999999999999994,-0.8660254037844387,0.6486295610349814,0.7611042586607747,0.6977793649378503,,32.4 +2026-02-10 11:00:00+00:00,32100.0,,,,,,,4.4375,-45.22428571428571,8.016777623795468,11,2,41,0.258819045102521,-0.9659258262890682,0.6486295610349814,0.7611042586607747,0.6695099739260462,,32.1 +2026-02-10 12:00:00+00:00,32400.0,,,,,,,4.1,-52.15913392857143,12.015673350318048,12,2,41,1.2246467991473532e-16,-1.0,0.6486295610349814,0.7611042586607747,0.5866283131707106,,32.4 +2026-02-10 13:00:00+00:00,32100.0,,,,,,,3.9875,-65.50401785714286,4.087319398197633,13,2,41,-0.2588190451025208,-0.9659258262890683,0.6486295610349814,0.7611042586607747,0.45478263088389953,,32.1 +2026-02-10 14:00:00+00:00,19700.0,,,,,,,4.3875,-69.18537500000001,6.204748965845977,14,2,41,-0.4999999999999998,-0.8660254037844388,0.6486295610349814,0.7611042586607747,0.28295799242816694,,19.7 +2026-02-10 15:00:00+00:00,1200.0,,,,,,,3.3125,-59.72080357142857,25.435510040793147,15,2,41,-0.7071067811865471,-0.7071067811865479,0.6486295610349814,0.7611042586607747,0.08286396296063003,,1.2 +2026-02-10 16:00:00+00:00,0.0,,,,,,,2.2,-57.730624999999996,29.389497583816684,16,2,41,-0.8660254037844384,-0.5000000000000004,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 17:00:00+00:00,0.0,,,,,,,2.8125,-57.71124999999999,29.376435106788108,17,2,41,-0.9659258262890683,-0.25881904510252063,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 18:00:00+00:00,0.0,,,,,,,2.9375,-57.695,29.373936009099406,18,2,41,-1.0,-1.8369701987210297e-16,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 19:00:00+00:00,0.0,,,,,,,3.375,-57.69375,29.37475691388782,19,2,41,-0.9659258262890684,0.2588190451025203,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 20:00:00+00:00,0.0,,,,,,,3.075,-57.68812500000001,29.37092158744484,20,2,41,-0.8660254037844386,0.5000000000000001,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 21:00:00+00:00,0.0,,,,,,,3.375,-57.686875,29.37174268287748,21,2,41,-0.7071067811865477,0.7071067811865474,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 22:00:00+00:00,0.0,,,,,,,2.025,-57.67125,29.37299223634982,22,2,41,-0.5000000000000004,0.8660254037844384,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-10 23:00:00+00:00,0.0,,,,,,,1.6625,-57.676249999999996,29.37302819623245,23,2,41,-0.25881904510252157,0.9659258262890681,0.6486295610349814,0.7611042586607747,0.0,0.0,0.0 +2026-02-11 00:00:00+00:00,0.0,,,,,,,2.325,-57.676875,29.375062934329748,0,2,42,0.0,1.0,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 01:00:00+00:00,0.0,,,,,,,2.3125,-57.67250000000001,29.36378828591434,1,2,42,0.25881904510252074,0.9659258262890683,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 02:00:00+00:00,0.0,,,,,,,2.4,-57.684375,29.37178836166603,2,2,42,0.49999999999999994,0.8660254037844387,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 03:00:00+00:00,0.0,,,,,,,1.975,-53.06241071428571,38.64486375541703,3,2,42,0.7071067811865475,0.7071067811865476,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 04:00:00+00:00,100.0,,,,,,,2.2,7.426041666666666,21.38575459515438,4,2,42,0.8660254037844386,0.5000000000000001,0.6616346182422783,0.7498264012045686,0.0,0.0,0.1 +2026-02-11 05:00:00+00:00,2600.0,,,,,,,1.7625,52.16267740408114,6.521225742187483,5,2,42,0.9659258262890683,0.25881904510252074,0.6616346182422783,0.7498264012045686,0.08589055982433003,,2.6 +2026-02-11 06:00:00+00:00,10700.0,,,,,,,1.3625,26.19181976619476,4.790050504269231,6,2,42,1.0,6.123233995736766e-17,0.6616346182422783,0.7498264012045686,0.28627328012190134,,10.7 +2026-02-11 07:00:00+00:00,23500.0,,,,,,,2.5,0.9871353571428569,5.308790044709815,7,2,42,0.9659258262890683,-0.25881904510252063,0.6616346182422783,0.7498264012045686,0.45834582301350413,,23.5 +2026-02-11 08:00:00+00:00,27400.0,,,,,,,3.8499999999999996,-15.447722943722942,6.011298485110871,8,2,42,0.8660254037844387,-0.49999999999999983,0.6616346182422783,0.7498264012045686,0.5903817290643982,,27.4 +2026-02-11 09:00:00+00:00,31100.0,,,,,,,4.15,-27.5039375,5.566840252876103,9,2,42,0.7071067811865476,-0.7071067811865475,0.6616346182422783,0.7498264012045686,0.6733829694768667,,31.1 +2026-02-11 10:00:00+00:00,32300.0,,,,,,,4.8374999999999995,-36.38170238095238,7.686709129607891,10,2,42,0.49999999999999994,-0.8660254037844387,0.6616346182422783,0.7498264012045686,0.701693146882835,,32.3 +2026-02-11 11:00:00+00:00,32300.0,,,,,,,5.2625,-45.48784615384615,7.29550367003822,11,2,42,0.258819045102521,-0.9659258262890682,0.6616346182422783,0.7498264012045686,0.6733829694768667,,32.3 +2026-02-11 12:00:00+00:00,32400.0,,,,,,,2.7375,-53.63983333333333,8.925798918490903,12,2,42,1.2246467991473532e-16,-1.0,0.6616346182422783,0.7498264012045686,0.5903817290643982,,32.4 +2026-02-11 13:00:00+00:00,31500.0,,,,,,,3.2875,-63.07072172619047,8.842844794956074,13,2,42,-0.2588190451025208,-0.9659258262890683,0.6616346182422783,0.7498264012045686,0.45834582301350413,,31.5 +2026-02-11 14:00:00+00:00,20300.0,,,,,,,3.7125,-65.80170833333334,13.079737234289365,14,2,42,-0.4999999999999998,-0.8660254037844388,0.6616346182422783,0.7498264012045686,0.28627328012190134,,20.3 +2026-02-11 15:00:00+00:00,1200.0,,,,,,,2.4875,-56.48233333333333,32.00832279527727,15,2,42,-0.7071067811865471,-0.7071067811865479,0.6616346182422783,0.7498264012045686,0.08589055982433003,,1.2 +2026-02-11 16:00:00+00:00,0.0,,,,,,,2.6,-54.148562500000004,36.64468236682678,16,2,42,-0.8660254037844384,-0.5000000000000004,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 17:00:00+00:00,0.0,,,,,,,2.75,-54.13912499999999,36.64009790829122,17,2,42,-0.9659258262890683,-0.25881904510252063,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 18:00:00+00:00,0.0,,,,,,,2.8375,-54.1216875,36.635013940090495,18,2,42,-1.0,-1.8369701987210297e-16,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 19:00:00+00:00,0.0,,,,,,,2.725,-54.107749999999996,36.63112442877868,19,2,42,-0.9659258262890684,0.2588190451025203,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 20:00:00+00:00,0.0,,,,,,,2.975,-54.11212499999999,36.6341086019914,20,2,42,-0.8660254037844386,0.5000000000000001,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 21:00:00+00:00,0.0,,,,,,,1.1375,-54.1000625,36.63151754317073,21,2,42,-0.7071067811865477,0.7071067811865474,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 22:00:00+00:00,0.0,,,,,,,1.2125,-54.0940625,36.628473802479924,22,2,42,-0.5000000000000004,0.8660254037844384,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-11 23:00:00+00:00,0.0,,,,,,,0.9625,-54.08625,36.625701671321835,23,2,42,-0.25881904510252157,0.9659258262890681,0.6616346182422783,0.7498264012045686,0.0,0.0,0.0 +2026-02-12 00:00:00+00:00,0.0,,,,,,,2.1750000000000003,-54.0886875,36.62754721823396,0,2,43,0.0,1.0,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 01:00:00+00:00,0.0,,,,,,,3.1625,-54.08975,36.62539254965968,1,2,43,0.25881904510252074,0.9659258262890683,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 02:00:00+00:00,0.0,,,,,,,3.5124999999999997,-54.080999999999996,36.61784991412431,2,2,43,0.49999999999999994,0.8660254037844387,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 03:00:00+00:00,0.0,,,,,,,4.1125,-49.05701785714285,46.66407953816439,3,2,43,0.7071067811865475,0.7071067811865476,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 04:00:00+00:00,200.0,,,,,,,4.825,9.561223958333333,22.05611820426613,4,2,43,0.8660254037844386,0.5000000000000001,0.6744436188329455,0.7383263540031065,0.0,0.0,0.2 +2026-02-12 05:00:00+00:00,5600.0,,,,,,,3.55,52.00063210227273,6.3216251224013,5,2,43,0.9659258262890683,0.25881904510252074,0.6744436188329455,0.7383263540031065,0.08895620270312332,,5.6 +2026-02-12 06:00:00+00:00,18900.0,,,,,,,1.6625,26.268136657101866,4.0812677824831995,6,2,43,1.0,6.123233995736766e-17,0.6744436188329455,0.7383263540031065,0.28962545029238185,,18.9 +2026-02-12 07:00:00+00:00,25100.0,,,,,,,1.5125,1.148824181547619,4.394056743310247,7,2,43,0.9659258262890683,-0.25881904510252063,0.6744436188329455,0.7383263540031065,0.4619440397473573,,25.1 +2026-02-12 08:00:00+00:00,29600.0,,,,,,,1.6,-15.5361,5.19036276574191,8,2,43,0.8660254037844387,-0.49999999999999983,0.6744436188329455,0.7383263540031065,0.5941687439666267,,29.6 +2026-02-12 09:00:00+00:00,32400.0,,,,,,,2.025,-27.422827205882356,5.711056998122987,9,2,43,0.7071067811865476,-0.7071067811865475,0.6744436188329455,0.7383263540031065,0.677288667869302,,32.4 +2026-02-12 10:00:00+00:00,32300.0,,,,,,,1.9000000000000001,-36.132241758241754,7.755836009385717,10,2,43,0.49999999999999994,-0.8660254037844387,0.6744436188329455,0.7383263540031065,0.7056393260035849,,32.3 +2026-02-12 11:00:00+00:00,32400.0,,,,,,,1.975,-45.60884523809524,6.792857755787531,11,2,43,0.258819045102521,-0.9659258262890682,0.6744436188329455,0.7383263540031065,0.677288667869302,,32.4 +2026-02-12 12:00:00+00:00,32400.0,,,,,,,2.4250000000000003,-53.740964285714284,8.607388526329999,12,2,43,1.2246467991473532e-16,-1.0,0.6744436188329455,0.7383263540031065,0.5941687439666267,,32.4 +2026-02-12 13:00:00+00:00,26600.0,,,,,,,1.2875,-63.08373637820513,8.469655141378734,13,2,43,-0.2588190451025208,-0.9659258262890683,0.6744436188329455,0.7383263540031065,0.4619440397473573,,26.6 +2026-02-12 14:00:00+00:00,4900.0,,,,,,,0.9874999999999999,-66.13862499999999,12.206651775261717,14,2,43,-0.4999999999999998,-0.8660254037844388,0.6744436188329455,0.7383263540031065,0.28962545029238185,,4.9 +2026-02-12 15:00:00+00:00,300.0,,,,,,,0.42500000000000004,-56.943642857142855,30.77003037683188,15,2,43,-0.7071067811865471,-0.7071067811865479,0.6744436188329455,0.7383263540031065,0.08895620270312332,,0.3 +2026-02-12 16:00:00+00:00,0.0,,,,,,,1.4375,-53.960625,36.77681019649702,16,2,43,-0.8660254037844384,-0.5000000000000004,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 17:00:00+00:00,0.0,,,,,,,2.05,-53.946562500000006,36.76833770626967,17,2,43,-0.9659258262890683,-0.25881904510252063,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 18:00:00+00:00,0.0,,,,,,,1.725,-53.9365,36.76175804872957,18,2,43,-1.0,-1.8369701987210297e-16,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 19:00:00+00:00,0.0,,,,,,,1.95,-53.932375,36.76002960729448,19,2,43,-0.9659258262890684,0.2588190451025203,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 20:00:00+00:00,0.0,,,,,,,2.05,-53.926437500000006,36.758528550287366,20,2,43,-0.8660254037844386,0.5000000000000001,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 21:00:00+00:00,0.0,,,,,,,1.8625,-53.92187499999999,36.7509144656633,21,2,43,-0.7071067811865477,0.7071067811865474,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 22:00:00+00:00,0.0,,,,,,,2.1875,-53.913937499999996,36.748469859514216,22,2,43,-0.5000000000000004,0.8660254037844384,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-12 23:00:00+00:00,0.0,,,,,,,2.25,-53.9026875,36.742610959764754,23,2,43,-0.25881904510252157,0.9659258262890681,0.6744436188329455,0.7383263540031065,0.0,0.0,0.0 +2026-02-13 00:00:00+00:00,0.0,,,,,,,2.3625,-53.918749999999996,36.748804997577814,0,2,44,0.0,1.0,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 01:00:00+00:00,0.0,,,,,,,2.8125,-53.91312500000001,36.745133202405185,1,2,44,0.25881904510252074,0.9659258262890683,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 02:00:00+00:00,0.0,,,,,,,2.85,-53.93075,36.75496041012696,2,2,44,0.49999999999999994,0.8660254037844387,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 03:00:00+00:00,0.0,,,,,,,3.6125,-49.459333333333326,45.66313327388835,3,2,44,0.7071067811865475,0.7071067811865476,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 04:00:00+00:00,100.0,,,,,,,3.2375,9.575863553113553,22.522749950128777,4,2,44,0.8660254037844386,0.5000000000000001,0.6870527672236669,0.7266075247685656,0.0,0.0,0.1 +2026-02-13 05:00:00+00:00,5700.0,,,,,,,3.1999999999999997,52.70269162210339,6.817648145483765,5,2,44,0.9659258262890683,0.25881904510252074,0.6870527672236669,0.7266075247685656,0.0920597799463077,,5.7 +2026-02-13 06:00:00+00:00,14000.0,,,,,,,2.8125,27.13883585055644,4.747653257558303,6,2,44,1.0,6.123233995736766e-17,0.6870527672236669,0.7266075247685656,0.29301304826829766,,14.0 +2026-02-13 07:00:00+00:00,23900.0,,,,,,,2.7125000000000004,2.0045716548776893,5.670138011135128,7,2,44,0.9659258262890683,-0.25881904510252063,0.6870527672236669,0.7266075247685656,0.4655755318556735,,23.9 +2026-02-13 08:00:00+00:00,27600.0,,,,,,,2.725,-14.460642857142856,6.589856245557457,8,2,44,0.8660254037844387,-0.49999999999999983,0.6870527672236669,0.7266075247685656,0.5979873826249436,,27.6 +2026-02-13 09:00:00+00:00,30500.0,,,,,,,3.375,-27.039116771708684,5.479967726270515,9,2,44,0.7071067811865476,-0.7071067811865475,0.6870527672236669,0.7266075247685656,0.6812249517671114,,30.5 +2026-02-13 10:00:00+00:00,31700.0,,,,,,,3.7625,-36.00838095238095,7.179449501274134,10,2,44,0.49999999999999994,-0.8660254037844387,0.6870527672236669,0.7266075247685656,0.7096157365017253,,31.7 +2026-02-13 11:00:00+00:00,29200.0,,,,,,,4.125,-45.38609126984127,6.510345656604423,11,2,44,0.258819045102521,-0.9659258262890682,0.6870527672236669,0.7266075247685656,0.6812249517671114,,29.2 +2026-02-13 12:00:00+00:00,29200.0,,,,,,,2.6,-54.101303571428566,6.875985618496106,12,2,44,1.2246467991473532e-16,-1.0,0.6870527672236669,0.7266075247685656,0.5979873826249436,,29.2 +2026-02-13 13:00:00+00:00,17300.0,,,,,,,3.6875,-63.496614583333326,7.050837485994567,13,2,44,-0.2588190451025208,-0.9659258262890683,0.6870527672236669,0.7266075247685656,0.4655755318556735,,17.3 +2026-02-13 14:00:00+00:00,5500.0,,,,,,,3.975,-66.5815,11.462676200027058,14,2,44,-0.4999999999999998,-0.8660254037844388,0.6870527672236669,0.7266075247685656,0.29301304826829766,,5.5 +2026-02-13 15:00:00+00:00,500.0,,,,,,,1.45,-56.24516666666666,32.25121820007561,15,2,44,-0.7071067811865471,-0.7071067811865479,0.6870527672236669,0.7266075247685656,0.0920597799463077,,0.5 +2026-02-13 16:00:00+00:00,0.0,,,,,,,1.2,-53.48125,37.93633529239042,16,2,44,-0.8660254037844384,-0.5000000000000004,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 17:00:00+00:00,0.0,,,,,,,1.1,-53.573625,37.94653184718159,17,2,44,-0.9659258262890683,-0.25881904510252063,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 18:00:00+00:00,0.0,,,,,,,0.75,-53.587125,37.917995735039845,18,2,44,-1.0,-1.8369701987210297e-16,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 19:00:00+00:00,0.0,,,,,,,1.4625,-53.578374999999994,37.91049749821941,19,2,44,-0.9659258262890684,0.2588190451025203,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 20:00:00+00:00,0.0,,,,,,,1.2625000000000002,-53.570375000000006,37.90148037648618,20,2,44,-0.8660254037844386,0.5000000000000001,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 21:00:00+00:00,0.0,,,,,,,1.3875000000000002,-53.5805625,37.8944195816784,21,2,44,-0.7071067811865477,0.7071067811865474,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 22:00:00+00:00,0.0,,,,,,,1.0750000000000002,-53.58412499999999,37.89223053251374,22,2,44,-0.5000000000000004,0.8660254037844384,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-13 23:00:00+00:00,0.0,,,,,,,1.4125,-53.594812499999996,37.867622908283515,23,2,44,-0.25881904510252157,0.9659258262890681,0.6870527672236669,0.7266075247685656,0.0,0.0,0.0 +2026-02-14 00:00:00+00:00,0.0,,,,,,,3.225,-53.592062500000004,37.85474486352129,0,2,45,0.0,1.0,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 01:00:00+00:00,0.0,,,,,,,3.8125,-53.57750000000001,37.87889666423773,1,2,45,0.25881904510252074,0.9659258262890683,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 02:00:00+00:00,0.0,,,,,,,4.175,-53.5796875,37.86449257955653,2,2,45,0.49999999999999994,0.8660254037844387,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 03:00:00+00:00,0.0,,,,,,,3.2125,-49.653166666666664,45.709304272276505,3,2,45,0.7071067811865475,0.7071067811865476,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 04:00:00+00:00,100.0,,,,,,,4.1375,10.72035294117647,21.507844095105792,4,2,45,0.8660254037844386,0.5000000000000001,0.6994583270516471,0.7146733860429609,0.0,0.0,0.1 +2026-02-14 05:00:00+00:00,5700.0,,,,,,,4.5249999999999995,51.97425487012987,6.303071283701587,5,2,45,0.9659258262890683,0.25881904510252074,0.6994583270516471,0.7146733860429609,0.09520016213513663,,5.7 +2026-02-14 06:00:00+00:00,15100.0,,,,,,,3.9250000000000003,27.670089151651652,5.065419878933386,6,2,45,1.0,6.123233995736766e-17,0.6994583270516471,0.7146733860429609,0.29643460414068074,,15.1 +2026-02-14 07:00:00+00:00,24600.0,,,,,,,3.3375,2.012085215053763,5.19573564121763,7,2,45,0.9659258262890683,-0.25881904510252063,0.6994583270516471,0.7146733860429609,0.46923853704390334,,24.6 +2026-02-14 08:00:00+00:00,30000.0,,,,,,,3.9125,-15.099874458874458,4.487083111832815,8,2,45,0.8660254037844387,-0.49999999999999983,0.6994583270516471,0.7146733860429609,0.6018356583894515,,30.0 +2026-02-14 09:00:00+00:00,32300.0,,,,,,,3.3625,-26.96358966503268,5.269166748458755,9,2,45,0.7071067811865476,-0.7071067811865475,0.6994583270516471,0.7146733860429609,0.6851896934847299,,32.3 +2026-02-14 10:00:00+00:00,32300.0,,,,,,,3.7625,-35.7,7.433438524417641,10,2,45,0.49999999999999994,-0.8660254037844387,0.6994583270516471,0.7146733860429609,0.7136202025870513,,32.3 +2026-02-14 11:00:00+00:00,32400.0,,,,,,,3.9875,-44.81477564102563,7.079517208923728,11,2,45,0.258819045102521,-0.9659258262890682,0.6994583270516471,0.7146733860429609,0.6851896934847299,,32.4 +2026-02-14 12:00:00+00:00,32300.0,,,,,,,3.675,-53.098217261904765,8.403429392449864,12,2,45,1.2246467991473532e-16,-1.0,0.6994583270516471,0.7146733860429609,0.6018356583894515,,32.3 +2026-02-14 13:00:00+00:00,28400.0,,,,,,,2.7125,-62.611697303921574,8.750824546414147,13,2,45,-0.2588190451025208,-0.9659258262890683,0.6994583270516471,0.7146733860429609,0.46923853704390334,,28.4 +2026-02-14 14:00:00+00:00,10800.0,,,,,,,1.9625,-66.01677777777778,12.823623341510709,14,2,45,-0.4999999999999998,-0.8660254037844388,0.6994583270516471,0.7146733860429609,0.29643460414068074,,10.8 +2026-02-14 15:00:00+00:00,500.0,,,,,,,2.5375,-56.27023214285714,32.463819747474474,15,2,45,-0.7071067811865471,-0.7071067811865479,0.6994583270516471,0.7146733860429609,0.09520016213513663,,0.5 +2026-02-14 16:00:00+00:00,0.0,,,,,,,1.6,-54.057833333333335,36.85299277233503,16,2,45,-0.8660254037844384,-0.5000000000000004,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 17:00:00+00:00,0.0,,,,,,,1.3250000000000002,-54.0349375,36.841473855547065,17,2,45,-0.9659258262890683,-0.25881904510252063,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 18:00:00+00:00,0.0,,,,,,,1.3875,-54.018750000000004,36.83876199625425,18,2,45,-1.0,-1.8369701987210297e-16,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 19:00:00+00:00,0.0,,,,,,,1.55,-54.0186875,36.8405519578262,19,2,45,-0.9659258262890684,0.2588190451025203,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 20:00:00+00:00,0.0,,,,,,,1.3,-54.0095625,36.84546730285321,20,2,45,-0.8660254037844386,0.5000000000000001,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 21:00:00+00:00,0.0,,,,,,,1.0625,-53.989749999999994,36.84498885307652,21,2,45,-0.7071067811865477,0.7071067811865474,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 22:00:00+00:00,0.0,,,,,,,1.2375,-53.979,36.84138684731254,22,2,45,-0.5000000000000004,0.8660254037844384,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-14 23:00:00+00:00,0.0,,,,,,,1.1625,-53.970062500000004,36.84105561981485,23,2,45,-0.25881904510252157,0.9659258262890681,0.6994583270516471,0.7146733860429609,0.0,0.0,0.0 +2026-02-15 00:00:00+00:00,0.0,,,,,,,1.2,-53.9645625,36.84197578757539,0,2,46,0.0,1.0,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 01:00:00+00:00,0.0,,,,,,,1.325,-53.961125,36.84053374652933,1,2,46,0.25881904510252074,0.9659258262890683,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 02:00:00+00:00,0.0,,,,,,,2.075,-53.96975,36.83994354298063,2,2,46,0.49999999999999994,0.8660254037844387,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 03:00:00+00:00,0.0,,,,,,,2.0125,-49.35230357142857,46.05326219547116,3,2,46,0.7071067811865475,0.7071067811865476,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 04:00:00+00:00,300.0,,,,,,,1.8875,9.91718576388889,21.87995084252363,4,2,46,0.8660254037844386,0.5000000000000001,0.7116566222817746,0.702527474169157,0.0,0.0,0.3 +2026-02-15 05:00:00+00:00,4700.0,,,,,,,1.225,52.32550378787879,6.223420815416292,5,2,46,0.9659258262890683,0.25881904510252074,0.7116566222817746,0.702527474169157,0.09837620257882995,,4.7 +2026-02-15 06:00:00+00:00,19500.0,,,,,,,1.9874999999999998,27.61167522853736,4.617332331527625,6,2,46,1.0,6.123233995736766e-17,0.7116566222817746,0.702527474169157,0.29988863368063956,,19.5 +2026-02-15 07:00:00+00:00,25700.0,,,,,,,3.0625,2.2107072302558395,4.735443293757044,7,2,46,0.9659258262890683,-0.25881904510252063,0.7116566222817746,0.702527474169157,0.47293128123260786,,25.7 +2026-02-15 08:00:00+00:00,30400.0,,,,,,,3.475,-14.096237012987013,5.406747445459825,8,2,46,0.8660254037844387,-0.49999999999999983,0.7116566222817746,0.702527474169157,0.6057115747705646,,30.4 +2026-02-15 09:00:00+00:00,32400.0,,,,,,,3.85,-26.547349264705883,5.300349673188573,9,2,46,0.7071067811865476,-0.7071067811865475,0.7116566222817746,0.702527474169157,0.6891807567197079,,32.4 +2026-02-15 10:00:00+00:00,32400.0,,,,,,,4.112500000000001,-35.13868452380952,7.68097471029177,10,2,46,0.49999999999999994,-0.8660254037844387,0.7116566222817746,0.702527474169157,0.717650540269549,,32.4 +2026-02-15 11:00:00+00:00,32200.0,,,,,,,4.7125,-44.10453571428572,7.905709629109582,11,2,46,0.258819045102521,-0.9659258262890682,0.7116566222817746,0.702527474169157,0.6891807567197079,,32.2 +2026-02-15 12:00:00+00:00,32400.0,,,,,,,4.5875,-52.67221428571429,8.961316504612634,12,2,46,1.2246467991473532e-16,-1.0,0.7116566222817746,0.702527474169157,0.6057115747705646,,32.4 +2026-02-15 13:00:00+00:00,32100.0,,,,,,,4.4375,-62.31092218137255,8.802910273514447,13,2,46,-0.2588190451025208,-0.9659258262890683,0.7116566222817746,0.702527474169157,0.47293128123260786,,32.1 +2026-02-15 14:00:00+00:00,20700.0,,,,,,,2.9375,-65.16234722222222,14.238593413964002,14,2,46,-0.4999999999999998,-0.8660254037844388,0.7116566222817746,0.702527474169157,0.29988863368063956,,20.7 +2026-02-15 15:00:00+00:00,1400.0,,,,,,,1.8125,-55.96171428571428,33.05602195289597,15,2,46,-0.7071067811865471,-0.7071067811865479,0.7116566222817746,0.702527474169157,0.09837620257882995,,1.4 +2026-02-15 16:00:00+00:00,0.0,,,,,,,2.2875,-53.94708333333334,37.05200890177761,16,2,46,-0.8660254037844384,-0.5000000000000004,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 17:00:00+00:00,0.0,,,,,,,2.875,-53.9504375,37.05764384620657,17,2,46,-0.9659258262890683,-0.25881904510252063,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 18:00:00+00:00,0.0,,,,,,,3.375,-53.955124999999995,37.061658400506495,18,2,46,-1.0,-1.8369701987210297e-16,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 19:00:00+00:00,0.0,,,,,,,4.375,-53.9519375,37.06134054980956,19,2,46,-0.9659258262890684,0.2588190451025203,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 20:00:00+00:00,0.0,,,,,,,4.65,-53.95475,37.06405492859625,20,2,46,-0.8660254037844386,0.5000000000000001,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 21:00:00+00:00,0.0,,,,,,,4.3875,-53.953916666666665,37.06527765020838,21,2,46,-0.7071067811865477,0.7071067811865474,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 22:00:00+00:00,0.0,17.5625,17.675,17.5,0.0,39.0,0.0,3.9625,-53.945875,37.06179100136914,22,2,46,-0.5000000000000004,0.8660254037844384,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-15 23:00:00+00:00,0.0,17.2125,17.3375,17.1625,0.0,37.75,0.0,4.0625,-53.943625,37.061332882972515,23,2,46,-0.25881904510252157,0.9659258262890681,0.7116566222817746,0.702527474169157,0.0,0.0,0.0 +2026-02-16 00:00:00+00:00,0.0,16.8625,16.9375,16.8,0.0,36.125,0.0,3.9125,-53.938937499999994,37.05724432571349,0,2,47,0.0,1.0,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 01:00:00+00:00,0.0,16.5875,16.675,16.5,0.0,34.375,0.0,3.1,-53.91275,37.047841674650904,1,2,47,0.25881904510252074,0.9659258262890683,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 02:00:00+00:00,0.0,16.3375,16.4125,16.2375,0.0,34.25,0.0,2.8,-53.902812499999996,37.0393421801822,2,2,47,0.49999999999999994,0.8660254037844387,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 03:00:00+00:00,0.0,16.125,16.237499999999997,16.0375,0.0,34.375,0.0,2.675,-49.05360714285714,46.8028068617808,3,2,47,0.7071067811865475,0.7071067811865476,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 04:00:00+00:00,400.0,15.8625,15.9375,15.7875,11.0,33.75,0.0,2.975,12.841109375,20.445922274047536,4,2,47,0.8660254037844386,0.5000000000000001,0.7236440382959124,0.6901733882429719,0.0,0.0,0.4 +2026-02-16 05:00:00+00:00,10100.0,16.3875,16.5,16.275,161.0,32.5,0.0,3.1875,52.20043102240896,6.364472075080159,5,2,47,0.9659258262890683,0.25881904510252074,0.7236440382959124,0.6901733882429719,0.10158673783802336,1.5,10.1 +2026-02-16 06:00:00+00:00,19600.0,17.35,17.45,17.2625,336.25,32.875,0.0,3.4499999999999997,27.188720318896785,3.53166587150894,6,2,47,1.0,6.123233995736766e-17,0.7236440382959124,0.6901733882429719,0.30337363928305316,1.1083692070103448,19.6 +2026-02-16 07:00:00+00:00,25600.0,18.575,18.675,18.387500000000003,488.625,33.75,0.0,3.75,1.9177195812807881,3.764227727588514,7,2,47,0.9659258262890683,-0.25881904510252063,0.7236440382959124,0.6901733882429719,0.47665197986202557,1.0251189980191422,25.6 +2026-02-16 08:00:00+00:00,29600.0,20.1625,20.424999999999997,19.924999999999997,617.375,32.875,0.0,4.725,-14.571658008658007,4.425533209562378,8,2,47,0.8660254037844387,-0.49999999999999983,0.7236440382959124,0.6901733882429719,0.6096131270204809,1.0127324570870968,29.6 +2026-02-16 09:00:00+00:00,32400.0,21.525000000000002,21.6625,21.3625,702.5,31.5,0.0,4.7,-26.494306985294116,4.953642854309908,9,2,47,0.7071067811865476,-0.7071067811865475,0.7236440382959124,0.6901733882429719,0.6931959983082553,1.0134218918090283,32.4 +2026-02-16 10:00:00+00:00,32300.0,22.9875,23.287499999999998,22.7625,714.25,28.75,0.0,3.85,-35.091206959706966,7.322743753772708,10,2,47,0.49999999999999994,-0.8660254037844387,0.7236440382959124,0.6901733882429719,0.7217045591743125,0.9896708991518065,32.3 +2026-02-16 11:00:00+00:00,32300.0,24.475,24.625,24.2625,633.0,28.375,0.0,3.0749999999999997,-44.19718131868132,6.817458288178179,11,2,47,0.258819045102521,-0.9659258262890682,0.7236440382959124,0.6901733882429719,0.6931959983082553,0.9131616477083485,32.3 +2026-02-16 12:00:00+00:00,32300.0,24.8125,25.0125,24.5875,474.25,28.625,0.0,2.5,-52.902921568627455,7.877483878745804,12,2,47,1.2246467991473532e-16,-1.0,0.7236440382959124,0.6901733882429719,0.6096131270204809,0.7779524078130077,32.3 +2026-02-16 13:00:00+00:00,30800.0,24.3625,24.5125,24.2375,239.75,31.5,0.0,1.9,-62.995375,7.276461786845078,13,2,47,-0.2588190451025208,-0.9659258262890683,0.7236440382959124,0.6901733882429719,0.47665197986202557,0.5029875257612471,30.8 +2026-02-16 14:00:00+00:00,14300.0,23.55,23.7125,23.375,122.625,33.75,0.0,1.4875,-65.37945833333333,13.499877450318252,14,2,47,-0.4999999999999998,-0.8660254037844388,0.7236440382959124,0.6901733882429719,0.30337363928305316,0.4042045323706871,14.3 +2026-02-16 15:00:00+00:00,1100.0,22.3,22.4625,22.075,19.25,34.75,0.0,1.9375,-55.97342857142858,32.76188786054727,15,2,47,-0.7071067811865471,-0.7071067811865479,0.7236440382959124,0.6901733882429719,0.10158673783802336,0.18949323907509935,1.1 +2026-02-16 16:00:00+00:00,0.0,21.4375,21.8125,21.0125,0.0,33.875,0.0,2.2375,-53.996437500000006,36.809269800766565,16,2,47,-0.8660254037844384,-0.5000000000000004,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 17:00:00+00:00,0.0,21.1,21.4125,20.7625,0.0,33.625,0.0,2.2,-53.981500000000004,36.80760682023939,17,2,47,-0.9659258262890683,-0.25881904510252063,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 18:00:00+00:00,0.0,19.5375,19.8125,19.3625,0.0,37.625,0.0,0.8125,-53.984125,36.805601166523104,18,2,47,-1.0,-1.8369701987210297e-16,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 19:00:00+00:00,0.0,19.362499999999997,19.6,19.2375,0.0,37.125,0.0,1.0,-53.9781875,36.80080127375795,19,2,47,-0.9659258262890684,0.2588190451025203,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 20:00:00+00:00,0.0,19.025,19.2,18.787499999999998,0.0,37.75,0.0,0.7625,-53.96116666666667,36.79084422485815,20,2,47,-0.8660254037844386,0.5000000000000001,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 21:00:00+00:00,0.0,18.9875,19.15,18.8125,0.0,37.0,0.0,1.1875,-53.964,36.7957437280455,21,2,47,-0.7071067811865477,0.7071067811865474,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 22:00:00+00:00,0.0,20.3625,20.975,19.8625,0.0,30.625,0.0,3.5625,-53.94581250000001,36.785405877294494,22,2,47,-0.5000000000000004,0.8660254037844384,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-16 23:00:00+00:00,0.0,20.3,20.4875,20.2,0.0,25.75,0.0,6.2625,-53.9318125,36.77507695175214,23,2,47,-0.25881904510252157,0.9659258262890681,0.7236440382959124,0.6901733882429719,0.0,0.0,0.0 +2026-02-17 00:00:00+00:00,0.0,18.5625,18.762500000000003,18.3625,0.0,45.75,0.0,5.5625,-53.956375,36.79434174202831,0,2,48,0.0,1.0,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 01:00:00+00:00,0.0,17.3125,17.4,17.175,0.0,66.75,0.0,5.1625,-53.94856250000001,36.79829160344664,1,2,48,0.25881904510252074,0.9659258262890683,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 02:00:00+00:00,0.0,16.6,16.737499999999997,16.5625,0.0,82.5,0.0,4.8,-53.85606249999999,36.97652744668738,2,2,48,0.49999999999999994,0.8660254037844387,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 03:00:00+00:00,0.0,16.7375,16.85,16.6875,0.0,90.75,0.0,3.1375,-49.428125,45.840790804288055,3,2,48,0.7071067811865475,0.7071067811865476,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 04:00:00+00:00,200.0,16.7125,16.775,16.65,3.375,90.125,0.0,3.5,7.9935358455882355,23.22800752711631,4,2,48,0.8660254037844386,0.5000000000000001,0.7354170229639855,0.6776147890466889,0.0,0.0,0.2 +2026-02-17 05:00:00+00:00,7600.0,16.674999999999997,16.725,16.6,42.625,88.375,0.0,2.625,52.51021306818182,6.416266068154421,5,2,48,0.9659258262890683,0.25881904510252074,0.7354170229639855,0.6776147890466889,0.1048305882754899,0.40660842127474744,7.6 +2026-02-17 06:00:00+00:00,16000.0,16.875,17.0,16.7875,131.0,83.75,0.0,1.6,28.279357142857144,4.179891984250315,6,2,48,1.0,6.123233995736766e-17,0.7354170229639855,0.6776147890466889,0.30688811093546736,0.4268656729668709,16.0 +2026-02-17 07:00:00+00:00,12100.0,17.6,17.8125,17.4125,225.125,76.25,0.0,1.3,3.2840276947637292,4.95905358337841,7,2,48,0.9659258262890683,-0.25881904510252063,0.7354170229639855,0.6776147890466889,0.4803988392200627,0.4686210324019413,12.1 +2026-02-17 08:00:00+00:00,15200.0,17.3,17.425,17.175,207.75,77.25,0.0,3.3375,-13.113017316017316,5.898363390345654,8,2,48,0.8660254037844387,-0.49999999999999983,0.7354170229639855,0.6776147890466889,0.6135383037367171,0.33860966582642266,15.2 +2026-02-17 09:00:00+00:00,25200.0,17.2625,17.424999999999997,17.175,338.5,74.0,0.0,3.275,-25.329436274509803,6.015715079252368,9,2,48,0.7071067811865476,-0.7071067811865475,0.7354170229639855,0.6776147890466889,0.6972332700019886,0.48549031516960534,25.2 +2026-02-17 10:00:00+00:00,17600.0,17.075,17.375,16.9375,326.375,74.75,0.0,4.15,-34.5725625,7.580188631049472,10,2,48,0.49999999999999994,-0.8660254037844387,0.7354170229639855,0.6776147890466889,0.7257800643773705,0.4496885709860181,17.6 +2026-02-17 11:00:00+00:00,18900.0,17.6,17.825,17.4,445.625,70.625,0.0,4.4125,-43.76523214285714,7.609780048389926,11,2,48,0.258819045102521,-0.9659258262890682,0.7354170229639855,0.6776147890466889,0.6972332700019886,0.6391332989585092,18.9 +2026-02-17 12:00:00+00:00,22100.0,17.425,17.6625,17.25,294.0,70.875,0.0,4.3,-52.185988095238095,8.574042509397062,12,2,48,1.2246467991473532e-16,-1.0,0.7354170229639855,0.6776147890466889,0.6135383037367171,0.4791876859348653,22.1 +2026-02-17 13:00:00+00:00,27600.0,17.1375,17.275,16.975,250.125,74.75,0.0,4.175,-61.85730208333334,8.620142426221893,13,2,48,-0.2588190451025208,-0.9659258262890683,0.7354170229639855,0.6776147890466889,0.4803988392200627,0.5206611248396916,27.6 +2026-02-17 14:00:00+00:00,15200.0,16.775000000000002,16.8875,16.6375,94.75,76.875,0.0,3.25,-65.7508134920635,12.847123224047081,14,2,48,-0.4999999999999998,-0.8660254037844388,0.7354170229639855,0.6776147890466889,0.30688811093546736,0.30874444666878637,15.2 +2026-02-17 15:00:00+00:00,1300.0,16.1625,16.275,16.075,8.5,80.875,0.0,1.3125,-56.28941666666667,32.42917665167519,15,2,48,-0.7071067811865471,-0.7071067811865479,0.7354170229639855,0.6776147890466889,0.1048305882754899,0.08108320424247163,1.3 +2026-02-17 16:00:00+00:00,0.0,15.6875,15.775,15.625,0.0,83.125,0.0,0.7875,-53.931825,37.09308715006747,16,2,48,-0.8660254037844384,-0.5000000000000004,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 17:00:00+00:00,0.0,15.1,15.2375,14.975000000000001,0.0,84.75,0.0,0.6125,-53.918312500000006,37.09164513594167,17,2,48,-0.9659258262890683,-0.25881904510252063,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 18:00:00+00:00,0.0,14.075,14.25,13.9625,0.0,87.625,0.0,0.8875,-53.9026875,37.08953757091018,18,2,48,-1.0,-1.8369701987210297e-16,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 19:00:00+00:00,0.0,14.3875,14.55,14.2625,0.0,80.875,0.0,2.2875,-53.887750000000004,37.08606045740097,19,2,48,-0.9659258262890684,0.2588190451025203,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 20:00:00+00:00,0.0,14.2625,14.4625,14.1,0.0,78.0,0.0,2.3625,-53.884833333333326,37.08746205380725,20,2,48,-0.8660254037844386,0.5000000000000001,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 21:00:00+00:00,0.0,14.425,14.625,14.2125,0.0,75.125,0.0,2.5999999999999996,-53.881,37.087849400668496,21,2,48,-0.7071067811865477,0.7071067811865474,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 22:00:00+00:00,0.0,14.325,14.6875,14.0625,0.0,65.375,0.0,2.1875,-53.869499999999995,37.087491593078475,22,2,48,-0.5000000000000004,0.8660254037844384,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-17 23:00:00+00:00,0.0,14.9625,15.1125,14.8,0.0,56.5,0.0,2.5375,-53.862562499999996,37.08460711691072,23,2,48,-0.25881904510252157,0.9659258262890681,0.7354170229639855,0.6776147890466889,0.0,0.0,0.0 +2026-02-18 00:00:00+00:00,0.0,14.525,14.8375,14.1,0.0,58.0,0.0,2.0,-53.86543749999999,37.08387312249928,0,2,49,0.0,1.0,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 01:00:00+00:00,0.0,14.475,14.6125,14.25,0.0,58.25,0.0,2.325,-53.857875,37.080664420905855,1,2,49,0.25881904510252074,0.9659258262890683,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 02:00:00+00:00,0.0,13.8625,14.212499999999999,13.5375,0.0,61.5,0.0,1.8375,-53.856437500000006,37.07860820741467,2,2,49,0.49999999999999994,0.8660254037844387,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 03:00:00+00:00,0.0,12.6625,12.95,12.325,0.0,67.625,0.0,0.9375,-49.45925,45.88804179467675,3,2,49,0.7071067811865475,0.7071067811865476,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 04:00:00+00:00,300.0,14.15,14.3625,13.799999999999999,9.375,59.875,0.0,1.3,9.112484374999998,22.553414745400747,4,2,49,0.8660254037844386,0.5000000000000001,0.7469720876965552,0.6648553979642865,0.0,0.0,0.3 +2026-02-18 05:00:00+00:00,10500.0,15.3375,15.4875,15.2625,158.25,55.0,0.0,1.625,52.5855252039627,6.331172374789136,5,2,49,0.9659258262890683,0.25881904510252074,0.7469720876965552,0.6648553979642865,0.10810655863389063,1.463833480593191,10.5 +2026-02-18 06:00:00+00:00,21100.0,16.0875,16.200000000000003,15.9375,357.625,55.0,0.0,1.85,28.250413278825043,5.034203059468968,6,2,49,1.0,6.123233995736766e-17,0.7469720876965552,0.6648553979642865,0.3104305272113489,1.1520290971787062,21.1 +2026-02-18 07:00:00+00:00,26000.0,17.425,17.7125,17.137500000000003,517.0,52.5,0.0,1.9875,3.2708809523809523,4.632086645479772,7,2,49,0.9659258262890683,-0.25881904510252063,0.7469720876965552,0.6648553979642865,0.48417005779234956,1.0678066346302864,26.0 +2026-02-18 08:00:00+00:00,30700.0,18.487499999999997,18.8125,18.2125,630.5,48.875,0.0,2.6375,-13.009951604554866,5.259324164609337,8,2,49,0.8660254037844387,-0.49999999999999983,0.7469720876965552,0.6648553979642865,0.6174850884859473,1.0210772887584458,30.7 +2026-02-18 09:00:00+00:00,32500.0,18.487499999999997,18.8,18.25,701.125,52.75,0.0,3.6375,-25.445527369281045,5.334477919757515,9,2,49,0.7071067811865476,-0.7071067811865475,0.7469720876965552,0.6648553979642865,0.7012904202638783,0.9997641201717599,32.5 +2026-02-18 10:00:00+00:00,32400.0,18.5625,18.7875,18.2375,681.5,52.0,0.0,3.675,-34.680148809523814,6.878892596038723,10,2,49,0.49999999999999994,-0.8660254037844387,0.7469720876965552,0.6648553979642865,0.7298748582603358,0.9337217089849652,32.4 +2026-02-18 11:00:00+00:00,32400.0,18.3875,18.5875,18.175,661.25,52.375,0.0,5.5625,-43.89050801282051,6.408220803209174,11,2,49,0.258819045102521,-0.9659258262890682,0.7469720876965552,0.6648553979642865,0.7012904202638783,0.9429046524707808,32.4 +2026-02-18 12:00:00+00:00,32300.0,17.849999999999998,18.15,17.6625,476.5,57.75,0.0,5.35,-52.600369047619054,7.029780161300431,12,2,49,1.2246467991473532e-16,-1.0,0.7469720876965552,0.6648553979642865,0.6174850884859473,0.7716785536770807,32.3 +2026-02-18 13:00:00+00:00,28500.0,16.925,17.0375,16.7875,187.875,64.5,0.0,5.6000000000000005,-61.918088235294114,7.966115920238124,13,2,49,-0.2588190451025208,-0.9659258262890683,0.7469720876965552,0.6648553979642865,0.48417005779234956,0.38803514793262095,28.5 +2026-02-18 14:00:00+00:00,14300.0,16.2875,16.3875,16.2125,75.0,68.75,0.0,5.575,-66.05329761904761,12.015602026889626,14,2,49,-0.4999999999999998,-0.8660254037844388,0.7469720876965552,0.6648553979642865,0.3104305272113489,0.24159995047438787,14.3 +2026-02-18 15:00:00+00:00,1000.0,15.700000000000001,15.875,15.4625,3.375,74.75,0.025,3.95,-56.10707142857143,32.39744580094502,15,2,49,-0.7071067811865471,-0.7071067811865479,0.7469720876965552,0.6648553979642865,0.10810655863389063,0.031219197453409286,1.0 +2026-02-18 16:00:00+00:00,0.0,15.5375,15.625,15.4375,0.0,64.25,0.0,4.95,-53.8968125,36.786874731247245,16,2,49,-0.8660254037844384,-0.5000000000000004,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 17:00:00+00:00,0.0,15.45,15.525,15.4125,0.0,63.0,0.0,3.8875,-53.8893125,36.781875227127266,17,2,49,-0.9659258262890683,-0.25881904510252063,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 18:00:00+00:00,0.0,15.0125,15.1375,14.925,0.0,64.25,0.0,5.125,-53.89175,36.7853209367088,18,2,49,-1.0,-1.8369701987210297e-16,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 19:00:00+00:00,0.0,14.3625,14.5,14.2375,0.0,71.25,0.0,3.2375,-53.88725,36.784321131201175,19,2,49,-0.9659258262890684,0.2588190451025203,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 20:00:00+00:00,0.0,13.0625,13.2,12.9,0.0,83.375,0.1125,3.0625,-53.8871875,36.78612439911674,20,2,49,-0.8660254037844386,0.5000000000000001,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 21:00:00+00:00,0.0,14.0125,14.125,13.9125,0.0,69.625,0.0,3.6125,-53.879000000000005,36.78414479319407,21,2,49,-0.7071067811865477,0.7071067811865474,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 22:00:00+00:00,0.0,14.237499999999999,14.3,14.15,0.0,68.25,0.0,3.5875,-53.871562499999996,36.77734092615939,22,2,49,-0.5000000000000004,0.8660254037844384,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-18 23:00:00+00:00,0.0,14.2,14.2375,14.125,0.0,65.875,0.0,3.5375,-53.865249999999996,36.78328683315291,23,2,49,-0.25881904510252157,0.9659258262890681,0.7469720876965552,0.6648553979642865,0.0,0.0,0.0 +2026-02-19 00:00:00+00:00,0.0,13.1375,13.325,12.925,0.0,76.75,0.0625,2.85,-53.795187500000004,36.91335518445808,0,2,50,0.0,1.0,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 01:00:00+00:00,0.0,13.1,13.149999999999999,13.0,0.0,70.0,0.0,1.8499999999999999,-53.695750000000004,37.078806600491696,1,2,50,0.25881904510252074,0.9659258262890683,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 02:00:00+00:00,0.0,13.5625,13.7,13.4,0.0,73.625,0.0,3.15,-53.695750000000004,37.078806600491696,2,2,50,0.49999999999999994,0.8660254037844387,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 03:00:00+00:00,0.0,13.4,13.4875,13.3375,0.0,74.5,0.0,2.3875,51.99985389065536,5.940123744338287,3,2,50,0.7071067811865475,0.7071067811865476,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 04:00:00+00:00,1000.0,13.725,13.7875,13.65,8.5,71.625,0.0,1.975,51.99985389065536,5.940123744338287,4,2,50,0.8660254037844386,0.5000000000000001,0.7583058084785625,0.6518989958787126,0.0,0.0,1.0 +2026-02-19 05:00:00+00:00,9900.0,14.575,14.7125,14.35,99.625,63.875,0.0,2.1,51.99985389065536,5.940123744338287,5,2,50,0.9659258262890683,0.25881904510252074,0.7583058084785625,0.6518989958787126,0.11141343864023118,0.8941919504136515,9.9 +2026-02-19 06:00:00+00:00,16800.0,15.5125,15.6375,15.3375,278.75,59.875,0.0,3.0125,28.24591865079365,4.401198107083288,6,2,50,1.0,6.123233995736766e-17,0.7583058084785625,0.6518989958787126,0.31399935628677267,0.8877406734089615,16.8 +2026-02-19 07:00:00+00:00,20400.0,15.8125,16.1125,15.55,251.125,59.625,0.0,2.95,3.5389666028097064,4.087165051831466,7,2,50,0.9659258262890683,-0.25881904510252063,0.7583058084785625,0.6518989958787126,0.48796382763291657,0.5146385567516191,20.4 +2026-02-19 08:00:00+00:00,21300.0,16.9375,17.225,16.6,648.125,48.625,0.0,3.325,-12.91992316017316,4.843898371812421,8,2,50,0.8660254037844387,-0.49999999999999983,0.7583058084785625,0.6518989958787126,0.6214514614463054,1.042921354616525,21.3 +2026-02-19 09:00:00+00:00,27500.0,17.5875,17.875,17.1625,689.125,48.75,0.0,2.8375,-25.33635294117647,4.740520920961759,9,2,50,0.7071067811865476,-0.7071067811865475,0.7583058084785625,0.6518989958787126,0.7053652960813017,0.9769760489046942,27.5 +2026-02-19 10:00:00+00:00,26400.0,17.3125,17.6875,16.825,596.25,51.25,0.0,2.9625,-34.087208333333336,7.626555903642803,10,2,50,0.49999999999999994,-0.8660254037844387,0.7583058084785625,0.6518989958787126,0.733986742381699,0.8123443729586179,26.4 +2026-02-19 11:00:00+00:00,23800.0,17.2125,17.5375,16.9125,565.125,53.0,0.0,3.1625,-43.08176923076923,7.560814310213588,11,2,50,0.258819045102521,-0.9659258262890682,0.7583058084785625,0.6518989958787126,0.7053652960813017,0.8011806125699479,23.8 +2026-02-19 12:00:00+00:00,24900.0,17.7625,18.0125,17.3875,634.0,49.75,0.0,2.575,-51.25990705128205,8.372207756519098,12,2,50,1.2246467991473532e-16,-1.0,0.7583058084785625,0.6518989958787126,0.6214514614463054,1.0201923067724232,24.9 +2026-02-19 13:00:00+00:00,10200.0,17.25,17.475,16.95,436.0,52.75,0.0,2.35,-57.0376393557423,7.6027755173933835,13,2,50,-0.2588190451025208,-0.9659258262890683,0.7583058084785625,0.6518989958787126,0.48796382763291657,0.893508853135713,10.2 +2026-02-19 14:00:00+00:00,3600.0,16.15,16.3625,15.9375,163.0,56.25,0.0,1.7125,-62.460750000000004,12.388661101169475,14,2,50,-0.4999999999999998,-0.8660254037844388,0.7583058084785625,0.6518989958787126,0.31399935628677267,0.5191093444508008,3.6 +2026-02-19 15:00:00+00:00,600.0,14.4625,14.825,14.2375,9.25,64.0,0.0,0.925,-55.783785714285706,33.20619333824651,15,2,50,-0.7071067811865471,-0.7071067811865479,0.7583058084785625,0.6518989958787126,0.11141343864023118,0.0830240957724093,0.6 +2026-02-19 16:00:00+00:00,0.0,12.375,12.5875,12.225,0.0,71.375,0.0,0.8,-53.77125,37.187033386428304,16,2,50,-0.8660254037844384,-0.5000000000000004,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 17:00:00+00:00,0.0,11.625,11.725,11.5125,0.0,74.0,0.0,1.025,-53.758750000000006,37.18198855516831,17,2,50,-0.9659258262890683,-0.25881904510252063,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 18:00:00+00:00,0.0,11.325,11.45,11.275,0.0,74.125,0.0,1.0625,-53.7424375,37.17458569057125,18,2,50,-1.0,-1.8369701987210297e-16,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 19:00:00+00:00,0.0,11.225,11.375,11.1,0.0,73.0,0.0,1.1,-53.740812500000004,37.174526898679225,19,2,50,-0.9659258262890684,0.2588190451025203,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 20:00:00+00:00,0.0,10.9375,11.075,10.8375,0.0,74.0,0.0,1.15,-53.72975,37.17995980475683,20,2,50,-0.8660254037844386,0.5000000000000001,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 21:00:00+00:00,0.0,10.8375,10.9125,10.725,0.0,76.875,0.0,1.1625,-53.724666666666664,37.18115731069923,21,2,50,-0.7071067811865477,0.7071067811865474,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 22:00:00+00:00,0.0,10.6,10.674999999999999,10.5,0.0,79.125,0.0,1.1500000000000001,-53.71487499999999,37.17798539990881,22,2,50,-0.5000000000000004,0.8660254037844384,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-19 23:00:00+00:00,0.0,10.4625,10.5375,10.4,0.0,80.0,0.0,1.175,-53.710125,37.17575327722582,23,2,50,-0.25881904510252157,0.9659258262890681,0.7583058084785625,0.6518989958787126,0.0,0.0,0.0 +2026-02-20 00:00:00+00:00,0.0,10.4,10.55,10.3,0.0,79.875,0.0,1.1625,-53.710125,37.175719260863,0,2,51,0.0,1.0,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 01:00:00+00:00,0.0,10.1375,10.2625,10.0,0.0,81.625,0.0,1.05,-53.704,37.17461521656949,1,2,51,0.25881904510252074,0.9659258262890683,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 02:00:00+00:00,0.0,10.637500000000001,10.7875,10.4875,0.0,76.125,0.0,1.525,-53.70168749999999,37.169269830384856,2,2,51,0.49999999999999994,0.8660254037844387,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 03:00:00+00:00,0.0,11.2,11.4125,11.0625,0.0,68.75,0.0,1.6124999999999998,-48.508535714285706,47.54754264222942,3,2,51,0.7071067811865475,0.7071067811865476,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 04:00:00+00:00,400.0,10.7125,10.9875,10.475,14.5,70.875,0.0,1.2125,14.672716176470589,19.169733575373634,4,2,51,0.8660254037844386,0.5000000000000001,0.7694148268839378,0.6387494220515272,0.0,0.0,0.4 +2026-02-20 05:00:00+00:00,9200.0,12.9,13.0375,12.7125,166.375,61.125,0.0,2.4124999999999996,51.98792857142857,5.938257379120602,5,2,51,0.9659258262890683,0.25881904510252074,0.7694148268839378,0.6387494220515272,0.11475000363662177,1.4498910215886252,9.2 +2026-02-20 06:00:00+00:00,22000.0,14.075,14.225,13.975,366.625,58.0,0.0,3.2625,27.873604297969187,4.016855180646518,6,2,51,1.0,6.123233995736766e-17,0.7694148268839378,0.6387494220515272,0.3175930569795268,1.1543860671476645,22.0 +2026-02-20 07:00:00+00:00,26400.0,15.5625,15.7625,15.3,532.25,55.5,0.0,3.4875,4.122197655316607,4.850460219857536,7,2,51,0.9659258262890683,-0.25881904510252063,0.7694148268839378,0.6387494220515272,0.4917783357539547,1.082296557826195,26.4 +2026-02-20 08:00:00+00:00,30700.0,17.2125,17.4,16.9875,662.5,51.25,0.0,4.175,-11.298808225108226,7.766207379016643,8,2,51,0.8660254037844387,-0.49999999999999983,0.7694148268839378,0.6387494220515272,0.6254354010662122,1.059262073861828,30.7 +2026-02-20 09:00:00+00:00,32400.0,19.2,19.45,18.925,736.75,45.5,0.0,4.074999999999999,-23.4705408496732,8.389669547764724,9,2,51,0.7071067811865476,-0.7071067811865475,0.7694148268839378,0.6387494220515272,0.7094557447940125,1.0384721040125093,32.4 +2026-02-20 10:00:00+00:00,32500.0,20.0625,20.325000000000003,19.875,755.5,43.0,0.0,3.825,-33.767809523809525,7.8496506879543695,10,2,51,0.49999999999999994,-0.8660254037844387,0.7694148268839378,0.6387494220515272,0.7381135193624893,1.0235552935712755,32.5 +2026-02-20 11:00:00+00:00,32400.0,21.0875,21.287499999999998,20.7875,694.5,41.125,0.0,2.725,-41.892555860805864,9.530622960613105,11,2,51,0.258819045102521,-0.9659258262890682,0.7694148268839378,0.6387494220515272,0.7094557447940125,0.9789194112476249,32.4 +2026-02-20 12:00:00+00:00,32100.0,21.675,21.8625,21.487499999999997,563.625,37.625,0.0,3.075,-51.32638839285714,8.847232027915682,12,2,51,1.2246467991473532e-16,-1.0,0.7694148268839378,0.6387494220515272,0.6254354010662122,0.9011722058571664,32.1 +2026-02-20 13:00:00+00:00,32300.0,21.875,22.0875,21.7125,382.375,37.25,0.0,2.625,-61.31223897058824,9.05673032173227,13,2,51,-0.2588190451025208,-0.9659258262890683,0.7694148268839378,0.6387494220515272,0.4917783357539547,0.7775352678229992,32.3 +2026-02-20 14:00:00+00:00,23200.0,20.3125,20.6125,19.9875,160.375,49.625,0.0,1.975,-66.70989087301587,10.403563507064222,14,2,51,-0.4999999999999998,-0.8660254037844388,0.7694148268839378,0.6387494220515272,0.3175930569795268,0.504970107108917,23.2 +2026-02-20 15:00:00+00:00,2300.0,17.0875,17.362499999999997,16.8875,10.5,67.125,0.0,1.0625,-57.665343750000005,29.649922460792197,15,2,51,-0.7071067811865471,-0.7071067811865479,0.7694148268839378,0.6387494220515272,0.11475000363662177,0.09150326507396282,2.3 +2026-02-20 16:00:00+00:00,0.0,15.825,16.0375,15.6,0.0,68.875,0.0,0.8625,-53.9806875,36.96018766601831,16,2,51,-0.8660254037844384,-0.5000000000000004,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 17:00:00+00:00,0.0,15.675,15.9,15.475,0.0,66.75,0.0,0.575,-53.960750000000004,36.95335314848528,17,2,51,-0.9659258262890683,-0.25881904510252063,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 18:00:00+00:00,0.0,17.725,17.975,17.4375,0.0,48.125,0.0,2.175,-53.953062499999994,36.947001716634034,18,2,51,-1.0,-1.8369701987210297e-16,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 19:00:00+00:00,0.0,19.1,19.2625,18.925,0.0,37.75,0.0,3.2,-53.941312499999995,36.94379212926882,19,2,51,-0.9659258262890684,0.2588190451025203,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 20:00:00+00:00,0.0,19.4875,19.575,19.375,0.0,34.75,0.0,3.5375,-53.9273125,36.941767166591056,20,2,51,-0.8660254037844386,0.5000000000000001,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 21:00:00+00:00,0.0,19.125,19.25,19.0125,0.0,34.375,0.0,2.9375,-53.92175,36.94290151368731,21,2,51,-0.7071067811865477,0.7071067811865474,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 22:00:00+00:00,0.0,18.5375,18.674999999999997,18.4125,0.0,35.375,0.0,2.4875,-53.9135625,36.94087280617895,22,2,51,-0.5000000000000004,0.8660254037844384,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-20 23:00:00+00:00,0.0,17.725,17.9125,17.6125,0.0,37.75,0.0,2.225,-53.903062500000004,36.94016333904907,23,2,51,-0.25881904510252157,0.9659258262890681,0.7694148268839378,0.6387494220515272,0.0,0.0,0.0 +2026-02-21 00:00:00+00:00,0.0,16.8,16.9125,16.675,0.0,40.5,0.0,2.65,-53.902750000000005,36.93907923076409,0,2,52,0.0,1.0,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 01:00:00+00:00,0.0,16.125,16.2375,16.0125,0.0,41.25,0.0,2.6,-53.8955,36.936885338371454,1,2,52,0.25881904510252074,0.9659258262890683,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 02:00:00+00:00,0.0,15.5,15.6875,15.35,0.0,42.75,0.0,1.9375,-53.888687499999996,36.930502340756554,2,2,52,0.49999999999999994,0.8660254037844387,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 03:00:00+00:00,0.0,15.2,15.25,15.125,0.0,42.625,0.0,2.425,-46.912958333333336,50.91273065535498,3,2,52,0.7071067811865475,0.7071067811865476,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 04:00:00+00:00,1400.0,15.1,15.2125,15.0125,16.375,42.0,0.0,2.775,11.525411274509803,21.227689815107873,4,2,52,0.8660254037844386,0.5000000000000001,0.7802958510707755,0.6254105729852463,0.0,0.0,1.4 +2026-02-21 05:00:00+00:00,9000.0,15.700000000000001,15.8125,15.600000000000001,169.25,40.875,0.0,3.45,52.58227027027027,6.3000705396603776,5,2,52,0.9659258262890683,0.25881904510252074,0.7802958510707755,0.6254105729852463,0.11811501523685859,1.4329253538222835,9.0 +2026-02-21 06:00:00+00:00,9200.0,16.799999999999997,16.925,16.637500000000003,371.125,39.75,0.0,3.55,28.559240440724814,4.054360834760752,6,2,52,1.0,6.123233995736766e-17,0.7802958510707755,0.6254105729852463,0.32121007980954397,1.1553964938461838,9.2 +2026-02-21 07:00:00+00:00,21500.0,18.15,18.3,17.975,541.125,38.25,0.0,4.025,5.215116984126984,5.93834126502198,7,2,52,0.9659258262890683,-0.25881904510252063,0.7802958510707755,0.6254105729852463,0.49561176553304004,1.0918324334330716,21.5 +2026-02-21 08:00:00+00:00,30300.0,19.8125,20.025,19.4875,674.375,35.875,0.0,3.675,-10.8707183982684,7.659742208109051,8,2,52,0.8660254037844387,-0.49999999999999983,0.7802958510707755,0.6254105729852463,0.6294348857377035,1.0713975587953413,30.3 +2026-02-21 09:00:00+00:00,32400.0,21.1625,21.4625,20.9,744.875,32.125,0.0,3.4375,-22.601508578431375,8.788840674312086,9,2,52,0.7071067811865476,-0.7071067811865475,0.7802958510707755,0.6254105729852463,0.7135596159347491,1.0438861496165648,32.4 +2026-02-21 10:00:00+00:00,32400.0,21.5,21.875,21.05,757.5,42.875,0.0,3.3125,-32.70907291666666,8.851485954606758,10,2,52,0.49999999999999994,-0.8660254037844387,0.7802958510707755,0.6254105729852463,0.7422529947839382,1.0205415206448578,32.4 +2026-02-21 11:00:00+00:00,32400.0,18.7,19.025,18.487499999999997,576.5,76.375,0.0,5.3,-41.49061813186813,9.500680630274,11,2,52,0.258819045102521,-0.9659258262890682,0.7802958510707755,0.6254105729852463,0.7135596159347491,0.8079212824352403,32.4 +2026-02-21 12:00:00+00:00,32300.0,16.9625,17.0875,16.8625,120.625,84.75,0.0,6.0875,-50.49413095238096,9.296230962080287,12,2,52,1.2246467991473532e-16,-1.0,0.7802958510707755,0.6254105729852463,0.6294348857377035,0.19164015648517224,32.3 +2026-02-21 13:00:00+00:00,32300.0,16.775,16.8375,16.6875,75.5,84.625,0.0,5.7125,-60.53397058823529,9.118624333299072,13,2,52,-0.2588190451025208,-0.9659258262890683,0.7802958510707755,0.6254105729852463,0.49561176553304004,0.15233698077929664,32.3 +2026-02-21 14:00:00+00:00,23900.0,16.5875,16.6625,16.5125,48.5,82.25,0.0,6.325,-66.3865,10.649081760101824,14,2,52,-0.4999999999999998,-0.8660254037844388,0.7802958510707755,0.6254105729852463,0.32121007980954397,0.15099152563567508,23.9 +2026-02-21 15:00:00+00:00,1100.0,16.025,16.125,15.9625,11.875,81.625,0.0,5.1,-58.143097222222224,28.79202665928399,15,2,52,-0.7071067811865471,-0.7071067811865479,0.7802958510707755,0.6254105729852463,0.11811501523685859,0.10053759868029315,1.1 +2026-02-21 16:00:00+00:00,0.0,15.55,15.5875,15.475,0.0,82.0,0.0,2.2875,-53.946125,37.151225148876314,16,2,52,-0.8660254037844384,-0.5000000000000004,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 17:00:00+00:00,0.0,15.4,15.4375,15.3125,0.0,83.5,0.0,0.9125,-53.929750000000006,37.142272651925865,17,2,52,-0.9659258262890683,-0.25881904510252063,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 18:00:00+00:00,0.0,15.0875,15.225,15.0125,0.0,84.125,0.0,1.4875,-53.921625,37.13676072612105,18,2,52,-1.0,-1.8369701987210297e-16,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 19:00:00+00:00,0.0,15.0375,15.1375,14.925,0.0,82.5,0.0,2.4375,-53.930125000000004,37.14149360974192,19,2,52,-0.9659258262890684,0.2588190451025203,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 20:00:00+00:00,0.0,15.475,15.5375,15.3625,0.0,82.375,0.0,1.475,-53.925875000000005,37.14337489910998,20,2,52,-0.8660254037844386,0.5000000000000001,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 21:00:00+00:00,0.0,14.7,14.825,14.5875,0.0,84.0,0.0,0.8375,-53.91887500000001,37.142366578645735,21,2,52,-0.7071067811865477,0.7071067811865474,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 22:00:00+00:00,0.0,14.025,14.1125,13.9125,0.0,86.0,0.0,1.2125,-53.909124999999996,37.13685059653237,22,2,52,-0.5000000000000004,0.8660254037844384,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-21 23:00:00+00:00,0.0,13.712499999999999,13.8125,13.6375,0.0,86.75,0.0,1.3125,-53.891625000000005,37.13333326984216,23,2,52,-0.25881904510252157,0.9659258262890681,0.7802958510707755,0.6254105729852463,0.0,0.0,0.0 +2026-02-22 00:00:00+00:00,0.0,13.8375,13.9125,13.7375,0.0,87.0,0.0,1.5,-53.881125,37.132744142636426,0,2,53,0.0,1.0,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 01:00:00+00:00,0.0,14.1625,14.2375,14.0625,0.0,86.875,0.0,2.4625,-53.875750000000004,37.13178029778983,1,2,53,0.25881904510252074,0.9659258262890683,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 02:00:00+00:00,0.0,14.0375,14.0875,13.925,0.0,87.625,0.0,2.6,-53.87397916666667,37.129753618247136,2,2,53,0.49999999999999994,0.8660254037844387,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 03:00:00+00:00,0.0,13.7625,13.875,13.712499999999999,0.0,87.0,0.0,1.4125,-47.799249999999994,49.27861861048265,3,2,53,0.7071067811865475,0.7071067811865476,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 04:00:00+00:00,1300.0,13.95,14.0,13.8875,14.25,83.625,0.0,2.35,11.071031249999999,21.506441461083476,4,2,53,0.8660254037844386,0.5000000000000001,0.7909456567567772,0.6118864012687243,0.0,0.0,1.3 +2026-02-22 05:00:00+00:00,13900.0,14.5,14.65,14.35,187.75,79.625,0.0,2.575,52.58290644849919,6.437597960941195,5,2,53,0.9659258262890683,0.25881904510252074,0.7909456567567772,0.6118864012687243,0.12150722200826534,1.5,13.9 +2026-02-22 06:00:00+00:00,22100.0,15.425,15.525,15.325,376.0,73.375,0.0,3.8125,28.962922608437317,4.332344570230105,6,2,53,1.0,6.123233995736766e-17,0.7909456567567772,0.6118864012687243,0.32484886807948127,1.157461321084251,22.1 +2026-02-22 07:00:00+00:00,24600.0,15.8625,16.075,15.6875,550.625,70.875,0.0,5.012499999999999,9.145276026272578,12.994390425817901,7,2,53,0.9659258262890683,-0.25881904510252063,0.7909456567567772,0.6118864012687243,0.49946229813611726,1.1024355633144094,24.6 +2026-02-22 08:00:00+00:00,27100.0,16.4125,16.575000000000003,16.2625,699.5,66.875,0.0,5.425,-2.611829051383399,23.39472314696495,8,2,53,0.8660254037844387,-0.49999999999999983,0.7909456567567772,0.6118864012687243,0.6334478954821507,1.1042739347449777,27.1 +2026-02-22 09:00:00+00:00,30100.0,16.5875,16.8625,16.3625,665.75,64.25,0.0,4.949999999999999,-18.50644301470588,16.72993555631938,9,2,53,0.7071067811865476,-0.7071067811865475,0.7909456567567772,0.6118864012687243,0.717674763080118,0.9276486150115307,30.1 +2026-02-22 10:00:00+00:00,32400.0,16.975,17.2875,16.5625,629.5,61.5,0.0,4.125,-32.62157291666667,8.309913815346677,10,2,53,0.49999999999999994,-0.8660254037844387,0.7909456567567772,0.6118864012687243,0.7464029790946978,0.8433781986823152,32.4 +2026-02-22 11:00:00+00:00,31700.0,16.9,17.225,16.6375,560.25,60.625,0.0,3.5375,-41.508761904761904,9.006012171435723,11,2,53,0.258819045102521,-0.9659258262890682,0.7909456567567772,0.6118864012687243,0.717674763080118,0.7806460932184907,31.7 +2026-02-22 12:00:00+00:00,32100.0,16.7,16.95,16.5,368.875,63.875,0.0,3.175,-50.75483333333334,8.959504804024235,12,2,53,1.2246467991473532e-16,-1.0,0.7909456567567772,0.6118864012687243,0.6334478954821507,0.5823288744518279,32.1 +2026-02-22 13:00:00+00:00,32500.0,16.5375,16.7375,16.3,260.875,65.875,0.0,3.025,-60.68006617647059,8.778696686823585,13,2,53,-0.2588190451025208,-0.9659258262890683,0.7909456567567772,0.6118864012687243,0.49946229813611726,0.5223116959448746,32.5 +2026-02-22 14:00:00+00:00,21600.0,15.887500000000001,16.1125,15.7625,137.875,65.375,0.0,3.8375,-66.90846428571429,9.563182256973985,14,2,53,-0.4999999999999998,-0.8660254037844388,0.7909456567567772,0.6118864012687243,0.32484886807948127,0.42442813735236995,21.6 +2026-02-22 15:00:00+00:00,2600.0,15.1,15.1875,15.0125,9.625,70.375,0.0,3.35,-58.01241666666667,28.984348271955334,15,2,53,-0.7071067811865471,-0.7071067811865479,0.7909456567567772,0.6118864012687243,0.12150722200826534,0.07921339852000957,2.6 +2026-02-22 16:00:00+00:00,0.0,14.775,14.8625,14.6625,0.0,79.125,0.0,1.55,-54.141125,36.67585095666948,16,2,53,-0.8660254037844384,-0.5000000000000004,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 17:00:00+00:00,0.0,13.8625,13.9875,13.725,0.0,83.625,0.0,0.6375,-54.125125000000004,36.66779365777503,17,2,53,-0.9659258262890683,-0.25881904510252063,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 18:00:00+00:00,0.0,13.7875,13.8875,13.7125,0.0,84.0,0.0,1.3375,-54.115375,36.662295114497404,18,2,53,-1.0,-1.8369701987210297e-16,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 19:00:00+00:00,0.0,14.0,14.1,13.862499999999999,0.0,83.75,0.0,1.525,-54.096500000000006,36.66160502714886,19,2,53,-0.9659258262890684,0.2588190451025203,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 20:00:00+00:00,0.0,14.125,14.2375,13.9875,0.0,82.25,0.0,2.7,-54.088499999999996,36.66094361169663,20,2,53,-0.8660254037844386,0.5000000000000001,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 21:00:00+00:00,0.0,13.6875,13.775,13.625,0.0,82.25,0.0,2.5375,-54.07981250000001,36.66323826587915,21,2,53,-0.7071067811865477,0.7071067811865474,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 22:00:00+00:00,0.0,13.6625,13.775,13.6,0.0,80.25,0.0,2.175,-54.07,36.66121622368794,22,2,53,-0.5000000000000004,0.8660254037844384,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-22 23:00:00+00:00,0.0,13.2375,13.3125,13.1375,0.0,79.75,0.0,3.1875,-54.0725625,36.66939206180397,23,2,53,-0.25881904510252157,0.9659258262890681,0.7909456567567772,0.6118864012687243,0.0,0.0,0.0 +2026-02-23 00:00:00+00:00,0.0,12.9625,13.15,12.8125,0.0,79.25,0.0,2.7125,-54.07425,36.6743490390107,0,2,54,0.0,1.0,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 01:00:00+00:00,0.0,13.274999999999999,13.3625,13.125,0.0,78.625,0.0,2.925,-54.074124999999995,36.66957115778467,1,2,54,0.25881904510252074,0.9659258262890683,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 02:00:00+00:00,0.0,13.525,13.5875,13.3875,0.0,78.875,0.0,3.1875,-54.06337500000001,36.65770648484663,2,2,54,0.49999999999999994,0.8660254037844387,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 03:00:00+00:00,0.0,12.6625,12.774999999999999,12.4625,0.0,85.5,0.4,3.7875,-48.774125000000005,47.2208109371546,3,2,54,0.7071067811865475,0.7071067811865476,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 04:00:00+00:00,1400.0,11.875,12.0625,11.75,8.5,87.375,0.125,3.8375,18.18548988970588,17.39890224863387,4,2,54,0.8660254037844386,0.5000000000000001,0.8013610881746766,0.5981809144059164,0.0,0.0,1.4 +2026-02-23 05:00:00+00:00,13400.0,12.4375,12.725,12.1625,137.625,81.625,0.0,3.8125,52.34677211632454,6.121630996720578,5,2,54,0.9659258262890683,0.25881904510252074,0.8013610881746766,0.5981809144059164,0.12492536017815457,1.1016578203475629,13.4 +2026-02-23 06:00:00+00:00,22000.0,13.325,13.4375,13.2625,179.875,82.125,0.0,3.1625,28.53699337121212,4.312101246114405,6,2,54,1.0,6.123233995736766e-17,0.8013610881746766,0.5981809144059164,0.32850785897419427,0.5475515884511304,22.0 +2026-02-23 07:00:00+00:00,26600.0,13.3,13.425,13.1625,131.375,82.875,0.0625,3.8125,4.909219795657727,4.619975883785669,7,2,54,0.9659258262890683,-0.25881904510252063,0.8013610881746766,0.5981809144059164,0.5033281139544626,0.26101264037853017,26.6 +2026-02-23 08:00:00+00:00,28000.0,12.2,12.325,12.075,134.5,85.875,0.125,5.2125,-10.45561856060606,7.458646696932414,8,2,54,0.8660254037844387,-0.49999999999999983,0.8013610881746766,0.5981809144059164,0.6374724136461859,0.21098952224566545,28.0 +2026-02-23 09:00:00+00:00,30200.0,12.85,13.025,12.6875,227.375,77.0,0.025,4.025,-22.666045751633987,7.812353554148813,9,2,54,0.7071067811865476,-0.7071067811865475,0.8013610881746766,0.5981809144059164,0.7217990457093098,0.315011499878833,30.2 +2026-02-23 10:00:00+00:00,28300.0,12.649999999999999,12.7625,12.55,200.625,83.875,0.025,4.425000000000001,-32.57465476190476,8.228745071412915,10,2,54,0.49999999999999994,-0.8660254037844387,0.8013610881746766,0.5981809144059164,0.7505612895250808,0.2672999564458565,28.3 +2026-02-23 11:00:00+00:00,23900.0,12.55,12.7,12.35,181.0,85.25,0.0125,3.2375,-41.400797619047616,9.208735463162077,11,2,54,0.258819045102521,-0.9659258262890682,0.8013610881746766,0.5981809144059164,0.7217990457093098,0.25076231546154487,23.9 +2026-02-23 12:00:00+00:00,20600.0,13.775,13.9375,13.625,279.5,73.0,0.0,2.0625,-50.583835737179484,9.11822202733833,12,2,54,1.2246467991473532e-16,-1.0,0.8013610881746766,0.5981809144059164,0.6374724136461859,0.43845034548448697,20.6 +2026-02-23 13:00:00+00:00,24900.0,14.0875,14.25,13.9375,162.0,76.0,0.0,0.8125,-60.78928819444444,8.180126426047035,13,2,54,-0.2588190451025208,-0.9659258262890683,0.8013610881746766,0.5981809144059164,0.5033281139544626,0.3218576421794244,24.9 +2026-02-23 14:00:00+00:00,19400.0,13.1,13.275,12.9375,32.375,81.75,0.0,1.875,-66.6971130952381,9.892521551990894,14,2,54,-0.4999999999999998,-0.8660254037844388,0.8013610881746766,0.5981809144059164,0.32850785897419427,0.09855167575319164,19.4 +2026-02-23 15:00:00+00:00,400.0,12.1625,12.3,12.0625,5.125,86.375,0.0875,3.2125,-54.31556944444445,28.849652997691173,15,2,54,-0.7071067811865471,-0.7071067811865479,0.8013610881746766,0.5981809144059164,0.12492536017815457,0.041024496488873824,0.4 +2026-02-23 16:00:00+00:00,0.0,11.1125,11.275,10.8875,0.0,84.0,0.11249999999999999,3.25,-53.8755,36.91431520200982,16,2,54,-0.8660254037844384,-0.5000000000000004,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 17:00:00+00:00,0.0,11.175,11.375,10.9125,0.0,77.375,0.0,2.9,-53.863125,36.909000843008016,17,2,54,-0.9659258262890683,-0.25881904510252063,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 18:00:00+00:00,0.0,10.1125,10.25,9.9625,0.0,90.0,0.0,0.9749999999999999,-53.8499375,36.90364258803764,18,2,54,-1.0,-1.8369701987210297e-16,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 19:00:00+00:00,0.0,10.175,10.325,10.075,0.0,92.5,0.0,1.0,-53.844,36.89877000885892,19,2,54,-0.9659258262890684,0.2588190451025203,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 20:00:00+00:00,0.0,10.2,10.2875,10.0875,0.0,90.875,0.925,2.15,-53.844875,36.90206081728363,20,2,54,-0.8660254037844386,0.5000000000000001,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 21:00:00+00:00,0.0,9.537500000000001,9.65,9.4375,0.0,91.0,0.2125,2.9625,-53.8426875,36.90974581855888,21,2,54,-0.7071067811865477,0.7071067811865474,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 22:00:00+00:00,0.0,10.75,10.9375,10.575000000000001,0.0,78.375,0.0,5.05,-53.65525,37.27125908234565,22,2,54,-0.5000000000000004,0.8660254037844384,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-23 23:00:00+00:00,0.0,11.0875,11.1875,10.9625,0.0,76.0,0.0,4.3375,-53.629562500000006,37.342624170407355,23,2,54,-0.25881904510252157,0.9659258262890681,0.8013610881746766,0.5981809144059164,0.0,0.0,0.0 +2026-02-24 00:00:00+00:00,0.0,11.212499999999999,11.3125,11.1125,0.0,82.5,0.0,4.5875,-53.63008333333333,37.341558915637144,0,2,55,0.0,1.0,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 01:00:00+00:00,0.0,11.125,11.2125,11.075,0.0,85.5,0.0,5.6375,-53.6128125,37.33776741304473,1,2,55,0.25881904510252074,0.9659258262890683,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 02:00:00+00:00,0.0,11.0,11.1125,10.9,0.0,83.875,0.0125,6.15,-53.622625,37.338224572536475,2,2,55,0.49999999999999994,0.8660254037844387,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 03:00:00+00:00,0.0,10.9625,11.075,10.875,0.0,84.875,0.0125,6.15,-48.255468750000006,48.08561068600016,3,2,55,0.7071067811865475,0.7071067811865476,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 04:00:00+00:00,100.0,11.125,11.2875,11.0,6.375,87.875,0.1375,5.6875,15.993022977941177,18.73813493295019,4,2,55,0.8660254037844386,0.5000000000000001,0.8115390590073611,0.5842981736283683,0.0,0.0,0.1 +2026-02-24 05:00:00+00:00,4300.0,11.5375,11.6625,11.4,62.625,89.375,0.27499999999999997,4.525,52.48422962549664,6.1317096107210896,5,2,55,0.9659258262890683,0.25881904510252074,0.8115390590073611,0.5842981736283683,0.12836815436419222,0.48785464206587514,4.3 +2026-02-24 06:00:00+00:00,9800.0,11.3375,11.4625,11.1875,196.125,92.75,0.0625,1.7999999999999998,28.843302474552473,3.796014839069748,6,2,55,1.0,6.123233995736766e-17,0.8115390590073611,0.5842981736283683,0.33218548467777487,0.5904080974225719,9.8 +2026-02-24 07:00:00+00:00,7600.0,12.8,13.025,12.5625,592.75,80.75,0.0,4.6375,5.467412399302486,4.51447187315412,7,2,55,0.9659258262890683,-0.25881904510252063,0.8115390590073611,0.5842981736283683,0.507207394053765,1.1686540987948755,7.6 +2026-02-24 08:00:00+00:00,6800.0,14.475,14.7,14.149999999999999,536.875,68.125,0.0,3.475,-9.997002569169961,7.571944906788983,8,2,55,0.8660254037844387,-0.49999999999999983,0.8115390590073611,0.5842981736283683,0.6415064286055703,0.8368973030667745,6.8 +2026-02-24 09:00:00+00:00,5400.0,15.1875,15.512500000000001,14.8375,727.625,67.125,0.0,3.65,-22.17668888888889,8.340493713485513,9,2,55,0.7071067811865476,-0.7071067811865475,0.8115390590073611,0.5842981736283683,0.725930331068133,1.002334478750011,5.4 +2026-02-24 10:00:00+00:00,8800.0,16.4375,16.9375,16.0625,776.0,62.75,0.0,2.9625,-32.3321875,7.804211294030615,10,2,55,0.49999999999999994,-0.8660254037844387,0.8115390590073611,0.5842981736283683,0.7547257520057252,1.0281880510075843,8.8 +2026-02-24 11:00:00+00:00,20200.0,17.1125,17.5375,16.5625,726.5,57.25,0.0,3.0,-40.32717830882353,9.002088135196347,11,2,55,0.258819045102521,-0.9659258262890682,0.8115390590073611,0.5842981736283683,0.725930331068133,1.0007847432563244,20.2 +2026-02-24 12:00:00+00:00,16400.0,16.4,16.6125,16.1375,469.375,64.0,0.0,3.6,-38.9321875,20.841210062523167,12,2,55,1.2246467991473532e-16,-1.0,0.8115390590073611,0.5842981736283683,0.6415064286055703,0.731676221889578,16.4 +2026-02-24 13:00:00+00:00,27900.0,16.1125,16.2875,15.950000000000001,410.125,62.5,0.0,4.0375,-59.89221895424836,9.254365573524716,13,2,55,-0.2588190451025208,-0.9659258262890683,0.8115390590073611,0.5842981736283683,0.507207394053765,0.80859428472079,27.9 +2026-02-24 14:00:00+00:00,20400.0,15.7625,15.9,15.6625,193.125,67.0,0.0,2.825,-66.08486111111111,11.094605994623056,14,2,55,-0.4999999999999998,-0.8660254037844388,0.8115390590073611,0.5842981736283683,0.33218548467777487,0.5813769984180203,20.4 +2026-02-24 15:00:00+00:00,2500.0,14.725,14.875,14.637500000000001,12.5,73.875,0.0,1.8125,-57.17628125,30.40513509438945,15,2,55,-0.7071067811865471,-0.7071067811865479,0.8115390590073611,0.5842981736283683,0.12836815436419222,0.09737617606105292,2.5 +2026-02-24 16:00:00+00:00,0.0,14.4875,14.625,14.325,0.0,74.75,0.0,2.425,-53.5051875,37.70545602284403,16,2,55,-0.8660254037844384,-0.5000000000000004,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 17:00:00+00:00,0.0,14.3,14.375,14.225,0.0,71.5,0.0,3.1125,-53.489374999999995,37.70034738870673,17,2,55,-0.9659258262890683,-0.25881904510252063,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 18:00:00+00:00,0.0,13.75,13.8375,13.65,0.0,71.625,0.0,2.2625,-53.48287499999999,37.701695084295174,18,2,55,-1.0,-1.8369701987210297e-16,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 19:00:00+00:00,0.0,14.075,14.125,14.0,0.0,73.0,0.0,2.7625,-53.479749999999996,37.699605936269414,19,2,55,-0.9659258262890684,0.2588190451025203,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 20:00:00+00:00,0.0,13.775,13.8625,13.712499999999999,0.0,71.875,0.0,2.925,-53.4785,37.69870308114061,20,2,55,-0.8660254037844386,0.5000000000000001,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 21:00:00+00:00,0.0,13.3,13.412500000000001,13.2,0.0,73.25,0.0,2.0875000000000004,-53.47025,37.69849925505435,21,2,55,-0.7071067811865477,0.7071067811865474,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 22:00:00+00:00,0.0,12.8625,13.0625,12.675,0.0,77.125,0.0,1.825,-53.465375,37.700016773592644,22,2,55,-0.5000000000000004,0.8660254037844384,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-24 23:00:00+00:00,0.0,12.7125,12.825,12.575,0.0,78.625,0.0,2.6875,-53.462562500000004,37.6989770254529,23,2,55,-0.25881904510252157,0.9659258262890681,0.8115390590073611,0.5842981736283683,0.0,0.0,0.0 +2026-02-25 00:00:00+00:00,0.0,13.025,13.125,12.95,0.0,78.5,0.0,2.5875,-53.458875000000006,37.70300397045086,0,2,56,0.0,1.0,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 01:00:00+00:00,0.0,13.175,13.2625,13.1125,0.0,78.125,0.0,2.975,-53.4473125,37.69447791309259,1,2,56,0.25881904510252074,0.9659258262890683,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 02:00:00+00:00,0.0,12.95,12.9875,12.875,0.0,79.375,0.0,4.1,-53.44354166666666,37.68972170759335,2,2,56,0.49999999999999994,0.8660254037844387,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 03:00:00+00:00,0.0,12.775,12.9125,12.7,0.0,78.5,0.0,3.6875,-48.280499999999996,48.0114580525663,3,2,56,0.7071067811865475,0.7071067811865476,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 04:00:00+00:00,2100.0,12.65,12.725,12.525,28.375,77.375,0.0,2.5875,15.509215073529411,19.06319487674578,4,2,56,0.8660254037844386,0.5000000000000001,0.8214765533024142,0.5702422926917871,0.0,0.0,2.1 +2026-02-25 05:00:00+00:00,17600.0,12.8375,12.9625,12.7625,103.0,78.625,0.0,2.8625,52.62836043900319,6.169402438141402,5,2,56,0.9659258262890683,0.25881904510252074,0.8214765533024142,0.5702422926917871,0.13183431832786907,0.7812836695817036,17.6 +2026-02-25 06:00:00+00:00,24800.0,14.0625,14.3125,13.825,404.25,75.75,0.0,2.3375,29.017916666666665,3.874138845462832,6,2,56,1.0,6.123233995736766e-17,0.8214765533024142,0.5702422926917871,0.33588017350674443,1.203554219290299,24.8 +2026-02-25 07:00:00+00:00,27900.0,16.262500000000003,16.6375,15.9375,584.375,65.125,0.0,1.3875,5.9105071765399355,5.544630083870438,7,2,56,0.9659258262890683,-0.25881904510252063,0.8214765533024142,0.5702422926917871,0.5110983216333937,1.14337100175251,27.9 +2026-02-25 08:00:00+00:00,79200.0,16.325,16.775,16.075,471.75,63.75,0.0,2.1375,-6.75372027972028,6.963030587935351,8,2,56,0.8660254037844387,-0.49999999999999983,0.8214765533024142,0.5702422926917871,0.6455479354746669,0.7307745468245135,79.2 +2026-02-25 09:00:00+00:00,32500.0,16.3625,16.775,16.0125,573.75,62.375,0.0,3.2125,-39.10404761904762,11.20118739825218,9,2,56,0.7071067811865476,-0.7071067811865475,0.8214765533024142,0.5702422926917871,0.7300664960357736,0.785887317272379,32.5 +2026-02-25 10:00:00+00:00,32400.0,16.0375,16.2875,15.825000000000001,396.625,66.25,0.0,3.325,-39.10404761904762,11.20118739825218,10,2,56,0.49999999999999994,-0.8660254037844387,0.8214765533024142,0.5702422926917871,0.7588942030879993,0.5226354324306368,32.4 +2026-02-25 11:00:00+00:00,32300.0,15.733333333333334,16.0,15.583333333333334,367.25,69.16666666666667,0.0,2.8875,-38.85860574229692,10.187750148582554,11,2,56,0.258819045102521,-0.9659258262890682,0.8214765533024142,0.5702422926917871,0.7300664960357736,0.5030363699665031,32.3 +2026-02-25 12:00:00+00:00,32200.0,15.8,16.025,15.6125,208.375,68.0,0.0,2.3125,-43.28702450980392,15.815411335756604,12,2,56,1.2246467991473532e-16,-1.0,0.8214765533024142,0.5702422926917871,0.6455479354746669,0.3227878032741028,32.2 +2026-02-25 13:00:00+00:00,32300.0,15.625,15.75,15.45,225.375,70.75,0.0,4.2625,-55.89698529411765,16.623133965095477,13,2,56,-0.2588190451025208,-0.9659258262890683,0.8214765533024142,0.5702422926917871,0.5110983216333937,0.4409621211036953,32.3 +2026-02-25 14:00:00+00:00,26300.0,15.137500000000001,15.3125,15.0125,106.125,71.25,0.0,4.1875,-62.52660416666667,17.524505842266283,14,2,56,-0.4999999999999998,-0.8660254037844388,0.8214765533024142,0.5702422926917871,0.33588017350674443,0.31596089430348295,26.3 +2026-02-25 15:00:00+00:00,3700.0,14.6,14.65,14.5125,13.625,73.625,0.0,3.1125,-54.032125,36.80038062840972,15,2,56,-0.7071067811865471,-0.7071067811865479,0.8214765533024142,0.5702422926917871,0.13183431832786907,0.10334941745680302,3.7 +2026-02-25 16:00:00+00:00,0.0,13.95,14.025,13.875,0.0,73.125,0.0,2.6625,-49.767500000000005,45.29665012448492,16,2,56,-0.8660254037844384,-0.5000000000000004,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 17:00:00+00:00,0.0,13.4375,13.5375,13.325,0.0,74.25,0.0,1.7375,-49.74625,45.29239770185868,17,2,56,-0.9659258262890683,-0.25881904510252063,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 18:00:00+00:00,0.0,13.0125,13.1125,12.9625,0.0,74.625,0.0,1.6625,-49.7375,45.29322829261198,18,2,56,-1.0,-1.8369701987210297e-16,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 19:00:00+00:00,0.0,12.95,13.025,12.850000000000001,0.0,75.5,0.0,1.3625,-49.735625,45.29863345873876,19,2,56,-0.9659258262890684,0.2588190451025203,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 20:00:00+00:00,0.0,13.25,13.3375,13.15,0.0,77.0,0.0,0.95,-49.725625,45.302024714455825,20,2,56,-0.8660254037844386,0.5000000000000001,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 21:00:00+00:00,0.0,13.3125,13.35,13.2125,0.0,77.25,0.0,1.6,-49.71875,45.30406321457271,21,2,56,-0.7071067811865477,0.7071067811865474,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 22:00:00+00:00,0.0,13.3,13.3625,13.1875,0.0,78.125,0.0,1.55,-49.703125,45.298500912235866,22,2,56,-0.5000000000000004,0.8660254037844384,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-25 23:00:00+00:00,0.0,13.174999999999999,13.275,13.1125,0.0,79.0,0.0,2.3375,-49.70583333333333,45.3031598419654,23,2,56,-0.25881904510252157,0.9659258262890681,0.8214765533024142,0.5702422926917871,0.0,0.0,0.0 +2026-02-26 00:00:00+00:00,0.0,12.65,12.8125,12.5375,0.0,85.0,0.2875,2.05,-49.690000000000005,45.29981093595572,0,2,57,0.0,1.0,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 01:00:00+00:00,0.0,12.15,12.25,11.9625,0.0,95.25,1.4,3.85,-49.688125,45.33516058089828,1,2,57,0.25881904510252074,0.9659258262890683,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 02:00:00+00:00,0.0,12.9375,12.9875,12.8375,0.0,97.0,0.7125,4.5875,-49.675625,45.39358239218219,2,2,57,0.49999999999999994,0.8660254037844387,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 03:00:00+00:00,0.0,13.4125,13.4875,13.3125,0.0,97.0,0.15,4.1125,-45.85520833333333,53.03493021015332,3,2,57,0.7071067811865475,0.7071067811865476,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 04:00:00+00:00,2400.0,13.6875,13.8,13.6,10.625,88.125,0.0,3.6625000000000005,18.503463235294117,17.135938671842663,4,2,57,0.8660254037844386,0.5000000000000001,0.8311706263658079,0.5560174366570446,0.0,0.0,2.4 +2026-02-26 05:00:00+00:00,18000.0,14.0875,14.2125,13.975,65.25,79.5,0.0,3.55,52.30598761261261,6.005589885638848,5,2,57,0.9659258262890683,0.25881904510252074,0.8311706263658079,0.5560174366570446,0.13532255575021074,0.4821812567628689,18.0 +2026-02-26 06:00:00+00:00,22100.0,14.2875,14.3625,14.2,148.25,71.5,0.0,3.8375,30.854168831168835,8.175929429495692,6,2,57,1.0,6.123233995736766e-17,0.8311706263658079,0.5560174366570446,0.33959035105792684,0.4365553954585468,22.1 +2026-02-26 07:00:00+00:00,22700.0,15.737499999999999,15.925,15.475000000000001,602.25,57.375,0.0,5.4,10.373683896642948,13.23640834780793,7,2,57,0.9659258262890683,-0.25881904510252063,0.8311706263658079,0.5560174366570446,0.514999083493855,1.1694195568547767,22.7 +2026-02-26 08:00:00+00:00,25900.0,16.4625,16.6,16.225,737.375,51.75,0.0,5.5,-5.732250595238096,14.903550906494374,8,2,57,0.8660254037844387,-0.49999999999999983,0.8311706263658079,0.5560174366570446,0.6495949378191233,1.135130459106685,25.9 +2026-02-26 09:00:00+00:00,26900.0,15.9,16.1125,15.65,484.75,59.875,0.0,4.7875,-17.33367487745098,16.53938189306112,9,2,57,0.7071067811865476,-0.7071067811865475,0.8311706263658079,0.5560174366570446,0.7342054289916304,0.6602375586704166,26.9 +2026-02-26 10:00:00+00:00,16500.0,15.7625,15.875,15.637500000000001,492.0,54.375,0.0,6.2,-27.420566789215687,16.37524799547378,10,2,57,0.49999999999999994,-0.8660254037844387,0.8311706263658079,0.5560174366570446,0.7630644918634182,0.6447685683794911,16.5 +2026-02-26 11:00:00+00:00,18100.0,15.925,16.175,15.7,567.5,47.0,0.0,6.2875,-36.44383333333333,17.121356933517212,11,2,57,0.258819045102521,-0.9659258262890682,0.8311706263658079,0.5560174366570446,0.7342054289916304,0.7729444343382391,18.1 +2026-02-26 12:00:00+00:00,16400.0,15.5625,15.7375,15.3875,331.5,54.5,0.0,5.575,-45.00458333333333,18.139848536210735,12,2,57,1.2246467991473532e-16,-1.0,0.8311706263658079,0.5560174366570446,0.6495949378191233,0.5103180161978181,16.4 +2026-02-26 13:00:00+00:00,22800.0,15.025,15.15,14.9,198.0,59.5,0.0,4.7375,-55.230902777777786,16.957519927996856,13,2,57,-0.2588190451025208,-0.9659258262890683,0.8311706263658079,0.5560174366570446,0.514999083493855,0.3844667036234882,22.8 +2026-02-26 14:00:00+00:00,10300.0,13.3875,13.674999999999999,13.1625,48.25,68.625,0.05,4.625,-61.940317460317466,18.67574964867974,14,2,57,-0.4999999999999998,-0.8660254037844388,0.8311706263658079,0.5560174366570446,0.33959035105792684,0.14208295332799248,10.3 +2026-02-26 15:00:00+00:00,1200.0,12.625,12.775,12.5,15.875,73.75,0.0,3.3625,-52.97056944444444,38.71963321490879,15,2,57,-0.7071067811865471,-0.7071067811865479,0.8311706263658079,0.5560174366570446,0.13532255575021074,0.11731229810131101,1.2 +2026-02-26 16:00:00+00:00,0.0,13.225,13.275,13.15,0.0,63.125,0.0,3.775,-49.1225,46.37984112197885,16,2,57,-0.8660254037844384,-0.5000000000000004,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 17:00:00+00:00,0.0,13.075,13.1,12.9875,0.0,59.75,0.0,3.8375,-49.11125,46.38395778265728,17,2,57,-0.9659258262890683,-0.25881904510252063,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 18:00:00+00:00,0.0,12.7375,12.7875,12.6625,0.0,58.125,0.0,4.075,-49.09,46.40813807045772,18,2,57,-1.0,-1.8369701987210297e-16,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 19:00:00+00:00,0.0,12.375,12.45,12.325,0.0,55.25,0.0,4.3,-49.085625,46.42016459179315,19,2,57,-0.9659258262890684,0.2588190451025203,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 20:00:00+00:00,0.0,12.149999999999999,12.25,12.125,0.0,53.625,0.0,4.025,-49.045625,46.480225426832504,20,2,57,-0.8660254037844386,0.5000000000000001,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 21:00:00+00:00,0.0,12.337499999999999,12.3625,12.2625,0.0,52.0,0.0,3.7125,-48.983125,46.61342002645269,21,2,57,-0.7071067811865477,0.7071067811865474,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 22:00:00+00:00,0.0,12.674999999999999,12.725,12.6,0.0,52.0,0.0,3.25,-48.939375000000005,46.70097047416859,22,2,57,-0.5000000000000004,0.8660254037844384,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-26 23:00:00+00:00,0.0,11.9125,12.2125,11.675,0.0,53.625,0.1,3.5,-48.933125,46.70517482816189,23,2,57,-0.25881904510252157,0.9659258262890681,0.8311706263658079,0.5560174366570446,0.0,0.0,0.0 +2026-02-27 00:00:00+00:00,0.0,10.0125,10.2375,9.8,0.0,64.875,0.025,3.6625,-48.936249999999994,46.70388574572784,0,2,58,0.0,1.0,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 01:00:00+00:00,0.0,10.9125,11.0,10.825,0.0,56.125,0.1,3.7750000000000004,-48.917500000000004,46.70967525577544,1,2,58,0.25881904510252074,0.9659258262890683,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 02:00:00+00:00,0.0,10.3375,10.5375,10.1375,0.0,71.875,0.0625,2.5875,-48.928333333333335,46.711911028606444,2,2,58,0.49999999999999994,0.8660254037844387,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 03:00:00+00:00,0.0,10.875,11.0125,10.775,0.0,59.5,0.0,2.9125,-45.029999999999994,54.46239090129247,3,2,58,0.7071067811865475,0.7071067811865476,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 04:00:00+00:00,200.0,10.6875,10.8,10.55,30.25,52.375,0.0,2.7625,18.747465643274854,17.048921175371362,4,2,58,0.8660254037844386,0.5000000000000001,0.8406184056344782,0.5416278206559814,0.0,0.0,0.2 +2026-02-27 05:00:00+00:00,3000.0,11.9,12.0875,11.7125,199.5,47.75,0.0,2.7875,52.05206992337165,5.5992607631963125,5,2,58,0.9659258262890683,0.25881904510252074,0.8406184056344782,0.5416278206559814,0.13883156102878116,1.4369931341378614,3.0 +2026-02-27 06:00:00+00:00,10800.0,12.7375,13.0125,12.5125,389.0,43.375,0.0,3.7125,30.875391201036866,8.209772889320329,6,2,58,1.0,6.123233995736766e-17,0.8406184056344782,0.5416278206559814,0.343314441369453,1.1330720561835705,10.8 +2026-02-27 07:00:00+00:00,18300.0,13.225,13.4,13.0,527.0,40.75,0.0,4.275,10.41323754789272,12.57405133960411,7,2,58,0.9659258262890683,-0.25881904510252063,0.8406184056344782,0.5416278206559814,0.5189078715103712,1.0155945379399915,18.3 +2026-02-27 08:00:00+00:00,25300.0,13.3875,13.7375,12.9375,601.375,41.625,0.0,4.275,-5.121896245059288,15.44200941702978,8,2,58,0.8660254037844387,-0.49999999999999983,0.8406184056344782,0.5416278206559814,0.653645449369296,0.9200324129545584,25.3 +2026-02-27 09:00:00+00:00,15100.0,14.0125,14.6,13.5875,653.75,39.5,0.0,3.7,-17.18804199346405,16.5820594548946,9,2,58,0.7071067811865476,-0.7071067811865475,0.8406184056344782,0.5416278206559814,0.7383450316795169,0.88542615166369,15.1 +2026-02-27 10:00:00+00:00,27700.0,14.0125,14.4875,13.575,635.125,39.375,0.0,3.7625,-27.57969779411765,16.07031836869438,10,2,58,0.49999999999999994,-0.8660254037844387,0.8406184056344782,0.5416278206559814,0.7672344818792703,0.8278108127313565,27.7 +2026-02-27 11:00:00+00:00,24600.0,13.825,14.2625,13.4125,668.0,38.875,0.0,3.8625,-36.14238541666666,17.307720096174346,11,2,58,0.258819045102521,-0.9659258262890682,0.8406184056344782,0.5416278206559814,0.7383450316795169,0.9047260716043517,24.6 +2026-02-27 12:00:00+00:00,25600.0,13.5125,13.75,13.2375,641.125,40.75,0.0,4.425,-45.212418154761906,17.34890979881301,12,2,58,1.2246467991473532e-16,-1.0,0.8406184056344782,0.5416278206559814,0.653645449369296,0.9808451976811328,25.6 +2026-02-27 13:00:00+00:00,20900.0,13.025,13.2875,12.75,443.375,40.0,0.0,3.7625,-55.052369485294115,17.33259879920818,13,2,58,-0.2588190451025208,-0.9659258262890683,0.8406184056344782,0.5416278206559814,0.5189078715103712,0.8544387633000831,20.9 +2026-02-27 14:00:00+00:00,8200.0,12.025,12.2875,11.875,214.125,42.625,0.0,3.2625,-61.77337301587302,18.914853489505198,14,2,58,-0.4999999999999998,-0.8660254037844388,0.8406184056344782,0.5416278206559814,0.343314441369453,0.6236993676871647,8.2 +2026-02-27 15:00:00+00:00,1300.0,11.2,11.3375,11.1375,23.0,46.75,0.0,2.6875,-52.971,38.88282741991208,15,2,58,-0.7071067811865471,-0.7071067811865479,0.8406184056344782,0.5416278206559814,0.13883156102878116,0.16566838137930232,1.3 +2026-02-27 16:00:00+00:00,0.0,10.675,10.75,10.649999999999999,0.0,46.875,0.0,2.4125,-49.248125,46.283985548234355,16,2,58,-0.8660254037844384,-0.5000000000000004,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 17:00:00+00:00,0.0,10.825,10.875,10.75,0.0,49.5,0.0,2.2375,-49.233125,46.28565991819173,17,2,58,-0.9659258262890683,-0.25881904510252063,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 18:00:00+00:00,0.0,10.9125,10.975,10.85,0.0,54.625,0.0,2.4625,-49.224375,46.28645330867157,18,2,58,-1.0,-1.8369701987210297e-16,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 19:00:00+00:00,0.0,10.774999999999999,10.850000000000001,10.7,0.0,56.375,0.0,1.9375,-49.225625,46.287287418496454,19,2,58,-0.9659258262890684,0.2588190451025203,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 20:00:00+00:00,0.0,10.8125,10.9375,10.725000000000001,0.0,54.125,0.0,2.5625,-49.207499999999996,46.2917971045267,20,2,58,-0.8660254037844386,0.5000000000000001,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 21:00:00+00:00,0.0,10.1375,10.3,9.975,0.0,57.375,0.0,0.8250000000000001,-49.2025,46.298465192343755,21,2,58,-0.7071067811865477,0.7071067811865474,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 22:00:00+00:00,0.0,8.1125,8.3375,7.9750000000000005,0.0,69.25,0.0,1.1375,-49.194374999999994,46.29303571520415,22,2,58,-0.5000000000000004,0.8660254037844384,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-27 23:00:00+00:00,0.0,7.4125000000000005,7.55,7.35,0.0,70.875,0.0,1.4249999999999998,-49.18249999999999,46.286738696592856,23,2,58,-0.25881904510252157,0.9659258262890681,0.8406184056344782,0.5416278206559814,0.0,0.0,0.0 +2026-02-28 00:00:00+00:00,0.0,7.275,7.4,7.074999999999999,0.0,69.5,0.0,1.1124999999999998,-49.182500000000005,46.28338398748878,0,2,59,0.0,1.0,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 01:00:00+00:00,0.0,7.0625,7.225,6.925000000000001,0.0,67.875,0.0,1.2,-49.191874999999996,46.29135279109011,1,2,59,0.25881904510252074,0.9659258262890683,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 02:00:00+00:00,0.0,6.9375,7.0375,6.8375,0.0,69.0,0.0,1.35,-49.189375,46.29301370864902,2,2,59,0.49999999999999994,0.8660254037844387,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 03:00:00+00:00,0.0,7.25,7.4625,7.075,0.0,66.375,0.0,1.225,-44.879999999999995,54.887354569761015,3,2,59,0.7071067811865475,0.7071067811865476,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 04:00:00+00:00,2100.0,7.9750000000000005,8.175,7.75,32.25,64.0,0.0,1.45,23.81098611111111,13.807722271240163,4,2,59,0.8660254037844386,0.5000000000000001,0.8498170915275278,0.5270777086423722,0.0,0.0,2.1 +2026-02-28 05:00:00+00:00,19400.0,10.0875,10.275,9.85,210.375,56.625,0.0,1.1125,52.01237299465241,6.111592292822519,5,2,59,0.9659258262890683,0.25881904510252074,0.8498170915275278,0.5270777086423722,0.1423600200949649,1.4777674227614181,19.4 +2026-02-28 06:00:00+00:00,25700.0,11.3125,11.625,11.0375,428.375,56.5,0.0,1.85,31.102544117647057,7.580612295583489,6,2,59,1.0,6.123233995736766e-17,0.8498170915275278,0.5270777086423722,0.34705086809328656,1.2343291412971014,25.7 +2026-02-28 07:00:00+00:00,28000.0,12.25,12.4875,12.0625,621.75,47.875,0.0,2.6500000000000004,10.39050267094017,12.754277882812275,7,2,59,0.9659258262890683,-0.25881904510252063,0.8498170915275278,0.5270777086423722,0.5228228841104612,1.1892172643855385,28.0 +2026-02-28 08:00:00+00:00,29300.0,12.675,13.075,12.3875,538.625,47.0,0.0,2.2375,-5.335588068181819,14.746636307981015,8,2,59,0.8660254037844387,-0.49999999999999983,0.8498170915275278,0.5270777086423722,0.6576974957319095,0.8189555281803205,29.3 +2026-02-28 09:00:00+00:00,31900.0,13.3,13.7125,12.8375,378.0,47.75,0.0,1.2125,-17.42090257352941,15.456112579330172,9,2,59,0.7071067811865476,-0.7071067811865475,0.8498170915275278,0.5270777086423722,0.742483221066464,0.509102413731398,31.9 +2026-02-28 10:00:00+00:00,32300.0,13.275,13.475,13.0125,251.0,51.25,0.0,1.15,-27.432321428571427,15.65407994929015,10,2,59,0.49999999999999994,-0.8660254037844387,0.8498170915275278,0.5270777086423722,0.7714020530476107,0.3253815555822851,32.3 +2026-02-28 11:00:00+00:00,28300.0,12.65,12.8125,12.5375,125.75,49.125,0.0,1.7375,-36.20139285714286,16.751064852936782,11,2,59,0.258819045102521,-0.9659258262890682,0.8498170915275278,0.5270777086423722,0.742483221066464,0.16936409663154312,28.3 +2026-02-28 12:00:00+00:00,24900.0,13.6875,14.0,13.3125,478.5,50.875,0.0,2.2875,-45.40890384615385,16.385186166998434,12,2,59,1.2246467991473532e-16,-1.0,0.8498170915275278,0.5270777086423722,0.6576974957319095,0.7275381206484722,24.9 +2026-02-28 13:00:00+00:00,29600.0,13.875,14.1375,13.6125,436.375,51.75,0.0,2.3125,-55.24921568627451,16.787215758371264,13,2,59,-0.2588190451025208,-0.9659258262890683,0.8498170915275278,0.5270777086423722,0.5228228841104612,0.834651682744253,29.6 +2026-02-28 14:00:00+00:00,26700.0,12.875,13.0125,12.7,113.625,55.625,0.0,2.175,-62.1828125,17.964516657120456,14,2,59,-0.4999999999999998,-0.8660254037844388,0.8498170915275278,0.5270777086423722,0.34705086809328656,0.3274015726405209,26.7 +2026-02-28 15:00:00+00:00,1600.0,11.975,12.1,11.8625,14.875,62.5,0.0,1.3624999999999998,-53.97375,37.07565657431661,15,2,59,-0.7071067811865471,-0.7071067811865479,0.8498170915275278,0.5270777086423722,0.1423600200949649,0.10448860564979724,1.6 +2026-02-28 16:00:00+00:00,0.0,10.325,10.5125,10.1875,0.0,72.375,0.0,1.1500000000000001,-49.504999999999995,45.926620140175785,16,2,59,-0.8660254037844384,-0.5000000000000004,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 17:00:00+00:00,0.0,9.9125,10.0,9.7625,0.0,73.75,0.0,0.9875,-49.48875,45.92902906024323,17,2,59,-0.9659258262890683,-0.25881904510252063,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 18:00:00+00:00,0.0,9.475,9.6,9.3625,0.0,73.25,0.0,0.775,-49.471875,45.93443014118966,18,2,59,-1.0,-1.8369701987210297e-16,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 19:00:00+00:00,0.0,9.0375,9.2125,8.950000000000001,0.0,71.5,0.0,0.8,-49.46125,45.93070911256796,19,2,59,-0.9659258262890684,0.2588190451025203,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 20:00:00+00:00,0.0,8.7625,8.875,8.575,0.0,71.625,0.0,0.7375,-49.4675,45.93989973323843,20,2,59,-0.8660254037844386,0.5000000000000001,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 21:00:00+00:00,0.0,8.35,8.4375,8.2375,0.0,71.125,0.0,1.0375,-49.443124999999995,45.940259503284985,21,2,59,-0.7071067811865477,0.7071067811865474,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 22:00:00+00:00,0.0,8.1125,8.2125,7.975,0.0,72.875,0.0,0.925,-49.443749999999994,45.94733336930447,22,2,59,-0.5000000000000004,0.8660254037844384,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-02-28 23:00:00+00:00,0.0,8.0125,8.1125,7.8875,0.0,73.125,0.0,1.1125,-49.433125,45.94187520547929,23,2,59,-0.25881904510252157,0.9659258262890681,0.8498170915275278,0.5270777086423722,0.0,0.0,0.0 +2026-03-01 00:00:00+00:00,0.0,8.3875,8.5625,8.2,0.0,73.125,0.0,0.9625,-49.42625,45.940597265200346,0,3,60,0.0,1.0,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 01:00:00+00:00,0.0,8.087499999999999,8.1625,8.0125,0.0,74.25,0.0,0.9875,-49.416875000000005,45.937667068857195,1,3,60,0.25881904510252074,0.9659258262890683,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 02:00:00+00:00,0.0,8.3125,8.4125,8.2375,0.0,73.375,0.0,0.6,-49.415625000000006,45.93846950790989,2,3,60,0.49999999999999994,0.8660254037844387,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 03:00:00+00:00,0.0,9.2,9.3875,9.0625,0.0,67.0,0.0,0.9125000000000001,-46.016071428571436,52.726727543523694,3,3,60,0.7071067811865475,0.7071067811865476,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 04:00:00+00:00,3000.0,8.4375,8.5625,8.325,19.375,72.5,0.0,0.42500000000000004,24.786109348125215,14.221409561956916,4,3,60,0.8660254037844386,0.5000000000000001,0.8587639582758029,0.5123714121284237,0.0,0.0,3.0 +2026-03-01 05:00:00+00:00,19500.0,9.4125,9.5125,9.2625,98.25,66.875,0.0,1.2125,52.12348012074575,5.872166203275744,5,3,60,0.9659258262890683,0.25881904510252074,0.8587639582758029,0.5123714121284237,0.14590661125044102,0.6733759296990254,19.5 +2026-03-01 06:00:00+00:00,25900.0,10.9875,11.2,10.725,378.75,60.75,0.0,1.9249999999999998,31.298405913978495,7.726072248346063,6,3,60,1.0,6.123233995736766e-17,0.8587639582758029,0.5123714121284237,0.35079805567759687,1.0796810126795358,25.9 +2026-03-01 07:00:00+00:00,27800.0,12.125,12.3125,11.9625,465.875,52.375,0.0,2.4375,10.478526785714285,12.17597732417354,7,3,60,0.9659258262890683,-0.25881904510252063,0.8587639582758029,0.5123714121284237,0.5267423277533441,0.8844457250797467,27.8 +2026-03-01 08:00:00+00:00,29000.0,13.375,13.725000000000001,12.95,678.125,49.375,0.0,1.9625,-4.810629619565217,14.957394762102753,8,3,60,0.8660254037844387,-0.49999999999999983,0.8587639582758029,0.5123714121284237,0.6617491160973779,1.0247463630917981,29.0 +2026-03-01 09:00:00+00:00,29900.0,15.05,15.4625,14.6125,785.375,43.0,0.0,1.55,-17.06885882352941,15.52152181522729,9,3,60,0.7071067811865476,-0.7071067811865475,0.8587639582758029,0.5123714121284237,0.746617931193319,1.0519101767951589,29.9 +2026-03-01 10:00:00+00:00,32000.0,15.2375,15.5625,14.825,585.875,44.5,0.0,2.1125,-27.26730208333333,15.576047099387322,10,3,60,0.49999999999999994,-0.8660254037844387,0.8587639582758029,0.5123714121284237,0.7755651035447275,0.7554169177058804,32.0 +2026-03-01 11:00:00+00:00,32200.0,14.8,15.15,14.5375,741.5,46.25,0.0,3.1374999999999997,-35.50570833333333,17.25914776144491,11,3,60,0.258819045102521,-0.9659258262890682,0.8587639582758029,0.5123714121284237,0.746617931193319,0.9931451804470608,32.2 +2026-03-01 12:00:00+00:00,32000.0,14.825,15.1375,14.475,471.375,48.0,0.0,3.275,-44.716499999999996,17.84660895997809,12,3,60,1.2246467991473532e-16,-1.0,0.8587639582758029,0.5123714121284237,0.6617491160973779,0.7123167806855614,32.0 +2026-03-01 13:00:00+00:00,22500.0,14.3625,14.55,14.1625,364.375,53.5,0.0,2.7875,-54.98643075980392,17.182369985987187,13,3,60,-0.2588190451025208,-0.9659258262890683,0.8587639582758029,0.5123714121284237,0.5267423277533441,0.6917518885450662,22.5 +2026-03-01 14:00:00+00:00,19100.0,13.7125,13.925,13.5375,214.125,60.75,0.0,2.8875,-62.34388888888889,17.251212057077954,14,3,60,-0.4999999999999998,-0.8660254037844388,0.8587639582758029,0.5123714121284237,0.35079805567759687,0.6103939190495198,19.1 +2026-03-01 15:00:00+00:00,1700.0,12.875,13.0125,12.7625,23.0,60.375,0.0,2.0125,-55.04615277777778,34.6205478905449,15,3,60,-0.7071067811865471,-0.7071067811865479,0.8587639582758029,0.5123714121284237,0.14590661125044102,0.1576350776903571,1.7 +2026-03-01 16:00:00+00:00,0.0,12.725,12.7625,12.674999999999999,0.0,59.875,0.0,2.45,-49.373875,45.92557159937334,16,3,60,-0.8660254037844384,-0.5000000000000004,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 17:00:00+00:00,0.0,12.5,12.5875,12.4,0.0,60.375,0.0,0.9375,-49.36125,45.92754586030044,17,3,60,-0.9659258262890683,-0.25881904510252063,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 18:00:00+00:00,0.0,11.425,11.5875,11.2875,0.0,67.625,0.0,0.35,-49.353125,45.93209818013071,18,3,60,-1.0,-1.8369701987210297e-16,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 19:00:00+00:00,100.0,10.6375,10.825,10.475,0.0,65.75,0.0,0.375,-49.33812499999999,45.93531377450795,19,3,60,-0.9659258262890684,0.2588190451025203,0.8587639582758029,0.5123714121284237,0.0,0.0,0.1 +2026-03-01 20:00:00+00:00,0.0,10.0,10.25,9.825,0.0,65.125,0.0,0.5875,-49.33624999999999,45.93742575957719,20,3,60,-0.8660254037844386,0.5000000000000001,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 21:00:00+00:00,0.0,11.4625,11.7125,11.15,0.0,53.375,0.0,1.8375,-49.333749999999995,45.9340854966839,21,3,60,-0.7071067811865477,0.7071067811865474,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 22:00:00+00:00,0.0,11.0375,11.3375,10.675,0.0,54.625,0.0,1.5375,-49.322500000000005,45.938244415737095,22,3,60,-0.5000000000000004,0.8660254037844384,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-01 23:00:00+00:00,0.0,10.4375,10.75,10.2125,0.0,55.375,0.0,0.9375,-49.315625000000004,45.94195705702106,23,3,60,-0.25881904510252157,0.9659258262890681,0.8587639582758029,0.5123714121284237,0.0,0.0,0.0 +2026-03-02 00:00:00+00:00,0.0,8.6625,8.8375,8.55,0.0,63.125,0.0,0.9125,-49.298125000000006,45.933647088989495,0,3,61,0.0,1.0,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 01:00:00+00:00,0.0,8.5875,8.7,8.4625,0.0,64.375,0.0,0.7,-49.298125,45.93866070529084,1,3,61,0.25881904510252074,0.9659258262890683,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 02:00:00+00:00,0.0,8.7125,9.0375,8.462499999999999,0.0,61.875,0.0,1.2625,-49.295,45.938193033321056,2,3,61,0.49999999999999994,0.8660254037844387,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 03:00:00+00:00,0.0,8.4,8.600000000000001,8.25,0.0,61.25,0.0,1.075,-45.07062500000001,54.37401142300581,3,3,61,0.7071067811865475,0.7071067811865476,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 04:00:00+00:00,3000.0,8.862499999999999,8.975,8.675,27.75,59.5,0.0,0.7625,22.66711111111111,14.686569342338771,4,3,61,0.8660254037844386,0.5000000000000001,0.8674563547295968,0.49751328890718066,0.0,0.0,3.0 +2026-03-02 05:00:00+00:00,18900.0,11.587499999999999,11.875,11.25,199.0,47.75,0.0,1.0875000000000001,52.207766544117646,5.955130134307395,5,3,61,0.9659258262890683,0.25881904510252074,0.8674563547295968,0.49751328890718066,0.14947000602169705,1.331370790010627,18.9 +2026-03-02 06:00:00+00:00,25600.0,13.3,13.475,13.1375,411.5,41.625,0.0,1.85,31.080665322580643,7.783967645497429,6,3,61,1.0,6.123233995736766e-17,0.8674563547295968,0.49751328890718066,0.3545544305572491,1.1606116424867408,25.6 +2026-03-02 07:00:00+00:00,27800.0,14.275,14.5,14.0625,601.625,39.5,0.0,2.425,11.287101785714285,13.188704276081008,7,3,61,0.9659258262890683,-0.25881904510252063,0.8674563547295968,0.49751328890718066,0.530664418408937,1.1337202554560195,27.8 +2026-03-02 08:00:00+00:00,29000.0,15.1875,15.5125,14.912500000000001,737.125,36.625,0.0,2.725,-4.024262445887446,15.150301711804518,8,3,61,0.8660254037844387,-0.49999999999999983,0.8674563547295968,0.49751328890718066,0.665798364940184,1.1071294836631569,29.0 +2026-03-02 09:00:00+00:00,29700.0,16.05,16.425,15.65,807.75,33.25,0.0,2.1875,-16.22436111111111,16.457823012153906,9,3,61,0.7071067811865476,-0.7071067811865475,0.8674563547295968,0.49751328890718066,0.7507471150142911,1.0759282105061754,29.7 +2026-03-02 10:00:00+00:00,31900.0,16.6625,16.95,16.25,809.0,32.375,0.0,2.65,-26.635408928571426,15.861488009788493,10,3,61,0.49999999999999994,-0.8660254037844387,0.8674563547295968,0.49751328890718066,0.779721551698155,1.0375498769247553,31.9 +2026-03-02 11:00:00+00:00,32200.0,15.7125,15.95,15.45,742.375,43.5,0.0,4.45,-35.13458333333333,17.027595047395053,11,3,61,0.258819045102521,-0.9659258262890682,0.8674563547295968,0.49751328890718066,0.7507471150142911,0.9888482887954464,32.2 +2026-03-02 12:00:00+00:00,31200.0,15.425,15.7,15.2,600.875,47.75,0.0,4.2625,-43.5887380952381,18.35617946927516,12,3,61,1.2246467991473532e-16,-1.0,0.8674563547295968,0.49751328890718066,0.665798364940184,0.9024879477647609,31.2 +2026-03-02 13:00:00+00:00,28700.0,15.15,15.3375,14.962499999999999,408.0,49.625,0.0,4.025,-54.28523774509804,17.146351824212804,13,3,61,-0.2588190451025208,-0.9659258262890683,0.8674563547295968,0.49751328890718066,0.530664418408937,0.7688474784559417,28.7 +2026-03-02 14:00:00+00:00,20100.0,14.65,14.7875,14.5125,193.75,51.875,0.0,3.825,-62.22815079365079,17.119434394737365,14,3,61,-0.4999999999999998,-0.8660254037844388,0.8674563547295968,0.49751328890718066,0.3545544305572491,0.5464605242571228,20.1 +2026-03-02 15:00:00+00:00,2500.0,14.0625,14.175,14.0375,21.5,50.125,0.0,3.4,-54.2934375,36.10544741008331,15,3,61,-0.7071067811865471,-0.7071067811865479,0.8674563547295968,0.49751328890718066,0.14947000602169705,0.14384156776496726,2.5 +2026-03-02 16:00:00+00:00,0.0,13.775,13.850000000000001,13.75,0.0,51.5,0.0,3.6625,-49.314375,46.01347933735469,16,3,61,-0.8660254037844384,-0.5000000000000004,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 17:00:00+00:00,0.0,13.487499999999999,13.575,13.425,0.0,51.875,0.0,2.6375,-49.299375,46.01176155682914,17,3,61,-0.9659258262890683,-0.25881904510252063,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 18:00:00+00:00,0.0,12.525,12.75,12.3375,0.0,53.375,0.0,1.1125,-49.28562500000001,46.01922181613353,18,3,61,-1.0,-1.8369701987210297e-16,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 19:00:00+00:00,0.0,11.637500000000001,11.85,11.375,0.0,56.25,0.0,0.6499999999999999,-49.276250000000005,46.01634277170811,19,3,61,-0.9659258262890684,0.2588190451025203,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 20:00:00+00:00,0.0,10.7625,10.9375,10.662500000000001,0.0,60.125,0.0,0.3375,-49.271874999999994,46.016746470487966,20,3,61,-0.8660254037844386,0.5000000000000001,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 21:00:00+00:00,0.0,10.2375,10.375,10.15,0.0,62.625,0.0,0.3875,-49.2675,46.0171746470815,21,3,61,-0.7071067811865477,0.7071067811865474,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 22:00:00+00:00,0.0,10.8125,11.275,10.5875,0.0,64.375,0.0,0.9624999999999999,-49.266875,46.02172672476736,22,3,61,-0.5000000000000004,0.8660254037844384,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-02 23:00:00+00:00,0.0,11.3125,11.625,11.025,0.0,62.0,0.0,1.2,-49.2525,46.02213611404842,23,3,61,-0.25881904510252157,0.9659258262890681,0.8674563547295968,0.49751328890718066,0.0,0.0,0.0 +2026-03-03 00:00:00+00:00,0.0,11.175,11.475,10.774999999999999,0.0,62.125,0.0,1.2,-49.243125000000006,46.02757494947097,0,3,62,0.0,1.0,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 01:00:00+00:00,0.0,9.7875,9.9,9.6375,0.0,65.625,0.0,0.4125,-49.231875,46.0250345543506,1,3,62,0.25881904510252074,0.9659258262890683,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 02:00:00+00:00,0.0,9.175,9.2625,9.0875,0.0,67.25,0.0,0.7,-49.22749999999999,46.023731242696954,2,3,62,0.49999999999999994,0.8660254037844387,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 03:00:00+00:00,0.0,10.5125,10.7875,10.3,0.0,44.75,0.0,1.6625,-45.564910714285716,53.30314724276859,3,3,62,0.7071067811865475,0.7071067811865476,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 04:00:00+00:00,2900.0,10.9625,11.1,10.85,32.5,37.625,0.0,1.9,21.412298284313728,15.708511929998773,4,3,62,0.8660254037844386,0.5000000000000001,0.8758917051442429,0.48250774176121847,0.0,0.0,2.9 +2026-03-03 05:00:00+00:00,18600.0,12.35,12.4625,12.125,215.25,33.125,0.0,2.4875,52.055288149350645,5.799500613565986,5,3,62,0.9659258262890683,0.25881904510252074,0.8758917051442429,0.48250774176121847,0.15304887003136364,1.4064135197854761,18.6 +2026-03-03 06:00:00+00:00,25600.0,13.825,14.025,13.6125,435.875,29.625,0.0,2.475,31.52163760080645,7.5365051604773186,6,3,62,1.0,6.123233995736766e-17,0.8758917051442429,0.48250774176121847,0.35831842235062544,1.2164459676412704,25.6 +2026-03-03 07:00:00+00:00,27800.0,14.6125,14.775,14.4625,622.0,30.25,0.0,3.0625,11.38494760308338,12.400711967710667,7,3,62,0.9659258262890683,-0.25881904510252063,0.8758917051442429,0.48250774176121847,0.5345873830341799,1.1635141788601309,27.8 +2026-03-03 08:00:00+00:00,29100.0,15.575,15.725,15.35,757.5,33.125,0.0,2.8375,-3.9834158874458865,15.051634151590362,8,3,62,0.8660254037844387,-0.49999999999999983,0.8758917051442429,0.48250774176121847,0.6698433137096734,1.1308614783431563,29.1 +2026-03-03 09:00:00+00:00,30000.0,16.8375,17.2125,16.425,824.125,31.25,0.0,1.95,-16.04438888888889,16.103920488974925,9,3,62,0.7071067811865476,-0.7071067811865475,0.8758917051442429,0.48250774176121847,0.7548687462225653,1.0917460871495868,30.0 +2026-03-03 10:00:00+00:00,31900.0,17.7625,18.05,17.3875,819.25,27.875,0.0,1.975,-26.569395238095243,15.72559446624884,10,3,62,0.49999999999999994,-0.8660254037844387,0.8758917051442429,0.48250774176121847,0.7838693378582724,1.0451359179814284,31.9 +2026-03-03 11:00:00+00:00,32200.0,17.475,17.9375,17.125,745.0,32.0,0.0,2.825,-35.171232142857136,16.979534546057096,11,3,62,0.258819045102521,-0.9659258262890682,0.8758917051442429,0.48250774176121847,0.7548687462225653,0.9869265401807276,32.2 +2026-03-03 12:00:00+00:00,31200.0,16.8125,17.1625,16.4375,608.375,40.625,0.0,2.65,-43.92683333333333,17.607290353503934,12,3,62,1.2246467991473532e-16,-1.0,0.8758917051442429,0.48250774176121847,0.6698433137096734,0.9082347879696604,31.2 +2026-03-03 13:00:00+00:00,29200.0,16.275,16.55,16.05,421.75,45.375,0.0,2.475,-54.26863777089784,16.99993992560774,13,3,62,-0.2588190451025208,-0.9659258262890683,0.8758917051442429,0.48250774176121847,0.5345873830341799,0.7889262137206755,29.2 +2026-03-03 14:00:00+00:00,21100.0,15.975,16.225,15.8,200.375,49.25,0.0,1.8125,-62.2358409090909,17.114102358931863,14,3,62,-0.4999999999999998,-0.8660254037844388,0.8758917051442429,0.48250774176121847,0.35831842235062544,0.5592093163547337,21.1 +2026-03-03 15:00:00+00:00,2600.0,14.975,15.075,14.8875,24.125,55.375,0.0,1.8125,-54.36255555555555,36.28517380384595,15,3,62,-0.7071067811865471,-0.7071067811865479,0.8758917051442429,0.48250774176121847,0.15304887003136364,0.15762938984819796,2.6 +2026-03-03 16:00:00+00:00,0.0,14.25,14.3375,14.1625,0.0,57.125,0.0,1.4125,-49.44999999999999,46.04977004104725,16,3,62,-0.8660254037844384,-0.5000000000000004,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 17:00:00+00:00,0.0,13.775,13.925,13.6375,0.0,59.75,0.0,1.2375,-49.433125,46.04676922140321,17,3,62,-0.9659258262890683,-0.25881904510252063,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 18:00:00+00:00,0.0,12.225,12.3875,12.1,0.0,66.875,0.0,0.6,-49.425000000000004,46.046370785329,18,3,62,-1.0,-1.8369701987210297e-16,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 19:00:00+00:00,0.0,11.4375,11.55,11.375,0.0,69.625,0.0,1.075,-49.419999999999995,46.05140429454893,19,3,62,-0.9659258262890684,0.2588190451025203,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 20:00:00+00:00,0.0,11.4875,11.575,11.35,0.0,69.5,0.0,1.05,-49.402499999999996,46.048022351671094,20,3,62,-0.8660254037844386,0.5000000000000001,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 21:00:00+00:00,0.0,11.35,11.425,11.2625,0.0,71.5,0.0,1.15,-49.405,46.05804833757795,21,3,62,-0.7071067811865477,0.7071067811865474,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 22:00:00+00:00,0.0,11.35,11.4625,11.287500000000001,0.0,73.875,0.0,1.25,-49.39874999999999,46.05717490702905,22,3,62,-0.5000000000000004,0.8660254037844384,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-03 23:00:00+00:00,0.0,11.0875,11.2375,11.0,0.0,74.375,0.0,1.1625,-49.38875,46.05391267760717,23,3,62,-0.25881904510252157,0.9659258262890681,0.8758917051442429,0.48250774176121847,0.0,0.0,0.0 +2026-03-04 00:00:00+00:00,0.0,10.7,10.8125,10.6,0.0,75.5,0.0,1.2875,-49.381875,46.05592512438003,0,3,63,0.0,1.0,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 01:00:00+00:00,0.0,11.0,11.125,10.837499999999999,0.0,77.625,0.0,1.2375,-49.368125000000006,46.05009022679362,1,3,63,0.25881904510252074,0.9659258262890683,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 02:00:00+00:00,0.0,11.9625,12.0,11.8375,0.0,75.25,0.0,1.6375,-49.36750000000001,46.04961224049557,2,3,63,0.49999999999999994,0.8660254037844387,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 03:00:00+00:00,0.0,12.1625,12.375,11.9125,0.0,69.75,0.0,2.3875,-45.383125,53.99550576880604,3,3,63,0.7071067811865475,0.7071067811865476,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 04:00:00+00:00,3100.0,12.325,12.45,12.15,23.625,69.0,0.0,2.5875,26.697236111111113,13.374629082689998,4,3,63,0.8660254037844386,0.5000000000000001,0.8840675099433636,0.46735921715800227,0.0,0.0,3.1 +2026-03-04 05:00:00+00:00,18600.0,13.4625,13.5875,13.2875,178.875,67.75,0.0,2.3625,52.14804761904762,5.883170685154188,5,3,63,0.9659258262890683,0.25881904510252074,0.8840675099433636,0.46735921715800227,0.15664186388508983,1.1419361054795676,18.6 +2026-03-04 06:00:00+00:00,25700.0,14.45,14.6875,14.35,340.75,64.375,0.0,2.675,31.53682196969697,7.505565576174552,6,3,63,1.0,6.123233995736766e-17,0.8840675099433636,0.46735921715800227,0.3620884650609447,0.9410683655516252,25.7 +2026-03-04 07:00:00+00:00,28300.0,15.5375,15.75,15.25,579.25,58.0,0.0,3.1375,10.934153029100528,11.908231521467597,7,3,63,0.9659258262890683,-0.25881904510252063,0.8840675099433636,0.46735921715800227,0.5385094610443732,1.075654267757182,28.3 +2026-03-04 08:00:00+00:00,29400.0,15.8,16.1,15.55,637.5,56.75,0.0,4.325,-3.7161006493506488,14.808320397216068,8,3,63,0.8660254037844387,-0.49999999999999983,0.8840675099433636,0.46735921715800227,0.6738820525085857,0.9460112457763932,29.4 +2026-03-04 09:00:00+00:00,26700.0,16.375,16.725,16.075,743.625,54.25,0.0,3.95,-15.789143575851394,15.870669257761856,9,3,63,0.7071067811865476,-0.7071067811865475,0.8840675099433636,0.46735921715800227,0.758980821059081,0.9797678404605092,26.7 +2026-03-04 10:00:00+00:00,31800.0,16.5,16.85,16.225,681.125,53.0,0.0,3.6875,-26.60178333333333,14.958491123488407,10,3,63,0.49999999999999994,-0.8660254037844387,0.8840675099433636,0.46735921715800227,0.7880064262515072,0.8643647783940864,31.8 +2026-03-04 11:00:00+00:00,32300.0,16.8625,17.2,16.525,620.5,52.875,0.0,3.2375,-35.04018498168498,16.80427686498124,11,3,63,0.258819045102521,-0.9659258262890682,0.8840675099433636,0.46735921715800227,0.758980821059081,0.817543714917796,32.3 +2026-03-04 12:00:00+00:00,30800.0,16.775,17.1625,16.4,485.875,56.875,0.0,3.4625,-44.09349973739496,16.931969131616672,12,3,63,1.2246467991473532e-16,-1.0,0.8840675099433636,0.46735921715800227,0.6738820525085857,0.7210089632025177,30.8 +2026-03-04 13:00:00+00:00,28800.0,16.275,16.5375,16.0875,380.625,58.125,0.0,3.9749999999999996,-54.07325367647058,16.44394110388894,13,3,63,-0.2588190451025208,-0.9659258262890683,0.8840675099433636,0.46735921715800227,0.5385094610443732,0.7068120943721664,28.8 +2026-03-04 14:00:00+00:00,18500.0,15.4875,15.675,15.2625,131.875,61.0,0.0,3.675,-62.16141098484849,17.04346772756896,14,3,63,-0.4999999999999998,-0.8660254037844388,0.8840675099433636,0.46735921715800227,0.3620884650609447,0.3642065758095982,18.5 +2026-03-04 15:00:00+00:00,2500.0,14.9875,15.05,14.9375,9.5,67.5,0.0,3.25,-53.94512499999999,36.84808995586926,15,3,63,-0.7071067811865471,-0.7071067811865479,0.8840675099433636,0.46735921715800227,0.15664186388508983,0.06064789938256263,2.5 +2026-03-04 16:00:00+00:00,0.0,14.5375,14.6,14.4375,0.0,66.75,0.0,2.4375,-49.36325,45.96881319347571,16,3,63,-0.8660254037844384,-0.5000000000000004,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 17:00:00+00:00,0.0,14.2625,14.3375,14.25,0.0,70.625,0.0,2.1875,-49.355624999999996,45.969061895610835,17,3,63,-0.9659258262890683,-0.25881904510252063,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 18:00:00+00:00,0.0,14.1625,14.2625,14.05,0.0,76.625,0.1375,2.4875,-49.3475,45.972496638993,18,3,63,-1.0,-1.8369701987210297e-16,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 19:00:00+00:00,0.0,13.075,13.2,12.9625,0.0,85.125,0.0,2.075,-49.326875,45.96650634678654,19,3,63,-0.9659258262890684,0.2588190451025203,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 20:00:00+00:00,0.0,12.225,12.3125,12.15,0.0,87.375,0.0,1.6625,-49.326249999999995,45.966106557803364,20,3,63,-0.8660254037844386,0.5000000000000001,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 21:00:00+00:00,0.0,12.325,12.55,12.0625,0.0,83.75,0.0,0.8625,-49.318124999999995,45.96570879357604,21,3,63,-0.7071067811865477,0.7071067811865474,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 22:00:00+00:00,0.0,12.225,12.4375,12.075,0.0,83.0,0.0,0.525,-49.319374999999994,45.97153020144641,22,3,63,-0.5000000000000004,0.8660254037844384,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-04 23:00:00+00:00,0.0,10.6125,10.8375,10.4625,0.0,81.5,0.0,0.6625,-49.316875,45.97482673408532,23,3,63,-0.25881904510252157,0.9659258262890681,0.8840675099433636,0.46735921715800227,0.0,0.0,0.0 +2026-03-05 00:00:00+00:00,0.0,9.787500000000001,10.0,9.5875,0.0,76.25,0.0,0.5625,-49.30437500000001,45.96982730439427,0,3,64,0.0,1.0,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 01:00:00+00:00,0.0,9.3,9.4875,9.1625,0.0,74.75,0.0,0.525,-49.298750000000005,45.96934895938815,1,3,64,0.25881904510252074,0.9659258262890683,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 02:00:00+00:00,0.0,9.3375,9.5125,9.15,0.0,72.375,0.0,1.0875,-49.30375,45.97269826121441,2,3,64,0.49999999999999994,0.8660254037844387,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 03:00:00+00:00,0.0,9.2875,9.475,9.05,0.0,73.375,0.0,0.9875,-45.613125000000004,53.316537669493314,3,3,64,0.7071067811865475,0.7071067811865476,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 04:00:00+00:00,2500.0,9.4875,9.8125,9.1625,40.875,69.625,0.0,0.6875,22.447320162538702,16.2761332263966,4,3,64,0.8660254037844386,0.5000000000000001,0.8919813464595485,0.45207220393230435,0.0,0.0,2.5 +2026-03-05 05:00:00+00:00,18800.0,12.15,12.3875,11.775,227.75,58.375,0.0,0.375,51.76022533206831,5.654331572372603,5,3,64,0.9659258262890683,0.25881904510252074,0.8919813464595485,0.45207220393230435,0.16024764407262038,1.4212377431070948,18.8 +2026-03-05 06:00:00+00:00,26100.0,14.1375,14.35,13.9125,450.5,42.5,0.0,1.8624999999999998,31.299908586876832,7.637608248641757,6,3,64,1.0,6.123233995736766e-17,0.8919813464595485,0.45207220393230435,0.36586299828020113,1.2313352323619742,26.1 +2026-03-05 07:00:00+00:00,26900.0,15.0875,15.3125,14.8375,641.75,35.0,0.0,2.375,11.168501653439154,11.520419430934336,7,3,64,0.9659258262890683,-0.25881904510252063,0.8919813464595485,0.45207220393230435,0.5424289057771904,1.1831043537042014,26.9 +2026-03-05 08:00:00+00:00,27500.0,15.725,15.975,15.4125,783.0,30.125,0.0,3.3375,-3.8277110389610387,14.101216736937742,8,3,64,0.8660254037844387,-0.49999999999999983,0.8919813464595485,0.45207220393230435,0.6779126917566269,1.1550159917659424,27.5 +2026-03-05 09:00:00+00:00,24400.0,15.775,16.125,15.45,858.0,36.25,0.0,3.4875,-15.982592320261439,15.341737025077238,9,3,64,0.7071067811865476,-0.7071067811865475,0.8919813464595485,0.45207220393230435,0.7630813601015547,1.1243886233648965,24.4 +2026-03-05 10:00:00+00:00,25800.0,16.425,16.875,16.0125,858.375,31.375,0.0,3.1875,-26.204148809523808,15.279316991542288,10,3,64,0.49999999999999994,-0.8660254037844387,0.8919813464595485,0.45207220393230435,0.792130806812146,1.0836278460806836,25.8 +2026-03-05 11:00:00+00:00,26300.0,16.45,16.75,16.05,782.75,34.0,0.0,3.4125,-34.815333333333335,16.663627714054122,11,3,64,0.258819045102521,-0.9659258262890682,0.8919813464595485,0.45207220393230435,0.7630813601015547,1.0257752854765418,26.3 +2026-03-05 12:00:00+00:00,30400.0,16.0375,16.525,15.6875,642.875,38.0,0.0,3.4625,-43.83992113095238,17.12785954744485,12,3,64,1.2246467991473532e-16,-1.0,0.8919813464595485,0.45207220393230435,0.6779126917566269,0.9483153329585314,30.4 +2026-03-05 13:00:00+00:00,29000.0,15.8,16.2,15.525,451.875,41.625,0.0,3.075,-54.02752614379085,16.810436674148992,13,3,64,-0.2588190451025208,-0.9659258262890683,0.8919813464595485,0.45207220393230435,0.5424289057771904,0.8330584804520235,29.0 +2026-03-05 14:00:00+00:00,21800.0,15.1625,15.35,14.9625,226.875,44.25,0.0,3.075,-61.811994949494945,17.630968014309943,14,3,64,-0.4999999999999998,-0.8660254037844388,0.8919813464595485,0.45207220393230435,0.36586299828020113,0.6201091694608721,21.8 +2026-03-05 15:00:00+00:00,3000.0,14.325,14.4375,14.2125,29.875,47.625,0.0,2.2125,-53.88175,37.25489184545657,15,3,64,-0.7071067811865471,-0.7071067811865479,0.8919813464595485,0.45207220393230435,0.16024764407262038,0.18643019791580442,3.0 +2026-03-05 16:00:00+00:00,0.0,13.825000000000001,13.9,13.8,0.0,51.125,0.0,2.2,-49.44625000000001,46.08268359246598,16,3,64,-0.8660254037844384,-0.5000000000000004,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 17:00:00+00:00,0.0,13.65,13.75,13.5875,0.0,53.625,0.0,2.3625,-49.42125,46.07760091682292,17,3,64,-0.9659258262890683,-0.25881904510252063,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 18:00:00+00:00,0.0,12.1875,12.4375,11.9125,0.0,57.5,0.0,0.875,-49.404375,46.07464945494251,18,3,64,-1.0,-1.8369701987210297e-16,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 19:00:00+00:00,0.0,11.0625,11.325,10.925,0.0,60.875,0.0,0.375,-49.39812499999999,46.073828632921675,19,3,64,-0.9659258262890684,0.2588190451025203,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 20:00:00+00:00,0.0,10.45,10.625,10.2875,0.0,62.125,0.0,0.65,-49.394999999999996,46.08564149333121,20,3,64,-0.8660254037844386,0.5000000000000001,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 21:00:00+00:00,0.0,10.225,10.2875,10.0875,0.0,63.875,0.0,1.3125,-49.38624999999999,46.08585287717551,21,3,64,-0.7071067811865477,0.7071067811865474,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 22:00:00+00:00,0.0,10.475,10.625,10.3625,0.0,60.125,0.0,1.8125,-49.366875,46.084593113054964,22,3,64,-0.5000000000000004,0.8660254037844384,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-05 23:00:00+00:00,0.0,10.35,10.5125,10.1625,0.0,56.625,0.0,1.35,-49.36125,46.085783486703725,23,3,64,-0.25881904510252157,0.9659258262890681,0.8919813464595485,0.45207220393230435,0.0,0.0,0.0 +2026-03-06 00:00:00+00:00,0.0,9.6,9.75,9.475,0.0,61.0,0.0,1.0375,-49.353750000000005,46.08744010483406,0,3,65,0.0,1.0,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 01:00:00+00:00,0.0,9.375,9.4875,9.2375,0.0,60.875,0.0,1.1125,-49.351875,46.092938196241086,1,3,65,0.25881904510252074,0.9659258262890683,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 02:00:00+00:00,0.0,10.8125,11.0625,10.600000000000001,0.0,49.5,0.0,1.8125,-49.339999999999996,46.08490339398937,2,3,65,0.49999999999999994,0.8660254037844387,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 03:00:00+00:00,0.0,10.1,10.375,9.8375,0.0,50.875,0.0,1.6624999999999999,-45.671875,53.40695754358697,3,3,65,0.7071067811865475,0.7071067811865476,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 04:00:00+00:00,3800.0,10.0375,10.35,9.825,38.625,46.375,0.0,1.25,24.585998415155537,15.309852982394474,4,3,65,0.8660254037844386,0.5000000000000001,0.8996308696522433,0.43665123195606403,0.0,0.0,3.8 +2026-03-06 05:00:00+00:00,20300.0,11.875,12.0,11.7,223.625,37.375,0.0,2.0,51.893522727272725,5.696573249926791,5,3,65,0.9659258262890683,0.25881904510252074,0.8996308696522433,0.43665123195606403,0.16386486388167903,1.364691580017249,20.3 +2026-03-06 06:00:00+00:00,26400.0,12.8625,13.0375,12.6875,438.25,35.25,0.0,2.825,31.596769744160177,7.434986382341445,6,3,65,1.0,6.123233995736766e-17,0.8996308696522433,0.43665123195606403,0.369640468393803,1.1856115265309715,26.4 +2026-03-06 07:00:00+00:00,28500.0,14.1625,14.475,13.8375,622.125,34.375,0.0,2.8000000000000003,12.19866640439701,12.431791507884617,7,3,65,0.9659258262890683,-0.25881904510252063,0.8996308696522433,0.43665123195606403,0.5463439859469934,1.1387056799420117,28.5 +2026-03-06 08:00:00+00:00,29800.0,16.0875,16.4875,15.7125,769.125,32.875,0.0,2.3499999999999996,-3.192064935064935,14.464948095737496,8,3,65,0.8660254037844387,-0.49999999999999983,0.8996308696522433,0.43665123195606403,0.6819333638363705,1.127859466609924,29.8 +2026-03-06 09:00:00+00:00,29900.0,17.4375,17.7375,17.1125,825.5,26.625,0.0,2.075,-15.141049346405229,15.582883085060054,9,3,65,0.7071067811865476,-0.7071067811865475,0.8996308696522433,0.43665123195606403,0.7671684100308144,1.0760349216762493,29.9 +2026-03-06 10:00:00+00:00,29600.0,18.1875,18.5375,17.8125,813.25,29.875,0.0,2.225,-25.693199999999997,15.106647532007102,10,3,65,0.49999999999999994,-0.8660254037844387,0.8996308696522433,0.43665123195606403,0.7962404969897476,1.021362268152095,29.6 +2026-03-06 11:00:00+00:00,32400.0,16.862499999999997,17.25,16.4625,741.125,41.0,0.0,3.4625,-34.36208333333333,16.438390784481715,11,3,65,0.258819045102521,-0.9659258262890682,0.8996308696522433,0.43665123195606403,0.7671684100308144,0.9660525515776017,32.4 +2026-03-06 12:00:00+00:00,32100.0,16.975,17.325,16.75,580.375,46.5,0.0,3.0375,-43.403369047619044,17.26329020565543,12,3,65,1.2246467991473532e-16,-1.0,0.8996308696522433,0.43665123195606403,0.6819333638363705,0.8510728918364825,32.1 +2026-03-06 13:00:00+00:00,30100.0,16.075,16.3875,15.825,410.375,55.375,0.0,3.525,-53.50800919117647,16.477568007640457,13,3,65,-0.2588190451025208,-0.9659258262890683,0.8996308696522433,0.43665123195606403,0.5463439859469934,0.7511293444343228,30.1 +2026-03-06 14:00:00+00:00,23500.0,15.2875,15.4875,15.15,220.625,54.25,0.0,2.9125,-61.70378156565656,17.054359469001614,14,3,65,-0.4999999999999998,-0.8660254037844388,0.8996308696522433,0.43665123195606403,0.369640468393803,0.5968637605040401,23.5 +2026-03-06 15:00:00+00:00,3500.0,14.4125,14.5125,14.3,31.0,57.0,0.0,2.7375,-54.767125,35.32598169519379,15,3,65,-0.7071067811865471,-0.7071067811865479,0.8996308696522433,0.43665123195606403,0.16386486388167903,0.18918027492693,3.5 +2026-03-06 16:00:00+00:00,0.0,13.9125,13.9875,13.875,0.0,55.125,0.0,2.55,-49.39583333333333,46.02424597527474,16,3,65,-0.8660254037844384,-0.5000000000000004,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 17:00:00+00:00,0.0,13.7875,13.8375,13.712499999999999,0.0,53.125,0.0,2.8,-49.384375000000006,46.02322830081747,17,3,65,-0.9659258262890683,-0.25881904510252063,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 18:00:00+00:00,0.0,13.8375,13.875,13.787500000000001,0.0,58.875,0.0,2.6875,-49.37624999999999,46.02284100042065,18,3,65,-1.0,-1.8369701987210297e-16,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 19:00:00+00:00,0.0,13.675,13.7375,13.6,0.0,63.875,0.0,2.0375,-49.368125,46.01909157146086,19,3,65,-0.9659258262890684,0.2588190451025203,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 20:00:00+00:00,0.0,13.475,13.55,13.4,0.0,67.375,0.0,1.2125,-49.35875000000001,46.02117395377191,20,3,65,-0.8660254037844386,0.5000000000000001,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 21:00:00+00:00,0.0,12.0625,12.2625,11.9,0.0,72.5,0.0,0.725,-49.35375,46.02615857223658,21,3,65,-0.7071067811865477,0.7071067811865474,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 22:00:00+00:00,0.0,11.5375,11.625,11.4125,0.0,77.0,0.0,0.8625,-49.329375,46.02982911362116,22,3,65,-0.5000000000000004,0.8660254037844384,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-06 23:00:00+00:00,0.0,11.625,11.725,11.45,0.0,78.875,0.0,1.275,-49.319374999999994,46.024854398420786,23,3,65,-0.25881904510252157,0.9659258262890681,0.8996308696522433,0.43665123195606403,0.0,0.0,0.0 +2026-03-07 00:00:00+00:00,0.0,12.5,12.575,12.425,0.0,76.75,0.0,1.925,-49.33500000000001,46.02525135727126,0,3,66,0.0,1.0,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 01:00:00+00:00,0.0,12.8875,12.95,12.8,0.0,76.25,0.0,2.175,-49.33,46.02859921650162,1,3,66,0.25881904510252074,0.9659258262890683,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 02:00:00+00:00,0.0,13.2125,13.2875,13.15,0.0,75.75,0.0,2.475,-49.326874999999994,46.03489289726326,2,3,66,0.49999999999999994,0.8660254037844387,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 03:00:00+00:00,0.0,12.7375,13.0375,12.5875,0.0,76.375,0.0,1.8875,-45.641875,53.3838642668597,3,3,66,0.7071067811865475,0.7071067811865476,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 04:00:00+00:00,3700.0,12.7625,12.9625,12.5375,51.375,78.375,0.0,1.6,25.945114561766736,14.901254361169716,4,3,66,0.8660254037844386,0.5000000000000001,0.9070138128026359,0.4211008707960896,0.0,0.0,3.7 +2026-03-07 05:00:00+00:00,20200.0,13.4,14.0,13.0875,105.375,75.25,0.0,1.275,51.538164299242425,5.442937209422967,5,3,66,0.9659258262890683,0.25881904510252074,0.9070138128026359,0.4211008707960896,0.16749217432321112,0.6291338710348159,20.2 +2026-03-07 06:00:00+00:00,26500.0,12.075,12.2875,11.875,133.0,82.5,0.0,1.3,31.834161290322577,7.321422803918825,6,3,66,1.0,6.123233995736766e-17,0.9070138128026359,0.4211008707960896,0.37341932978395753,0.35616795755310093,26.5 +2026-03-07 07:00:00+00:00,28100.0,15.587499999999999,16.025000000000002,15.2,533.0,67.5,0.0,1.525,11.959535520434226,11.976450398403765,7,3,66,0.9659258262890683,-0.25881904510252063,0.9070138128026359,0.4211008707960896,0.5502529870870644,0.9686453549695414,28.1 +2026-03-07 08:00:00+00:00,29700.0,16.65,16.9375,16.45,598.625,62.25,0.0,2.975,-2.9552500000000004,14.325493131033182,8,3,66,0.8660254037844387,-0.49999999999999983,0.9070138128026359,0.4211008707960896,0.6859422247187611,0.8727046949842439,29.7 +2026-03-07 09:00:00+00:00,30000.0,15.825,16.275,15.4875,373.875,66.125,0.0,2.975,-15.331966911764706,14.962015899316242,9,3,66,0.7071067811865476,-0.7071067811865475,0.9070138128026359,0.4211008707960896,0.7712400453715149,0.48477124890461337,30.0 +2026-03-07 10:00:00+00:00,27900.0,16.075,16.5375,15.7,681.875,62.375,0.0,3.575,-25.74571875,15.140500819537188,10,3,66,0.49999999999999994,-0.8660254037844387,0.9070138128026359,0.4211008707960896,0.8003335435291542,0.8519885309232462,27.9 +2026-03-07 11:00:00+00:00,28800.0,16.375,16.8,16.05,455.5,60.625,0.0,2.8125,-34.30695238095238,16.334799346536524,11,3,66,0.258819045102521,-0.9659258262890682,0.9070138128026359,0.4211008707960896,0.7712400453715149,0.5906072988995023,28.8 +2026-03-07 12:00:00+00:00,22200.0,15.899999999999999,16.3,15.6,442.125,58.875,0.0,4.199999999999999,-43.16499999999999,17.087475972510134,12,3,66,1.2246467991473532e-16,-1.0,0.9070138128026359,0.4211008707960896,0.6859422247187611,0.644551369003815,22.2 +2026-03-07 13:00:00+00:00,24900.0,15.925,16.2625,15.65,435.75,50.5,0.0,4.025,-53.365079248366015,16.415883917939244,13,3,66,-0.2588190451025208,-0.9659258262890683,0.9070138128026359,0.4211008707960896,0.5502529870870644,0.7919084679699393,24.9 +2026-03-07 14:00:00+00:00,19600.0,15.4125,15.5375,15.3125,159.875,51.875,0.0,3.0125,-61.73664457070707,16.821059026816915,14,3,66,-0.4999999999999998,-0.8660254037844388,0.9070138128026359,0.4211008707960896,0.37341932978395753,0.42813798656993995,19.6 +2026-03-07 15:00:00+00:00,2400.0,14.8375,14.9,14.7375,33.875,60.5,0.0,4.1,-54.407402777777776,35.9845557234195,15,3,66,-0.7071067811865471,-0.7071067811865479,0.9070138128026359,0.4211008707960896,0.16749217432321112,0.2022482551013465,2.4 +2026-03-07 16:00:00+00:00,0.0,14.350000000000001,14.4375,14.3,0.0,59.25,0.0,3.6625,-49.342000000000006,46.06293523720201,16,3,66,-0.8660254037844384,-0.5000000000000004,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 17:00:00+00:00,0.0,14.05,14.15,14.0,0.0,57.5,0.0,2.8125,-49.334999999999994,46.06190865744348,17,3,66,-0.9659258262890683,-0.25881904510252063,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 18:00:00+00:00,0.0,12.8875,13.075,12.6625,0.0,71.875,0.075,2.975,-49.33,46.06188201756415,18,3,66,-1.0,-1.8369701987210297e-16,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 19:00:00+00:00,0.0,13.3,13.3875,13.1875,0.0,59.75,0.0,3.0,-49.318749999999994,46.05938239110464,19,3,66,-0.9659258262890684,0.2588190451025203,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 20:00:00+00:00,0.0,12.75,12.8625,12.625,0.0,61.5,0.0,1.925,-49.32062499999999,46.06231889946307,20,3,66,-0.8660254037844386,0.5000000000000001,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 21:00:00+00:00,0.0,12.1875,12.4,12.025,0.0,55.0,0.0,2.3875,-49.317499999999995,46.060780487026854,21,3,66,-0.7071067811865477,0.7071067811865474,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 22:00:00+00:00,0.0,11.025,11.35,10.775,0.0,56.5,0.0,1.0375,-49.313125,46.067286674629536,22,3,66,-0.5000000000000004,0.8660254037844384,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-07 23:00:00+00:00,0.0,10.175,10.5125,9.875,0.0,57.25,0.0,0.85,-49.293125,46.067320230605624,23,3,66,-0.25881904510252157,0.9659258262890681,0.9070138128026359,0.4211008707960896,0.0,0.0,0.0 +2026-03-08 00:00:00+00:00,0.0,10.05,10.275,9.7625,0.0,56.875,0.0,0.7375,-49.277499999999996,46.0668042086707,0,3,67,0.0,1.0,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 01:00:00+00:00,0.0,9.45,9.75,9.3,0.0,60.875,0.0,0.75,-49.27375,46.067616631244704,1,3,67,0.25881904510252074,0.9659258262890683,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 02:00:00+00:00,0.0,10.55,10.825,10.1875,0.0,53.5,0.0,2.1375,-49.273125,46.070587072764404,2,3,67,0.49999999999999994,0.8660254037844387,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 03:00:00+00:00,0.0,11.1375,11.3,10.9875,0.0,45.75,0.0,2.1625,-45.489642857142854,53.61323898033568,3,3,67,0.7071067811865475,0.7071067811865476,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 04:00:00+00:00,1700.0,10.9375,11.125,10.7875,58.125,48.5,0.0,1.4625,27.873289528969483,13.149088779056283,4,3,67,0.8660254037844386,0.5000000000000001,0.9141279881853337,0.40542572835999735,0.0,0.0,1.7 +2026-03-08 05:00:00+00:00,21100.0,12.25,12.3625,12.0875,264.625,44.75,0.0,1.85,51.66353082233627,5.525167097075605,5,3,67,0.9659258262890683,0.25881904510252074,0.9141279881853337,0.40542572835999735,0.1711282250664892,1.5,21.1 +2026-03-08 06:00:00+00:00,27100.0,13.025,13.225,12.875,473.75,43.375,0.0,2.65,32.19948807123656,7.073728377521103,6,3,67,1.0,6.123233995736766e-17,0.9141279881853337,0.40542572835999735,0.37719804602981793,1.255971511481662,27.1 +2026-03-08 07:00:00+00:00,29200.0,13.875,14.2125,13.55,630.25,45.125,0.0,3.85,11.957433900151575,11.268937392843497,7,3,67,0.9659258262890683,-0.25881904510252063,0.9141279881853337,0.40542572835999735,0.5541542129773482,1.1373187918464174,29.2 +2026-03-08 08:00:00+00:00,30400.0,14.0125,14.399999999999999,13.725,770.0,45.375,0.0,4.8875,-2.8270340909090903,14.283711451741272,8,3,67,0.8660254037844387,-0.49999999999999983,0.9141279881853337,0.40542572835999735,0.6899374555654988,1.1160431917250802,30.4 +2026-03-08 09:00:00+00:00,28300.0,14.125,14.5125,13.85,845.125,45.125,0.0,4.95,-14.796064542483661,15.273360339191735,9,3,67,0.7071067811865476,-0.7071067811865475,0.9141279881853337,0.40542572835999735,0.775294370204305,1.0900698269965423,28.3 +2026-03-08 10:00:00+00:00,32200.0,14.2125,14.5,13.95,879.125,43.75,0.0,5.0125,-25.382072916666665,14.805242817875946,10,3,67,0.49999999999999994,-0.8660254037844387,0.9141279881853337,0.40542572835999735,0.8044080242201033,1.0928844237379867,32.2 +2026-03-08 11:00:00+00:00,32200.0,14.4125,14.8125,14.125,805.125,42.75,0.0,4.5375,-34.025375000000004,16.211982745039638,11,3,67,0.258819045102521,-0.9659258262890682,0.9141279881853337,0.40542572835999735,0.775294370204305,1.0384765205864117,32.2 +2026-03-08 12:00:00+00:00,29200.0,14.45,14.775,14.149999999999999,670.0,43.875,0.0,4.7125,-43.124333333333325,16.74371097855351,12,3,67,1.2246467991473532e-16,-1.0,0.9141279881853337,0.40542572835999735,0.6899374555654988,0.9711025174750698,29.2 +2026-03-08 13:00:00+00:00,30400.0,14.1375,14.3875,13.8875,467.125,46.375,0.0,4.2625,-53.2403839869281,16.26474089506311,13,3,67,-0.2588190451025208,-0.9659258262890683,0.9141279881853337,0.40542572835999735,0.5541542129773482,0.84295127432171,30.4 +2026-03-08 14:00:00+00:00,26400.0,13.7125,14.0125,13.475,252.125,48.375,0.0,3.8,-61.66793181818181,16.78693459943976,14,3,67,-0.4999999999999998,-0.8660254037844388,0.9141279881853337,0.40542572835999735,0.37719804602981793,0.6684154455563358,26.4 +2026-03-08 15:00:00+00:00,4700.0,13.0375,13.125,12.95,29.625,50.625,0.0,3.05,-54.05694444444444,36.98375293729884,15,3,67,-0.7071067811865471,-0.7071067811865479,0.9141279881853337,0.40542572835999735,0.1711282250664892,0.17311580242528474,4.7 +2026-03-08 16:00:00+00:00,0.0,12.8125,12.925,12.7375,0.0,49.5,0.0,2.075,-49.474125,46.07540089963949,16,3,67,-0.8660254037844384,-0.5000000000000004,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 17:00:00+00:00,0.0,12.5625,12.6375,12.5,0.0,49.25,0.0,2.425,-49.4625,46.080288717990186,17,3,67,-0.9659258262890683,-0.25881904510252063,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 18:00:00+00:00,0.0,12.3625,12.4375,12.3125,0.0,50.125,0.0,2.525,-49.45125000000001,46.08279480547305,18,3,67,-1.0,-1.8369701987210297e-16,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 19:00:00+00:00,0.0,12.05,12.1375,11.9625,0.0,48.25,0.0,2.2125,-49.43875,46.08109018802253,19,3,67,-0.9659258262890684,0.2588190451025203,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 20:00:00+00:00,0.0,12.0,12.0875,11.8875,0.0,46.125,0.0,2.375,-49.4325,46.08854214082571,20,3,67,-0.8660254037844386,0.5000000000000001,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 21:00:00+00:00,0.0,11.425,11.5625,11.225,0.0,51.5,0.0,1.525,-49.4225,46.08684750012741,21,3,67,-0.7071067811865477,0.7071067811865474,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 22:00:00+00:00,0.0,,,,,,,,-49.41833333333334,46.08738153808521,22,3,67,-0.5000000000000004,0.8660254037844384,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-08 23:00:00+00:00,0.0,,,,,,,,-49.415000000000006,46.08683818799752,23,3,67,-0.25881904510252157,0.9659258262890681,0.9141279881853337,0.40542572835999735,0.0,0.0,0.0 +2026-03-09 00:00:00+00:00,0.0,,,,,,,,-49.403124999999996,46.08562539696263,0,3,68,0.0,1.0,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 01:00:00+00:00,0.0,,,,,,,,-49.394999999999996,46.08012826407206,1,3,68,0.25881904510252074,0.9659258262890683,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 02:00:00+00:00,0.0,,,,,,,,-49.395624999999995,46.08392160753213,2,3,68,0.49999999999999994,0.8660254037844387,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 03:00:00+00:00,0.0,,,,,,,,-45.713125,53.442750341486914,3,3,68,0.7071067811865475,0.7071067811865476,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 04:00:00+00:00,5600.0,,,,,,,,25.720272058823532,15.253477914054075,4,3,68,0.8660254037844386,0.5000000000000001,0.9209712877166346,0.38963044953078796,0.0,0.0,5.6 +2026-03-09 05:00:00+00:00,22700.0,,,,,,,,51.79144733626589,5.538226303562716,5,3,68,0.9659258262890683,0.25881904510252074,0.9209712877166346,0.38963044953078796,0.17477166538254124,,22.7 +2026-03-09 06:00:00+00:00,27500.0,,,,,,,,31.953580018939395,7.296784748617544,6,3,68,1.0,6.123233995736766e-17,0.9209712877166346,0.38963044953078796,0.3809750911023833,,27.5 +2026-03-09 07:00:00+00:00,29200.0,,,,,,,,12.612258356227105,10.723433795825281,7,3,68,0.9659258262890683,-0.25881904510252063,0.9209712877166346,0.38963044953078796,0.5580459870552965,,29.2 +2026-03-09 08:00:00+00:00,30300.0,,,,,,,,-3.0743333333333327,13.757985440855014,8,3,68,0.8660254037844387,-0.49999999999999983,0.9209712877166346,0.38963044953078796,0.6939172643055813,,30.3 +2026-03-09 09:00:00+00:00,31200.0,,,,,,,,-14.339906372549018,14.412073212987169,9,3,68,0.7071067811865476,-0.7071067811865475,0.9209712877166346,0.38963044953078796,0.7793295198465329,,31.2 +2026-03-09 10:00:00+00:00,31500.0,,,,,,,,-25.368450892857144,14.593864753547333,10,3,68,0.49999999999999994,-0.8660254037844387,0.9209712877166346,0.38963044953078796,0.8084620496134616,,31.5 +2026-03-09 11:00:00+00:00,30700.0,,,,,,,,-33.84608333333333,16.153113085682385,11,3,68,0.258819045102521,-0.9659258262890682,0.9209712877166346,0.38963044953078796,0.7793295198465329,,30.7 +2026-03-09 12:00:00+00:00,29700.0,,,,,,,,-42.825552083333335,16.943970580260682,12,3,68,1.2246467991473532e-16,-1.0,0.9209712877166346,0.38963044953078796,0.6939172643055813,,29.7 +2026-03-09 13:00:00+00:00,30000.0,,,,,,,,-52.83819669117647,16.88370489929753,13,3,68,-0.2588190451025208,-0.9659258262890683,0.9209712877166346,0.38963044953078796,0.5580459870552965,,30.0 +2026-03-09 14:00:00+00:00,18900.0,,,,,,,,-61.43363005050505,17.012929717937485,14,3,68,-0.4999999999999998,-0.8660254037844388,0.9209712877166346,0.38963044953078796,0.3809750911023833,,18.9 +2026-03-09 15:00:00+00:00,2700.0,,,,,,,,-53.805819444444445,37.335781803400636,15,3,68,-0.7071067811865471,-0.7071067811865479,0.9209712877166346,0.38963044953078796,0.17477166538254124,,2.7 +2026-03-09 16:00:00+00:00,0.0,,,,,,,,-49.36875,46.14312040181794,16,3,68,-0.8660254037844384,-0.5000000000000004,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 17:00:00+00:00,0.0,,,,,,,,-49.356874999999995,46.14181072948735,17,3,68,-0.9659258262890683,-0.25881904510252063,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 18:00:00+00:00,0.0,,,,,,,,-49.342499999999994,46.145539013357876,18,3,68,-1.0,-1.8369701987210297e-16,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 19:00:00+00:00,0.0,,,,,,,,-49.32000000000001,46.14379571874569,19,3,68,-0.9659258262890684,0.2588190451025203,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 20:00:00+00:00,0.0,,,,,,,,-49.323125,46.15419922097194,20,3,68,-0.8660254037844386,0.5000000000000001,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 21:00:00+00:00,0.0,,,,,,,,-49.315000000000005,46.15377390672764,21,3,68,-0.7071067811865477,0.7071067811865474,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 22:00:00+00:00,0.0,,,,,,,,-49.307500000000005,46.15709484106064,22,3,68,-0.5000000000000004,0.8660254037844384,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-09 23:00:00+00:00,0.0,,,,,,,,-49.293749999999996,46.15460172525234,23,3,68,-0.25881904510252157,0.9659258262890681,0.9209712877166346,0.38963044953078796,0.0,0.0,0.0 +2026-03-10 00:00:00+00:00,0.0,,,,,,,,-49.286249999999995,46.15125172101692,0,3,69,0.0,1.0,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 01:00:00+00:00,0.0,,,,,,,,-49.2775,46.15207637979755,1,3,69,0.25881904510252074,0.9659258262890683,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 02:00:00+00:00,0.0,,,,,,,,-49.26875,46.152865137677715,2,3,69,0.49999999999999994,0.8660254037844387,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 03:00:00+00:00,0.0,,,,,,,,-44.881875,54.94214246122157,3,3,69,0.7071067811865475,0.7071067811865476,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 04:00:00+00:00,5300.0,,,,,,,,29.930702275910363,12.247660835440893,4,3,69,0.8660254037844386,0.5000000000000001,0.9275416835791966,0.37371971479046906,0.0,0.0,5.3 +2026-03-10 05:00:00+00:00,22600.0,,,,,,,,51.49783121028837,5.53271499740254,5,3,69,0.9659258262890683,0.25881904510252074,0.9275416835791966,0.37371971479046906,0.17842114509431983,,22.6 +2026-03-10 06:00:00+00:00,27300.0,,,,,,,,31.986109374999998,7.505596519635191,6,3,69,1.0,6.123233995736766e-17,0.9275416835791966,0.37371971479046906,0.3847489505521226,,27.3 +2026-03-10 07:00:00+00:00,29000.0,,,,,,,,13.721454022988505,13.74487389657904,7,3,69,0.9659258262890683,-0.25881904510252063,0.9275416835791966,0.37371971479046906,0.5619266538073985,,29.0 +2026-03-10 08:00:00+00:00,30300.0,,,,,,,,-2.153612648221344,14.400064775296409,8,3,69,0.8660254037844387,-0.49999999999999983,0.9275416835791966,0.37371971479046906,0.6978798871832995,,30.3 +2026-03-10 09:00:00+00:00,31000.0,,,,,,,,-13.930132761437909,15.79266010917578,9,3,69,0.7071067811865476,-0.7071067811865475,0.9275416835791966,0.37371971479046906,0.7833436624985988,,31.0 +2026-03-10 10:00:00+00:00,27100.0,,,,,,,,-24.09980625,16.145607167797156,10,3,69,0.49999999999999994,-0.8660254037844387,0.9275416835791966,0.37371971479046906,0.8124937647011254,,27.1 +2026-03-10 11:00:00+00:00,32400.0,,,,,,,,-33.415619047619046,16.398682279896967,11,3,69,0.258819045102521,-0.9659258262890682,0.9275416835791966,0.37371971479046906,0.7833436624985988,,32.4 +2026-03-10 12:00:00+00:00,32200.0,,,,,,,,-41.831302083333334,17.543551033499956,12,3,69,1.2246467991473532e-16,-1.0,0.9275416835791966,0.37371971479046906,0.6978798871832995,,32.2 +2026-03-10 13:00:00+00:00,30600.0,,,,,,,,-52.136068014705884,16.891347697508092,13,3,69,-0.2588190451025208,-0.9659258262890683,0.9275416835791966,0.37371971479046906,0.5619266538073985,,30.6 +2026-03-10 14:00:00+00:00,24100.0,,,,,,,,-61.48818181818182,15.72766047866724,14,3,69,-0.4999999999999998,-0.8660254037844388,0.9275416835791966,0.37371971479046906,0.3847489505521226,,24.1 +2026-03-10 15:00:00+00:00,4400.0,,,,,,,,-56.42846590909091,32.00331131998754,15,3,69,-0.7071067811865471,-0.7071067811865479,0.9275416835791966,0.37371971479046906,0.17842114509431983,,4.4 +2026-03-10 16:00:00+00:00,0.0,,,,,,,,-49.496249999999996,45.83317746185617,16,3,69,-0.8660254037844384,-0.5000000000000004,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 17:00:00+00:00,0.0,,,,,,,,-49.48375,45.83319850737745,17,3,69,-0.9659258262890683,-0.25881904510252063,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 18:00:00+00:00,0.0,,,,,,,,-49.464375000000004,45.82857902803846,18,3,69,-1.0,-1.8369701987210297e-16,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 19:00:00+00:00,0.0,,,,,,,,-49.451875,45.83182793171684,19,3,69,-0.9659258262890684,0.2588190451025203,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 20:00:00+00:00,0.0,,,,,,,,-49.441874999999996,45.83352254695792,20,3,69,-0.8660254037844386,0.5000000000000001,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 21:00:00+00:00,0.0,,,,,,,,-49.436249999999994,45.83308855237665,21,3,69,-0.7071067811865477,0.7071067811865474,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 22:00:00+00:00,0.0,,,,,,,,-49.428125,45.83432444572335,22,3,69,-0.5000000000000004,0.8660254037844384,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-10 23:00:00+00:00,0.0,,,,,,,,-49.42375,45.84308565185521,23,3,69,-0.25881904510252157,0.9659258262890681,0.9275416835791966,0.37371971479046906,0.0,0.0,0.0 +2026-03-11 00:00:00+00:00,0.0,,,,,,,,-49.40812499999999,45.83600824201972,0,3,70,0.0,1.0,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 01:00:00+00:00,0.0,,,,,,,,-49.4,45.835521205356294,1,3,70,0.25881904510252074,0.9659258262890683,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 02:00:00+00:00,0.0,,,,,,,,-49.39333333333334,45.831131502667645,2,3,70,0.49999999999999994,0.8660254037844387,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 03:00:00+00:00,0.0,,,,,,,,-41.839999999999996,50.35924979657733,3,3,70,0.7071067811865475,0.7071067811865476,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 04:00:00+00:00,5300.0,,,,,,,,36.94789100877193,10.458701635996277,4,3,70,0.8660254037844386,0.5000000000000001,0.9338372288229252,0.35769823883312546,0.0,0.0,5.3 +2026-03-11 05:00:00+00:00,22800.0,,,,,,,,51.41995463709677,5.354753108099845,5,3,70,0.9659258262890683,0.25881904510252074,0.9338372288229252,0.35769823883312546,0.18207531553199435,,22.8 +2026-03-11 06:00:00+00:00,27600.0,,,,,,,,32.3524910648827,7.344913190071504,6,3,70,1.0,6.123233995736766e-17,0.9338372288229252,0.35769823883312546,0.38851812268728037,,27.6 +2026-03-11 07:00:00+00:00,29200.0,,,,,,,,14.309143187830689,14.32106644641899,7,3,70,0.9659258262890683,-0.25881904510252063,0.9338372288229252,0.35769823883312546,0.565794580138993,,29.2 +2026-03-11 08:00:00+00:00,30300.0,,,,,,,,-2.002705086580086,14.406883092088867,8,3,70,0.8660254037844387,-0.49999999999999983,0.9338372288229252,0.35769823883312546,0.7018235902749961,,30.3 +2026-03-11 09:00:00+00:00,30800.0,,,,,,,,-13.861696981424148,15.830269634264344,9,3,70,0.7071067811865476,-0.7071067811865475,0.9338372288229252,0.35769823883312546,0.7873350008530888,,30.8 +2026-03-11 10:00:00+00:00,32000.0,,,,,,,,-24.242281372549016,15.55671671207011,10,3,70,0.49999999999999994,-0.8660254037844387,0.9338372288229252,0.35769823883312546,0.8165013505566621,,32.0 +2026-03-11 11:00:00+00:00,29800.0,,,,,,,,-33.4956130952381,15.745613876404216,11,3,70,0.258819045102521,-0.9659258262890682,0.9338372288229252,0.35769823883312546,0.7873350008530888,,29.8 +2026-03-11 12:00:00+00:00,30900.0,,,,,,,,-41.91419047619048,17.641766510342503,12,3,70,1.2246467991473532e-16,-1.0,0.9338372288229252,0.35769823883312546,0.7018235902749961,,30.9 +2026-03-11 13:00:00+00:00,24100.0,,,,,,,,-51.74955882352941,17.36090836959667,13,3,70,-0.2588190451025208,-0.9659258262890683,0.9338372288229252,0.35769823883312546,0.565794580138993,,24.1 +2026-03-11 14:00:00+00:00,10300.0,,,,,,,,-61.43894355644356,15.856344714616284,14,3,70,-0.4999999999999998,-0.8660254037844388,0.9338372288229252,0.35769823883312546,0.38851812268728037,,10.3 +2026-03-11 15:00:00+00:00,3800.0,,,,,,,,-56.091625,32.73489061988497,15,3,70,-0.7071067811865471,-0.7071067811865479,0.9338372288229252,0.35769823883312546,0.18207531553199435,,3.8 +2026-03-11 16:00:00+00:00,0.0,,,,,,,,-49.381875,46.140202750918135,16,3,70,-0.8660254037844384,-0.5000000000000004,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 17:00:00+00:00,0.0,,,,,,,,-49.355,46.14056191862716,17,3,70,-0.9659258262890683,-0.25881904510252063,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 18:00:00+00:00,0.0,,,,,,,,-49.34250000000001,46.13888205732775,18,3,70,-1.0,-1.8369701987210297e-16,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 19:00:00+00:00,0.0,,,,,,,,-49.328125,46.13925066104239,19,3,70,-0.9659258262890684,0.2588190451025203,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 20:00:00+00:00,0.0,,,,,,,,-49.326249999999995,46.13630848276297,20,3,70,-0.8660254037844386,0.5000000000000001,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 21:00:00+00:00,0.0,,,,,,,,-49.321875,46.1417293679214,21,3,70,-0.7071067811865477,0.7071067811865474,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 22:00:00+00:00,0.0,,,,,,,,-49.309374999999996,46.14336889769935,22,3,70,-0.5000000000000004,0.8660254037844384,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-11 23:00:00+00:00,0.0,,,,,,,,-49.300000000000004,46.143737928347335,23,3,70,-0.25881904510252157,0.9659258262890681,0.9338372288229252,0.35769823883312546,0.0,0.0,0.0 +2026-03-12 00:00:00+00:00,0.0,,,,,,,,-49.29187499999999,46.15004073558151,0,3,71,0.0,1.0,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 01:00:00+00:00,0.0,,,,,,,,-49.28187499999999,46.14997988330186,1,3,71,0.25881904510252074,0.9659258262890683,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 02:00:00+00:00,0.0,,,,,,,,-49.273125,46.14909277615867,2,3,71,0.49999999999999994,0.8660254037844387,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 03:00:00+00:00,0.0,,,,,,,,-38.42835714285714,48.284380735811624,3,3,71,0.7071067811865475,0.7071067811865476,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 04:00:00+00:00,4900.0,,,,,,,,42.64591388888889,7.439384439640929,4,3,71,0.8660254037844386,0.5000000000000001,0.9398560579418954,0.3415707691678556,0.0,0.0,4.9 +2026-03-12 05:00:00+00:00,20800.0,,,,,,,,51.36711388074292,5.386973151699925,5,3,71,0.9659258262890683,0.25881904510252074,0.9398560579418954,0.3415707691678556,0.18573283049171663,,20.8 +2026-03-12 06:00:00+00:00,26600.0,,,,,,,,32.263197737068964,7.345870459857633,6,3,71,1.0,6.123233995736766e-17,0.9398560579418954,0.3415707691678556,0.3922811197408136,,26.6 +2026-03-12 07:00:00+00:00,28600.0,,,,,,,,13.94673962962963,13.598888768564006,7,3,71,0.9659258262890683,-0.25881904510252063,0.9398560579418954,0.3415707691678556,0.5696481567199656,,28.6 +2026-03-12 08:00:00+00:00,29600.0,,,,,,,,-1.8622888198757765,14.182438635411657,8,3,71,0.8660254037844387,-0.49999999999999983,0.9398560579418954,0.3415707691678556,0.7057466709719313,,29.6 +2026-03-12 09:00:00+00:00,30400.0,,,,,,,,-13.688192530959753,15.546732101136058,9,3,71,0.7071067811865476,-0.7071067811865475,0.9398560579418954,0.3415707691678556,0.7913017736638681,,30.4 +2026-03-12 10:00:00+00:00,31900.0,,,,,,,,-24.1255,15.32652910261594,10,3,71,0.49999999999999994,-0.8660254037844387,0.9398560579418954,0.3415707691678556,0.8204830259338128,,31.9 +2026-03-12 11:00:00+00:00,32300.0,,,,,,,,-33.45418452380952,15.584539720342283,11,3,71,0.258819045102521,-0.9659258262890682,0.9398560579418954,0.3415707691678556,0.7913017736638681,,32.3 +2026-03-12 12:00:00+00:00,31000.0,,,,,,,,-41.75136755952381,17.377439725272517,12,3,71,1.2246467991473532e-16,-1.0,0.9398560579418954,0.3415707691678556,0.7057466709719313,,31.0 +2026-03-12 13:00:00+00:00,28900.0,,,,,,,,-52.053045955882354,16.75479284957098,13,3,71,-0.2588190451025208,-0.9659258262890683,0.9398560579418954,0.3415707691678556,0.5696481567199656,,28.9 +2026-03-12 14:00:00+00:00,21700.0,,,,,,,,-61.73572177822178,15.29644449553776,14,3,71,-0.4999999999999998,-0.8660254037844388,0.9398560579418954,0.3415707691678556,0.3922811197408136,,21.7 +2026-03-12 15:00:00+00:00,4100.0,,,,,,,,-55.78395454545454,33.333835447781574,15,3,71,-0.7071067811865471,-0.7071067811865479,0.9398560579418954,0.3415707691678556,0.18573283049171663,,4.1 +2026-03-12 16:00:00+00:00,0.0,,,,,,,,-49.469375,45.95408838245516,16,3,71,-0.8660254037844384,-0.5000000000000004,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 17:00:00+00:00,0.0,,,,,,,,-49.45374999999999,45.95199063968828,17,3,71,-0.9659258262890683,-0.25881904510252063,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 18:00:00+00:00,0.0,,,,,,,,-49.432500000000005,45.95274252787676,18,3,71,-1.0,-1.8369701987210297e-16,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 19:00:00+00:00,0.0,,,,,,,,-49.412499999999994,45.95095582973945,19,3,71,-0.9659258262890684,0.2588190451025203,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 20:00:00+00:00,0.0,,,,,,,,-49.411249999999995,45.956842730435696,20,3,71,-0.8660254037844386,0.5000000000000001,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 21:00:00+00:00,0.0,,,,,,,,-49.403749999999995,45.96183169670968,21,3,71,-0.7071067811865477,0.7071067811865474,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 22:00:00+00:00,0.0,,,,,,,,-49.39000000000001,45.95934240354911,22,3,71,-0.5000000000000004,0.8660254037844384,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-12 23:00:00+00:00,0.0,,,,,,,,-49.379374999999996,45.96558651022705,23,3,71,-0.25881904510252157,0.9659258262890681,0.9398560579418954,0.3415707691678556,0.0,0.0,0.0 +2026-03-13 00:00:00+00:00,0.0,,,,,,,,-49.364375,45.963841376265535,0,3,72,0.0,1.0,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 01:00:00+00:00,0.0,,,,,,,,-49.365624999999994,45.96802993997568,1,3,72,0.25881904510252074,0.9659258262890683,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 02:00:00+00:00,0.0,,,,,,,,-49.355624999999996,45.96464770954413,2,3,72,0.49999999999999994,0.8660254037844387,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 03:00:00+00:00,0.0,,,,,,,,-33.450312499999995,47.17164288062577,3,3,72,0.7071067811865475,0.7071067811865476,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 04:00:00+00:00,3900.0,,,,,,,,44.630470022624436,8.551522421670342,4,3,72,0.8660254037844386,0.5000000000000001,0.9455963874271426,0.3253420847119801,0.0,0.0,3.9 +2026-03-13 05:00:00+00:00,17300.0,,,,,,,,51.10516369047619,5.268078567531638,5,3,72,0.9659258262890683,0.25881904510252074,0.9455963874271426,0.3253420847119801,0.18939234719618148,,17.3 +2026-03-13 06:00:00+00:00,26000.0,,,,,,,,32.33632291666667,7.2400682133486125,6,3,72,1.0,6.123233995736766e-17,0.9455963874271426,0.3253420847119801,0.396036469023904,,26.0 +2026-03-13 07:00:00+00:00,28200.0,,,,,,,,13.93817074159413,13.10698585514908,7,3,72,0.9659258262890683,-0.25881904510252063,0.9455963874271426,0.3253420847119801,0.5734857993039528,,28.2 +2026-03-13 08:00:00+00:00,29600.0,,,,,,,,-1.295820631123262,14.517217499890535,8,3,72,0.8660254037844387,-0.49999999999999983,0.9455963874271426,0.3253420847119801,0.7096474594266264,,29.6 +2026-03-13 09:00:00+00:00,30100.0,,,,,,,,-13.625369298245616,15.060409356459115,9,3,72,0.7071067811865476,-0.7071067811865475,0.9455963874271426,0.3253420847119801,0.7952422572723472,,30.1 +2026-03-13 10:00:00+00:00,27400.0,,,,,,,,-24.030047619047618,15.204920906610006,10,3,72,0.49999999999999994,-0.8660254037844387,0.9455963874271426,0.3253420847119801,0.8244370488200207,,27.4 +2026-03-13 11:00:00+00:00,24900.0,,,,,,,,-33.02365208333334,16.001176342200093,11,3,72,0.258819045102521,-0.9659258262890682,0.9455963874271426,0.3253420847119801,0.7952422572723472,,24.9 +2026-03-13 12:00:00+00:00,26000.0,,,,,,,,-41.57416666666667,17.220123941352906,12,3,72,1.2246467991473532e-16,-1.0,0.9455963874271426,0.3253420847119801,0.7096474594266264,,26.0 +2026-03-13 13:00:00+00:00,10100.0,,,,,,,,-51.7648545751634,16.535852093229252,13,3,72,-0.2588190451025208,-0.9659258262890683,0.9455963874271426,0.3253420847119801,0.5734857993039528,,10.1 +2026-03-13 14:00:00+00:00,4100.0,,,,,,,,-61.46068431568432,15.096815622436706,14,3,72,-0.4999999999999998,-0.8660254037844388,0.9455963874271426,0.3253420847119801,0.396036469023904,,4.1 +2026-03-13 15:00:00+00:00,500.0,,,,,,,,-55.69650000000001,33.089873473617274,15,3,72,-0.7071067811865471,-0.7071067811865479,0.9455963874271426,0.3253420847119801,0.18939234719618148,,0.5 +2026-03-13 16:00:00+00:00,0.0,,,,,,,,-49.32,45.86464083765037,16,3,72,-0.8660254037844384,-0.5000000000000004,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 17:00:00+00:00,0.0,,,,,,,,-49.318749999999994,45.877241294022895,17,3,72,-0.9659258262890683,-0.25881904510252063,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 18:00:00+00:00,0.0,,,,,,,,-49.31625,45.87891411549174,18,3,72,-1.0,-1.8369701987210297e-16,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 19:00:00+00:00,0.0,,,,,,,,-49.311875,45.87933882183969,19,3,72,-0.9659258262890684,0.2588190451025203,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 20:00:00+00:00,0.0,,,,,,,,-49.30875,45.8789138884448,20,3,72,-0.8660254037844386,0.5000000000000001,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 21:00:00+00:00,0.0,,,,,,,,-49.27312500000001,45.93853340674362,21,3,72,-0.7071067811865477,0.7071067811865474,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 22:00:00+00:00,0.0,,,,,,,,-49.173750000000005,46.293358707450324,22,3,72,-0.5000000000000004,0.8660254037844384,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-13 23:00:00+00:00,0.0,,,,,,,,-49.17125,46.268608621288806,23,3,72,-0.25881904510252157,0.9659258262890681,0.9455963874271426,0.3253420847119801,0.0,0.0,0.0 +2026-03-14 00:00:00+00:00,0.0,,,,,,,,-49.209999999999994,46.25821746817893,0,3,73,0.0,1.0,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 01:00:00+00:00,0.0,,,,,,,,-49.1875,46.26656973452862,1,3,73,0.25881904510252074,0.9659258262890683,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 02:00:00+00:00,0.0,,,,,,,,-49.200625,46.26370649939864,2,3,73,0.49999999999999994,0.8660254037844387,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 03:00:00+00:00,0.0,,,,,,,,-36.347,47.75549583730302,3,3,73,0.7071067811865475,0.7071067811865476,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 04:00:00+00:00,700.0,,,,,,,,41.69806666666666,13.378011612592758,4,3,73,0.8660254037844386,0.5000000000000001,0.9510565162951535,0.30901699437494745,0.0,0.0,0.7 +2026-03-14 05:00:00+00:00,3000.0,,,,,,,,51.25437752016129,5.436753728453776,5,3,73,0.9659258262890683,0.25881904510252074,0.9510565162951535,0.30901699437494745,0.19305252725528238,,3.0 +2026-03-14 06:00:00+00:00,8200.0,,,,,,,,32.19315257352941,7.341117130452061,6,3,73,1.0,6.123233995736766e-17,0.9510565162951535,0.30901699437494745,0.39978271406399696,,8.2 +2026-03-14 07:00:00+00:00,6500.0,,,,,,,,15.034889583333335,15.4960882169193,7,3,73,0.9659258262890683,-0.25881904510252063,0.9510565162951535,0.30901699437494745,0.5773059500187029,,6.5 +2026-03-14 08:00:00+00:00,6000.0,,,,,,,,-0.3958345864661661,17.360938653406045,8,3,73,0.8660254037844387,-0.49999999999999983,0.9510565162951535,0.30901699437494745,0.7135243199601058,,6.0 +2026-03-14 09:00:00+00:00,7800.0,,,,,,,,-12.236571691176469,18.7732879419259,9,3,73,0.7071067811865476,-0.7071067811865475,0.9510565162951535,0.30901699437494745,0.7991547670881988,,7.8 +2026-03-14 10:00:00+00:00,4000.0,,,,,,,,-22.27646726190476,18.511919722898497,10,3,73,0.49999999999999994,-0.8660254037844387,0.9510565162951535,0.30901699437494745,0.8283617179422071,,4.0 +2026-03-14 11:00:00+00:00,8500.0,,,,,,,,-31.387785714285716,18.610025850383106,11,3,73,0.258819045102521,-0.9659258262890682,0.9510565162951535,0.30901699437494745,0.7991547670881988,,8.5 +2026-03-14 12:00:00+00:00,6900.0,,,,,,,,-39.87943443627451,20.152202735187608,12,3,73,1.2246467991473532e-16,-1.0,0.9510565162951535,0.30901699437494745,0.7135243199601058,,6.9 +2026-03-14 13:00:00+00:00,7200.0,,,,,,,,-50.05750306372549,19.65393062494813,13,3,73,-0.2588190451025208,-0.9659258262890683,0.9510565162951535,0.30901699437494745,0.5773059500187029,,7.2 +2026-03-14 14:00:00+00:00,4700.0,,,,,,,,-59.789255952380955,19.18963113917283,14,3,73,-0.4999999999999998,-0.8660254037844388,0.9510565162951535,0.30901699437494745,0.39978271406399696,,4.7 +2026-03-14 15:00:00+00:00,800.0,,,,,,,,-53.81723333333333,36.97664094932848,15,3,73,-0.7071067811865471,-0.7071067811865479,0.9510565162951535,0.30901699437494745,0.19305252725528238,,0.8 +2026-03-14 16:00:00+00:00,0.0,,,,,,,,-47.42708333333333,49.80056292213082,16,3,73,-0.8660254037844384,-0.5000000000000004,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 17:00:00+00:00,0.0,,,,,,,,-47.41437500000001,49.79365000408352,17,3,73,-0.9659258262890683,-0.25881904510252063,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 18:00:00+00:00,0.0,,,,,,,,-47.4025,49.79895978665953,18,3,73,-1.0,-1.8369701987210297e-16,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 19:00:00+00:00,0.0,,,,,,,,-47.39625,49.82977910262764,19,3,73,-0.9659258262890684,0.2588190451025203,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 20:00:00+00:00,0.0,,,,,,,,-47.396875,49.830294725155234,20,3,73,-0.8660254037844386,0.5000000000000001,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 21:00:00+00:00,0.0,,,,,,,,-47.389375,49.83858806081723,21,3,73,-0.7071067811865477,0.7071067811865474,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 22:00:00+00:00,0.0,,,,,,,,-47.380624999999995,49.834411235903715,22,3,73,-0.5000000000000004,0.8660254037844384,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-14 23:00:00+00:00,0.0,,,,,,,,-47.373125,49.837708965158434,23,3,73,-0.25881904510252157,0.9659258262890681,0.9510565162951535,0.30901699437494745,0.0,0.0,0.0 +2026-03-15 00:00:00+00:00,0.0,,,,,,,,-47.362500000000004,49.847369121482565,0,3,74,0.0,1.0,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 01:00:00+00:00,0.0,,,,,,,,-47.353750000000005,49.85483621224725,1,3,74,0.25881904510252074,0.9659258262890683,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 02:00:00+00:00,0.0,,,,,,,,-47.330625,49.86098012536958,2,3,74,0.49999999999999994,0.8660254037844387,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 03:00:00+00:00,0.0,,,,,,,,-24.059424999999997,40.74887056940965,3,3,74,0.7071067811865475,0.7071067811865476,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 04:00:00+00:00,6400.0,,,,,,,,50.80458839285714,9.47203327560193,4,3,74,0.8660254037844386,0.5000000000000001,0.9562348265919056,0.29260033563334836,0.0,0.0,6.4 +2026-03-15 05:00:00+00:00,17800.0,,,,,,,,51.18266484819734,5.194624413048358,5,3,74,0.9659258262890683,0.25881904510252074,0.9562348265919056,0.29260033563334836,0.19671203762514194,,17.8 +2026-03-15 06:00:00+00:00,21800.0,,,,,,,,32.587563004032255,7.2927514740608705,6,3,74,1.0,6.123233995736766e-17,0.9562348265919056,0.29260033563334836,0.40351841572532166,,21.8 +2026-03-15 07:00:00+00:00,27400.0,,,,,,,,16.327023148148147,16.555468356937048,7,3,74,0.9659258262890683,-0.25881904510252063,0.9562348265919056,0.29260033563334836,0.5811070786252709,,27.4 +2026-03-15 08:00:00+00:00,23600.0,,,,,,,,1.7496728778467903,19.802221976947827,8,3,74,0.8660254037844387,-0.49999999999999983,0.9562348265919056,0.29260033563334836,0.7173756524274999,,23.6 +2026-03-15 09:00:00+00:00,27600.0,,,,,,,,-9.849756944444445,21.15689796395891,9,3,74,0.7071067811865476,-0.7071067811865475,0.9562348265919056,0.29260033563334836,0.8030376590218524,,27.6 +2026-03-15 10:00:00+00:00,22300.0,,,,,,,,-20.318839583333336,20.979710028518312,10,3,74,0.49999999999999994,-0.8660254037844387,0.9562348265919056,0.29260033563334836,0.8322553742220827,,22.3 +2026-03-15 11:00:00+00:00,24100.0,,,,,,,,-29.551302884615385,20.96988317148979,11,3,74,0.258819045102521,-0.9659258262890682,0.9562348265919056,0.29260033563334836,0.8030376590218524,,24.1 +2026-03-15 12:00:00+00:00,24200.0,,,,,,,,-37.99516666666666,22.811558112468305,12,3,74,1.2246467991473532e-16,-1.0,0.9562348265919056,0.29260033563334836,0.7173756524274999,,24.2 +2026-03-15 13:00:00+00:00,23600.0,,,,,,,,-48.09839767156863,22.77365258380788,13,3,74,-0.2588190451025208,-0.9659258262890683,0.9562348265919056,0.29260033563334836,0.5811070786252709,,23.6 +2026-03-15 14:00:00+00:00,19300.0,,,,,,,,-58.12150183150183,21.77240736221347,14,3,74,-0.4999999999999998,-0.8660254037844388,0.9562348265919056,0.29260033563334836,0.40351841572532166,,19.3 +2026-03-15 15:00:00+00:00,3300.0,,,,,,,,-53.16415909090908,38.711599660606346,15,3,74,-0.7071067811865471,-0.7071067811865479,0.9562348265919056,0.29260033563334836,0.19671203762514194,,3.3 +2026-03-15 16:00:00+00:00,0.0,,,,,,,,-46.30270833333334,52.41252188335924,16,3,74,-0.8660254037844384,-0.5000000000000004,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 17:00:00+00:00,0.0,,,,,,,,-46.285,52.41231013957186,17,3,74,-0.9659258262890683,-0.25881904510252063,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 18:00:00+00:00,0.0,,,,,,,,-46.27125,52.414818853227644,18,3,74,-1.0,-1.8369701987210297e-16,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 19:00:00+00:00,0.0,,,,,,,,-46.25500000000001,52.41395941604362,19,3,74,-0.9659258262890684,0.2588190451025203,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 20:00:00+00:00,0.0,,,,,,,,-46.24437499999999,52.415181339911754,20,3,74,-0.8660254037844386,0.5000000000000001,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 21:00:00+00:00,0.0,,,,,,,,-46.241249999999994,52.41807594157445,21,3,74,-0.7071067811865477,0.7071067811865474,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 22:00:00+00:00,0.0,,,,,,,,-46.228125,52.407603828666886,22,3,74,-0.5000000000000004,0.8660254037844384,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-15 23:00:00+00:00,0.0,,,,,,,,-46.235625000000006,52.41597225460798,23,3,74,-0.25881904510252157,0.9659258262890681,0.9562348265919056,0.29260033563334836,0.0,0.0,0.0 +2026-03-16 00:00:00+00:00,0.0,,,,,,,,-46.249375,52.42520832795199,0,3,75,0.0,1.0,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 01:00:00+00:00,0.0,,,,,,,,-46.2375,52.42223458768871,1,3,75,0.25881904510252074,0.9659258262890683,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 02:00:00+00:00,0.0,,,,,,,,-46.224375,52.426792584795486,2,3,75,0.49999999999999994,0.8660254037844387,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 03:00:00+00:00,0.0,,,,,,,,-23.822541666666666,42.01252355771432,3,3,75,0.7071067811865475,0.7071067811865476,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 04:00:00+00:00,7100.0,,,,,,,,54.13949818563789,9.648696461494074,4,3,75,0.8660254037844386,0.5000000000000001,0.9611297838723007,0.27609697309746883,0.0,0.0,7.1 +2026-03-16 05:00:00+00:00,24000.0,,,,,,,,51.28538362068966,5.135986479595134,5,3,75,0.9659258262890683,0.25881904510252074,0.9611297838723007,0.27609697309746883,0.20036955156378522,,24.0 +2026-03-16 06:00:00+00:00,27900.0,,,,,,,,32.7223463570634,7.253096622184145,6,3,75,1.0,6.123233995736766e-17,0.9611297838723007,0.27609697309746883,0.4072421533098664,,27.9 +2026-03-16 07:00:00+00:00,29300.0,,,,,,,,16.47545334757835,16.748948001177624,7,3,75,0.9659258262890683,-0.25881904510252063,0.9611297838723007,0.27609697309746883,0.5848876837437672,,29.3 +2026-03-16 08:00:00+00:00,29200.0,,,,,,,,2.4458665066817247,20.545326276818315,8,3,75,0.8660254037844387,-0.49999999999999983,0.9611297838723007,0.27609697309746883,0.7211998935395371,,29.2 +2026-03-16 09:00:00+00:00,28900.0,,,,,,,,-9.8721977124183,21.00504359422382,9,3,75,0.7071067811865476,-0.7071067811865475,0.9611297838723007,0.27609697309746883,0.8068893308661718,,28.9 +2026-03-16 10:00:00+00:00,29500.0,,,,,,,,-20.271885416666667,20.74931641102279,10,3,75,0.49999999999999994,-0.8660254037844387,0.9611297838723007,0.27609697309746883,0.836116402178352,,29.5 +2026-03-16 11:00:00+00:00,30500.0,,,,,,,,-29.59803869047619,20.896954560209853,11,3,75,0.258819045102521,-0.9659258262890682,0.9611297838723007,0.27609697309746883,0.8068893308661718,,30.5 +2026-03-16 12:00:00+00:00,28600.0,,,,,,,,-37.83220336538462,22.638198468447975,12,3,75,1.2246467991473532e-16,-1.0,0.9611297838723007,0.27609697309746883,0.7211998935395371,,28.6 +2026-03-16 13:00:00+00:00,27200.0,,,,,,,,-48.3226875,22.108220508373687,13,3,75,-0.2588190451025208,-0.9659258262890683,0.9611297838723007,0.27609697309746883,0.5848876837437672,,27.2 +2026-03-16 14:00:00+00:00,22100.0,,,,,,,,-58.08674450549451,21.51228509362107,14,3,75,-0.4999999999999998,-0.8660254037844388,0.9611297838723007,0.27609697309746883,0.4072421533098664,,22.1 +2026-03-16 15:00:00+00:00,4400.0,,,,,,,,-52.96857954545454,38.989481566549976,15,3,75,-0.7071067811865471,-0.7071067811865479,0.9611297838723007,0.27609697309746883,0.20036955156378522,,4.4 +2026-03-16 16:00:00+00:00,0.0,,,,,,,,-46.40749999999999,52.16916550191949,16,3,75,-0.8660254037844384,-0.5000000000000004,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 17:00:00+00:00,0.0,,,,,,,,-46.395,52.17244391598563,17,3,75,-0.9659258262890683,-0.25881904510252063,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 18:00:00+00:00,0.0,,,,,,,,-46.375,52.170772988011855,18,3,75,-1.0,-1.8369701987210297e-16,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 19:00:00+00:00,0.0,,,,,,,,-46.364374999999995,52.17032447406443,19,3,75,-0.9659258262890684,0.2588190451025203,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 20:00:00+00:00,0.0,,,,,,,,-46.351875,52.17695158364946,20,3,75,-0.8660254037844386,0.5000000000000001,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 21:00:00+00:00,0.0,,,,,,,,-46.33625000000001,52.17817090268689,21,3,75,-0.7071067811865477,0.7071067811865474,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 22:00:00+00:00,0.0,,,,,,,,-46.319375,52.176899716852674,22,3,75,-0.5000000000000004,0.8660254037844384,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-16 23:00:00+00:00,0.0,,,,,,,,-46.323125,52.18104869805863,23,3,75,-0.25881904510252157,0.9659258262890681,0.9611297838723007,0.27609697309746883,0.0,0.0,0.0 +2026-03-17 00:00:00+00:00,0.0,,,,,,,,-46.310833333333335,52.181749851768984,0,3,76,0.0,1.0,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 01:00:00+00:00,0.0,,,,,,,,-46.29812499999999,52.1777259060719,1,3,76,0.25881904510252074,0.9659258262890683,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 02:00:00+00:00,0.0,,,,,,,,-46.3,52.182280796901416,2,3,76,0.49999999999999994,0.8660254037844387,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 03:00:00+00:00,0.0,,,,,,,,-18.64657692307692,38.48314032903014,3,3,76,0.7071067811865475,0.7071067811865476,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 04:00:00+00:00,7600.0,,,,,,,,56.91364285714286,10.666404054909279,4,3,76,0.8660254037844386,0.5000000000000001,0.9657399376548549,0.2595117970697999,0.0,0.0,7.6 +2026-03-17 05:00:00+00:00,24400.0,,,,,,,,50.861879849137935,4.878148105354494,5,3,76,0.9659258262890683,0.25881904510252074,0.9657399376548549,0.2595117970697999,0.20402374958171357,,24.4 +2026-03-17 06:00:00+00:00,28000.0,,,,,,,,32.72874849778621,7.210741953819423,6,3,76,1.0,6.123233995736766e-17,0.9657399376548549,0.2595117970697999,0.41095252563679874,,28.0 +2026-03-17 07:00:00+00:00,29400.0,,,,,,,,16.593240384615385,16.562668024592973,7,3,76,0.9659258262890683,-0.25881904510252063,0.9657399376548549,0.2595117970697999,0.5886462940434206,,29.4 +2026-03-17 08:00:00+00:00,29200.0,,,,,,,,1.8109288043478253,18.87387856258643,8,3,76,0.8660254037844387,-0.49999999999999983,0.9657399376548549,0.2595117970697999,0.7249955181375047,,29.2 +2026-03-17 09:00:00+00:00,29100.0,,,,,,,,-9.918133578431371,20.500551135094263,9,3,76,0.7071067811865476,-0.7071067811865475,0.9657399376548549,0.2595117970697999,0.8107082236247859,,29.1 +2026-03-17 10:00:00+00:00,29500.0,,,,,,,,-20.153716666666668,20.48859490714918,10,3,76,0.49999999999999994,-0.8660254037844387,0.9657399376548549,0.2595117970697999,0.839943231273249,,29.5 +2026-03-17 11:00:00+00:00,30300.0,,,,,,,,-29.463220238095236,20.628567508384762,11,3,76,0.258819045102521,-0.9659258262890682,0.9657399376548549,0.2595117970697999,0.8107082236247859,,30.3 +2026-03-17 12:00:00+00:00,28400.0,,,,,,,,-37.91391339285715,22.547703191665864,12,3,76,1.2246467991473532e-16,-1.0,0.9657399376548549,0.2595117970697999,0.7249955181375047,,28.4 +2026-03-17 13:00:00+00:00,26900.0,,,,,,,,-48.042862132352944,21.84083790266011,13,3,76,-0.2588190451025208,-0.9659258262890683,0.9657399376548549,0.2595117970697999,0.5886462940434206,,26.9 +2026-03-17 14:00:00+00:00,22400.0,,,,,,,,-58.10755952380952,20.905584109346186,14,3,76,-0.4999999999999998,-0.8660254037844388,0.9657399376548549,0.2595117970697999,0.41095252563679874,,22.4 +2026-03-17 15:00:00+00:00,4400.0,,,,,,,,-52.48231818181818,39.800512794345224,15,3,76,-0.7071067811865471,-0.7071067811865479,0.9657399376548549,0.2595117970697999,0.20402374958171357,,4.4 +2026-03-17 16:00:00+00:00,0.0,,,,,,,,-46.310625,52.281660877046555,16,3,76,-0.8660254037844384,-0.5000000000000004,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 17:00:00+00:00,0.0,,,,,,,,-46.295,52.277875259680044,17,3,76,-0.9659258262890683,-0.25881904510252063,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 18:00:00+00:00,0.0,,,,,,,,-46.276250000000005,52.28036137419735,18,3,76,-1.0,-1.8369701987210297e-16,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 19:00:00+00:00,0.0,,,,,,,,-46.255,52.281137890893945,19,3,76,-0.9659258262890684,0.2588190451025203,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 20:00:00+00:00,0.0,,,,,,,,-46.243750000000006,52.28196237311042,20,3,76,-0.8660254037844386,0.5000000000000001,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 21:00:00+00:00,0.0,,,,,,,,-46.23625,52.28529989793179,21,3,76,-0.7071067811865477,0.7071067811865474,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 22:00:00+00:00,0.0,,,,,,,,-46.20812500000001,52.27815223936765,22,3,76,-0.5000000000000004,0.8660254037844384,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-17 23:00:00+00:00,0.0,,,,,,,,-46.218125,52.27646890870212,23,3,76,-0.25881904510252157,0.9659258262890681,0.9657399376548549,0.2595117970697999,0.0,0.0,0.0 +2026-03-18 00:00:00+00:00,0.0,,,,,,,,-46.26,52.27727131647459,0,3,77,0.0,1.0,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 01:00:00+00:00,0.0,,,,,,,,-46.2595,52.28047315202876,1,3,77,0.25881904510252074,0.9659258262890683,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 02:00:00+00:00,0.0,,,,,,,,-46.29666666666667,52.28622791548106,2,3,77,0.49999999999999994,0.8660254037844387,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 03:00:00+00:00,0.0,,,,,,,,-23.633410714285713,46.25309495621332,3,3,77,0.7071067811865475,0.7071067811865476,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 04:00:00+00:00,5900.0,,,,,,,,48.53071017871018,19.322204589703418,4,3,77,0.8660254037844386,0.5000000000000001,0.970063921851507,0.2428497220959356,0.0,0.0,5.9 +2026-03-18 05:00:00+00:00,21500.0,,,,,,,,50.682759576612895,4.921406393960988,5,3,77,0.9659258262890683,0.25881904510252074,0.970063921851507,0.2428497220959356,0.20767332038563407,,21.5 +2026-03-18 06:00:00+00:00,27000.0,,,,,,,,32.49844758064516,7.1967116723037075,6,3,77,1.0,6.123233995736766e-17,0.970063921851507,0.2428497220959356,0.41464815209834816,,27.0 +2026-03-18 07:00:00+00:00,25900.0,,,,,,,,16.917585826210825,17.191901651263656,7,3,77,0.9659258262890683,-0.25881904510252063,0.970063921851507,0.2428497220959356,0.5923814693947694,,25.9 +2026-03-18 08:00:00+00:00,26600.0,,,,,,,,3.2648468899521523,21.409904559576027,8,3,77,0.8660254037844387,-0.49999999999999983,0.970063921851507,0.2428497220959356,0.7287610404193412,,26.6 +2026-03-18 09:00:00+00:00,15700.0,,,,,,,,-8.442527573529413,22.62373823140239,9,3,77,0.7071067811865476,-0.7071067811865475,0.970063921851507,0.2428497220959356,0.8144928227846363,,15.7 +2026-03-18 10:00:00+00:00,21100.0,,,,,,,,-18.74513942307692,22.846784065356708,10,3,77,0.49999999999999994,-0.8660254037844387,0.970063921851507,0.2428497220959356,0.8437343372009289,,21.1 +2026-03-18 11:00:00+00:00,13000.0,,,,,,,,-27.517992857142858,23.590081743366373,11,3,77,0.258819045102521,-0.9659258262890682,0.970063921851507,0.2428497220959356,0.8144928227846363,,13.0 +2026-03-18 12:00:00+00:00,19700.0,,,,,,,,-36.46150446428572,24.468068602601516,12,3,77,1.2246467991473532e-16,-1.0,0.970063921851507,0.2428497220959356,0.7287610404193412,,19.7 +2026-03-18 13:00:00+00:00,12100.0,,,,,,,,-46.6281748366013,24.446037362067532,13,3,77,-0.2588190451025208,-0.9659258262890683,0.970063921851507,0.2428497220959356,0.5923814693947694,,12.1 +2026-03-18 14:00:00+00:00,1800.0,,,,,,,,-56.565925366300355,23.869546489654812,14,3,77,-0.4999999999999998,-0.8660254037844388,0.970063921851507,0.2428497220959356,0.41464815209834816,,1.8 +2026-03-18 15:00:00+00:00,0.0,,,,,,,,-53.30753124999999,38.12046839466832,15,3,77,-0.7071067811865471,-0.7071067811865479,0.970063921851507,0.2428497220959356,0.20767332038563407,,0.0 +2026-03-18 16:00:00+00:00,0.0,,,,,,,,-53.30753124999999,38.12046839466832,16,3,77,-0.8660254037844384,-0.5000000000000004,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 17:00:00+00:00,0.0,,,,,,,,-53.30753124999999,38.12046839466832,17,3,77,-0.9659258262890683,-0.25881904510252063,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 18:00:00+00:00,0.0,,,,,,,,,,18,3,77,-1.0,-1.8369701987210297e-16,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 19:00:00+00:00,0.0,,,,,,,,,,19,3,77,-0.9659258262890684,0.2588190451025203,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 20:00:00+00:00,0.0,,,,,,,,,,20,3,77,-0.8660254037844386,0.5000000000000001,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 21:00:00+00:00,0.0,,,,,,,,,,21,3,77,-0.7071067811865477,0.7071067811865474,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 22:00:00+00:00,0.0,,,,,,,,,,22,3,77,-0.5000000000000004,0.8660254037844384,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-18 23:00:00+00:00,0.0,,,,,,,,,,23,3,77,-0.25881904510252157,0.9659258262890681,0.970063921851507,0.2428497220959356,0.0,0.0,0.0 +2026-03-19 00:00:00+00:00,0.0,,,,,,,,,,0,3,78,0.0,1.0,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 01:00:00+00:00,0.0,,,,,,,,,,1,3,78,0.25881904510252074,0.9659258262890683,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 02:00:00+00:00,0.0,,,,,,,,,,2,3,78,0.49999999999999994,0.8660254037844387,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 03:00:00+00:00,0.0,,,,,,,,,,3,3,78,0.7071067811865475,0.7071067811865476,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 04:00:00+00:00,5100.0,,,,,,,,,,4,3,78,0.8660254037844386,0.5000000000000001,0.9741004551724205,0.22611568550828828,0.0,0.0,5.1 +2026-03-19 05:00:00+00:00,19900.0,,,,,,,,,,5,3,78,0.9659258262890683,0.25881904510252074,0.9741004551724205,0.22611568550828828,0.21131696181359955,,19.9 +2026-03-19 06:00:00+00:00,27300.0,,,,,,,,,,6,3,78,1.0,6.123233995736766e-17,0.9741004551724205,0.22611568550828828,0.41832767369020013,,27.3 +2026-03-19 07:00:00+00:00,28800.0,,,,,,,,,,7,3,78,0.9659258262890683,-0.25881904510252063,0.9741004551724205,0.22611568550828828,0.5960918019818516,,28.8 +2026-03-19 08:00:00+00:00,28800.0,,,,,,,,,,8,3,78,0.8660254037844387,-0.49999999999999983,0.9741004551724205,0.22611568550828828,0.7324950151145901,,28.8 +2026-03-19 09:00:00+00:00,28400.0,,,,,,,,,,9,3,78,0.7071067811865476,-0.7071067811865475,0.9741004551724205,0.22611568550828828,0.8182416595303871,,28.4 +2026-03-19 10:00:00+00:00,28300.0,,,,,,,,,,10,3,78,0.49999999999999994,-0.8660254037844387,0.9741004551724205,0.22611568550828828,0.847488243115336,,28.3 +2026-03-19 11:00:00+00:00,25200.0,,,,,,,,,,11,3,78,0.258819045102521,-0.9659258262890682,0.9741004551724205,0.22611568550828828,0.8182416595303871,,25.2 +2026-03-19 12:00:00+00:00,13900.0,,,,,,,,,,12,3,78,1.2246467991473532e-16,-1.0,0.9741004551724205,0.22611568550828828,0.7324950151145901,,13.9 +2026-03-19 13:00:00+00:00,14700.0,,,,,,,,,,13,3,78,-0.2588190451025208,-0.9659258262890683,0.9741004551724205,0.22611568550828828,0.5960918019818516,,14.7 +2026-03-19 14:00:00+00:00,7500.0,,,,,,,,,,14,3,78,-0.4999999999999998,-0.8660254037844388,0.9741004551724205,0.22611568550828828,0.41832767369020013,,7.5 +2026-03-19 15:00:00+00:00,100.0,,,,,,,,,,15,3,78,-0.7071067811865471,-0.7071067811865479,0.9741004551724205,0.22611568550828828,0.21131696181359955,,0.1 +2026-03-19 16:00:00+00:00,0.0,,,,,,,,,,16,3,78,-0.8660254037844384,-0.5000000000000004,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 17:00:00+00:00,0.0,,,,,,,,,,17,3,78,-0.9659258262890683,-0.25881904510252063,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 18:00:00+00:00,0.0,,,,,,,,,,18,3,78,-1.0,-1.8369701987210297e-16,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 19:00:00+00:00,0.0,,,,,,,,,,19,3,78,-0.9659258262890684,0.2588190451025203,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 20:00:00+00:00,0.0,,,,,,,,,,20,3,78,-0.8660254037844386,0.5000000000000001,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 21:00:00+00:00,0.0,,,,,,,,,,21,3,78,-0.7071067811865477,0.7071067811865474,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 22:00:00+00:00,0.0,,,,,,,,,,22,3,78,-0.5000000000000004,0.8660254037844384,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-19 23:00:00+00:00,0.0,,,,,,,,,,23,3,78,-0.25881904510252157,0.9659258262890681,0.9741004551724205,0.22611568550828828,0.0,0.0,0.0 +2026-03-20 00:00:00+00:00,0.0,,,,,,,,,,0,3,79,0.0,1.0,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 01:00:00+00:00,0.0,,,,,,,,,,1,3,79,0.25881904510252074,0.9659258262890683,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 02:00:00+00:00,0.0,,,,,,,,,,2,3,79,0.49999999999999994,0.8660254037844387,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 03:00:00+00:00,0.0,,,,,,,,,,3,3,79,0.7071067811865475,0.7071067811865476,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 04:00:00+00:00,7200.0,,,,,,,,,,4,3,79,0.8660254037844386,0.5000000000000001,0.9778483415056568,0.20931464596304847,0.0,0.0,7.2 +2026-03-20 05:00:00+00:00,22500.0,,,,,,,,,,5,3,79,0.9659258262890683,0.25881904510252074,0.9778483415056568,0.20931464596304847,0.21495338175982073,,22.5 +2026-03-20 06:00:00+00:00,28400.0,,,,,,,,,,6,3,79,1.0,6.123233995736766e-17,0.9778483415056568,0.20931464596304847,0.42198975401448496,,28.4 +2026-03-20 07:00:00+00:00,29700.0,,,,,,,,,,7,3,79,0.9659258262890683,-0.25881904510252063,0.9778483415056568,0.20931464596304847,0.5997759173723258,,29.7 +2026-03-20 08:00:00+00:00,29200.0,,,,,,,,,,8,3,79,0.8660254037844387,-0.49999999999999983,0.9778483415056568,0.20931464596304847,0.7361960386060333,,29.2 +2026-03-20 09:00:00+00:00,26900.0,,,,,,,,,,9,3,79,0.7071067811865476,-0.7071067811865475,0.9778483415056568,0.20931464596304847,0.82195331189844,,26.9 +2026-03-20 10:00:00+00:00,23500.0,,,,,,,,,,10,3,79,0.49999999999999994,-0.8660254037844387,0.9778483415056568,0.20931464596304847,0.8512035207952631,,23.5 +2026-03-20 11:00:00+00:00,23200.0,,,,,,,,,,11,3,79,0.258819045102521,-0.9659258262890682,0.9778483415056568,0.20931464596304847,0.82195331189844,,23.2 +2026-03-20 12:00:00+00:00,21900.0,,,,,,,,,,12,3,79,1.2246467991473532e-16,-1.0,0.9778483415056568,0.20931464596304847,0.7361960386060333,,21.9 +2026-03-20 13:00:00+00:00,21500.0,,,,,,,,,,13,3,79,-0.2588190451025208,-0.9659258262890683,0.9778483415056568,0.20931464596304847,0.5997759173723258,,21.5 +2026-03-20 14:00:00+00:00,14300.0,,,,,,,,,,14,3,79,-0.4999999999999998,-0.8660254037844388,0.9778483415056568,0.20931464596304847,0.42198975401448496,,14.3 +2026-03-20 15:00:00+00:00,2500.0,,,,,,,,,,15,3,79,-0.7071067811865471,-0.7071067811865479,0.9778483415056568,0.20931464596304847,0.21495338175982073,,2.5 +2026-03-20 16:00:00+00:00,0.0,,,,,,,,,,16,3,79,-0.8660254037844384,-0.5000000000000004,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 17:00:00+00:00,0.0,,,,,,,,,,17,3,79,-0.9659258262890683,-0.25881904510252063,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 18:00:00+00:00,0.0,,,,,,,,,,18,3,79,-1.0,-1.8369701987210297e-16,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 19:00:00+00:00,0.0,,,,,,,,,,19,3,79,-0.9659258262890684,0.2588190451025203,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 20:00:00+00:00,0.0,,,,,,,,,,20,3,79,-0.8660254037844386,0.5000000000000001,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 21:00:00+00:00,0.0,,,,,,,,,,21,3,79,-0.7071067811865477,0.7071067811865474,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 22:00:00+00:00,0.0,,,,,,,,,,22,3,79,-0.5000000000000004,0.8660254037844384,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-20 23:00:00+00:00,0.0,,,,,,,,,,23,3,79,-0.25881904510252157,0.9659258262890681,0.9778483415056568,0.20931464596304847,0.0,0.0,0.0 +2026-03-21 00:00:00+00:00,0.0,,,,,,,,,,0,3,80,0.0,1.0,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 01:00:00+00:00,0.0,,,,,,,,,,1,3,80,0.25881904510252074,0.9659258262890683,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 02:00:00+00:00,0.0,,,,,,,,,,2,3,80,0.49999999999999994,0.8660254037844387,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 03:00:00+00:00,0.0,,,,,,,,,,3,3,80,0.7071067811865475,0.7071067811865476,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 04:00:00+00:00,2400.0,,,,,,,,,,4,3,80,0.8660254037844386,0.5000000000000001,0.9813064702716093,0.19245158197082998,0.0,0.0,2.4 +2026-03-21 05:00:00+00:00,9900.0,,,,,,,,,,5,3,80,0.9659258262890683,0.25881904510252074,0.9813064702716093,0.19245158197082998,0.21858129908742338,,9.9 +2026-03-21 06:00:00+00:00,17900.0,,,,,,,,,,6,3,80,1.0,6.123233995736766e-17,0.9813064702716093,0.19245158197082998,0.4256330802534909,,17.9 +2026-03-21 07:00:00+00:00,26800.0,,,,,,,,,,7,3,80,0.9659258262890683,-0.25881904510252063,0.9813064702716093,0.19245158197082998,0.6034324755435284,,26.8 +2026-03-21 08:00:00+00:00,27400.0,,,,,,,,,,8,3,80,0.8660254037844387,-0.49999999999999983,0.9813064702716093,0.19245158197082998,0.7398627499959136,,27.4 +2026-03-21 09:00:00+00:00,25100.0,,,,,,,,,,9,3,80,0.7071067811865476,-0.7071067811865475,0.9813064702716093,0.19245158197082998,0.8256264058684049,,25.1 +2026-03-21 10:00:00+00:00,18400.0,,,,,,,,,,10,3,80,0.49999999999999994,-0.8660254037844387,0.9813064702716093,0.19245158197082998,0.8548787917444346,,18.4 +2026-03-21 11:00:00+00:00,13700.0,,,,,,,,,,11,3,80,0.258819045102521,-0.9659258262890682,0.9813064702716093,0.19245158197082998,0.8256264058684049,,13.7 +2026-03-21 12:00:00+00:00,12700.0,,,,,,,,,,12,3,80,1.2246467991473532e-16,-1.0,0.9813064702716093,0.19245158197082998,0.7398627499959136,,12.7 +2026-03-21 13:00:00+00:00,7100.0,,,,,,,,,,13,3,80,-0.2588190451025208,-0.9659258262890683,0.9813064702716093,0.19245158197082998,0.6034324755435284,,7.1 +2026-03-21 14:00:00+00:00,5300.0,,,,,,,,,,14,3,80,-0.4999999999999998,-0.8660254037844388,0.9813064702716093,0.19245158197082998,0.4256330802534909,,5.3 +2026-03-21 15:00:00+00:00,1300.0,,,,,,,,,,15,3,80,-0.7071067811865471,-0.7071067811865479,0.9813064702716093,0.19245158197082998,0.21858129908742338,,1.3 +2026-03-21 16:00:00+00:00,0.0,,,,,,,,,,16,3,80,-0.8660254037844384,-0.5000000000000004,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 17:00:00+00:00,0.0,,,,,,,,,,17,3,80,-0.9659258262890683,-0.25881904510252063,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 18:00:00+00:00,0.0,,,,,,,,,,18,3,80,-1.0,-1.8369701987210297e-16,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 19:00:00+00:00,0.0,,,,,,,,,,19,3,80,-0.9659258262890684,0.2588190451025203,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 20:00:00+00:00,0.0,,,,,,,,,,20,3,80,-0.8660254037844386,0.5000000000000001,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 21:00:00+00:00,0.0,,,,,,,,,,21,3,80,-0.7071067811865477,0.7071067811865474,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 22:00:00+00:00,0.0,,,,,,,,,,22,3,80,-0.5000000000000004,0.8660254037844384,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-21 23:00:00+00:00,0.0,,,,,,,,,,23,3,80,-0.25881904510252157,0.9659258262890681,0.9813064702716093,0.19245158197082998,0.0,0.0,0.0 +2026-03-22 00:00:00+00:00,0.0,,,,,,,,,,0,3,81,0.0,1.0,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 01:00:00+00:00,0.0,,,,,,,,,,1,3,81,0.25881904510252074,0.9659258262890683,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 02:00:00+00:00,0.0,,,,,,,,,,2,3,81,0.49999999999999994,0.8660254037844387,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 03:00:00+00:00,0.0,,,,,,,,,,3,3,81,0.7071067811865475,0.7071067811865476,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 04:00:00+00:00,8500.0,,,,,,,,,,4,3,81,0.8660254037844386,0.5000000000000001,0.9844738167520922,0.1755314904214282,5.2568743232372765e-17,0.0,8.5 +2026-03-22 05:00:00+00:00,23400.0,,,,,,,,,,5,3,81,0.9659258262890683,0.25881904510252074,0.9844738167520922,0.1755314904214282,0.22219944452743765,,23.4 +2026-03-22 06:00:00+00:00,29100.0,,,,,,,,,,6,3,81,1.0,6.123233995736766e-17,0.9844738167520922,0.1755314904214282,0.4292563641122745,,29.1 +2026-03-22 07:00:00+00:00,29700.0,,,,,,,,,,7,3,81,0.9659258262890683,-0.25881904510252063,0.9844738167520922,0.1755314904214282,0.607060171862542,,29.7 +2026-03-22 08:00:00+00:00,30300.0,,,,,,,,,,8,3,81,0.8660254037844387,-0.49999999999999983,0.9844738167520922,0.1755314904214282,0.743493832114745,,30.3 +2026-03-22 09:00:00+00:00,32100.0,,,,,,,,,,9,3,81,0.7071067811865476,-0.7071067811865475,0.9844738167520922,0.1755314904214282,0.8292596163899797,,32.1 +2026-03-22 10:00:00+00:00,30300.0,,,,,,,,,,10,3,81,0.49999999999999994,-0.8660254037844387,0.9844738167520922,0.1755314904214282,0.8585127282245488,,30.3 +2026-03-22 11:00:00+00:00,28600.0,,,,,,,,,,11,3,81,0.258819045102521,-0.9659258262890682,0.9844738167520922,0.1755314904214282,0.8292596163899797,,28.6 +2026-03-22 12:00:00+00:00,27400.0,,,,,,,,,,12,3,81,1.2246467991473532e-16,-1.0,0.9844738167520922,0.1755314904214282,0.743493832114745,,27.4 +2026-03-22 13:00:00+00:00,24600.0,,,,,,,,,,13,3,81,-0.2588190451025208,-0.9659258262890683,0.9844738167520922,0.1755314904214282,0.607060171862542,,24.6 +2026-03-22 14:00:00+00:00,16600.0,,,,,,,,,,14,3,81,-0.4999999999999998,-0.8660254037844388,0.9844738167520922,0.1755314904214282,0.4292563641122745,,16.6 +2026-03-22 15:00:00+00:00,2500.0,,,,,,,,,,15,3,81,-0.7071067811865471,-0.7071067811865479,0.9844738167520922,0.1755314904214282,0.22219944452743765,,2.5 +2026-03-22 16:00:00+00:00,0.0,,,,,,,,,,16,3,81,-0.8660254037844384,-0.5000000000000004,0.9844738167520922,0.1755314904214282,5.2568743232372765e-17,0.0,0.0 +2026-03-22 17:00:00+00:00,0.0,,,,,,,,,,17,3,81,-0.9659258262890683,-0.25881904510252063,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 18:00:00+00:00,0.0,,,,,,,,,,18,3,81,-1.0,-1.8369701987210297e-16,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 19:00:00+00:00,0.0,,,,,,,,,,19,3,81,-0.9659258262890684,0.2588190451025203,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 20:00:00+00:00,0.0,,,,,,,,,,20,3,81,-0.8660254037844386,0.5000000000000001,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 21:00:00+00:00,0.0,,,,,,,,,,21,3,81,-0.7071067811865477,0.7071067811865474,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 22:00:00+00:00,0.0,,,,,,,,,,22,3,81,-0.5000000000000004,0.8660254037844384,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-22 23:00:00+00:00,0.0,,,,,,,,,,23,3,81,-0.25881904510252157,0.9659258262890681,0.9844738167520922,0.1755314904214282,0.0,0.0,0.0 +2026-03-23 00:00:00+00:00,0.0,,,,,,,,,,0,3,82,0.0,1.0,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 01:00:00+00:00,0.0,,,,,,,,,,1,3,82,0.25881904510252074,0.9659258262890683,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 02:00:00+00:00,0.0,,,,,,,,,,2,3,82,0.49999999999999994,0.8660254037844387,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 03:00:00+00:00,0.0,,,,,,,,,,3,3,82,0.7071067811865475,0.7071067811865476,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 04:00:00+00:00,6600.0,,,,,,,,,,4,3,82,0.8660254037844386,0.5000000000000001,0.9873494423939864,0.15855938510313478,0.0036126312374530683,0.0,6.6 +2026-03-23 05:00:00+00:00,19600.0,,,,,,,,,,5,3,82,0.9659258262890683,0.25881904510252074,0.9873494423939864,0.15855938510313478,0.2258065615623294,,19.6 +2026-03-23 06:00:00+00:00,24300.0,,,,,,,,,,6,3,82,1.0,6.123233995736766e-17,0.9873494423939864,0.15855938510313478,0.43285834272839696,,24.3 +2026-03-23 07:00:00+00:00,31200.0,,,,,,,,,,7,3,82,0.9659258262890683,-0.25881904510252063,0.9873494423939864,0.15855938510313478,0.6106577380184345,,31.2 +2026-03-23 08:00:00+00:00,32000.0,,,,,,,,,,8,3,82,0.8660254037844387,-0.49999999999999983,0.9873494423939864,0.15855938510313478,0.7470880124708197,,32.0 +2026-03-23 09:00:00+00:00,25000.0,,,,,,,,,,9,3,82,0.7071067811865476,-0.7071067811865475,0.9873494423939864,0.15855938510313478,0.8328516683433109,,25.0 +2026-03-23 10:00:00+00:00,21100.0,,,,,,,,,,10,3,82,0.49999999999999994,-0.8660254037844387,0.9873494423939864,0.15855938510313478,0.8621040542193407,,21.1 +2026-03-23 11:00:00+00:00,20200.0,,,,,,,,,,11,3,82,0.258819045102521,-0.9659258262890682,0.9873494423939864,0.15855938510313478,0.8328516683433109,,20.2 +2026-03-23 12:00:00+00:00,25400.0,,,,,,,,,,12,3,82,1.2246467991473532e-16,-1.0,0.9873494423939864,0.15855938510313478,0.7470880124708197,,25.4 +2026-03-23 13:00:00+00:00,15800.0,,,,,,,,,,13,3,82,-0.2588190451025208,-0.9659258262890683,0.9873494423939864,0.15855938510313478,0.6106577380184345,,15.8 +2026-03-23 14:00:00+00:00,12600.0,,,,,,,,,,14,3,82,-0.4999999999999998,-0.8660254037844388,0.9873494423939864,0.15855938510313478,0.43285834272839696,,12.6 +2026-03-23 15:00:00+00:00,6000.0,,,,,,,,,,15,3,82,-0.7071067811865471,-0.7071067811865479,0.9873494423939864,0.15855938510313478,0.2258065615623294,,6.0 +2026-03-23 16:00:00+00:00,0.0,,,,,,,,,,16,3,82,-0.8660254037844384,-0.5000000000000004,0.9873494423939864,0.15855938510313478,0.0036126312374530683,0.0,0.0 +2026-03-23 17:00:00+00:00,0.0,,,,,,,,,,17,3,82,-0.9659258262890683,-0.25881904510252063,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 18:00:00+00:00,0.0,,,,,,,,,,18,3,82,-1.0,-1.8369701987210297e-16,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 19:00:00+00:00,0.0,,,,,,,,,,19,3,82,-0.9659258262890684,0.2588190451025203,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 20:00:00+00:00,0.0,,,,,,,,,,20,3,82,-0.8660254037844386,0.5000000000000001,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 21:00:00+00:00,0.0,,,,,,,,,,21,3,82,-0.7071067811865477,0.7071067811865474,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 22:00:00+00:00,0.0,,,,,,,,,,22,3,82,-0.5000000000000004,0.8660254037844384,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-23 23:00:00+00:00,0.0,,,,,,,,,,23,3,82,-0.25881904510252157,0.9659258262890681,0.9873494423939864,0.15855938510313478,0.0,0.0,0.0 +2026-03-24 00:00:00+00:00,0.0,,,,,,,,,,0,3,83,0.0,1.0,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 01:00:00+00:00,0.0,,,,,,,,,,1,3,83,0.25881904510252074,0.9659258262890683,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 02:00:00+00:00,0.0,,,,,,,,,,2,3,83,0.49999999999999994,0.8660254037844387,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 03:00:00+00:00,0.0,,,,,,,,,,3,3,83,0.7071067811865475,0.7071067811865476,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 04:00:00+00:00,5700.0,,,,,,,,,,4,3,83,0.8660254037844386,0.5000000000000001,0.989932495087353,0.141540295217043,0.007224012766293428,0.0,5.7 +2026-03-24 05:00:00+00:00,16700.0,,,,,,,,,,5,3,83,0.9659258262890683,0.25881904510252074,0.989932495087353,0.141540295217043,0.22940140729240746,,16.7 +2026-03-24 06:00:00+00:00,26100.0,,,,,,,,,,6,3,83,1.0,6.123233995736766e-17,0.989932495087353,0.141540295217043,0.4364377795470717,,26.1 +2026-03-24 07:00:00+00:00,30500.0,,,,,,,,,,7,3,83,0.9659258262890683,-0.25881904510252063,0.989932495087353,0.141540295217043,0.6142239429049126,,30.5 +2026-03-24 08:00:00+00:00,27600.0,,,,,,,,,,8,3,83,0.8660254037844387,-0.49999999999999983,0.989932495087353,0.141540295217043,0.7506440641386201,,27.6 +2026-03-24 09:00:00+00:00,28400.0,,,,,,,,,,9,3,83,0.7071067811865476,-0.7071067811865475,0.989932495087353,0.141540295217043,0.8364013374310267,,28.4 +2026-03-24 10:00:00+00:00,26900.0,,,,,,,,,,10,3,83,0.49999999999999994,-0.8660254037844387,0.989932495087353,0.141540295217043,0.8656515463278498,,26.9 +2026-03-24 11:00:00+00:00,26400.0,,,,,,,,,,11,3,83,0.258819045102521,-0.9659258262890682,0.989932495087353,0.141540295217043,0.8364013374310267,,26.4 +2026-03-24 12:00:00+00:00,26300.0,,,,,,,,,,12,3,83,1.2246467991473532e-16,-1.0,0.989932495087353,0.141540295217043,0.7506440641386201,,26.3 +2026-03-24 13:00:00+00:00,23200.0,,,,,,,,,,13,3,83,-0.2588190451025208,-0.9659258262890683,0.989932495087353,0.141540295217043,0.6142239429049126,,23.2 +2026-03-24 14:00:00+00:00,16500.0,,,,,,,,,,14,3,83,-0.4999999999999998,-0.8660254037844388,0.989932495087353,0.141540295217043,0.4364377795470717,,16.5 +2026-03-24 15:00:00+00:00,5000.0,,,,,,,,,,15,3,83,-0.7071067811865471,-0.7071067811865479,0.989932495087353,0.141540295217043,0.22940140729240746,,5.0 +2026-03-24 16:00:00+00:00,0.0,,,,,,,,,,16,3,83,-0.8660254037844384,-0.5000000000000004,0.989932495087353,0.141540295217043,0.007224012766293428,0.0,0.0 +2026-03-24 17:00:00+00:00,0.0,,,,,,,,,,17,3,83,-0.9659258262890683,-0.25881904510252063,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 18:00:00+00:00,0.0,,,,,,,,,,18,3,83,-1.0,-1.8369701987210297e-16,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 19:00:00+00:00,0.0,,,,,,,,,,19,3,83,-0.9659258262890684,0.2588190451025203,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 20:00:00+00:00,0.0,,,,,,,,,,20,3,83,-0.8660254037844386,0.5000000000000001,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 21:00:00+00:00,0.0,,,,,,,,,,21,3,83,-0.7071067811865477,0.7071067811865474,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 22:00:00+00:00,0.0,,,,,,,,,,22,3,83,-0.5000000000000004,0.8660254037844384,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-24 23:00:00+00:00,0.0,,,,,,,,,,23,3,83,-0.25881904510252157,0.9659258262890681,0.989932495087353,0.141540295217043,0.0,0.0,0.0 +2026-03-25 00:00:00+00:00,0.0,,,,,,,,,,0,3,84,0.0,1.0,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 01:00:00+00:00,0.0,,,,,,,,,,1,3,84,0.25881904510252074,0.9659258262890683,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 02:00:00+00:00,0.0,,,,,,,,,,2,3,84,0.49999999999999994,0.8660254037844387,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 03:00:00+00:00,0.0,,,,,,,,,,3,3,84,0.7071067811865475,0.7071067811865476,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 04:00:00+00:00,9800.0,,,,,,,,,,4,3,84,0.8660254037844386,0.5000000000000001,0.9922222094179323,0.12447926388678915,0.010832895734936005,0.0,9.8 +2026-03-25 05:00:00+00:00,24700.0,,,,,,,,,,5,3,84,0.9659258262890683,0.25881904510252074,0.9922222094179323,0.12447926388678915,0.23298275328347146,,24.7 +2026-03-25 06:00:00+00:00,28900.0,,,,,,,,,,6,3,84,1.0,6.123233995736766e-17,0.9922222094179323,0.12447926388678915,0.43999346516007204,,28.9 +2026-03-25 07:00:00+00:00,29600.0,,,,,,,,,,7,3,84,0.9659258262890683,-0.25881904510252063,0.9922222094179323,0.12447926388678915,0.6177575934517235,,29.6 +2026-03-25 08:00:00+00:00,25400.0,,,,,,,,,,8,3,84,0.8660254037844387,-0.49999999999999983,0.9922222094179323,0.12447926388678915,0.754160806584462,,25.4 +2026-03-25 09:00:00+00:00,26300.0,,,,,,,,,,9,3,84,0.7071067811865476,-0.7071067811865475,0.9922222094179323,0.12447926388678915,0.839907451000259,,26.3 +2026-03-25 10:00:00+00:00,29500.0,,,,,,,,,,10,3,84,0.49999999999999994,-0.8660254037844387,0.9922222094179323,0.12447926388678915,0.8691540345852079,,29.5 +2026-03-25 11:00:00+00:00,22600.0,,,,,,,,,,11,3,84,0.258819045102521,-0.9659258262890682,0.9922222094179323,0.12447926388678915,0.839907451000259,,22.6 +2026-03-25 12:00:00+00:00,7400.0,,,,,,,,,,12,3,84,1.2246467991473532e-16,-1.0,0.9922222094179323,0.12447926388678915,0.754160806584462,,7.4 +2026-03-25 13:00:00+00:00,4900.0,,,,,,,,,,13,3,84,-0.2588190451025208,-0.9659258262890683,0.9922222094179323,0.12447926388678915,0.6177575934517235,,4.9 +2026-03-25 14:00:00+00:00,6200.0,,,,,,,,,,14,3,84,-0.4999999999999998,-0.8660254037844388,0.9922222094179323,0.12447926388678915,0.43999346516007204,,6.2 +2026-03-25 15:00:00+00:00,1400.0,,,,,,,,,,15,3,84,-0.7071067811865471,-0.7071067811865479,0.9922222094179323,0.12447926388678915,0.23298275328347146,,1.4 +2026-03-25 16:00:00+00:00,0.0,,,,,,,,,,16,3,84,-0.8660254037844384,-0.5000000000000004,0.9922222094179323,0.12447926388678915,0.010832895734936005,0.0,0.0 +2026-03-25 17:00:00+00:00,0.0,,,,,,,,,,17,3,84,-0.9659258262890683,-0.25881904510252063,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 18:00:00+00:00,0.0,,,,,,,,,,18,3,84,-1.0,-1.8369701987210297e-16,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 19:00:00+00:00,0.0,,,,,,,,,,19,3,84,-0.9659258262890684,0.2588190451025203,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 20:00:00+00:00,0.0,,,,,,,,,,20,3,84,-0.8660254037844386,0.5000000000000001,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 21:00:00+00:00,0.0,,,,,,,,,,21,3,84,-0.7071067811865477,0.7071067811865474,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 22:00:00+00:00,0.0,,,,,,,,,,22,3,84,-0.5000000000000004,0.8660254037844384,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-25 23:00:00+00:00,0.0,,,,,,,,,,23,3,84,-0.25881904510252157,0.9659258262890681,0.9922222094179323,0.12447926388678915,0.0,0.0,0.0 +2026-03-26 00:00:00+00:00,0.0,,,,,,,,,,0,3,85,0.0,1.0,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 01:00:00+00:00,0.0,,,,,,,,,,1,3,85,0.25881904510252074,0.9659258262890683,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 02:00:00+00:00,0.0,,,,,,,,,,2,3,85,0.49999999999999994,0.8660254037844387,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 03:00:00+00:00,0.0,,,,,,,,,,3,3,85,0.7071067811865475,0.7071067811865476,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 04:00:00+00:00,200.0,,,,,,,,,,4,3,85,0.8660254037844386,0.5000000000000001,0.994217906893952,0.10738134666416309,0.014438033004232848,0.0,0.2 +2026-03-26 05:00:00+00:00,1600.0,,,,,,,,,,5,3,85,0.9659258262890683,0.25881904510252074,0.994217906893952,0.10738134666416309,0.23654938639409967,,1.6 +2026-03-26 06:00:00+00:00,6100.0,,,,,,,,,,6,3,85,1.0,6.123233995736766e-17,0.994217906893952,0.10738134666416309,0.44352421810681375,,6.1 +2026-03-26 07:00:00+00:00,11100.0,,,,,,,,,,7,3,85,0.9659258262890683,-0.25881904510252063,0.994217906893952,0.10738134666416309,0.6212575354032349,,11.1 +2026-03-26 08:00:00+00:00,17100.0,,,,,,,,,,8,3,85,0.8660254037844387,-0.49999999999999983,0.994217906893952,0.10738134666416309,0.7576371064278067,,17.1 +2026-03-26 09:00:00+00:00,16500.0,,,,,,,,,,9,3,85,0.7071067811865476,-0.7071067811865475,0.994217906893952,0.10738134666416309,0.8433688887931018,,16.5 +2026-03-26 10:00:00+00:00,15400.0,,,,,,,,,,10,3,85,0.49999999999999994,-0.8660254037844387,0.994217906893952,0.10738134666416309,0.8726104032093944,,15.4 +2026-03-26 11:00:00+00:00,17600.0,,,,,,,,,,11,3,85,0.258819045102521,-0.9659258262890682,0.994217906893952,0.10738134666416309,0.8433688887931018,,17.6 +2026-03-26 12:00:00+00:00,13600.0,,,,,,,,,,12,3,85,1.2246467991473532e-16,-1.0,0.994217906893952,0.10738134666416309,0.7576371064278067,,13.6 +2026-03-26 13:00:00+00:00,22700.0,,,,,,,,,,13,3,85,-0.2588190451025208,-0.9659258262890683,0.994217906893952,0.10738134666416309,0.6212575354032349,,22.7 +2026-03-26 14:00:00+00:00,6600.0,,,,,,,,,,14,3,85,-0.4999999999999998,-0.8660254037844388,0.994217906893952,0.10738134666416309,0.44352421810681375,,6.6 +2026-03-26 15:00:00+00:00,1100.0,,,,,,,,,,15,3,85,-0.7071067811865471,-0.7071067811865479,0.994217906893952,0.10738134666416309,0.23654938639409967,,1.1 +2026-03-26 16:00:00+00:00,0.0,,,,,,,,,,16,3,85,-0.8660254037844384,-0.5000000000000004,0.994217906893952,0.10738134666416309,0.014438033004232848,0.0,0.0 +2026-03-26 17:00:00+00:00,0.0,,,,,,,,,,17,3,85,-0.9659258262890683,-0.25881904510252063,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 18:00:00+00:00,0.0,,,,,,,,,,18,3,85,-1.0,-1.8369701987210297e-16,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 19:00:00+00:00,0.0,,,,,,,,,,19,3,85,-0.9659258262890684,0.2588190451025203,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 20:00:00+00:00,0.0,,,,,,,,,,20,3,85,-0.8660254037844386,0.5000000000000001,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 21:00:00+00:00,0.0,,,,,,,,,,21,3,85,-0.7071067811865477,0.7071067811865474,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 22:00:00+00:00,0.0,,,,,,,,,,22,3,85,-0.5000000000000004,0.8660254037844384,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-26 23:00:00+00:00,0.0,,,,,,,,,,23,3,85,-0.25881904510252157,0.9659258262890681,0.994217906893952,0.10738134666416309,0.0,0.0,0.0 +2026-03-27 00:00:00+00:00,0.0,,,,,,,,,,0,3,86,0.0,1.0,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 01:00:00+00:00,0.0,,,,,,,,,,1,3,86,0.25881904510252074,0.9659258262890683,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 02:00:00+00:00,0.0,,,,,,,,,,2,3,86,0.49999999999999994,0.8660254037844387,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 03:00:00+00:00,0.0,,,,,,,,24.512703615196077,13.488461414813141,3,3,86,0.7071067811865475,0.7071067811865476,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 04:00:00+00:00,1900.0,,,,,,,,24.512703615196077,13.488461414813141,4,3,86,0.8660254037844386,0.5000000000000001,0.995918996147179,0.09025161003104117,0.01803817999965173,0.0,1.9 +2026-03-27 05:00:00+00:00,13100.0,,,,,,,,24.512703615196077,13.488461414813141,5,3,86,0.9659258262890683,0.25881904510252074,0.995918996147179,0.09025161003104117,0.24010010958101694,,13.1 +2026-03-27 06:00:00+00:00,26200.0,,,,,,,,18.947754074074073,16.891778925357528,6,3,86,1.0,6.123233995736766e-17,0.995918996147179,0.09025161003104117,0.4470288856361021,,26.2 +2026-03-27 07:00:00+00:00,25500.0,,,,,,,,7.1551791666666675,24.70709584642093,7,3,86,0.9659258262890683,-0.25881904510252063,0.995918996147179,0.09025161003104117,0.6247226540427239,,25.5 +2026-03-27 08:00:00+00:00,26600.0,,,,,,,,-2.1761764705882367,30.910893510232324,8,3,86,0.8660254037844387,-0.49999999999999983,0.995918996147179,0.09025161003104117,0.761071878136808,,26.6 +2026-03-27 09:00:00+00:00,28200.0,,,,,,,,-10.0365625,35.38442912651517,9,3,86,0.7071067811865476,-0.7071067811865475,0.995918996147179,0.09025161003104117,0.8467845836240891,,28.2 +2026-03-27 10:00:00+00:00,28900.0,,,,,,,,-18.41253125,37.30732443104142,10,3,86,0.49999999999999994,-0.8660254037844387,0.995918996147179,0.09025161003104117,0.8760195912725522,,28.9 +2026-03-27 11:00:00+00:00,27300.0,,,,,,,,-27.399,38.10757511032571,11,3,86,0.258819045102521,-0.9659258262890682,0.995918996147179,0.09025161003104117,0.8467845836240891,,27.3 +2026-03-27 12:00:00+00:00,23500.0,,,,,,,,-37.29734926470588,38.57968726486869,12,3,86,1.2246467991473532e-16,-1.0,0.995918996147179,0.09025161003104117,0.761071878136808,,23.5 +2026-03-27 13:00:00+00:00,21100.0,,,,,,,,-47.122245098039215,40.6375293111244,13,3,86,-0.2588190451025208,-0.9659258262890683,0.995918996147179,0.09025161003104117,0.6247226540427239,,21.1 +2026-03-27 14:00:00+00:00,16600.0,,,,,,,,-53.853575,36.86128581302023,14,3,86,-0.4999999999999998,-0.8660254037844388,0.995918996147179,0.09025161003104117,0.4470288856361021,,16.6 +2026-03-27 15:00:00+00:00,4000.0,,,,,,,,-49.761812500000005,45.561570642270716,15,3,86,-0.7071067811865471,-0.7071067811865479,0.995918996147179,0.09025161003104117,0.24010010958101694,,4.0 +2026-03-27 16:00:00+00:00,0.0,,,,,,,,-43.4375,58.16370865210253,16,3,86,-0.8660254037844384,-0.5000000000000004,0.995918996147179,0.09025161003104117,0.01803817999965173,0.0,0.0 +2026-03-27 17:00:00+00:00,0.0,,,,,,,,-43.42,58.15869722148185,17,3,86,-0.9659258262890683,-0.25881904510252063,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 18:00:00+00:00,0.0,,,,,,,,-43.416250000000005,58.164490330584584,18,3,86,-1.0,-1.8369701987210297e-16,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 19:00:00+00:00,0.0,,,,,,,,-43.413125,58.174086634249505,19,3,86,-0.9659258262890684,0.2588190451025203,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 20:00:00+00:00,0.0,,,,,,,,-43.399166666666666,58.17587850488219,20,3,86,-0.8660254037844386,0.5000000000000001,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 21:00:00+00:00,0.0,,,,,,,,-43.390625,58.174100600947554,21,3,86,-0.7071067811865477,0.7071067811865474,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 22:00:00+00:00,0.0,,,,,,,,-43.380624999999995,58.1757577795869,22,3,86,-0.5000000000000004,0.8660254037844384,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-27 23:00:00+00:00,0.0,,,,,,,,-43.37125,58.17113292905683,23,3,86,-0.25881904510252157,0.9659258262890681,0.995918996147179,0.09025161003104117,0.0,0.0,0.0 +2026-03-28 00:00:00+00:00,0.0,,,,,,,,-43.36125,58.17275767416108,0,3,87,0.0,1.0,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 01:00:00+00:00,0.0,,,,,,,,-43.368125000000006,58.17404645311487,1,3,87,0.25881904510252074,0.9659258262890683,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 02:00:00+00:00,0.0,,,,,,,,5.561897058823529,25.63246775865313,2,3,87,0.49999999999999994,0.8660254037844387,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 03:00:00+00:00,200.0,,,,,,,,61.77383928571429,12.001698488694023,3,3,87,0.7071067811865475,0.7071067811865476,0.9973249731081555,0.07309512989807777,0.0,0.0,0.2 +2026-03-28 04:00:00+00:00,12400.0,,,,,,,,50.104375,4.177497812076916,4,3,87,0.8660254037844386,0.5000000000000001,0.9973249731081555,0.07309512989807777,0.021632095558619436,0.0,12.4 +2026-03-28 05:00:00+00:00,26200.0,,,,,,,,33.35208477011494,6.970441305020109,5,3,87,0.9659258262890683,0.25881904510252074,0.9973249731081555,0.07309512989807777,0.243633742681024,,26.2 +2026-03-28 06:00:00+00:00,30400.0,,,,,,,,18.8606379985755,16.63226925024108,6,3,87,1.0,6.123233995736766e-17,0.9973249731081555,0.07309512989807777,0.4505063444271052,,30.4 +2026-03-28 07:00:00+00:00,31800.0,,,,,,,,7.433837779973651,24.261076000446977,7,3,87,0.9659258262890683,-0.25881904510252063,0.9973249731081555,0.07309512989807777,0.6281518748610059,,31.8 +2026-03-28 08:00:00+00:00,32400.0,,,,,,,,-1.9072569444444447,30.491690663881847,8,3,87,0.8660254037844387,-0.49999999999999983,0.9973249731081555,0.07309512989807777,0.7644640846567757,,32.4 +2026-03-28 09:00:00+00:00,31800.0,,,,,,,,-9.870446428571427,34.995349794791004,9,3,87,0.7071067811865476,-0.7071067811865475,0.9973249731081555,0.07309512989807777,0.8501535219834104,,31.8 +2026-03-28 10:00:00+00:00,30100.0,,,,,,,,-18.02403125,37.054357829125934,10,3,87,0.49999999999999994,-0.8660254037844387,0.9973249731081555,0.07309512989807777,0.8793805932955907,,30.1 +2026-03-28 11:00:00+00:00,27500.0,,,,,,,,-26.60191941391941,38.79296134944579,11,3,87,0.258819045102521,-0.9659258262890682,0.9973249731081555,0.07309512989807777,0.8501535219834104,,27.5 +2026-03-28 12:00:00+00:00,26800.0,,,,,,,,-36.642678717320265,38.68182356381687,12,3,87,1.2246467991473532e-16,-1.0,0.9973249731081555,0.07309512989807777,0.7644640846567757,,26.8 +2026-03-28 13:00:00+00:00,22500.0,,,,,,,,-46.52368137254902,40.60134822671007,13,3,87,-0.2588190451025208,-0.9659258262890683,0.9973249731081555,0.07309512989807777,0.6281518748610059,,22.5 +2026-03-28 14:00:00+00:00,16300.0,,,,,,,,-53.298,37.71137579917586,14,3,87,-0.4999999999999998,-0.8660254037844388,0.9973249731081555,0.07309512989807777,0.4505063444271052,,16.3 +2026-03-28 15:00:00+00:00,2800.0,,,,,,,,-50.69947916666667,43.415365683982884,15,3,87,-0.7071067811865471,-0.7071067811865479,0.9973249731081555,0.07309512989807777,0.243633742681024,,2.8 +2026-03-28 16:00:00+00:00,100.0,,,,,,,,-43.47087499999999,57.96949165778928,16,3,87,-0.8660254037844384,-0.5000000000000004,0.9973249731081555,0.07309512989807777,0.021632095558619436,0.0,0.1 +2026-03-28 17:00:00+00:00,0.0,,,,,,,,-43.455625,57.968263097685615,17,3,87,-0.9659258262890683,-0.25881904510252063,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 18:00:00+00:00,0.0,,,,,,,,-43.440625,57.966651633180426,18,3,87,-1.0,-1.8369701987210297e-16,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 19:00:00+00:00,0.0,,,,,,,,-43.430625000000006,57.964961879821566,19,3,87,-0.9659258262890684,0.2588190451025203,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 20:00:00+00:00,0.0,,,,,,,,-43.418749999999996,57.97037118577616,20,3,87,-0.8660254037844386,0.5000000000000001,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 21:00:00+00:00,0.0,,,,,,,,-43.40625,57.96531328087514,21,3,87,-0.7071067811865477,0.7071067811865474,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 22:00:00+00:00,0.0,,,,,,,,-43.419375,57.96239550975413,22,3,87,-0.5000000000000004,0.8660254037844384,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-28 23:00:00+00:00,0.0,,,,,,,,-43.433125,57.95990501253862,23,3,87,-0.25881904510252157,0.9659258262890681,0.9973249731081555,0.07309512989807777,0.0,0.0,0.0 +2026-03-29 00:00:00+00:00,0.0,,,,,,,,-43.426875,57.96073618461466,0,3,88,0.0,1.0,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 01:00:00+00:00,0.0,,,,,,,,-43.425625000000004,57.95993567309375,1,3,88,0.25881904510252074,0.9659258262890683,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 02:00:00+00:00,0.0,,,,,,,,3.918970588235293,26.463690089789,2,3,88,0.49999999999999994,0.8660254037844387,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 03:00:00+00:00,0.0,,,,,,,,61.613726190476186,12.176912966231969,3,3,88,0.7071067811865475,0.7071067811865476,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 04:00:00+00:00,1000.0,,,,,,,,49.536,4.027267311713986,4,3,88,0.8660254037844386,0.5000000000000001,0.9984354211555643,0.055916990100603484,0.025218542771439686,0.0,1.0 +2026-03-29 05:00:00+00:00,3200.0,,,,,,,,33.18489994026284,6.881459359262667,5,3,88,0.9659258262890683,0.25881904510252074,0.9984354211555643,0.055916990100603484,0.24714912316802123,,3.2 +2026-03-29 06:00:00+00:00,6600.0,,,,,,,,18.784586271367523,16.479704841262393,6,3,88,1.0,6.123233995736766e-17,0.9984354211555643,0.055916990100603484,0.45395550126820094,,6.6 +2026-03-29 07:00:00+00:00,4700.0,,,,,,,,7.475498494259363,24.011554607330396,7,3,88,0.9659258262890683,-0.25881904510252063,0.9984354211555643,0.055916990100603484,0.6315441641681502,,4.7 +2026-03-29 08:00:00+00:00,5700.0,,,,,,,,-1.663925653594772,30.267722390752077,8,3,88,0.8660254037844387,-0.49999999999999983,0.9984354211555643,0.055916990100603484,0.7678127379703792,,5.7 +2026-03-29 09:00:00+00:00,16300.0,,,,,,,,-9.426875000000003,35.4329842353016,9,3,88,0.7071067811865476,-0.7071067811865475,0.9984354211555643,0.055916990100603484,0.8534747445647317,,16.3 +2026-03-29 10:00:00+00:00,15200.0,,,,,,,,-17.045726190476188,39.18272304134575,10,3,88,0.49999999999999994,-0.8660254037844387,0.9984354211555643,0.055916990100603484,0.882692459764962,,15.2 +2026-03-29 11:00:00+00:00,13100.0,,,,,,,,-25.39674519230769,40.96336023677639,11,3,88,0.258819045102521,-0.9659258262890682,0.9984354211555643,0.055916990100603484,0.8534747445647317,,13.1 +2026-03-29 12:00:00+00:00,3400.0,,,,,,,,-35.30991339869281,40.7640422707275,12,3,88,1.2246467991473532e-16,-1.0,0.9984354211555643,0.055916990100603484,0.7678127379703792,,3.4 +2026-03-29 13:00:00+00:00,4000.0,,,,,,,,-44.994206140350876,43.35405724021132,13,3,88,-0.2588190451025208,-0.9659258262890683,0.9984354211555643,0.055916990100603484,0.6315441641681502,,4.0 +2026-03-29 14:00:00+00:00,1900.0,,,,,,,,-51.90235,40.56719885765674,14,3,88,-0.4999999999999998,-0.8660254037844388,0.9984354211555643,0.055916990100603484,0.45395550126820094,,1.9 +2026-03-29 15:00:00+00:00,1200.0,,,,,,,,-49.702125,44.96209327607205,15,3,88,-0.7071067811865471,-0.7071067811865479,0.9984354211555643,0.055916990100603484,0.24714912316802123,,1.2 +2026-03-29 16:00:00+00:00,0.0,,,,,,,,87.2,0.0,16,3,88,-0.8660254037844384,-0.5000000000000004,0.9984354211555643,0.055916990100603484,0.025218542771439686,0.0,0.0 +2026-03-29 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,3,88,-0.9659258262890683,-0.25881904510252063,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,3,88,-1.0,-1.8369701987210297e-16,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,3,88,-0.9659258262890684,0.2588190451025203,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,3,88,-0.8660254037844386,0.5000000000000001,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,3,88,-0.7071067811865477,0.7071067811865474,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,3,88,-0.5000000000000004,0.8660254037844384,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-29 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,3,88,-0.25881904510252157,0.9659258262890681,0.9984354211555643,0.055916990100603484,0.0,0.0,0.0 +2026-03-30 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,3,89,0.0,1.0,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,3,89,0.25881904510252074,0.9659258262890683,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,3,89,0.49999999999999994,0.8660254037844387,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 03:00:00+00:00,200.0,,,,,,,,87.2,0.0,3,3,89,0.7071067811865475,0.7071067811865476,0.9992500112396835,0.03872228089217446,0.0,0.0,0.2 +2026-03-30 04:00:00+00:00,13200.0,,,,,,,,87.2,0.0,4,3,89,0.8660254037844386,0.5000000000000001,0.9992500112396835,0.03872228089217446,0.028796289814213505,0.0,13.2 +2026-03-30 05:00:00+00:00,27100.0,,,,,,,,87.2,0.0,5,3,89,0.9659258262890683,0.25881904510252074,0.9992500112396835,0.03872228089217446,0.2506451068837093,,27.1 +2026-03-30 06:00:00+00:00,26700.0,,,,,,,,87.2,0.0,6,3,89,1.0,6.123233995736766e-17,0.9992500112396835,0.03872228089217446,0.45737529369242386,,26.7 +2026-03-30 07:00:00+00:00,29300.0,,,,,,,,87.2,0.0,7,3,89,0.9659258262890683,-0.25881904510252063,0.9992500112396835,0.03872228089217446,0.6348985296471298,,29.3 +2026-03-30 08:00:00+00:00,27400.0,,,,,,,,87.2,0.0,8,3,89,0.8660254037844387,-0.49999999999999983,0.9992500112396835,0.03872228089217446,0.7711168995885327,,27.4 +2026-03-30 09:00:00+00:00,30300.0,,,,,,,,87.2,0.0,9,3,89,0.7071067811865476,-0.7071067811865475,0.9992500112396835,0.03872228089217446,0.8567473467166257,,30.3 +2026-03-30 10:00:00+00:00,31500.0,,,,,,,,87.2,0.0,10,3,89,0.49999999999999994,-0.8660254037844387,0.9992500112396835,0.03872228089217446,0.885954297570634,,31.5 +2026-03-30 11:00:00+00:00,30700.0,,,,,,,,87.2,0.0,11,3,89,0.258819045102521,-0.9659258262890682,0.9992500112396835,0.03872228089217446,0.8567473467166257,,30.7 +2026-03-30 12:00:00+00:00,30600.0,,,,,,,,87.2,0.0,12,3,89,1.2246467991473532e-16,-1.0,0.9992500112396835,0.03872228089217446,0.7711168995885327,,30.6 +2026-03-30 13:00:00+00:00,27200.0,,,,,,,,87.2,0.0,13,3,89,-0.2588190451025208,-0.9659258262890683,0.9992500112396835,0.03872228089217446,0.6348985296471298,,27.2 +2026-03-30 14:00:00+00:00,20800.0,,,,,,,,87.2,0.0,14,3,89,-0.4999999999999998,-0.8660254037844388,0.9992500112396835,0.03872228089217446,0.45737529369242386,,20.8 +2026-03-30 15:00:00+00:00,5900.0,,,,,,,,87.2,0.0,15,3,89,-0.7071067811865471,-0.7071067811865479,0.9992500112396835,0.03872228089217446,0.2506451068837093,,5.9 +2026-03-30 16:00:00+00:00,0.0,,,,,,,,87.2,0.0,16,3,89,-0.8660254037844384,-0.5000000000000004,0.9992500112396835,0.03872228089217446,0.028796289814213505,0.0,0.0 +2026-03-30 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,3,89,-0.9659258262890683,-0.25881904510252063,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,3,89,-1.0,-1.8369701987210297e-16,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,3,89,-0.9659258262890684,0.2588190451025203,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,3,89,-0.8660254037844386,0.5000000000000001,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,3,89,-0.7071067811865477,0.7071067811865474,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,3,89,-0.5000000000000004,0.8660254037844384,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-30 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,3,89,-0.25881904510252157,0.9659258262890681,0.9992500112396835,0.03872228089217446,0.0,0.0,0.0 +2026-03-31 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,3,90,0.0,1.0,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,3,90,0.25881904510252074,0.9659258262890683,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,3,90,0.49999999999999994,0.8660254037844387,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 03:00:00+00:00,100.0,,,,,,,,87.2,0.0,3,3,90,0.7071067811865475,0.7071067811865476,0.9997685019798909,0.021516097436222254,0.0,0.0,0.1 +2026-03-31 04:00:00+00:00,11100.0,,,,,,,,87.2,0.0,4,3,90,0.8660254037844386,0.5000000000000001,0.9997685019798909,0.021516097436222254,0.032364110772212955,0.0,11.1 +2026-03-31 05:00:00+00:00,27500.0,,,,,,,,87.2,0.0,5,3,90,0.9659258262890683,0.25881904510252074,0.9997685019798909,0.021516097436222254,0.2541205687406073,,27.5 +2026-03-31 06:00:00+00:00,30900.0,,,,,,,,87.2,0.0,6,3,90,1.0,6.123233995736766e-17,0.9997685019798909,0.021516097436222254,0.4607646905683298,,30.9 +2026-03-31 07:00:00+00:00,32000.0,,,,,,,,87.2,0.0,7,3,90,0.9659258262890683,-0.25881904510252063,0.9997685019798909,0.021516097436222254,0.6382140208483786,,32.0 +2026-03-31 08:00:00+00:00,31900.0,,,,,,,,87.2,0.0,8,3,90,0.8660254037844387,-0.49999999999999983,0.9997685019798909,0.021516097436222254,0.7743756809710522,,31.9 +2026-03-31 09:00:00+00:00,31300.0,,,,,,,,87.2,0.0,9,3,90,0.7071067811865476,-0.7071067811865475,0.9997685019798909,0.021516097436222254,0.859970478816773,,31.3 +2026-03-31 10:00:00+00:00,30400.0,,,,,,,,87.2,0.0,10,3,90,0.49999999999999994,-0.8660254037844387,0.9997685019798909,0.021516097436222254,0.8891652703644465,,30.4 +2026-03-31 11:00:00+00:00,28000.0,,,,,,,,87.2,0.0,11,3,90,0.258819045102521,-0.9659258262890682,0.9997685019798909,0.021516097436222254,0.859970478816773,,28.0 +2026-03-31 12:00:00+00:00,29100.0,,,,,,,,87.2,0.0,12,3,90,1.2246467991473532e-16,-1.0,0.9997685019798909,0.021516097436222254,0.7743756809710522,,29.1 +2026-03-31 13:00:00+00:00,23800.0,,,,,,,,87.2,0.0,13,3,90,-0.2588190451025208,-0.9659258262890683,0.9997685019798909,0.021516097436222254,0.6382140208483786,,23.8 +2026-03-31 14:00:00+00:00,19400.0,,,,,,,,87.2,0.0,14,3,90,-0.4999999999999998,-0.8660254037844388,0.9997685019798909,0.021516097436222254,0.4607646905683298,,19.4 +2026-03-31 15:00:00+00:00,4900.0,,,,,,,,87.2,0.0,15,3,90,-0.7071067811865471,-0.7071067811865479,0.9997685019798909,0.021516097436222254,0.2541205687406073,,4.9 +2026-03-31 16:00:00+00:00,0.0,,,,,,,,87.2,0.0,16,3,90,-0.8660254037844384,-0.5000000000000004,0.9997685019798909,0.021516097436222254,0.032364110772212955,0.0,0.0 +2026-03-31 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,3,90,-0.9659258262890683,-0.25881904510252063,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,3,90,-1.0,-1.8369701987210297e-16,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,3,90,-0.9659258262890684,0.2588190451025203,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,3,90,-0.8660254037844386,0.5000000000000001,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,3,90,-0.7071067811865477,0.7071067811865474,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,3,90,-0.5000000000000004,0.8660254037844384,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-03-31 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,3,90,-0.25881904510252157,0.9659258262890681,0.9997685019798909,0.021516097436222254,0.0,0.0,0.0 +2026-04-01 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,4,91,0.0,1.0,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,4,91,0.25881904510252074,0.9659258262890683,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,4,91,0.49999999999999994,0.8660254037844387,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 03:00:00+00:00,0.0,,,,,,,,87.2,0.0,3,4,91,0.7071067811865475,0.7071067811865476,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 04:00:00+00:00,2500.0,,,,,,,,87.2,0.0,4,4,91,0.8660254037844386,0.5000000000000001,0.9999907397361901,0.004303538296244289,0.03592078645218594,0.0,2.5 +2026-04-01 05:00:00+00:00,7600.0,,,,,,,,87.2,0.0,5,4,91,0.9659258262890683,0.25881904510252074,0.9999907397361901,0.004303538296244289,0.2575744033960884,,7.6 +2026-04-01 06:00:00+00:00,9800.0,,,,,,,,87.2,0.0,6,4,91,1.0,6.123233995736766e-17,0.9999907397361901,0.004303538296244289,0.46412269264518535,,9.8 +2026-04-01 07:00:00+00:00,13600.0,,,,,,,,87.2,0.0,7,4,91,0.9659258262890683,-0.25881904510252063,0.9999907397361901,0.004303538296244289,0.6414897296243374,,13.6 +2026-04-01 08:00:00+00:00,20800.0,,,,,,,,87.2,0.0,8,4,91,0.8660254037844387,-0.49999999999999983,0.9999907397361901,0.004303538296244289,0.7775882438763031,,20.8 +2026-04-01 09:00:00+00:00,23100.0,,,,,,,,87.2,0.0,9,4,91,0.7071067811865476,-0.7071067811865475,0.9999907397361901,0.004303538296244289,0.8631433465682399,,23.1 +2026-04-01 10:00:00+00:00,22900.0,,,,,,,,87.2,0.0,10,4,91,0.49999999999999994,-0.8660254037844387,0.9999907397361901,0.004303538296244289,0.8923245988381846,,22.9 +2026-04-01 11:00:00+00:00,7800.0,,,,,,,,87.2,0.0,11,4,91,0.258819045102521,-0.9659258262890682,0.9999907397361901,0.004303538296244289,0.8631433465682399,,7.8 +2026-04-01 12:00:00+00:00,4300.0,,,,,,,,87.2,0.0,12,4,91,1.2246467991473532e-16,-1.0,0.9999907397361901,0.004303538296244289,0.7775882438763031,,4.3 +2026-04-01 13:00:00+00:00,4800.0,,,,,,,,87.2,0.0,13,4,91,-0.2588190451025208,-0.9659258262890683,0.9999907397361901,0.004303538296244289,0.6414897296243374,,4.8 +2026-04-01 14:00:00+00:00,1600.0,,,,,,,,87.2,0.0,14,4,91,-0.4999999999999998,-0.8660254037844388,0.9999907397361901,0.004303538296244289,0.46412269264518535,,1.6 +2026-04-01 15:00:00+00:00,700.0,,,,,,,,87.2,0.0,15,4,91,-0.7071067811865471,-0.7071067811865479,0.9999907397361901,0.004303538296244289,0.2575744033960884,,0.7 +2026-04-01 16:00:00+00:00,0.0,,,,,,,,87.2,0.0,16,4,91,-0.8660254037844384,-0.5000000000000004,0.9999907397361901,0.004303538296244289,0.03592078645218594,0.0,0.0 +2026-04-01 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,4,91,-0.9659258262890683,-0.25881904510252063,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,4,91,-1.0,-1.8369701987210297e-16,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,4,91,-0.9659258262890684,0.2588190451025203,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,4,91,-0.8660254037844386,0.5000000000000001,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,4,91,-0.7071067811865477,0.7071067811865474,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,4,91,-0.5000000000000004,0.8660254037844384,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-01 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,4,91,-0.25881904510252157,0.9659258262890681,0.9999907397361901,0.004303538296244289,0.0,0.0,0.0 +2026-04-02 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,4,92,0.0,1.0,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,4,92,0.25881904510252074,0.9659258262890683,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,4,92,0.49999999999999994,0.8660254037844387,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 03:00:00+00:00,0.0,,,,,,,,87.2,0.0,3,4,92,0.7071067811865475,0.7071067811865476,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 04:00:00+00:00,1300.0,,,,,,,,87.2,0.0,4,4,92,0.8660254037844386,0.5000000000000001,0.9999166586547379,-0.01291029607500882,0.039465105182101556,0.0,1.3 +2026-04-02 05:00:00+00:00,2500.0,,,,,,,,87.2,0.0,5,4,92,0.9659258262890683,0.25881904510252074,0.9999166586547379,-0.01291029607500882,0.26100552589619735,,2.5 +2026-04-02 06:00:00+00:00,7500.0,,,,,,,,87.2,0.0,6,4,92,1.0,6.123233995736766e-17,0.9999166586547379,-0.01291029607500882,0.46744833305148337,,7.5 +2026-04-02 07:00:00+00:00,8900.0,,,,,,,,87.2,0.0,7,4,92,0.9659258262890683,-0.25881904510252063,0.9999166586547379,-0.01291029607500882,0.6447247905031961,,8.9 +2026-04-02 08:00:00+00:00,11300.0,,,,,,,,87.2,0.0,8,4,92,0.8660254037844387,-0.49999999999999983,0.9999166586547379,-0.01291029607500882,0.780753800639199,,11.3 +2026-04-02 09:00:00+00:00,18100.0,,,,,,,,87.2,0.0,9,4,92,0.7071067811865476,-0.7071067811865475,0.9999166586547379,-0.01291029607500882,0.8662652112172919,,18.1 +2026-04-02 10:00:00+00:00,19500.0,,,,,,,,87.2,0.0,10,4,92,0.49999999999999994,-0.8660254037844387,0.9999166586547379,-0.01291029607500882,0.895431560920865,,19.5 +2026-04-02 11:00:00+00:00,16700.0,,,,,,,,87.2,0.0,11,4,92,0.258819045102521,-0.9659258262890682,0.9999166586547379,-0.01291029607500882,0.8662652112172919,,16.7 +2026-04-02 12:00:00+00:00,8400.0,,,,,,,,87.2,0.0,12,4,92,1.2246467991473532e-16,-1.0,0.9999166586547379,-0.01291029607500882,0.780753800639199,,8.4 +2026-04-02 13:00:00+00:00,11200.0,,,,,,,,87.2,0.0,13,4,92,-0.2588190451025208,-0.9659258262890683,0.9999166586547379,-0.01291029607500882,0.6447247905031961,,11.2 +2026-04-02 14:00:00+00:00,3700.0,,,,,,,,87.2,0.0,14,4,92,-0.4999999999999998,-0.8660254037844388,0.9999166586547379,-0.01291029607500882,0.46744833305148337,,3.7 +2026-04-02 15:00:00+00:00,900.0,,,,,,,,87.2,0.0,15,4,92,-0.7071067811865471,-0.7071067811865479,0.9999166586547379,-0.01291029607500882,0.26100552589619735,,0.9 +2026-04-02 16:00:00+00:00,0.0,,,,,,,,87.2,0.0,16,4,92,-0.8660254037844384,-0.5000000000000004,0.9999166586547379,-0.01291029607500882,0.039465105182101556,0.0,0.0 +2026-04-02 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,4,92,-0.9659258262890683,-0.25881904510252063,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,4,92,-1.0,-1.8369701987210297e-16,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,4,92,-0.9659258262890684,0.2588190451025203,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,4,92,-0.8660254037844386,0.5000000000000001,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,4,92,-0.7071067811865477,0.7071067811865474,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,4,92,-0.5000000000000004,0.8660254037844384,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-02 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,4,92,-0.25881904510252157,0.9659258262890681,0.9999166586547379,-0.01291029607500882,0.0,0.0,0.0 +2026-04-03 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,4,93,0.0,1.0,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,4,93,0.25881904510252074,0.9659258262890683,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,4,93,0.49999999999999994,0.8660254037844387,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 03:00:00+00:00,0.0,,,,,,,,87.2,0.0,3,4,93,0.7071067811865475,0.7071067811865476,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 04:00:00+00:00,2000.0,,,,,,,,87.2,0.0,4,4,93,0.8660254037844386,0.5000000000000001,0.9995462806873573,-0.030120304846908114,0.0429958635968805,0.0,2.0 +2026-04-03 05:00:00+00:00,8000.0,,,,,,,,87.2,0.0,5,4,93,0.9659258262890683,0.25881904510252074,0.9995462806873573,-0.030120304846908114,0.26441287228808075,,8.0 +2026-04-03 06:00:00+00:00,14900.0,,,,,,,,87.2,0.0,6,4,93,1.0,6.123233995736766e-17,0.9995462806873573,-0.030120304846908114,0.4707406777458835,,14.9 +2026-04-03 07:00:00+00:00,24100.0,,,,,,,,87.2,0.0,7,4,93,0.9659258262890683,-0.25881904510252063,0.9995462806873573,-0.030120304846908114,0.6479183810011594,,24.1 +2026-04-03 08:00:00+00:00,29000.0,,,,,,,,87.2,0.0,8,4,93,0.8660254037844387,-0.49999999999999983,0.9995462806873573,-0.030120304846908114,0.7838716143770604,,29.0 +2026-04-03 09:00:00+00:00,28400.0,,,,,,,,87.2,0.0,9,4,93,0.7071067811865476,-0.7071067811865475,0.9995462806873573,-0.030120304846908114,0.8693353896923597,,28.4 +2026-04-03 10:00:00+00:00,28500.0,,,,,,,,87.2,0.0,10,4,93,0.49999999999999994,-0.8660254037844387,0.9995462806873573,-0.030120304846908114,0.8984854918948864,,28.5 +2026-04-03 11:00:00+00:00,27800.0,,,,,,,,87.2,0.0,11,4,93,0.258819045102521,-0.9659258262890682,0.9995462806873573,-0.030120304846908114,0.8693353896923597,,27.8 +2026-04-03 12:00:00+00:00,28300.0,,,,,,,,87.2,0.0,12,4,93,1.2246467991473532e-16,-1.0,0.9995462806873573,-0.030120304846908114,0.7838716143770604,,28.3 +2026-04-03 13:00:00+00:00,24100.0,,,,,,,,87.2,0.0,13,4,93,-0.2588190451025208,-0.9659258262890683,0.9995462806873573,-0.030120304846908114,0.6479183810011594,,24.1 +2026-04-03 14:00:00+00:00,12700.0,,,,,,,,87.2,0.0,14,4,93,-0.4999999999999998,-0.8660254037844388,0.9995462806873573,-0.030120304846908114,0.4707406777458835,,12.7 +2026-04-03 15:00:00+00:00,3000.0,,,,,,,,87.2,0.0,15,4,93,-0.7071067811865471,-0.7071067811865479,0.9995462806873573,-0.030120304846908114,0.26441287228808075,,3.0 +2026-04-03 16:00:00+00:00,100.0,,,,,,,,87.2,0.0,16,4,93,-0.8660254037844384,-0.5000000000000004,0.9995462806873573,-0.030120304846908114,0.0429958635968805,0.0,0.1 +2026-04-03 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,4,93,-0.9659258262890683,-0.25881904510252063,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,4,93,-1.0,-1.8369701987210297e-16,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,4,93,-0.9659258262890684,0.2588190451025203,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,4,93,-0.8660254037844386,0.5000000000000001,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,4,93,-0.7071067811865477,0.7071067811865474,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,4,93,-0.5000000000000004,0.8660254037844384,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-03 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,4,93,-0.25881904510252157,0.9659258262890681,0.9995462806873573,-0.030120304846908114,0.0,0.0,0.0 +2026-04-04 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,4,94,0.0,1.0,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,4,94,0.25881904510252074,0.9659258262890683,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,4,94,0.49999999999999994,0.8660254037844387,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 03:00:00+00:00,200.0,,,,,,,,87.2,0.0,3,4,94,0.7071067811865475,0.7071067811865476,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.2 +2026-04-04 04:00:00+00:00,9100.0,,,,,,,,87.2,0.0,4,4,94,0.8660254037844386,0.5000000000000001,0.9988797155850336,-0.04732138832243185,0.046511867408695236,0.0,9.1 +2026-04-04 05:00:00+00:00,23000.0,,,,,,,,87.2,0.0,5,4,94,0.9659258262890683,0.25881904510252074,0.9988797155850336,-0.04732138832243185,0.2677954001999316,,23.0 +2026-04-04 06:00:00+00:00,28900.0,,,,,,,,87.2,0.0,6,4,94,1.0,6.123233995736766e-17,0.9988797155850336,-0.04732138832243185,0.47399882591977366,,28.9 +2026-04-04 07:00:00+00:00,30900.0,,,,,,,,87.2,0.0,7,4,94,0.9659258262890683,-0.25881904510252063,0.9988797155850336,-0.04732138832243185,0.6510697218726869,,30.9 +2026-04-04 08:00:00+00:00,32000.0,,,,,,,,87.2,0.0,8,4,94,0.8660254037844387,-0.49999999999999983,0.9988797155850336,-0.04732138832243185,0.7869409991229717,,32.0 +2026-04-04 09:00:00+00:00,32000.0,,,,,,,,87.2,0.0,9,4,94,0.7071067811865476,-0.7071067811865475,0.9988797155850336,-0.04732138832243185,0.8723532546639232,,32.0 +2026-04-04 10:00:00+00:00,30300.0,,,,,,,,87.2,0.0,10,4,94,0.49999999999999994,-0.8660254037844387,0.9988797155850336,-0.04732138832243185,0.9014857844308519,,30.3 +2026-04-04 11:00:00+00:00,29000.0,,,,,,,,87.2,0.0,11,4,94,0.258819045102521,-0.9659258262890682,0.9988797155850336,-0.04732138832243185,0.8723532546639232,,29.0 +2026-04-04 12:00:00+00:00,27900.0,,,,,,,,87.2,0.0,12,4,94,1.2246467991473532e-16,-1.0,0.9988797155850336,-0.04732138832243185,0.7869409991229717,,27.9 +2026-04-04 13:00:00+00:00,23400.0,,,,,,,,87.2,0.0,13,4,94,-0.2588190451025208,-0.9659258262890683,0.9988797155850336,-0.04732138832243185,0.6510697218726869,,23.4 +2026-04-04 14:00:00+00:00,14100.0,,,,,,,,87.2,0.0,14,4,94,-0.4999999999999998,-0.8660254037844388,0.9988797155850336,-0.04732138832243185,0.47399882591977366,,14.1 +2026-04-04 15:00:00+00:00,4300.0,,,,,,,,87.2,0.0,15,4,94,-0.7071067811865471,-0.7071067811865479,0.9988797155850336,-0.04732138832243185,0.2677954001999316,,4.3 +2026-04-04 16:00:00+00:00,100.0,,,,,,,,87.2,0.0,16,4,94,-0.8660254037844384,-0.5000000000000004,0.9988797155850336,-0.04732138832243185,0.046511867408695236,0.0,0.1 +2026-04-04 17:00:00+00:00,0.0,,,,,,,,87.2,0.0,17,4,94,-0.9659258262890683,-0.25881904510252063,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 18:00:00+00:00,0.0,,,,,,,,87.2,0.0,18,4,94,-1.0,-1.8369701987210297e-16,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 19:00:00+00:00,0.0,,,,,,,,87.2,0.0,19,4,94,-0.9659258262890684,0.2588190451025203,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 20:00:00+00:00,0.0,,,,,,,,87.2,0.0,20,4,94,-0.8660254037844386,0.5000000000000001,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 21:00:00+00:00,0.0,,,,,,,,87.2,0.0,21,4,94,-0.7071067811865477,0.7071067811865474,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 22:00:00+00:00,0.0,,,,,,,,87.2,0.0,22,4,94,-0.5000000000000004,0.8660254037844384,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-04 23:00:00+00:00,0.0,,,,,,,,87.2,0.0,23,4,94,-0.25881904510252157,0.9659258262890681,0.9988797155850336,-0.04732138832243185,0.0,0.0,0.0 +2026-04-05 00:00:00+00:00,0.0,,,,,,,,87.2,0.0,0,4,95,0.0,1.0,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 01:00:00+00:00,0.0,,,,,,,,87.2,0.0,1,4,95,0.25881904510252074,0.9659258262890683,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 02:00:00+00:00,0.0,,,,,,,,87.2,0.0,2,4,95,0.49999999999999994,0.8660254037844387,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 03:00:00+00:00,400.0,,,,,,,,87.2,0.0,3,4,95,0.7071067811865475,0.7071067811865476,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.4 +2026-04-05 04:00:00+00:00,13300.0,,,,,,,,87.2,0.0,4,4,95,0.8660254037844386,0.5000000000000001,0.9979171608653922,-0.06450844944931623,0.05001193216046761,,13.3 +2026-04-05 05:00:00+00:00,26800.0,,,,,,,,87.2,0.0,5,4,95,0.9659258262890683,0.25881904510252074,0.9979171608653922,-0.06450844944931623,0.2711520893874243,,26.8 +2026-04-05 06:00:00+00:00,30800.0,,,,,,,,-4.070535714285715,37.612240094914355,6,4,95,1.0,6.123233995736766e-17,0.9979171608653922,-0.06450844944931623,0.47722191035075306,,30.8 +2026-04-05 07:00:00+00:00,32400.0,,,,,,,,8.759752380952381,23.15752677652043,7,4,95,0.9659258262890683,-0.25881904510252063,0.9979171608653922,-0.06450844944931623,0.6541780772982833,,32.4 +2026-04-05 08:00:00+00:00,32400.0,,,,,,,,-0.406495743034057,29.25295828032456,8,4,95,0.8660254037844387,-0.49999999999999983,0.9979171608653922,-0.06450844944931623,0.7899613198864338,,32.4 +2026-04-05 09:00:00+00:00,32300.0,,,,,,,,-8.950098039215689,33.240358087048676,9,4,95,0.7071067811865476,-0.7071067811865475,0.9979171608653922,-0.06450844944931623,0.87531823452524,,32.3 +2026-04-05 10:00:00+00:00,30700.0,,,,,,,,-17.47975446428572,34.90999267350167,10,4,95,0.49999999999999994,-0.8660254037844387,0.9979171608653922,-0.06450844944931623,0.9044318885410383,,30.7 +2026-04-05 11:00:00+00:00,29100.0,,,,,,,,-27.160916666666665,33.77097964928205,11,4,95,0.258819045102521,-0.9659258262890682,0.9979171608653922,-0.06450844944931623,0.87531823452524,,29.1 +2026-04-05 12:00:00+00:00,29100.0,,,,,,,,-36.94314031862745,34.56686420463944,12,4,95,1.2246467991473532e-16,-1.0,0.9979171608653922,-0.06450844944931623,0.7899613198864338,,29.1 +2026-04-05 13:00:00+00:00,25300.0,,,,,,,,-46.62471381578947,37.81371129660678,13,4,95,-0.2588190451025208,-0.9659258262890683,0.9979171608653922,-0.06450844944931623,0.6541780772982833,,25.3 +2026-04-05 14:00:00+00:00,17700.0,,,,,,,,-53.99935,36.321138182285345,14,4,95,-0.4999999999999998,-0.8660254037844388,0.9979171608653922,-0.06450844944931623,0.47722191035075306,,17.7 +2026-04-05 15:00:00+00:00,5000.0,,,,,,,,-51.778732142857145,41.09723231326897,15,4,95,-0.7071067811865471,-0.7071067811865479,0.9979171608653922,-0.06450844944931623,0.2711520893874243,,5.0 +2026-04-05 16:00:00+00:00,0.0,,,,,,,,-43.512499999999996,57.90348787709885,16,4,95,-0.8660254037844384,-0.5000000000000004,0.9979171608653922,-0.06450844944931623,0.05001193216046761,,0.0 +2026-04-05 17:00:00+00:00,0.0,,,,,,,,-43.478750000000005,57.90092819132234,17,4,95,-0.9659258262890683,-0.25881904510252063,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 18:00:00+00:00,0.0,,,,,,,,-43.46875,57.904242954064536,18,4,95,-1.0,-1.8369701987210297e-16,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 19:00:00+00:00,0.0,,,,,,,,-43.44312499999999,57.89880400948854,19,4,95,-0.9659258262890684,0.2588190451025203,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 20:00:00+00:00,0.0,,,,,,,,-43.43625000000001,57.902514248087705,20,4,95,-0.8660254037844386,0.5000000000000001,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 21:00:00+00:00,0.0,,,,,88.25,0.0,1.3250000000000002,-43.428124999999994,57.89706977958815,21,4,95,-0.7071067811865477,0.7071067811865474,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 22:00:00+00:00,0.0,,,,,83.75,0.0,1.225,-43.44187499999999,57.89794963896246,22,4,95,-0.5000000000000004,0.8660254037844384,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-05 23:00:00+00:00,0.0,,,,,81.0,0.0,0.9375,-43.443125,57.90213850307401,23,4,95,-0.25881904510252157,0.9659258262890681,0.9979171608653922,-0.06450844944931623,0.0,0.0,0.0 +2026-04-06 00:00:00+00:00,0.0,,,,,89.5,0.0,0.775,-43.43687499999999,57.90129008259804,0,4,96,0.0,1.0,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 01:00:00+00:00,0.0,,,,,92.0,0.0,1.0625,-43.4275,57.89839663870955,1,4,96,0.25881904510252074,0.9659258262890683,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 02:00:00+00:00,0.0,,,,,89.625,0.0,1.6,6.436964154411765,24.89672606401144,2,4,96,0.49999999999999994,0.8660254037844387,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 03:00:00+00:00,400.0,,,,,86.25,0.0,0.5625,60.92243639122315,11.769715858751052,3,4,96,0.7071067811865475,0.7071067811865476,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.4 +2026-04-06 04:00:00+00:00,13300.0,,,,,78.875,0.0,0.9375,48.90153181444991,3.6825307670837244,4,4,96,0.8660254037844386,0.5000000000000001,0.9966589017541702,-0.08167639533042241,0.053494883961239484,,13.3 +2026-04-06 05:00:00+00:00,26700.0,,,,,72.75,0.0,1.9124999999999999,33.30361468253968,6.69376287072821,5,4,96,0.9659258262890683,0.25881904510252074,0.9966589017541702,-0.08167639533042241,0.27448194224569,,26.7 +2026-04-06 06:00:00+00:00,30300.0,,,,,72.0,0.0,2.95,19.83321153846154,15.654344954837674,6,4,96,1.0,6.123233995736766e-17,0.9966589017541702,-0.08167639533042241,0.48040909770643636,,30.3 +2026-04-06 07:00:00+00:00,32100.0,,,,,70.375,0.0,3.7125000000000004,8.772247727272728,23.005245565934743,7,4,96,0.9659258262890683,-0.25881904510252063,0.9966589017541702,-0.08167639533042241,0.6572427550095433,,32.1 +2026-04-06 08:00:00+00:00,32400.0,,,,,66.125,0.0,3.7625,-0.3792075163398696,29.112941698334996,8,4,96,0.8660254037844387,-0.49999999999999983,0.9966589017541702,-0.08167639533042241,0.79293199264124,,32.4 +2026-04-06 09:00:00+00:00,28300.0,,,,,63.375,0.0,3.525,-8.479791666666667,33.175801020483206,9,4,96,0.7071067811865476,-0.7071067811865475,0.9966589017541702,-0.08167639533042241,0.8782298132939939,,28.3 +2026-04-06 10:00:00+00:00,29300.0,,,,,66.875,0.0,4.2,-16.55730654761905,35.387589652750314,10,4,96,0.49999999999999994,-0.8660254037844387,0.9966589017541702,-0.08167639533042241,0.9073233114516331,,29.3 +2026-04-06 11:00:00+00:00,28100.0,,,,,69.125,0.0,4.1125,-26.31946428571428,34.28682450273417,11,4,96,0.258819045102521,-0.9659258262890682,0.9966589017541702,-0.08167639533042241,0.8782298132939939,,28.1 +2026-04-06 12:00:00+00:00,17800.0,,,,,68.875,0.0,4.525,-36.50513541666667,33.824019327120276,12,4,96,1.2246467991473532e-16,-1.0,0.9966589017541702,-0.08167639533042241,0.79293199264124,,17.8 +2026-04-06 13:00:00+00:00,22400.0,,,,,72.125,0.0,3.75,-46.22268562030076,37.40701546251014,13,4,96,-0.2588190451025208,-0.9659258262890683,0.9966589017541702,-0.08167639533042241,0.6572427550095433,,22.4 +2026-04-06 14:00:00+00:00,18100.0,,,,,74.625,0.0,2.7375000000000003,-53.970333333333336,36.2224871339154,14,4,96,-0.4999999999999998,-0.8660254037844388,0.9966589017541702,-0.08167639533042241,0.48040909770643636,,18.1 +2026-04-06 15:00:00+00:00,5100.0,,,,,76.5,0.0,2.4625,-52.11201666666667,40.50211994987972,15,4,96,-0.7071067811865471,-0.7071067811865479,0.9966589017541702,-0.08167639533042241,0.27448194224569,,5.1 +2026-04-06 16:00:00+00:00,0.0,,,,,79.375,0.0,2.175,-43.354375000000005,58.167670157592696,16,4,96,-0.8660254037844384,-0.5000000000000004,0.9966589017541702,-0.08167639533042241,0.053494883961239484,,0.0 +2026-04-06 17:00:00+00:00,0.0,,,,,81.0,0.0,2.5,-43.3375,58.166398841312734,17,4,96,-0.9659258262890683,-0.25881904510252063,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 18:00:00+00:00,0.0,,,,,82.75,0.0,2.8,-43.323750000000004,58.170583577526536,18,4,96,-1.0,-1.8369701987210297e-16,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 19:00:00+00:00,0.0,,,,,83.5,0.0,2.225,-43.298125,58.1667654741878,19,4,96,-0.9659258262890684,0.2588190451025203,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 20:00:00+00:00,0.0,,,,,87.0,0.0,1.3,-43.293749999999996,58.17220017256238,20,4,96,-0.8660254037844386,0.5000000000000001,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 21:00:00+00:00,0.0,,,,,90.125,0.0,1.2875,-43.28937499999999,58.17429538231784,21,4,96,-0.7071067811865477,0.7071067811865474,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 22:00:00+00:00,0.0,,,,,89.75,0.0,1.55,-43.27312500000001,58.168357390960416,22,4,96,-0.5000000000000004,0.8660254037844384,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-06 23:00:00+00:00,0.0,,,,,92.0,0.0,1.4875,-43.268750000000004,58.168759853693516,23,4,96,-0.25881904510252157,0.9659258262890681,0.9966589017541702,-0.08167639533042241,0.0,0.0,0.0 +2026-04-07 00:00:00+00:00,0.0,,,,,90.625,0.0,2.0625,-43.268125000000005,58.1700173118635,0,4,97,0.0,1.0,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 01:00:00+00:00,0.0,,,,,90.125,0.0,1.9375,-43.265,58.171274841339574,1,4,97,0.25881904510252074,0.9659258262890683,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 02:00:00+00:00,0.0,,,,,90.625,0.0,1.4875,8.603576286764707,24.015260577178037,2,4,97,0.49999999999999994,0.8660254037844387,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 03:00:00+00:00,600.0,,,,,88.0,0.0,1.0375,60.777383040935675,11.266968598074651,3,4,97,0.7071067811865475,0.7071067811865476,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.6 +2026-04-07 04:00:00+00:00,9800.0,,,,,80.125,0.0,1.175,49.07110330923248,3.4197850103364433,4,4,97,0.8660254037844386,0.5000000000000001,0.9951053111006976,-0.09882013873287143,0.05695956020214194,,9.8 +2026-04-07 05:00:00+00:00,13500.0,,,,,73.625,0.0,2.9,33.562290640394096,6.904919657204521,5,4,97,0.9659258262890683,0.25881904510252074,0.9951053111006976,-0.09882013873287143,0.2777839842859628,,13.5 +2026-04-07 06:00:00+00:00,21900.0,,,,,69.375,0.0,4.025,19.928260384615385,15.97126858291189,6,4,97,1.0,6.123233995736766e-17,0.9951053111006976,-0.09882013873287143,0.48355958879808675,,21.9 +2026-04-07 07:00:00+00:00,21100.0,,,,,74.0,0.0,3.8625,9.052027173913043,23.230848508083607,7,4,97,0.9659258262890683,-0.25881904510252063,0.9951053111006976,-0.09882013873287143,0.6602631063512772,,21.1 +2026-04-07 08:00:00+00:00,28500.0,,,,,74.25,0.0,3.975,0.0227256944444445,29.271712507082164,8,4,97,0.8660254037844387,-0.49999999999999983,0.9951053111006976,-0.09882013873287143,0.7958524842406542,,28.5 +2026-04-07 09:00:00+00:00,28400.0,,,,,70.125,0.0,3.2375,-8.150785014005603,33.25151488719252,9,4,97,0.7071067811865476,-0.7071067811865475,0.9951053111006976,-0.09882013873287143,0.8810875304350981,,28.4 +2026-04-07 10:00:00+00:00,28400.0,,,,,64.625,0.0,3.0125,-16.512708333333336,35.09651764839329,10,4,97,0.49999999999999994,-0.8660254037844387,0.9951053111006976,-0.09882013873287143,0.9101596173940314,,28.4 +2026-04-07 11:00:00+00:00,25200.0,,,,,64.625,0.0,3.0375,-26.268708333333333,33.97927207283195,11,4,97,0.258819045102521,-0.9659258262890682,0.9951053111006976,-0.09882013873287143,0.8810875304350981,,25.2 +2026-04-07 12:00:00+00:00,21400.0,,,,,54.375,0.0,3.3875,-35.776568627450985,34.66459890193323,12,4,97,1.2246467991473532e-16,-1.0,0.9951053111006976,-0.09882013873287143,0.7958524842406542,,21.4 +2026-04-07 13:00:00+00:00,20700.0,,,,,61.25,0.0,2.4375,-45.870328446115295,37.92349162797951,13,4,97,-0.2588190451025208,-0.9659258262890683,0.9951053111006976,-0.09882013873287143,0.6602631063512772,,20.7 +2026-04-07 14:00:00+00:00,14200.0,,,,,70.875,0.0,2.575,-54.267408333333336,35.96241967171734,14,4,97,-0.4999999999999998,-0.8660254037844388,0.9951053111006976,-0.09882013873287143,0.48355958879808675,,14.2 +2026-04-07 15:00:00+00:00,4700.0,,,,,74.375,0.0,1.9875,-52.065450000000006,40.739930831351856,15,4,97,-0.7071067811865471,-0.7071067811865479,0.9951053111006976,-0.09882013873287143,0.2777839842859628,,4.7 +2026-04-07 16:00:00+00:00,0.0,,,,,79.875,0.0,1.4875,-43.41395833333333,58.00345169875588,16,4,97,-0.8660254037844384,-0.5000000000000004,0.9951053111006976,-0.09882013873287143,0.05695956020214194,,0.0 +2026-04-07 17:00:00+00:00,0.0,,,,,82.75,0.0,2.25,-43.401041666666664,58.00091334440106,17,4,97,-0.9659258262890683,-0.25881904510252063,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 18:00:00+00:00,0.0,,,,,84.375,0.0,1.375,-43.39125000000001,58.00100740863616,18,4,97,-1.0,-1.8369701987210297e-16,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 19:00:00+00:00,0.0,,,,,88.375,0.0375,1.525,-43.374375,58.00478749548035,19,4,97,-0.9659258262890684,0.2588190451025203,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 20:00:00+00:00,0.0,,,,,87.125,0.0,2.175,-43.369375000000005,58.00140387578994,20,4,97,-0.8660254037844386,0.5000000000000001,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 21:00:00+00:00,0.0,,,,,86.0,0.0,2.4375,-43.361875,57.99971111188831,21,4,97,-0.7071067811865477,0.7071067811865474,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 22:00:00+00:00,0.0,,,,,85.25,0.0,3.4,-43.36750000000001,58.001763443019556,22,4,97,-0.5000000000000004,0.8660254037844384,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-07 23:00:00+00:00,0.0,,,,,90.25,0.05,3.8875,-43.358125,57.99718123089403,23,4,97,-0.25881904510252157,0.9659258262890681,0.9951053111006976,-0.09882013873287143,0.0,0.0,0.0 +2026-04-08 00:00:00+00:00,0.0,,,,,90.25,0.0,3.4125,-43.355000000000004,57.99510349302489,0,4,98,0.0,1.0,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 01:00:00+00:00,0.0,,,,,90.0,0.0,3.3000000000000003,-43.36125,57.99595677358322,1,4,98,0.25881904510252074,0.9659258262890683,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 02:00:00+00:00,0.0,,,,,90.125,0.0,3.1875,3.6565503472222236,27.03774789553402,2,4,98,0.49999999999999994,0.8660254037844387,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 03:00:00+00:00,400.0,,,,,86.625,0.0,3.1625,60.657587953841826,11.428441159987477,3,4,98,0.7071067811865475,0.7071067811865476,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.4 +2026-04-08 04:00:00+00:00,7100.0,,,,,82.125,0.0,2.95,48.88039942528736,3.531506100835235,4,4,98,0.8660254037844386,0.5000000000000001,0.9932568492674143,-0.11593459959550041,0.06040481025174393,,7.1 +2026-04-08 05:00:00+00:00,14800.0,,,,,77.125,0.0,3.2625,33.55880952380952,6.696813548103861,5,4,98,0.9659258262890683,0.25881904510252074,0.9932568492674143,-0.11593459959550041,0.28105726457610813,,14.8 +2026-04-08 06:00:00+00:00,14500.0,,,,,75.75,0.0,3.7375000000000003,20.021820126811598,15.708860545075662,6,4,98,1.0,6.123233995736766e-17,0.9932568492674143,-0.11593459959550041,0.4866726187836889,,14.5 +2026-04-08 07:00:00+00:00,26600.0,,,,,68.5,0.0,4.6375,9.187321807359307,22.925283810019447,7,4,98,0.9659258262890683,-0.25881904510252063,0.9932568492674143,-0.11593459959550041,0.663238526280678,,26.6 +2026-04-08 08:00:00+00:00,24600.0,,,,,69.0,0.0,5.4125,0.04867647058823543,29.010910808422683,8,4,98,0.8660254037844387,-0.49999999999999983,0.9932568492674143,-0.11593459959550041,0.7987223122601146,,24.6 +2026-04-08 09:00:00+00:00,23800.0,,,,,70.25,0.0,5.2,-8.144939075630251,33.055331413482804,9,4,98,0.7071067811865476,-0.7071067811865475,0.9932568492674143,-0.11593459959550041,0.8838909806050423,,23.8 +2026-04-08 10:00:00+00:00,18400.0,,,,,69.25,0.0,5.975,-16.555510416666664,35.00266636213258,10,4,98,0.49999999999999994,-0.8660254037844387,0.9932568492674143,-0.11593459959550041,0.9129404273156336,,18.4 +2026-04-08 11:00:00+00:00,24300.0,,,,,72.125,0.0,5.6875,-26.203479166666668,33.87069658563551,11,4,98,0.258819045102521,-0.9659258262890682,0.9932568492674143,-0.11593459959550041,0.8838909806050423,,24.3 +2026-04-08 12:00:00+00:00,23300.0,,,,,73.75,0.0,4.925,-36.13349264705882,33.87246935194389,12,4,98,1.2246467991473532e-16,-1.0,0.9932568492674143,-0.11593459959550041,0.7987223122601146,,23.3 +2026-04-08 13:00:00+00:00,26200.0,,,,,74.875,0.0,4.6875,-46.10050417956656,37.20801568028268,13,4,98,-0.2588190451025208,-0.9659258262890683,0.9932568492674143,-0.11593459959550041,0.663238526280678,,26.2 +2026-04-08 14:00:00+00:00,11500.0,,,,,79.875,0.0,4.2375,-56.7341,37.1164803387929,14,4,98,-0.4999999999999998,-0.8660254037844388,0.9932568492674143,-0.11593459959550041,0.4866726187836889,,11.5 +2026-04-08 15:00:00+00:00,5600.0,,,,,80.375,0.0,3.85,-53.786925000000004,43.14268502874116,15,4,98,-0.7071067811865471,-0.7071067811865479,0.9932568492674143,-0.11593459959550041,0.28105726457610813,,5.6 +2026-04-08 16:00:00+00:00,100.0,,,,,82.625,0.0,2.875,-45.513125,59.599793811688926,16,4,98,-0.8660254037844384,-0.5000000000000004,0.9932568492674143,-0.11593459959550041,0.06040481025174393,,0.1 +2026-04-08 17:00:00+00:00,0.0,,,,,84.0,0.0,2.4875,-45.496249999999996,59.60579856789661,17,4,98,-0.9659258262890683,-0.25881904510252063,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 18:00:00+00:00,0.0,,,,,84.125,0.0,2.6125,-45.481875,59.60863665663307,18,4,98,-1.0,-1.8369701987210297e-16,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 19:00:00+00:00,0.0,,,,,84.125,0.0,2.1625,-45.477500000000006,59.61254457606497,19,4,98,-0.9659258262890684,0.2588190451025203,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 20:00:00+00:00,0.0,,,,,84.25,0.0,1.15,-45.469375,59.61718842522823,20,4,98,-0.8660254037844386,0.5000000000000001,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 21:00:00+00:00,0.0,,,,,84.125,0.0,1.4375,-45.466249999999995,59.617021251624664,21,4,98,-0.7071067811865477,0.7071067811865474,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 22:00:00+00:00,0.0,,,,,86.0,0.0,0.6125,-45.46083333333332,59.62023161304049,22,4,98,-0.5000000000000004,0.8660254037844384,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-08 23:00:00+00:00,0.0,,,,,85.75,0.0,0.7125,-45.443125,59.61651058973373,23,4,98,-0.25881904510252157,0.9659258262890681,0.9932568492674143,-0.11593459959550041,0.0,0.0,0.0 +2026-04-09 00:00:00+00:00,0.0,,,,,87.25,0.0,1.4125,-45.441250000000004,59.61696432574092,0,4,99,0.0,1.0,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 01:00:00+00:00,0.0,,,,,89.0,0.0,1.0,-45.445625,59.62411041876572,1,4,99,0.25881904510252074,0.9659258262890683,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 02:00:00+00:00,0.0,,,,,88.375,0.0,1.4,-45.416250000000005,59.604429557849706,2,4,99,0.49999999999999994,0.8660254037844387,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 03:00:00+00:00,300.0,,,,,84.125,0.0,1.3875,-45.434999999999995,59.611858684605146,3,4,99,0.7071067811865475,0.7071067811865476,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.3 +2026-04-09 04:00:00+00:00,13500.0,,,,,79.25,0.0,1.975,-45.51,59.62760689619084,4,4,99,0.8660254037844386,0.5000000000000001,0.9911140639934547,-0.1330147065341959,0.06382949612961802,,13.5 +2026-04-09 05:00:00+00:00,26900.0,,,,,75.0,0.0,2.5125,-45.59375,59.65966509781406,5,4,99,0.9659258262890683,0.25881904510252074,0.9911140639934547,-0.1330147065341959,0.28430085614432576,,26.9 +2026-04-09 06:00:00+00:00,31900.0,,,,,68.375,0.0,2.4875,-45.5325,59.687970661320584,6,4,99,1.0,6.123233995736766e-17,0.9911140639934547,-0.1330147065341959,0.48974745732018066,,31.9 +2026-04-09 07:00:00+00:00,32500.0,,,,,63.625,0.0,2.7249999999999996,-45.55375,59.691225119359046,7,4,99,0.9659258262890683,-0.25881904510252063,0.9911140639934547,-0.1330147065341959,0.6661684533036092,,32.5 +2026-04-09 08:00:00+00:00,32300.0,,,,,65.0,0.0,3.475,-45.551249999999996,59.68702554785252,8,4,99,0.8660254037844387,-0.49999999999999983,0.9911140639934547,-0.1330147065341959,0.8015410447678216,,32.3 +2026-04-09 09:00:00+00:00,32300.0,,,,,66.25,0.0,5.025,-45.978624999999994,58.684407363136074,9,4,99,0.7071067811865476,-0.7071067811865475,0.9911140639934547,-0.1330147065341959,0.886639813318317,,32.3 +2026-04-09 10:00:00+00:00,31000.0,,,,,69.25,0.0,4.675,-47.579375,55.32759959154653,10,4,99,0.49999999999999994,-0.8660254037844387,0.9911140639934547,-0.1330147065341959,0.9156654185107431,,31.0 +2026-04-09 11:00:00+00:00,29600.0,,,,,70.25,0.0,4.987500000000001,-50.15575,50.11434264675798,11,4,99,0.258819045102521,-0.9659258262890682,0.9911140639934547,-0.1330147065341959,0.886639813318317,,29.6 +2026-04-09 12:00:00+00:00,29400.0,,,,,74.875,0.0,4.95,-52.635,45.11986720577385,12,4,99,1.2246467991473532e-16,-1.0,0.9911140639934547,-0.1330147065341959,0.8015410447678216,,29.4 +2026-04-09 13:00:00+00:00,26200.0,,,,,78.25,0.0,3.7375000000000003,-53.8366,42.65426949603052,13,4,99,-0.2588190451025208,-0.9659258262890683,0.9911140639934547,-0.1330147065341959,0.6661684533036092,,26.2 +2026-04-09 14:00:00+00:00,18900.0,,,,,81.875,0.0,3.5625,-56.659675,37.043009688142696,14,4,99,-0.4999999999999998,-0.8660254037844388,0.9911140639934547,-0.1330147065341959,0.48974745732018066,,18.9 +2026-04-09 15:00:00+00:00,5000.0,,,,,86.125,0.0,2.9375,-53.404925000000006,43.86866652508561,15,4,99,-0.7071067811865471,-0.7071067811865479,0.9911140639934547,-0.1330147065341959,0.28430085614432576,,5.0 +2026-04-09 16:00:00+00:00,100.0,,,,,87.375,0.0,1.6500000000000001,-45.584374999999994,59.61995570468974,16,4,99,-0.8660254037844384,-0.5000000000000004,0.9911140639934547,-0.1330147065341959,0.06382949612961802,,0.1 +2026-04-09 17:00:00+00:00,0.0,,,,,88.5,0.0,1.8375,-45.57125,59.62335719260251,17,4,99,-0.9659258262890683,-0.25881904510252063,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 18:00:00+00:00,0.0,,,,,87.5,0.0,2.0625,-45.541875,59.61757128338227,18,4,99,-1.0,-1.8369701987210297e-16,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 19:00:00+00:00,0.0,,,,,86.875,0.0,2.325,-45.514375,59.614561678020415,19,4,99,-0.9659258262890684,0.2588190451025203,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 20:00:00+00:00,0.0,,,,,87.5,0.0,1.425,-45.512499999999996,59.61835490573911,20,4,99,-0.8660254037844386,0.5000000000000001,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 21:00:00+00:00,0.0,,,,,86.25,0.0,2.25,-45.503750000000004,59.619489455350646,21,4,99,-0.7071067811865477,0.7071067811865474,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 22:00:00+00:00,0.0,,,,,88.25,0.0,2.1875,-45.48375,59.627082685499,22,4,99,-0.5000000000000004,0.8660254037844384,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-09 23:00:00+00:00,0.0,,,,,88.875,0.0,1.2625,-45.4825,59.623178413823815,23,4,99,-0.25881904510252157,0.9659258262890681,0.9911140639934547,-0.1330147065341959,0.0,0.0,0.0 +2026-04-10 00:00:00+00:00,0.0,,,,,86.75,0.0,1.3875,-45.485625,59.62657235435529,0,4,100,0.0,1.0,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 01:00:00+00:00,0.0,,,,,86.875,0.0,1.475,-45.47666666666667,59.63146317171834,1,4,100,0.25881904510252074,0.9659258262890683,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 02:00:00+00:00,0.0,,,,,88.625,0.0,2.2875,-45.47125,59.630881628146334,2,4,100,0.49999999999999994,0.8660254037844387,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 03:00:00+00:00,600.0,,,,,86.25,0.0,1.2,-45.4675,59.63354376243849,3,4,100,0.7071067811865475,0.7071067811865476,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.6 +2026-04-10 04:00:00+00:00,12100.0,,,,,82.75,0.0,1.275,-45.569374999999994,59.66048183872777,4,4,100,0.8660254037844386,0.5000000000000001,0.9886775902323405,-0.1500553983446526,0.06723249315702186,,12.1 +2026-04-10 05:00:00+00:00,20100.0,,,,,78.625,0.0,1.8625,-45.595,59.649861832754205,5,4,100,0.9659258262890683,0.25881904510252074,0.9886775902323405,-0.1500553983446526,0.2875138563454072,,20.1 +2026-04-10 06:00:00+00:00,31800.0,,,,,73.625,0.0,3.05,-45.615,59.64801725539584,6,4,100,1.0,6.123233995736766e-17,0.9886775902323405,-0.1500553983446526,0.492783408664669,,31.8 +2026-04-10 07:00:00+00:00,32400.0,,,,,66.875,0.0,4.025,-45.614374999999995,59.6689446157924,7,4,100,0.9659258262890683,-0.25881904510252063,0.9886775902323405,-0.1500553983446526,0.6690523693482235,,32.4 +2026-04-10 08:00:00+00:00,32400.0,,,,,64.125,0.0,4.575,-45.576875,59.677922962034295,8,4,100,0.8660254037844387,-0.49999999999999983,0.9886775902323405,-0.1500553983446526,0.8043083000237171,,32.4 +2026-04-10 09:00:00+00:00,32400.0,,,,,68.25,0.0,4.475,-45.92075,58.92281063462038,9,4,100,0.7071067811865476,-0.7071067811865475,0.9886775902323405,-0.1500553983446526,0.889333732536609,,32.4 +2026-04-10 10:00:00+00:00,30900.0,,,,,69.375,0.0,4.3,-47.128,56.30682787341751,10,4,100,0.49999999999999994,-0.8660254037844387,0.9886775902323405,-0.1500553983446526,0.9183343241723161,,30.9 +2026-04-10 11:00:00+00:00,29000.0,,,,,74.125,0.0,4.7875,-49.49125000000001,51.53705909747535,11,4,100,0.258819045102521,-0.9659258262890682,0.9886775902323405,-0.1500553983446526,0.889333732536609,,29.0 +2026-04-10 12:00:00+00:00,27100.0,,,,,77.125,0.0,4.6,-50.7445,48.89206354477858,12,4,100,1.2246467991473532e-16,-1.0,0.9886775902323405,-0.1500553983446526,0.8043083000237171,,27.1 +2026-04-10 13:00:00+00:00,23700.0,,,,,78.875,0.0,4.525,-53.33205,43.7788821405557,13,4,100,-0.2588190451025208,-0.9659258262890683,0.9886775902323405,-0.1500553983446526,0.6690523693482235,,23.7 +2026-04-10 14:00:00+00:00,17800.0,,,,,78.125,0.0,4.1625,-55.873374999999996,38.668485108192435,14,4,100,-0.4999999999999998,-0.8660254037844388,0.9886775902323405,-0.1500553983446526,0.492783408664669,,17.8 +2026-04-10 15:00:00+00:00,5600.0,,,,,78.875,0.0,3.9125,-55.474711538461534,39.76280846710673,15,4,100,-0.7071067811865471,-0.7071067811865479,0.9886775902323405,-0.1500553983446526,0.2875138563454072,,5.6 +2026-04-10 16:00:00+00:00,100.0,,,,,78.5,0.0,3.4375,-46.055833333333325,58.67088182063664,16,4,100,-0.8660254037844384,-0.5000000000000004,0.9886775902323405,-0.1500553983446526,0.06723249315702186,,0.1 +2026-04-10 17:00:00+00:00,0.0,,,,,77.75,0.0,3.6125,-45.559375,59.63575872099865,17,4,100,-0.9659258262890683,-0.25881904510252063,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 18:00:00+00:00,0.0,,,,,80.5,0.0,3.35,-45.550625,59.638593676655105,18,4,100,-1.0,-1.8369701987210297e-16,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 19:00:00+00:00,0.0,,,,,81.75,0.0,1.4375,-45.53750000000001,59.63264308106201,19,4,100,-0.9659258262890684,0.2588190451025203,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 20:00:00+00:00,0.0,,,,,86.125,0.0,0.7250000000000001,-45.51500000000001,59.62617507577245,20,4,100,-0.8660254037844386,0.5000000000000001,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 21:00:00+00:00,0.0,,,,,90.5,0.0,0.875,-45.49875,59.62475564240634,21,4,100,-0.7071067811865477,0.7071067811865474,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 22:00:00+00:00,0.0,,,,,91.375,0.0,0.675,-45.490624999999994,59.62804186423113,22,4,100,-0.5000000000000004,0.8660254037844384,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-10 23:00:00+00:00,0.0,,,,,92.0,0.0,1.2875,-45.483125,59.63161079267578,23,4,100,-0.25881904510252157,0.9659258262890681,0.9886775902323405,-0.1500553983446526,0.0,0.0,0.0 +2026-04-11 00:00:00+00:00,0.0,,,,,87.875,0.0,2.8875,-45.472500000000004,59.63818138715051,0,4,101,0.0,1.0,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 01:00:00+00:00,0.0,,,,,85.75,0.0,3.75,-45.46,59.64520656906694,1,4,101,0.25881904510252074,0.9659258262890683,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 02:00:00+00:00,0.0,,,,,85.75,0.0,3.325,-45.45645833333333,59.64313386166323,2,4,101,0.49999999999999994,0.8660254037844387,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 03:00:00+00:00,1700.0,,,,,85.25,0.0,3.2,-45.452999999999996,59.643852983075014,3,4,101,0.7071067811865475,0.7071067811865476,0.9859481499638304,-0.16705162550211924,0.0,0.0,1.7 +2026-04-11 04:00:00+00:00,17400.0,,,,,77.75,0.0,2.1875,-45.568333333333335,59.65855888427198,4,4,101,0.8660254037844386,0.5000000000000001,0.9859481499638304,-0.16705162550211924,0.07061269058365713,,17.4 +2026-04-11 05:00:00+00:00,28700.0,,,,,71.375,0.0,2.25,-45.61999999999999,59.66438486093134,5,4,101,0.9659258262890683,0.25881904510252074,0.9859481499638304,-0.16705162550211924,0.2906953871890112,,28.7 +2026-04-11 06:00:00+00:00,30400.0,,,,,67.625,0.0,3.375,-45.57750000000001,59.64232033547991,6,4,101,1.0,6.123233995736766e-17,0.9859481499638304,-0.16705162550211924,0.4957798117245632,,30.4 +2026-04-11 07:00:00+00:00,26300.0,,,,,65.25,0.0,5.0,-45.53625,59.63373131388532,7,4,101,0.9659258262890683,-0.25881904510252063,0.9859481499638304,-0.16705162550211924,0.6718897995762511,,26.3 +2026-04-11 08:00:00+00:00,26000.0,,,,,65.25,0.0,5.0875,-45.535000000000004,59.625776899201355,8,4,101,0.8660254037844387,-0.49999999999999983,0.9859481499638304,-0.16705162550211924,0.807023746107498,,26.0 +2026-04-11 09:00:00+00:00,24900.0,,,,,61.875,0.0,5.25,-45.899874999999994,58.84051488327721,9,4,101,0.7071067811865476,-0.7071067811865475,0.9859481499638304,-0.16705162550211924,0.8919724961816052,,24.9 +2026-04-11 10:00:00+00:00,26800.0,,,,,60.625,0.0,4.8374999999999995,-47.2325,56.19171991939738,10,4,101,0.49999999999999994,-0.8660254037844387,0.9859481499638304,-0.16705162550211924,0.9209469328654691,,26.8 +2026-04-11 11:00:00+00:00,24000.0,,,,,70.625,0.0,3.9,-49.48,51.43361332014957,11,4,101,0.258819045102521,-0.9659258262890682,0.9859481499638304,-0.16705162550211924,0.8919724961816052,,24.0 +2026-04-11 12:00:00+00:00,27200.0,,,,,72.625,0.0,3.6625,-50.7655,48.83071470396475,12,4,101,1.2246467991473532e-16,-1.0,0.9859481499638304,-0.16705162550211924,0.807023746107498,,27.2 +2026-04-11 13:00:00+00:00,24900.0,,,,,69.125,0.0,3.5,-53.268125,43.8408637087497,13,4,101,-0.2588190451025208,-0.9659258262890683,0.9859481499638304,-0.16705162550211924,0.6718897995762511,,24.9 +2026-04-11 14:00:00+00:00,18500.0,,,,,66.875,0.0,2.25,-55.867775,38.632326340374156,14,4,101,-0.4999999999999998,-0.8660254037844388,0.9859481499638304,-0.16705162550211924,0.4957798117245632,,18.5 +2026-04-11 15:00:00+00:00,6600.0,,,,,73.25,0.0,1.8624999999999998,-55.476423076923076,39.74051040602474,15,4,101,-0.7071067811865471,-0.7071067811865479,0.9859481499638304,-0.16705162550211924,0.2906953871890112,,6.6 +2026-04-11 16:00:00+00:00,0.0,,,,,75.625,0.0,1.8,-45.77875,59.2033863931504,16,4,101,-0.8660254037844384,-0.5000000000000004,0.9859481499638304,-0.16705162550211924,0.07061269058365713,,0.0 +2026-04-11 17:00:00+00:00,0.0,,,,,75.625,0.0,1.7375,-45.49687499999999,59.750508204777354,17,4,101,-0.9659258262890683,-0.25881904510252063,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 18:00:00+00:00,0.0,,,,,79.0,0.0,1.325,-45.470625,59.73712882199674,18,4,101,-1.0,-1.8369701987210297e-16,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 19:00:00+00:00,0.0,,,,,78.875,0.0,1.4,-45.45625000000001,59.73690001093685,19,4,101,-0.9659258262890684,0.2588190451025203,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 20:00:00+00:00,0.0,,,,,81.25,0.0,1.3625,-45.448750000000004,59.74035432952057,20,4,101,-0.8660254037844386,0.5000000000000001,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 21:00:00+00:00,0.0,,,,,81.625,0.0,1.6749999999999998,-45.436249999999994,59.7427350011419,21,4,101,-0.7071067811865477,0.7071067811865474,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 22:00:00+00:00,0.0,,,,,85.0,0.0,1.1375,-45.43249999999999,59.743698517082116,22,4,101,-0.5000000000000004,0.8660254037844384,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-11 23:00:00+00:00,0.0,,,,,87.0,0.0,1.8125,-45.426874999999995,59.74675721238629,23,4,101,-0.25881904510252157,0.9659258262890681,0.9859481499638304,-0.16705162550211924,0.0,0.0,0.0 +2026-04-12 00:00:00+00:00,0.0,,,,,86.625,0.0,2.2375,-45.419375,59.75032637201658,0,4,102,0.0,1.0,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 01:00:00+00:00,0.0,,,,,84.5,0.0,2.3625,-45.410624999999996,59.754858183770295,1,4,102,0.25881904510252074,0.9659258262890683,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 02:00:00+00:00,0.0,,,,,82.75,0.0,3.5,-45.410624999999996,59.75638684048062,2,4,102,0.49999999999999994,0.8660254037844387,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 03:00:00+00:00,2100.0,,,,,79.125,0.0,2.7624999999999997,-45.408125,59.75661390782752,3,4,102,0.7071067811865475,0.7071067811865476,0.9829265519799822,-0.18399835165768005,0.0,0.0,2.1 +2026-04-12 04:00:00+00:00,19100.0,,,,,78.625,0.0,2.125,-45.565,59.80733006218106,4,4,102,0.8660254037844386,0.5000000000000001,0.9829265519799822,-0.18399835165768005,0.07396899218953405,,19.1 +2026-04-12 05:00:00+00:00,29500.0,,,,,78.25,0.0,2.3875,-45.571875,59.7768920087785,5,4,102,0.9659258262890683,0.25881904510252074,0.9829265519799822,-0.18399835165768005,0.293844595629509,,29.5 +2026-04-12 06:00:00+00:00,31900.0,,,,,82.25,0.0,2.7625,-45.57625,59.77468003190537,6,4,102,1.0,6.123233995736766e-17,0.9829265519799822,-0.18399835165768005,0.4987360400566649,,31.9 +2026-04-12 07:00:00+00:00,32400.0,,,,,77.0,0.0,4.9,-45.56125,59.76502340764761,7,4,102,0.9659258262890683,-0.25881904510252063,0.9829265519799822,-0.18399835165768005,0.6746803121324121,,32.4 +2026-04-12 08:00:00+00:00,32300.0,,,,,76.625,0.0,4.5249999999999995,-45.531875,59.77902800366112,8,4,102,0.8660254037844387,-0.49999999999999983,0.9829265519799822,-0.18399835165768005,0.8096871004764459,,32.3 +2026-04-12 09:00:00+00:00,32300.0,,,,,73.875,0.0,5.1875,-46.018249999999995,58.75740609418243,9,4,102,0.7071067811865476,-0.7071067811865475,0.9829265519799822,-0.18399835165768005,0.894555915572387,,32.3 +2026-04-12 10:00:00+00:00,31100.0,,,,,70.25,0.0,5.4625,-47.362874999999995,55.896131691401514,10,4,102,0.49999999999999994,-0.8660254037844387,0.9829265519799822,-0.18399835165768005,0.9235030879237955,,31.1 +2026-04-12 11:00:00+00:00,29000.0,,,,,69.0,0.0,5.35,-49.434375,51.61213579912854,11,4,102,0.258819045102521,-0.9659258262890682,0.9829265519799822,-0.18399835165768005,0.894555915572387,,29.0 +2026-04-12 12:00:00+00:00,27000.0,,,,,69.25,0.0,4.4875,-50.72350000000001,49.00034693584662,12,4,102,1.2246467991473532e-16,-1.0,0.9829265519799822,-0.18399835165768005,0.8096871004764459,,27.0 +2026-04-12 13:00:00+00:00,24800.0,,,,,68.125,0.0,4.6875,-53.56227499999999,43.310495391253994,13,4,102,-0.2588190451025208,-0.9659258262890683,0.9829265519799822,-0.18399835165768005,0.6746803121324121,,24.8 +2026-04-12 14:00:00+00:00,18600.0,,,,,71.375,0.0,3.475,-55.82722499999999,38.7754356709137,14,4,102,-0.4999999999999998,-0.8660254037844388,0.9829265519799822,-0.18399835165768005,0.4987360400566649,,18.6 +2026-04-12 15:00:00+00:00,6600.0,,,,,73.5,0.0,2.6875,-55.473803571428576,39.64136087666942,15,4,102,-0.7071067811865471,-0.7071067811865479,0.9829265519799822,-0.18399835165768005,0.293844595629509,,6.6 +2026-04-12 16:00:00+00:00,200.0,,,,,76.75,0.0,2.3,-45.84525,59.131868447422946,16,4,102,-0.8660254037844384,-0.5000000000000004,0.9829265519799822,-0.18399835165768005,0.07396899218953405,,0.2 +2026-04-12 17:00:00+00:00,0.0,,,,,80.125,0.0,3.075,-45.55437499999999,59.68403347263403,17,4,102,-0.9659258262890683,-0.25881904510252063,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 18:00:00+00:00,0.0,,,,,81.125,0.0,3.1,-45.538125,59.68726816272601,18,4,102,-1.0,-1.8369701987210297e-16,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 19:00:00+00:00,0.0,,,,,81.5,0.0,2.325,-45.52562499999999,59.683356151966684,19,4,102,-0.9659258262890684,0.2588190451025203,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 20:00:00+00:00,0.0,,,,,81.125,0.0,1.725,-45.49875,59.668057391846325,20,4,102,-0.8660254037844386,0.5000000000000001,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 21:00:00+00:00,0.0,14.8875,14.9375,14.7875,0.0,79.75,0.0,2.075,-45.49375,59.66834135801554,21,4,102,-0.7071067811865477,0.7071067811865474,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 22:00:00+00:00,0.0,14.6,14.7125,14.525,0.0,78.875,0.0,1.9,-45.499375,59.668397008487666,22,4,102,-0.5000000000000004,0.8660254037844384,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-12 23:00:00+00:00,0.0,14.375,14.4375,14.2875,0.0,79.0,0.0,2.05,-45.5,59.668849634182386,23,4,102,-0.25881904510252157,0.9659258262890681,0.9829265519799822,-0.18399835165768005,0.0,0.0,0.0 +2026-04-13 00:00:00+00:00,0.0,14.575,14.6625,14.525,0.0,80.625,0.0,1.2375,-45.501875,59.67615724247974,0,4,103,0.0,1.0,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 01:00:00+00:00,0.0,14.175,14.25,14.1,0.0,82.625,0.0,1.2375,-45.475625,59.680064104879285,1,4,103,0.25881904510252074,0.9659258262890683,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 02:00:00+00:00,0.0,14.2,14.3125,14.1125,13.75,81.75,0.0,1.2125,-45.4675,59.68646374318608,2,4,103,0.49999999999999994,0.8660254037844387,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 03:00:00+00:00,1800.0,15.337499999999999,15.5625,15.1375,178.375,75.25,0.0,1.1625,-45.46375,59.68754003489059,3,4,103,0.7071067811865475,0.7071067811865476,0.9796136916454901,-0.20089055513063506,0.0,0.0,1.8 +2026-04-13 04:00:00+00:00,18200.0,16.425,16.6375,16.275,278.875,68.375,0.0,1.7000000000000002,-45.584999999999994,59.7227794340931,4,4,103,0.8660254037844386,0.5000000000000001,0.9796136916454901,-0.20089055513063506,0.07730031686103792,1.5,18.2 +2026-04-13 05:00:00+00:00,29100.0,17.025,17.25,16.75,407.375,65.125,0.0,1.85,-45.609375,59.705833340602766,5,4,103,0.9659258262890683,0.25881904510252074,0.9796136916454901,-0.20089055513063506,0.2969606538170406,1.3718147329072974,29.1 +2026-04-13 06:00:00+00:00,31800.0,18.112499999999997,18.487499999999997,17.712500000000002,759.25,59.0,0.0,2.1,-45.699999999999996,59.742330783959204,6,4,103,1.0,6.123233995736766e-17,0.9796136916454901,-0.20089055513063506,0.5016515018153622,1.5,31.8 +2026-04-13 07:00:00+00:00,32400.0,18.475,18.837500000000002,18.15,870.5,58.25,0.0,2.375,-45.644999999999996,59.69640849749673,7,4,103,0.9659258262890683,-0.25881904510252063,0.9796136916454901,-0.20089055513063506,0.677423517832537,1.2850159126232057,32.4 +2026-04-13 08:00:00+00:00,32400.0,18.975,19.275,18.487499999999997,980.625,56.75,0.0,2.6624999999999996,-45.613125,59.64762667725487,8,4,103,0.8660254037844387,-0.49999999999999983,0.9796136916454901,-0.20089055513063506,0.8122981294539853,1.2072230187938036,32.4 +2026-04-13 09:00:00+00:00,32400.0,19.275,19.5625,18.95,970.75,54.25,0.0,3.575,-56.004375,38.57580115688893,9,4,103,0.7071067811865476,-0.7071067811865475,0.9796136916454901,-0.20089055513063506,0.8970838547885398,1.0821173459072282,32.4 +2026-04-13 10:00:00+00:00,32400.0,19.4,19.674999999999997,19.1125,880.25,54.5,0.0,3.3125,-45.805294913419914,22.22287036273358,10,4,103,0.49999999999999994,-0.8660254037844387,0.9796136916454901,-0.20089055513063506,0.9260026867696864,0.9505911943632773,32.4 +2026-04-13 11:00:00+00:00,32400.0,19.3,19.5875,19.0125,735.125,54.375,0.0,3.125,-36.718459821428574,10.254078569195089,11,4,103,0.258819045102521,-0.9659258262890682,0.9796136916454901,-0.20089055513063506,0.8970838547885398,0.8194607405717755,32.4 +2026-04-13 12:00:00+00:00,32500.0,18.6625,18.8625,18.4125,538.375,57.25,0.0,2.725,-45.20510784313725,12.64620917676454,12,4,103,1.2246467991473532e-16,-1.0,0.9796136916454901,-0.20089055513063506,0.8122981294539853,0.6627800563345968,32.5 +2026-04-13 13:00:00+00:00,32300.0,17.7875,18.0,17.6,314.0,59.25,0.0,2.725,-57.02116071428571,12.730616098452323,13,4,103,-0.2588190451025208,-0.9659258262890683,0.9796136916454901,-0.20089055513063506,0.677423517832537,0.46352096101514834,32.3 +2026-04-13 14:00:00+00:00,28100.0,16.5375,16.675,16.4375,91.75,63.0,0.0,2.6,-65.72220238095238,11.889052535655575,14,4,103,-0.4999999999999998,-0.8660254037844388,0.9796136916454901,-0.20089055513063506,0.5016515018153622,0.18289589419742133,28.1 +2026-04-13 15:00:00+00:00,11100.0,15.775,15.862499999999999,15.7,2.0,67.125,0.0,1.4875,-65.71552884615384,13.385567733742578,15,4,103,-0.7071067811865471,-0.7071067811865479,0.9796136916454901,-0.20089055513063506,0.2969606538170406,0.006734898964871666,11.1 +2026-04-13 16:00:00+00:00,200.0,15.3875,15.525,15.3375,0.0,69.875,0.0,1.475,-55.292791666666666,34.41709254468144,16,4,103,-0.8660254037844384,-0.5000000000000004,0.9796136916454901,-0.20089055513063506,0.07730031686103792,0.0,0.2 +2026-04-13 17:00:00+00:00,0.0,14.1625,14.4,14.0125,0.0,75.75,0.0,0.5,-54.57366666666667,35.81441777335553,17,4,103,-0.9659258262890683,-0.25881904510252063,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 18:00:00+00:00,0.0,13.0,13.125,12.925,0.0,80.75,0.0,0.8500000000000001,-54.5616875,35.805555634667805,18,4,103,-1.0,-1.8369701987210297e-16,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 19:00:00+00:00,0.0,12.7,12.775,12.625,0.0,82.0,0.0,0.9750000000000001,-54.54675,35.802079160992875,19,4,103,-0.9659258262890684,0.2588190451025203,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 20:00:00+00:00,0.0,13.4,13.6,13.125,0.0,74.125,0.0,1.15,-54.541625,35.80219821783527,20,4,103,-0.8660254037844386,0.5000000000000001,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 21:00:00+00:00,0.0,13.3,13.6375,12.975,0.0,70.25,0.0,0.8125,-54.53193749999999,35.796509327246206,21,4,103,-0.7071067811865477,0.7071067811865474,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 22:00:00+00:00,0.0,12.375,12.5625,12.1875,0.0,59.125,0.0,0.8625,-54.518499999999996,35.79507000272523,22,4,103,-0.5000000000000004,0.8660254037844384,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-13 23:00:00+00:00,0.0,11.075,11.2875,10.9125,0.0,60.125,0.0,0.8999999999999999,-54.5058125,35.79372299101187,23,4,103,-0.25881904510252157,0.9659258262890681,0.9796136916454901,-0.20089055513063506,0.0,0.0,0.0 +2026-04-14 00:00:00+00:00,0.0,11.8,12.0125,11.475,0.0,60.125,0.0,1.475,-54.504374999999996,35.79823554631103,0,4,104,0.0,1.0,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 01:00:00+00:00,0.0,13.0375,13.2375,12.825,0.0,58.125,0.0,2.1375,-54.4941875,35.795259674161116,1,4,104,0.25881904510252074,0.9659258262890683,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 02:00:00+00:00,0.0,13.8125,13.925,13.6625,22.25,57.0,0.0,2.7625,4.910359170751633,4.4797120488022335,2,4,104,0.49999999999999994,0.8660254037844387,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 03:00:00+00:00,1700.0,14.8375,15.0375,14.675,184.625,52.75,0.0,2.7125,56.27770394736842,19.271988640449283,3,4,104,0.7071067811865475,0.7071067811865476,0.9760105506323683,-0.21772323039653177,0.0,0.0,1.7 +2026-04-14 04:00:00+00:00,18900.0,16.0,16.1125,15.85,408.625,47.125,0.0,3.3875,48.51168365717935,3.037111065815917,4,4,104,0.8660254037844386,0.5000000000000001,0.9760105506323683,-0.21772323039653177,0.08060559914036461,1.5,18.9 +2026-04-14 05:00:00+00:00,29000.0,17.5375,17.7875,17.3125,620.5,43.875,0.0,4.2875,33.67939992877493,6.854184272432337,5,4,104,0.9659258262890683,0.25881904510252074,0.9760105506323683,-0.21772323039653177,0.3000427593095103,1.5,29.0 +2026-04-14 06:00:00+00:00,32000.0,19.637500000000003,19.8,19.4375,787.625,39.875,0.0,4.95,18.84775925925926,11.480427226364629,6,4,104,1.0,6.123233995736766e-17,0.9760105506323683,-0.21772323039653177,0.5045256396501822,1.5,32.0 +2026-04-14 07:00:00+00:00,32400.0,21.5125,21.725,21.237499999999997,929.5,34.875,0.0,5.3875,4.364336038961039,11.401495481862835,7,4,104,0.9659258262890683,-0.25881904510252063,0.9760105506323683,-0.21772323039653177,0.6801190697911004,1.366672456758928,32.4 +2026-04-14 08:00:00+00:00,32400.0,23.383333333333336,23.633333333333336,23.099999999999998,982.3333333333334,31.666666666666668,0.0,4.6000000000000005,-8.124625612745097,9.824028220403656,8,4,104,0.8660254037844387,-0.49999999999999983,0.9760105506323683,-0.21772323039653177,0.8148566476500252,1.2055290168722268,32.4 +2026-04-14 09:00:00+00:00,32300.0,22.75,23.125,22.425,873.75,40.0,0.0,3.5,-18.16218468137255,10.283345114279207,9,4,104,0.7071067811865476,-0.7071067811865475,0.9760105506323683,-0.21772323039653177,0.8995562299602461,0.9713122658698206,32.3 +2026-04-14 10:00:00+00:00,32200.0,21.0,21.15,20.65,741.0,51.0,0.0,2.5,-26.848933333333335,11.615493909066657,10,4,104,0.49999999999999994,-0.8660254037844387,0.9760105506323683,-0.21772323039653177,0.9284456801599995,0.7981080808866525,32.2 +2026-04-14 11:00:00+00:00,32100.0,22.099999999999998,22.383333333333336,21.766666666666666,577.8333333333334,42.0,0.0,1.5833333333333333,-36.065312500000005,11.253824144423891,11,4,104,0.258819045102521,-0.9659258262890682,0.9760105506323683,-0.21772323039653177,0.8995562299602461,0.6423537674336038,32.1 +2026-04-14 12:00:00+00:00,31600.0,21.3875,21.6625,21.125,309.125,42.75,0.0,1.375,-44.53159803921569,13.727748488816943,12,4,104,1.2246467991473532e-16,-1.0,0.9760105506323683,-0.21772323039653177,0.8148566476500252,0.3793612053009438,31.6 +2026-04-14 13:00:00+00:00,31600.0,20.75,20.95,20.525,277.625,47.125,0.0,1.5125,-56.062723684210525,14.102969821560908,13,4,104,-0.2588190451025208,-0.9659258262890683,0.9760105506323683,-0.21772323039653177,0.6801190697911004,0.408200581826463,31.6 +2026-04-14 14:00:00+00:00,25300.0,19.675,19.8125,19.5875,92.0,52.5,0.0,1.0625,-65.05350892857143,13.204424517386315,14,4,104,-0.4999999999999998,-0.8660254037844388,0.9760105506323683,-0.21772323039653177,0.5045256396501822,0.18234950371162328,25.3 +2026-04-14 15:00:00+00:00,12400.0,18.337500000000002,18.4875,18.2375,2.625,61.5,0.0,1.225,-64.64725961538463,15.712112873075576,15,4,104,-0.7071067811865471,-0.7071067811865479,0.9760105506323683,-0.21772323039653177,0.3000427593095103,0.008748753031204365,12.4 +2026-04-14 16:00:00+00:00,0.0,17.5125,17.75,17.2875,0.0,63.625,0.0,1.7125,-54.758874999999996,35.680971808923125,16,4,104,-0.8660254037844384,-0.5000000000000004,0.9760105506323683,-0.21772323039653177,0.08060559914036461,0.0,0.0 +2026-04-14 17:00:00+00:00,0.0,17.25,17.375,17.2,0.0,81.25,0.0,2.7625,-54.034437499999996,37.08611047861843,17,4,104,-0.9659258262890683,-0.25881904510252063,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 18:00:00+00:00,0.0,17.5625,17.95,17.0375,0.0,60.25,0.0,1.8125,-54.029250000000005,37.088366658787585,18,4,104,-1.0,-1.8369701987210297e-16,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 19:00:00+00:00,0.0,21.75,21.987499999999997,21.525,0.0,33.875,0.0,2.5625,-54.023624999999996,37.08448258228545,19,4,104,-0.9659258262890684,0.2588190451025203,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 20:00:00+00:00,0.0,20.575,20.8375,20.325,0.0,36.625,0.0,1.8,-54.00258333333334,37.072071498811106,20,4,104,-0.8660254037844386,0.5000000000000001,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 21:00:00+00:00,0.0,21.475,21.6125,21.3375,0.0,32.75,0.0,2.45,-53.9935,37.067961444712154,21,4,104,-0.7071067811865477,0.7071067811865474,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 22:00:00+00:00,0.0,20.95,21.1125,20.7875,0.0,33.25,0.0,1.8625,-54.0100625,37.07824456491468,22,4,104,-0.5000000000000004,0.8660254037844384,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-14 23:00:00+00:00,0.0,20.875,21.125,20.675,0.0,32.5,0.0,1.85,-54.0285,37.091392440385235,23,4,104,-0.25881904510252157,0.9659258262890681,0.9760105506323683,-0.21772323039653177,0.0,0.0,0.0 +2026-04-15 00:00:00+00:00,0.0,20.8875,21.05,20.7375,0.0,30.5,0.0,2.275,-54.02125,37.08759993245721,0,4,105,0.0,1.0,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 01:00:00+00:00,0.0,21.5625,21.650000000000002,21.424999999999997,0.0,27.5,0.0,2.4125,-54.014125,37.08185124013947,1,4,105,0.25881904510252074,0.9659258262890683,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 02:00:00+00:00,0.0,21.1125,21.3,20.975,16.125,28.75,0.0,2.875,0.5034014705882348,0.8694678846563211,2,4,105,0.49999999999999994,0.8660254037844387,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 03:00:00+00:00,300.0,20.575,20.7,20.487499999999997,117.375,31.375,0.0,2.5125,56.251283799533795,19.71701511786765,3,4,105,0.7071067811865475,0.7071067811865476,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.3 +2026-04-15 04:00:00+00:00,4000.0,21.5625,21.6875,21.412499999999998,295.875,31.125,0.0,2.6875,48.521049648786715,3.341333508780211,4,4,105,0.8660254037844386,0.5000000000000001,0.9721181966290613,-0.23449138957040985,0.08388378974756476,1.5,4.0 +2026-04-15 05:00:00+00:00,9400.0,22.3625,22.450000000000003,22.2875,378.625,32.0,0.0,3.0125,33.56606216931217,6.62576703650562,5,4,105,0.9659258262890683,0.25881904510252074,0.9721181966290613,-0.23449138957040985,0.3030901352453401,1.2492158469410999,9.4 +2026-04-15 06:00:00+00:00,16100.0,22.825,22.975,22.725,352.375,32.75,0.0,2.825,19.316785291248607,12.21887490741493,6,4,105,1.0,6.123233995736766e-17,0.9721181966290613,-0.23449138957040985,0.5073579305530562,0.6945294017891593,16.1 +2026-04-15 07:00:00+00:00,26200.0,23.9875,24.1,23.825,434.0,32.0,0.0,2.975,4.56413143939394,11.099041025183267,7,4,105,0.9659258262890683,-0.25881904510252063,0.9721181966290613,-0.23449138957040985,0.6827666629889845,0.6356490782664385,26.2 +2026-04-15 08:00:00+00:00,29600.0,25.7,26.0125,25.424999999999997,710.0,31.5,0.0,3.6999999999999997,-7.912347222222222,9.847114660574594,8,4,105,0.8660254037844387,-0.49999999999999983,0.9721181966290613,-0.23449138957040985,0.8173625173142527,0.8686476134640575,29.6 +2026-04-15 09:00:00+00:00,31700.0,27.3875,27.65,27.15,838.875,29.75,0.0,4.2875,-17.73884145658263,10.321207391338307,9,4,105,0.7071067811865476,-0.7071067811865475,0.9721181966290613,-0.23449138957040985,0.9019730084867599,0.9300444604294541,31.7 +2026-04-15 10:00:00+00:00,28300.0,28.6375,28.85,28.3625,721.125,28.0,0.0,4.3125,-25.68845879120879,12.695117672947116,10,4,105,0.49999999999999994,-0.8660254037844387,0.9721181966290613,-0.23449138957040985,0.9308320713585476,0.7747100923881141,28.3 +2026-04-15 11:00:00+00:00,31800.0,28.6125,28.825000000000003,28.4625,525.875,28.5,0.0,4.5,-37.09172916666667,7.653291050555564,11,4,105,0.258819045102521,-0.9659258262890682,0.9721181966290613,-0.23449138957040985,0.9019730084867599,0.5830274243818676,31.8 +2026-04-15 12:00:00+00:00,28400.0,28.425,28.575,28.3,366.375,28.875,0.0,4.0875,-43.157068014705885,15.609759614912193,12,4,105,1.2246467991473532e-16,-1.0,0.9721181966290613,-0.23449138957040985,0.8173625173142527,0.44824052025759725,28.4 +2026-04-15 13:00:00+00:00,19200.0,28.175,28.3375,28.0,216.875,29.25,0.0,3.1,-54.23732050715023,16.791931812148697,13,4,105,-0.2588190451025208,-0.9659258262890683,0.9721181966290613,-0.23449138957040985,0.6827666629889845,0.3176414604816448,19.2 +2026-04-15 14:00:00+00:00,15000.0,26.875,27.0125,26.775000000000002,43.75,31.375,0.0,2.0,-63.646517857142854,15.331552411664502,14,4,105,-0.4999999999999998,-0.8660254037844388,0.9721181966290613,-0.23449138957040985,0.5073579305530562,0.08623103605044546,15.0 +2026-04-15 15:00:00+00:00,4000.0,26.2375,26.375,26.0875,2.0,30.875,0.0,1.8875,-64.53033928571429,15.839185462867901,15,4,105,-0.7071067811865471,-0.7071067811865479,0.9721181966290613,-0.23449138957040985,0.3030901352453401,0.006598697111606998,4.0 +2026-04-15 16:00:00+00:00,0.0,25.7875,25.95,25.575,0.0,29.75,0.0,1.95,-53.786325,37.1883181347203,16,4,105,-0.8660254037844384,-0.5000000000000004,0.9721181966290613,-0.23449138957040985,0.08388378974756476,0.0,0.0 +2026-04-15 17:00:00+00:00,0.0,26.1125,26.275,25.9375,0.0,26.875,0.0,2.075,-52.929575,38.918356376597316,17,4,105,-0.9659258262890683,-0.25881904510252063,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 18:00:00+00:00,0.0,26.2125,26.35,26.025,0.0,25.25,0.0,2.6875,-52.915000000000006,38.91069085097308,18,4,105,-1.0,-1.8369701987210297e-16,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 19:00:00+00:00,0.0,26.325,26.475,26.2,0.0,22.25,0.0,3.4375,-52.93175,38.927308909256325,19,4,105,-0.9659258262890684,0.2588190451025203,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 20:00:00+00:00,0.0,26.075,26.1375,25.975,0.0,22.0,0.0,4.45,-52.93275,38.92701064492366,20,4,105,-0.8660254037844386,0.5000000000000001,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 21:00:00+00:00,0.0,25.4125,25.575,25.325,0.0,22.125,0.0,4.025,-52.976208333333325,38.958111282878775,21,4,105,-0.7071067811865477,0.7071067811865474,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 22:00:00+00:00,0.0,24.5625,24.725,24.4,0.0,23.5,0.0,3.3,-52.99960000000001,38.97532222282881,22,4,105,-0.5000000000000004,0.8660254037844384,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-15 23:00:00+00:00,0.0,24.1125,24.2,24.0125,0.0,24.5,0.0,4.5,-52.9755,38.959019303289374,23,4,105,-0.25881904510252157,0.9659258262890681,0.9721181966290613,-0.23449138957040985,0.0,0.0,0.0 +2026-04-16 00:00:00+00:00,0.0,23.8375,23.95,23.7375,0.0,26.75,0.0,4.5375,-52.97187499999999,38.9595382188902,0,4,106,0.0,1.0,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 01:00:00+00:00,0.0,23.55,23.6375,23.525,0.0,28.5,0.0,3.875,-52.978125,38.96389671729245,1,4,106,0.25881904510252074,0.9659258262890683,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 02:00:00+00:00,0.0,23.137500000000003,23.25,23.025,18.0,30.5,0.0,3.75,3.177734375,4.498701397224896,2,4,106,0.49999999999999994,0.8660254037844387,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 03:00:00+00:00,900.0,23.525,23.65,23.4125,159.75,32.125,0.0,4.4125,56.86934232026144,18.373914297754798,3,4,106,0.7071067811865475,0.7071067811865476,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.9 +2026-04-16 04:00:00+00:00,13700.0,24.0,24.125,23.875,345.25,33.5,0.0,5.3625,48.26827586206897,3.082694167342877,4,4,106,0.8660254037844386,0.5000000000000001,0.9679377830240642,-0.25119006388481935,0.08713385607451075,1.5,13.7 +2026-04-16 05:00:00+00:00,26500.0,25.512500000000003,25.7125,25.35,595.5,33.5,0.0,5.6875,33.8265142958893,6.5035808443200045,5,4,106,0.9659258262890683,0.25881904510252074,0.9679377830240642,-0.25119006388481935,0.30610203047689044,1.5,26.5 +2026-04-16 06:00:00+00:00,28700.0,26.8375,27.0875,26.625,762.0,33.0,0.0,6.125,20.310585497181965,13.657326591163223,6,4,106,1.0,6.123233995736766e-17,0.9679377830240642,-0.25119006388481935,0.5101478856557659,1.4936845205591565,28.7 +2026-04-16 07:00:00+00:00,32200.0,28.225,28.5125,27.9875,885.875,33.0,0.0,5.75,6.088132675438597,13.868047286889574,7,4,106,0.9659258262890683,-0.25881904510252063,0.9679377830240642,-0.25119006388481935,0.6853660337824152,1.292557489479032,32.2 +2026-04-16 08:00:00+00:00,32400.0,29.362499999999997,29.625,29.1375,928.625,32.25,0.0,5.5375,-6.327766666666667,12.56090576051124,8,4,106,0.8660254037844387,-0.49999999999999983,0.9679377830240642,-0.25119006388481935,0.8198156476236884,1.1327241712105711,32.4 +2026-04-16 09:00:00+00:00,32400.0,30.75,31.0875,30.525,914.875,31.0,0.0,4.725,-16.168977815934063,13.008317074078828,9,4,106,0.7071067811865476,-0.7071067811865475,0.9679377830240642,-0.25119006388481935,0.904334208184795,1.0116558587741171,32.4 +2026-04-16 10:00:00+00:00,32300.0,31.6625,31.925,31.425,831.25,31.0,0.0,4.7,-24.705528846153847,14.0587965817069,10,4,106,0.49999999999999994,-0.8660254037844387,0.9679377830240642,-0.25119006388481935,0.9331619152370207,0.890788604235809,32.3 +2026-04-16 11:00:00+00:00,32200.0,31.3375,31.625,31.025,683.125,32.375,0.0,3.4875,-33.932053571428575,14.003311307791032,11,4,106,0.258819045102521,-0.9659258262890682,0.9679377830240642,-0.25119006388481935,0.904334208184795,0.7553899806258437,32.2 +2026-04-16 12:00:00+00:00,32200.0,28.475,28.725,28.2375,496.75,36.625,0.0,1.9124999999999999,-42.58558639705882,16.436674378220253,12,4,106,1.2246467991473532e-16,-1.0,0.9679377830240642,-0.25119006388481935,0.8198156476236884,0.6059289078463871,32.2 +2026-04-16 13:00:00+00:00,30700.0,26.9625,27.2,26.8375,283.75,32.875,0.0,1.9375,-53.78299840510366,17.22895470029489,13,4,106,-0.2588190451025208,-0.9659258262890683,0.9679377830240642,-0.25119006388481935,0.6853660337824152,0.4140123467076905,30.7 +2026-04-16 14:00:00+00:00,24900.0,25.825,26.025,25.6875,85.0,33.75,0.0,1.8875,-63.44611607142858,15.585687303820187,14,4,106,-0.4999999999999998,-0.8660254037844388,0.9679377830240642,-0.25119006388481935,0.5101478856557659,0.16661835203087705,24.9 +2026-04-16 15:00:00+00:00,9500.0,24.4,24.6125,24.1625,1.875,37.125,0.0,1.95,-63.81961538461538,17.279560428568097,15,4,106,-0.7071067811865471,-0.7071067811865479,0.9679377830240642,-0.25119006388481935,0.30610203047689044,0.006125408567459847,9.5 +2026-04-16 16:00:00+00:00,0.0,24.2125,24.4125,24.0,0.0,42.625,0.0,1.5125,-53.29087500000001,38.37283177017954,16,4,106,-0.8660254037844384,-0.5000000000000004,0.9679377830240642,-0.25119006388481935,0.08713385607451075,0.0,0.0 +2026-04-16 17:00:00+00:00,0.0,26.425,26.75,26.0625,0.0,39.125,0.0,2.2,-52.546937500000006,39.81508266367942,17,4,106,-0.9659258262890683,-0.25881904510252063,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 18:00:00+00:00,0.0,27.1375,27.35,26.95,0.0,36.375,0.0,2.9749999999999996,-52.553374999999996,39.822540483531434,18,4,106,-1.0,-1.8369701987210297e-16,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 19:00:00+00:00,0.0,26.375,26.475,26.275,0.0,38.25,0.0,3.6,-52.517375,39.849124635670066,19,4,106,-0.9659258262890684,0.2588190451025203,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 20:00:00+00:00,0.0,25.387500000000003,25.525,25.325,0.0,37.625,0.0,3.6125,-52.54275,39.8739327265738,20,4,106,-0.8660254037844386,0.5000000000000001,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 21:00:00+00:00,0.0,24.3,24.4125,24.1625,0.0,40.875,0.0,3.775,-52.5560625,39.886259579780415,21,4,106,-0.7071067811865477,0.7071067811865474,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 22:00:00+00:00,0.0,23.5875,23.7,23.487499999999997,0.0,44.625,0.0,4.225,-52.537,39.8738665063556,22,4,106,-0.5000000000000004,0.8660254037844384,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-16 23:00:00+00:00,0.0,23.0625,23.2125,22.975,0.0,48.0,0.0,4.5,-52.5166875,39.87740046242514,23,4,106,-0.25881904510252157,0.9659258262890681,0.9679377830240642,-0.25119006388481935,0.0,0.0,0.0 +2026-04-17 00:00:00+00:00,0.0,22.7,22.75,22.6125,0.0,50.375,0.0,4.6,-52.5506875,39.90356863498918,0,4,107,0.0,1.0,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 01:00:00+00:00,0.0,22.7,22.7625,22.6375,0.0,52.25,0.0,5.0,-52.57725000000001,39.920962447691565,1,4,107,0.25881904510252074,0.9659258262890683,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 02:00:00+00:00,0.0,22.7375,22.8125,22.625,20.75,53.375,0.0,5.1625,10.7904375,6.473946715932189,2,4,107,0.49999999999999994,0.8660254037844387,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 03:00:00+00:00,1200.0,23.0,23.1,22.925,156.625,54.875,0.0,5.3375,57.515276754385965,15.739982097176362,3,4,107,0.7071067811865475,0.7071067811865476,0.9634705485641488,-0.2678143051621742,0.0,0.0,1.2 +2026-04-17 04:00:00+00:00,13600.0,24.0875,24.2125,23.925,378.375,54.0,0.0,5.4875,48.08682391443167,3.0052640795081342,4,4,107,0.8660254037844386,0.5000000000000001,0.9634705485641488,-0.2678143051621742,0.0903547826501758,1.5,13.6 +2026-04-17 05:00:00+00:00,24700.0,25.525,25.712500000000002,25.2875,469.0,51.125,0.0,6.1,33.818346560846564,6.481869633934113,5,4,107,0.9659258262890683,0.25881904510252074,0.9634705485641488,-0.2678143051621742,0.30907771966454367,1.5,24.7 +2026-04-17 06:00:00+00:00,30800.0,26.7625,26.9375,26.55,652.0,48.625,0.0,6.2375,20.323865365612647,13.62102552003458,6,4,107,1.0,6.123233995736766e-17,0.9634705485641488,-0.2678143051621742,0.5128950499781263,1.2712152320982748,30.8 +2026-04-17 07:00:00+00:00,32300.0,28.1,28.3375,27.9,679.375,46.125,0.0,5.45,6.403258885850991,13.944227822450278,7,4,107,0.9659258262890683,-0.25881904510252063,0.9634705485641488,-0.2678143051621742,0.6879169593541165,0.9875828626726452,32.3 +2026-04-17 08:00:00+00:00,32400.0,30.1125,30.3625,29.8625,920.125,42.0,0.0,5.5,-6.0816734649122814,12.4594556269506,8,4,107,0.8660254037844387,-0.49999999999999983,0.9634705485641488,-0.2678143051621742,0.8222159939059217,1.1190794229493926,32.4 +2026-04-17 09:00:00+00:00,32300.0,30.1875,30.85,29.7375,888.75,42.75,0.0,5.137499999999999,-16.239055322128856,12.452475595431585,9,4,107,0.7071067811865476,-0.7071067811865475,0.9634705485641488,-0.2678143051621742,0.9066398963684844,0.9802679140415707,32.3 +2026-04-17 10:00:00+00:00,32200.0,25.8125,26.237499999999997,25.225,741.375,53.875,0.0,8.175,-24.610720238095237,13.919996229810359,10,4,107,0.49999999999999994,-0.8660254037844387,0.9634705485641488,-0.2678143051621742,0.9354353173060767,0.7925454451891518,32.2 +2026-04-17 11:00:00+00:00,32100.0,23.3375,23.9125,22.7875,533.375,57.5,0.0,8.875,-33.96175045787545,13.083178465661453,11,4,107,0.258819045102521,-0.9659258262890682,0.9634705485641488,-0.2678143051621742,0.9066398963684844,0.5882986201428104,32.1 +2026-04-17 12:00:00+00:00,26200.0,22.15,22.75,21.6375,358.25,59.5,0.0,8.0,-42.26513970588235,16.172963297470588,12,4,107,1.2246467991473532e-16,-1.0,0.9634705485641488,-0.2678143051621742,0.8222159939059217,0.43571275997459025,26.2 +2026-04-17 13:00:00+00:00,18700.0,19.9375,20.1375,19.7625,37.5,71.375,0.0,6.6375,-53.577333333333335,16.966491173023368,13,4,107,-0.2588190451025208,-0.9659258262890683,0.9634705485641488,-0.2678143051621742,0.6879169593541165,0.05451239352378906,18.7 +2026-04-17 14:00:00+00:00,8500.0,19.450000000000003,19.6625,19.3,43.25,70.75,0.0,2.1625,-63.02821825396825,16.14462202919819,14,4,107,-0.4999999999999998,-0.8660254037844388,0.9634705485641488,-0.2678143051621742,0.5128950499781263,0.08432524354026132,8.5 +2026-04-17 15:00:00+00:00,3200.0,18.875,19.0375,18.7375,2.375,73.75,0.0,1.6,-63.7436607142857,17.218384123302684,15,4,107,-0.7071067811865471,-0.7071067811865479,0.9634705485641488,-0.2678143051621742,0.30907771966454367,0.007684151425012767,3.2 +2026-04-17 16:00:00+00:00,100.0,18.8875,18.9875,18.8125,0.0,64.875,0.0,1.8,-53.167249999999996,38.50748852820708,16,4,107,-0.8660254037844384,-0.5000000000000004,0.9634705485641488,-0.2678143051621742,0.0903547826501758,0.0,0.1 +2026-04-17 17:00:00+00:00,0.0,18.4625,18.5625,18.4,0.0,73.25,0.0,0.575,-52.45725,40.06161167813896,17,4,107,-0.9659258262890683,-0.25881904510252063,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 18:00:00+00:00,0.0,18.262500000000003,18.4375,18.075,0.0,73.5,0.0,1.4125,-52.462125,40.0602510983456,18,4,107,-1.0,-1.8369701987210297e-16,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 19:00:00+00:00,0.0,18.7125,18.9625,18.5,0.0,62.0,0.0,1.6875,-52.461499999999994,40.05990345511748,19,4,107,-0.9659258262890684,0.2588190451025203,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 20:00:00+00:00,0.0,19.1,19.3125,18.7375,0.0,50.125,0.0,1.5999999999999999,-52.460874999999994,40.05949812128413,20,4,107,-0.8660254037844386,0.5000000000000001,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 21:00:00+00:00,0.0,19.925,20.175,19.6125,0.0,45.625,0.0,1.8624999999999998,-52.45675,40.0577661810624,21,4,107,-0.7071067811865477,0.7071067811865474,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 22:00:00+00:00,0.0,20.6375,20.875,20.3875,0.0,43.625,0.0,1.8125,-52.4565,40.05661999803112,22,4,107,-0.5000000000000004,0.8660254037844384,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-17 23:00:00+00:00,0.0,21.5375,22.1375,21.0625,0.0,36.75,0.0,2.175,-52.4543125,40.05427891487531,23,4,107,-0.25881904510252157,0.9659258262890681,0.9634705485641488,-0.2678143051621742,0.0,0.0,0.0 +2026-04-18 00:00:00+00:00,0.0,21.362499999999997,22.075000000000003,20.85,0.0,37.375,0.0,1.5125,-52.444,40.04654306553813,0,4,108,0.0,1.0,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 01:00:00+00:00,0.0,20.675,21.1125,20.35,0.0,40.5,0.0,1.525,-52.43475,40.045000117576066,1,4,108,0.25881904510252074,0.9659258262890683,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 02:00:00+00:00,0.0,20.5,20.7375,20.075,14.125,42.875,0.0,1.075,15.140154166666665,5.973972506529732,2,4,108,0.49999999999999994,0.8660254037844387,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 03:00:00+00:00,500.0,20.6375,20.7375,20.575,140.0,44.375,0.0,1.4125,57.9457302631579,15.161265836154946,3,4,108,0.7071067811865475,0.7071067811865476,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.5 +2026-04-18 04:00:00+00:00,9000.0,21.3875,21.55,21.275,356.875,44.625,0.0,1.6875,48.011533068783066,2.9246520810321206,4,4,108,0.8660254037844386,0.5000000000000001,0.9587178169872964,-0.2843591872810034,0.09354557157669256,1.5,9.0 +2026-04-18 05:00:00+00:00,22800.0,22.725,23.125,22.325,549.0,42.625,0.0,1.9625,33.79419693732194,6.567988457679297,5,4,108,0.9659258262890683,0.25881904510252074,0.9587178169872964,-0.2843591872810034,0.3120165033315396,1.5,22.8 +2026-04-18 06:00:00+00:00,29500.0,23.675,23.9625,23.4,714.375,37.875,0.0,2.4625,20.39407472826087,13.424785605361219,6,4,108,1.0,6.123233995736766e-17,0.9587178169872964,-0.2843591872810034,0.5155990021275793,1.3855244037559944,29.5 +2026-04-18 07:00:00+00:00,32400.0,22.6875,22.9625,22.5125,822.5,46.75,0.0,5.7375,6.561785405542842,14.024384131552857,7,4,108,0.9659258262890683,-0.25881904510252063,0.9587178169872964,-0.2843591872810034,0.6904192571078477,1.1913051258816794,32.4 +2026-04-18 08:00:00+00:00,32300.0,21.5125,21.7375,21.3375,869.0,55.875,0.0,7.3125,-5.916063523391813,12.915440554530182,8,4,108,0.8660254037844387,-0.49999999999999983,0.9587178169872964,-0.2843591872810034,0.8245635567995709,1.0538908648508587,32.3 +2026-04-18 09:00:00+00:00,32300.0,20.487499999999997,20.7625,20.2875,837.875,65.75,0.0,7.5874999999999995,-15.997572916666668,12.821871130512546,9,4,108,0.7071067811865476,-0.7071067811865475,0.9587178169872964,-0.2843591872810034,0.9088901888626948,0.9218660408783189,32.3 +2026-04-18 10:00:00+00:00,32400.0,20.075,20.325,19.85,681.5,71.125,0.0,6.0375,-24.610446978021976,13.641308715557685,10,4,108,0.49999999999999994,-0.8660254037844387,0.9587178169872964,-0.2843591872810034,0.9376524326784659,0.7268151569268054,32.4 +2026-04-18 11:00:00+00:00,29500.0,19.3125,19.4625,19.1875,250.875,76.625,0.0,5.375,-33.84810267857143,13.176963322443267,11,4,108,0.258819045102521,-0.9659258262890682,0.9587178169872964,-0.2843591872810034,0.9088901888626948,0.2760234438375035,29.5 +2026-04-18 12:00:00+00:00,27300.0,18.6125,18.7875,18.4875,160.875,81.875,0.0,4.5125,-42.30201943277311,15.839624389849924,12,4,108,1.2246467991473532e-16,-1.0,0.9587178169872964,-0.2843591872810034,0.8245635567995709,0.195103213904352,27.3 +2026-04-18 13:00:00+00:00,23800.0,18.0625,18.174999999999997,17.975,88.5,83.0,0.0,4.3125,-53.504276315789475,17.114815779978308,13,4,108,-0.2588190451025208,-0.9659258262890683,0.9587178169872964,-0.2843591872810034,0.6904192571078477,0.12818298314957888,23.8 +2026-04-18 14:00:00+00:00,17800.0,17.5875,17.712500000000002,17.5,37.0,83.375,0.0,4.3625,-62.99302678571428,15.814484391667609,14,4,108,-0.4999999999999998,-0.8660254037844388,0.9587178169872964,-0.2843591872810034,0.5155990021275793,0.07176119396531484,17.8 +2026-04-18 15:00:00+00:00,5200.0,17.1875,17.25,17.1125,1.5,84.75,0.0,3.7,-63.61100961538461,17.593519792601978,15,4,108,-0.7071067811865471,-0.7071067811865479,0.9587178169872964,-0.2843591872810034,0.3120165033315396,0.004807438016847923,5.2 +2026-04-18 16:00:00+00:00,0.0,17.0125,17.1,16.9375,0.0,85.625,0.0,3.975,-53.09233333333333,38.71057174511032,16,4,108,-0.8660254037844384,-0.5000000000000004,0.9587178169872964,-0.2843591872810034,0.09354557157669256,0.0,0.0 +2026-04-18 17:00:00+00:00,0.0,16.924999999999997,17.0,16.8625,0.0,86.375,0.0,3.475,-52.366499999999995,40.13536779657895,17,4,108,-0.9659258262890683,-0.25881904510252063,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 18:00:00+00:00,0.0,16.825,16.9,16.6875,0.0,86.5,0.0,2.9875,-52.358125,40.12869398235092,18,4,108,-1.0,-1.8369701987210297e-16,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 19:00:00+00:00,0.0,16.7125,16.8,16.6125,0.0,87.625,0.0,3.3375000000000004,-52.352375,40.12850055420918,19,4,108,-0.9659258262890684,0.2588190451025203,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 20:00:00+00:00,0.0,16.6125,16.6875,16.55,0.0,87.5,0.0,2.9625,-52.3368125,40.12628718359855,20,4,108,-0.8660254037844386,0.5000000000000001,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 21:00:00+00:00,0.0,16.587500000000002,16.675,16.5125,0.0,88.375,0.0,3.45,-52.334875000000004,40.12685911658798,21,4,108,-0.7071067811865477,0.7071067811865474,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 22:00:00+00:00,0.0,16.45,16.5125,16.3875,0.0,89.25,0.0,3.225,-52.325312499999995,40.125948955224615,22,4,108,-0.5000000000000004,0.8660254037844384,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-18 23:00:00+00:00,0.0,16.325,16.35,16.225,0.0,90.0,0.0,2.7375,-52.32125,40.12404710706536,23,4,108,-0.25881904510252157,0.9659258262890681,0.9587178169872964,-0.2843591872810034,0.0,0.0,0.0 +2026-04-19 00:00:00+00:00,0.0,16.2625,16.35,16.1875,0.0,89.0,0.0,2.5375,-52.317125,40.12231655279266,0,4,109,0.0,1.0,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 01:00:00+00:00,0.0,16.0875,16.15,16.025,0.0,89.125,0.0,2.35,-52.306312500000004,40.11883388518779,1,4,109,0.25881904510252074,0.9659258262890683,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 02:00:00+00:00,0.0,16.1,16.1625,16.0375,22.25,88.625,0.0,2.175,7.380764705882353,2.6972654153779017,2,4,109,0.49999999999999994,0.8660254037844387,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 03:00:00+00:00,1800.0,16.425,16.575,16.2875,151.25,86.375,0.0,2.2875,57.92481854066986,15.044072343078097,3,4,109,0.7071067811865475,0.7071067811865476,0.9536809966304457,-0.30081980763566735,0.0,0.0,1.8 +2026-04-19 04:00:00+00:00,17300.0,16.875,17.075,16.6875,259.0,83.0,0.0,2.9375,48.11776124338624,2.9164594544880607,4,4,109,0.8660254037844386,0.5000000000000001,0.9536809966304457,-0.30081980763566735,0.09670524293573544,1.5,17.3 +2026-04-19 05:00:00+00:00,27900.0,17.6125,17.8,17.375,404.0,79.125,0.0,2.8375000000000004,33.795144230769225,6.616817676800736,5,4,109,0.9659258262890683,0.25881904510252074,0.9536809966304457,-0.30081980763566735,0.3149177078797361,1.28287482695093,27.9 +2026-04-19 06:00:00+00:00,29200.0,18.1625,18.5,17.9625,409.875,76.75,0.0,3.5125,20.601093290767203,13.188926677998504,6,4,109,1.0,6.123233995736766e-17,0.9536809966304457,-0.30081980763566735,0.518259353950952,0.7908685041096055,29.2 +2026-04-19 07:00:00+00:00,32400.0,18.4875,18.7375,18.2875,435.125,74.75,0.0,3.3,5.813863157894737,12.571162365903286,7,4,109,0.9659258262890683,-0.25881904510252063,0.9536809966304457,-0.30081980763566735,0.692872784007588,0.6280012868787104,32.4 +2026-04-19 08:00:00+00:00,32300.0,18.5875,18.825,18.45,477.5,74.5,0.0,4.3,-6.008212928921569,12.107668910305042,8,4,109,0.8660254037844387,-0.49999999999999983,0.9536809966304457,-0.30081980763566735,0.8268583813536214,0.5774870410315018,32.3 +2026-04-19 09:00:00+00:00,32300.0,18.275,18.5375,18.075,417.0,76.375,0.0,4.6375,-15.983840773809522,12.460748412762927,9,4,109,0.7071067811865476,-0.7071067811865475,0.9536809966304457,-0.30081980763566735,0.9110852489515887,0.4576959186638721,32.3 +2026-04-19 10:00:00+00:00,32400.0,17.412499999999998,17.612499999999997,17.2,313.25,81.5,0.0,3.8375,-25.000395833333332,13.180098527548916,10,4,109,0.49999999999999994,-0.8660254037844387,0.9536809966304457,-0.30081980763566735,0.9398134649661685,0.3333108235593075,32.4 +2026-04-19 11:00:00+00:00,32300.0,17.9625,18.125,17.8375,334.0,76.875,0.0,3.625,-33.53518131868132,13.239886190450074,11,4,109,0.258819045102521,-0.9659258262890682,0.9536809966304457,-0.30081980763566735,0.9110852489515887,0.36659577178353303,32.3 +2026-04-19 12:00:00+00:00,32400.0,18.35,18.525,18.1625,455.0,68.375,0.0,4.05,-41.950610556722694,15.456834114845872,12,4,109,1.2246467991473532e-16,-1.0,0.9536809966304457,-0.30081980763566735,0.8268583813536214,0.5502756097787086,32.4 +2026-04-19 13:00:00+00:00,31900.0,17.5375,17.675,17.4125,163.75,76.75,0.0,3.525,-53.218333333333334,16.633408638774085,13,4,109,-0.2588190451025208,-0.9659258262890683,0.9536809966304457,-0.30081980763566735,0.692872784007588,0.23633487095981343,31.9 +2026-04-19 14:00:00+00:00,26100.0,16.95,17.0875,16.85,45.375,80.875,0.0,3.5875,-62.61168055555555,16.059549991413128,14,4,109,-0.4999999999999998,-0.8660254037844388,0.9536809966304457,-0.30081980763566735,0.518259353950952,0.08755268892704691,26.1 +2026-04-19 15:00:00+00:00,11200.0,16.775,16.8875,16.7125,1.875,83.625,0.0,3.0749999999999997,-63.260416666666664,18.018772521857436,15,4,109,-0.7071067811865471,-0.7071067811865479,0.9536809966304457,-0.30081980763566735,0.3149177078797361,0.005953936387457906,11.2 +2026-04-19 16:00:00+00:00,200.0,16.6875,16.75,16.6,0.0,83.125,0.0,2.7125,-53.60325000000001,37.59264644071586,16,4,109,-0.8660254037844384,-0.5000000000000004,0.9536809966304457,-0.30081980763566735,0.09670524293573544,0.0,0.2 +2026-04-19 17:00:00+00:00,0.0,16.225,16.2875,16.175,0.0,82.375,0.0,3.5875,-52.4054,39.96470622695313,17,4,109,-0.9659258262890683,-0.25881904510252063,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 18:00:00+00:00,0.0,15.887500000000001,15.9625,15.825,0.0,82.625,0.0,4.2125,-52.397125,39.95956020023035,18,4,109,-1.0,-1.8369701987210297e-16,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 19:00:00+00:00,0.0,15.6375,15.7125,15.575,0.0,84.0,0.0,3.2375,-52.391375,39.9577325753414,19,4,109,-0.9659258262890684,0.2588190451025203,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 20:00:00+00:00,0.0,15.6,15.6875,15.4875,0.0,85.25,0.0,3.5,-52.375249999999994,39.95327872757545,20,4,109,-0.8660254037844386,0.5000000000000001,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 21:00:00+00:00,0.0,15.6,15.7,15.55,0.0,85.375,0.0,3.1125,-52.368,39.94937847034252,21,4,109,-0.7071067811865477,0.7071067811865474,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 22:00:00+00:00,0.0,15.725,15.825,15.675,0.0,84.375,0.0,2.6375,-52.371125,39.95149658309644,22,4,109,-0.5000000000000004,0.8660254037844384,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-19 23:00:00+00:00,0.0,15.7,15.75,15.6375,0.0,82.375,0.0,2.3875,-52.36745833333333,39.952669289301284,23,4,109,-0.25881904510252157,0.9659258262890681,0.9536809966304457,-0.30081980763566735,0.0,0.0,0.0 +2026-04-20 00:00:00+00:00,0.0,15.5625,15.6375,15.5125,0.0,79.875,0.0,2.3875,-52.290375,40.1016404306503,0,4,110,0.0,1.0,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 01:00:00+00:00,0.0,15.4625,15.5125,15.3875,0.0,78.125,0.0,2.0375,-52.288812500000006,40.106100712866926,1,4,110,0.25881904510252074,0.9659258262890683,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 02:00:00+00:00,0.0,15.4,15.475,15.3375,31.125,76.375,0.0,2.0,12.340046875,5.845913651230511,2,4,110,0.49999999999999994,0.8660254037844387,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 03:00:00+00:00,1400.0,16.05,16.2375,15.875,225.75,71.25,0.0,2.2625,57.54052850877193,15.191946600004986,3,4,110,0.7071067811865475,0.7071067811865476,0.9483615800121715,-0.3171912885891061,0.0,0.0,1.4 +2026-04-20 04:00:00+00:00,9400.0,16.325,16.6125,16.125,352.0,71.5,0.0,2.95,48.01234457671958,2.7968759361246893,4,4,110,0.8660254037844386,0.5000000000000001,0.9483615800121715,-0.3171912885891061,0.09983283516485066,1.5,9.4 +2026-04-20 05:00:00+00:00,22600.0,17.099999999999998,17.3375,16.825,628.5,68.25,0.0,3.8125,34.16524928774929,6.449364520728427,5,4,110,0.9659258262890683,0.25881904510252074,0.9483615800121715,-0.3171912885891061,0.3177806855665598,1.5,22.6 +2026-04-20 06:00:00+00:00,25300.0,17.8625,18.3125,17.5375,872.0,63.875,0.0,4.15,21.287380434782612,14.698322780165672,6,4,110,1.0,6.123233995736766e-17,0.9483615800121715,-0.3171912885891061,0.5208757501392451,1.5,25.3 +2026-04-20 07:00:00+00:00,27000.0,17.575,17.9125,17.3375,834.625,65.375,0.0,5.1875,9.022131422305764,18.007852329495357,7,4,110,0.9659258262890683,-0.25881904510252063,0.9483615800121715,-0.3171912885891061,0.6952774358627413,1.200420086931698,27.0 +2026-04-20 08:00:00+00:00,31300.0,17.5875,17.8375,17.35,823.625,65.125,0.0,6.2375,-3.812295649509804,15.81670147670844,8,4,110,0.8660254037844387,-0.49999999999999983,0.9483615800121715,-0.3171912885891061,0.8291005560674047,0.9933957877276354,31.3 +2026-04-20 09:00:00+00:00,31900.0,17.6125,17.8625,17.375,828.125,64.625,0.0,6.525,-13.562538690476188,15.93502099381887,9,4,110,0.7071067811865476,-0.7071067811865475,0.9483615800121715,-0.3171912885891061,0.9132252862644504,0.9068134801517013,31.9 +2026-04-20 10:00:00+00:00,32300.0,17.625,17.9625,17.349999999999998,700.5,66.5,0.0,6.4625,-21.68972596153846,17.875241321817416,10,4,110,0.49999999999999994,-0.8660254037844387,0.9483615800121715,-0.3171912885891061,0.9419186651136395,0.7436947859139057,32.3 +2026-04-20 11:00:00+00:00,32300.0,17.65,17.875,17.412499999999998,531.625,68.375,0.0,6.075,-31.356890196078428,16.64966052981356,11,4,110,0.258819045102521,-0.9659258262890682,0.9483615800121715,-0.3171912885891061,0.9132252862644504,0.5821400348807827,32.3 +2026-04-20 12:00:00+00:00,31800.0,17.3375,17.525,17.2125,204.0,71.625,0.0,4.9625,-39.93429166666666,18.9702328312968,12,4,110,1.2246467991473532e-16,-1.0,0.9483615800121715,-0.3171912885891061,0.8291005560674047,0.24604976864038564,31.8 +2026-04-20 13:00:00+00:00,29200.0,16.962500000000002,17.0625,16.85,151.375,73.125,0.0,5.1875,-50.794607142857146,20.739214299527255,13,4,110,-0.2588190451025208,-0.9659258262890683,0.9483615800121715,-0.3171912885891061,0.6952774358627413,0.21771884458204077,29.2 +2026-04-20 14:00:00+00:00,25800.0,16.65,16.7625,16.5625,47.125,75.875,0.0,4.4375,-60.78102777777778,19.763631214764406,14,4,110,-0.4999999999999998,-0.8660254037844388,0.9483615800121715,-0.3171912885891061,0.5208757501392451,0.09047263188467139,25.8 +2026-04-20 15:00:00+00:00,14700.0,16.2625,16.35,16.225,4.0,78.5,0.0,4.075,-63.332556818181814,18.29687085180028,15,4,110,-0.7071067811865471,-0.7071067811865479,0.9483615800121715,-0.3171912885891061,0.3177806855665598,0.012587297408804262,14.7 +2026-04-20 16:00:00+00:00,300.0,16.0125,16.1125,15.95,0.0,79.75,0.0,3.45,-52.8910625,39.198542749473376,16,4,110,-0.8660254037844384,-0.5000000000000004,0.9483615800121715,-0.3171912885891061,0.09983283516485066,0.0,0.3 +2026-04-20 17:00:00+00:00,0.0,15.7375,15.8375,15.65,0.0,79.625,0.0,3.3625,-50.89000000000001,43.15826021748328,17,4,110,-0.9659258262890683,-0.25881904510252063,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 18:00:00+00:00,0.0,15.5625,15.675,15.525,0.0,81.625,0.0,3.0625,-50.88125,43.15908462208932,18,4,110,-1.0,-1.8369701987210297e-16,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 19:00:00+00:00,0.0,15.4875,15.55,15.4,0.0,82.75,0.0,2.7,-50.875,43.15656192863375,19,4,110,-0.9659258262890684,0.2588190451025203,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 20:00:00+00:00,0.0,15.350000000000001,15.4625,15.2875,0.0,84.0,0.0,2.525,-50.853125,43.153543760188455,20,4,110,-0.8660254037844386,0.5000000000000001,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 21:00:00+00:00,0.0,15.2625,15.325000000000001,15.2,0.0,84.75,0.0,2.4125,-50.845,43.14643501109525,21,4,110,-0.7071067811865477,0.7071067811865474,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 22:00:00+00:00,0.0,15.075,15.15,15.0,0.0,85.0,0.0,2.425,-50.853125,43.15019063182109,22,4,110,-0.5000000000000004,0.8660254037844384,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-20 23:00:00+00:00,0.0,14.8,14.8625,14.712499999999999,0.0,85.625,0.0,2.4625,-50.851875,43.1493659848651,23,4,110,-0.25881904510252157,0.9659258262890681,0.9483615800121715,-0.3171912885891061,0.0,0.0,0.0 +2026-04-21 00:00:00+00:00,0.0,14.65,14.712499999999999,14.5875,0.0,85.375,0.0,2.7,-50.84125,43.14893768004801,0,4,111,0.0,1.0,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 01:00:00+00:00,0.0,14.5875,14.6375,14.5,0.0,85.25,0.0,2.675,-50.841874999999995,43.14601605667086,1,4,111,0.25881904510252074,0.9659258262890683,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 02:00:00+00:00,0.0,14.7125,14.8125,14.5625,47.0,84.625,0.0,2.9875,12.631491830065357,2.936335712142361,2,4,111,0.49999999999999994,0.8660254037844387,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 03:00:00+00:00,2800.0,15.8625,15.9875,15.75,233.625,78.5,0.0,2.1375,58.044741161616166,14.440842316540925,3,4,111,0.7071067811865475,0.7071067811865476,0.9427611433904207,-0.3334687789181868,0.0,0.0,2.8 +2026-04-21 04:00:00+00:00,22200.0,16.6375,16.8125,16.4125,433.625,75.125,0.0,2.5125,48.03476574074074,2.737926364069192,4,4,111,0.8660254037844386,0.5000000000000001,0.9427611433904207,-0.3334687789181868,0.10292740540343606,1.5,22.2 +2026-04-21 05:00:00+00:00,30600.0,17.2625,17.537499999999998,17.0125,650.875,66.75,0.0,3.85,34.226325,6.4578708417842074,5,4,111,0.9659258262890683,0.25881904510252074,0.9427611433904207,-0.3334687789181868,0.32060481444349376,1.5,30.6 +2026-04-21 06:00:00+00:00,21900.0,18.0875,18.475,17.825,856.75,59.75,0.0,4.4625,21.270391304347825,14.640466530669876,6,4,111,1.0,6.123233995736766e-17,0.9427611433904207,-0.3334687789181868,0.5234478677863987,1.5,21.9 +2026-04-21 07:00:00+00:00,24100.0,18.25,18.5,17.95,993.375,58.875,0.0,5.05,8.6911375,17.52643955164002,7,4,111,0.9659258262890683,-0.25881904510252063,0.9427611433904207,-0.3334687789181868,0.6976331465608268,1.4239217343629866,24.1 +2026-04-21 08:00:00+00:00,31900.0,18.775000000000002,19.1875,18.35,1037.5,56.875,0.0,4.175,-3.7337463235294113,15.656649006110607,8,4,111,0.8660254037844387,-0.49999999999999983,0.9427611433904207,-0.3334687789181868,0.8312902118730843,1.2480599256212563,31.9 +2026-04-21 09:00:00+00:00,28600.0,18.7125,19.0625,18.3,994.5,59.0,0.0,5.1625,-13.983874999999998,15.147392225980193,9,4,111,0.7071067811865476,-0.7071067811865475,0.9427611433904207,-0.3334687789181868,0.9153105556008846,1.0865164767461126,28.6 +2026-04-21 10:00:00+00:00,32500.0,18.7375,19.175,18.25,850.125,58.5,0.0,4.2625,-21.765400000000003,17.855888233274303,10,4,111,0.49999999999999994,-0.8660254037844387,0.9427611433904207,-0.3334687789181868,0.9439683301693613,0.9005863574337027,32.5 +2026-04-21 11:00:00+00:00,32400.0,18.200000000000003,18.425,17.9875,480.25,64.25,0.0,4.3875,-31.259554761904766,16.648644275863436,11,4,111,0.258819045102521,-0.9659258262890682,0.9427611433904207,-0.3334687789181868,0.9153105556008846,0.5246853071466271,32.4 +2026-04-21 12:00:00+00:00,32200.0,18.1875,18.45,17.975,433.25,63.25,0.0,3.525,-39.79958333333333,19.156600708227035,12,4,111,1.2246467991473532e-16,-1.0,0.9427611433904207,-0.3334687789181868,0.8312902118730843,0.5211777954461777,32.2 +2026-04-21 13:00:00+00:00,31700.0,18.0,18.2375,17.85,234.25,64.625,0.0,2.875,-50.723875,20.64600104287753,13,4,111,-0.2588190451025208,-0.9659258262890683,0.9427611433904207,-0.3334687789181868,0.6976331465608268,0.33577819682851856,31.7 +2026-04-21 14:00:00+00:00,25700.0,17.275,17.3875,17.174999999999997,106.875,67.625,0.0,2.375,-60.71338888888889,19.563541831051673,14,4,111,-0.4999999999999998,-0.8660254037844388,0.9427611433904207,-0.3334687789181868,0.5234478677863987,0.20417506035885133,25.7 +2026-04-21 15:00:00+00:00,13200.0,16.4375,16.5125,16.325,4.375,70.25,0.0,1.4124999999999999,-63.24335227272727,18.116136899544863,15,4,111,-0.7071067811865471,-0.7071067811865479,0.9427611433904207,-0.3334687789181868,0.32060481444349376,0.013646083286659717,13.2 +2026-04-21 16:00:00+00:00,400.0,15.6125,15.75,15.5125,0.0,71.5,0.0,1.2625,-52.984928571428576,38.94842910697889,16,4,111,-0.8660254037844384,-0.5000000000000004,0.9427611433904207,-0.3334687789181868,0.10292740540343606,0.0,0.4 +2026-04-21 17:00:00+00:00,0.0,14.4625,14.6125,14.35,0.0,75.25,0.0,1.0,-50.926249999999996,43.0115725948649,17,4,111,-0.9659258262890683,-0.25881904510252063,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 18:00:00+00:00,0.0,13.775,13.85,13.7,0.0,78.0,0.0,1.325,-50.91875,43.00825465826299,18,4,111,-1.0,-1.8369701987210297e-16,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 19:00:00+00:00,0.0,13.6,13.6875,13.5,0.0,77.375,0.0,1.175,-50.899375,43.00868765798952,19,4,111,-0.9659258262890684,0.2588190451025203,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 20:00:00+00:00,0.0,13.225,13.325,13.15,0.0,79.5,0.0,0.8875000000000001,-50.895,43.00742494035187,20,4,111,-0.8660254037844386,0.5000000000000001,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 21:00:00+00:00,0.0,12.8625,12.95,12.7625,0.0,82.75,0.0,0.875,-50.89124999999999,43.011644571557596,21,4,111,-0.7071067811865477,0.7071067811865474,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 22:00:00+00:00,0.0,12.45,12.575,12.325,0.0,84.625,0.0,1.125,-50.88375,43.01492383948467,22,4,111,-0.5000000000000004,0.8660254037844384,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-21 23:00:00+00:00,0.0,12.15,12.2125,12.075,0.0,85.625,0.0,1.0,-50.86125,43.013179109237356,23,4,111,-0.25881904510252157,0.9659258262890681,0.9427611433904207,-0.3334687789181868,0.0,0.0,0.0 +2026-04-22 00:00:00+00:00,0.0,12.025,12.1125,11.9875,0.0,86.875,0.0,1.05,-50.854375,43.01527090149691,0,4,112,0.0,1.0,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 01:00:00+00:00,0.0,12.075,12.1375,12.0125,0.0,87.0,0.0,0.75,-50.84125,43.01645932566588,1,4,112,0.25881904510252074,0.9659258262890683,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 02:00:00+00:00,0.0,12.3875,12.5,12.225,40.625,86.375,0.0,0.48750000000000004,12.530908496732026,3.0128424497868096,2,4,112,0.49999999999999994,0.8660254037844387,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 03:00:00+00:00,4200.0,15.1875,15.45,14.875,231.0,73.875,0.0,0.7,58.07502192982456,14.488444717711454,3,4,112,0.7071067811865475,0.7071067811865476,0.9368813462954315,-0.3496474552512284,0.0,0.0,4.2 +2026-04-22 04:00:00+00:00,23500.0,16.2625,16.475,16.05,468.75,70.0,0.0,1.5125,48.230248219373216,2.866463007824513,4,4,112,0.8660254037844386,0.5000000000000001,0.9368813462954315,-0.3496474552512284,0.105988029808154,1.5,23.5 +2026-04-22 05:00:00+00:00,30800.0,17.575000000000003,17.85,17.2625,675.125,63.875,0.0,1.35,33.973173076923075,6.638969414441351,5,4,112,0.9659258262890683,0.25881904510252074,0.9368813462954315,-0.3496474552512284,0.32338949825653907,1.5,30.8 +2026-04-22 06:00:00+00:00,32500.0,19.1,19.4375,18.625,848.25,56.25,0.0,1.8375,21.367217132505175,14.667585780025185,6,4,112,1.0,6.123233995736766e-17,0.9368813462954315,-0.3496474552512284,0.5259754159030805,1.5,32.5 +2026-04-22 07:00:00+00:00,32300.0,19.525,19.8125,19.1875,968.375,54.25,0.0,2.4,8.825216148325358,17.38891179223073,7,4,112,0.9659258262890683,-0.25881904510252063,0.9368813462954315,-0.3496474552512284,0.6999398872492244,1.3835116667028795,32.3 +2026-04-22 08:00:00+00:00,32500.0,20.5,20.9375,20.0875,1019.0,55.5,0.0,2.625,-3.276102605625584,16.372760400749925,8,4,112,0.8660254037844387,-0.49999999999999983,0.9368813462954315,-0.3496474552512284,0.8334275210626132,1.2226618083127174,32.5 +2026-04-22 09:00:00+00:00,32300.0,20.8375,21.15,20.6,997.0,56.125,0.0,2.675,-13.814973214285715,15.036905495959076,9,4,112,0.7071067811865476,-0.7071067811865475,0.9368813462954315,-0.3496474552512284,0.9173413556976096,1.0868364255112128,32.3 +2026-04-22 10:00:00+00:00,32400.0,20.6875,21.049999999999997,20.425,914.875,56.125,0.0,2.975,-21.72564835164835,17.457623785262136,10,4,112,0.49999999999999994,-0.8660254037844387,0.9368813462954315,-0.3496474552512284,0.9459628019980069,0.9671363377795141,32.4 +2026-04-22 11:00:00+00:00,32500.0,19.575,19.925,19.3125,775.5,57.25,0.0,3.3125,-30.7205,17.09165409739531,11,4,112,0.258819045102521,-0.9659258262890682,0.9368813462954315,-0.3496474552512284,0.9173413556976096,0.8453777813279294,32.5 +2026-04-22 12:00:00+00:00,32300.0,19.1875,19.5,18.7875,581.375,58.625,0.0,3.15,-39.70074183006536,18.588889737255617,12,4,112,1.2246467991473532e-16,-1.0,0.9368813462954315,-0.3496474552512284,0.8334275210626132,0.6975711568280727,32.3 +2026-04-22 13:00:00+00:00,31600.0,17.975,18.225,17.700000000000003,352.375,65.625,0.0,3.6125,-50.57425,19.863015403424193,13,4,112,-0.2588190451025208,-0.9659258262890683,0.9368813462954315,-0.3496474552512284,0.6999398872492244,0.5034360898974335,31.6 +2026-04-22 14:00:00+00:00,25800.0,17.2125,17.35,17.1,114.75,69.375,0.0,3.2375000000000003,-60.69261363636363,18.998070547729352,14,4,112,-0.4999999999999998,-0.8660254037844388,0.9368813462954315,-0.3496474552512284,0.5259754159030805,0.21816609014506594,25.8 +2026-04-22 15:00:00+00:00,13500.0,16.525,16.6375,16.475,2.625,74.5,0.0,2.5625,-63.021458333333335,18.599391310418078,15,4,112,-0.7071067811865471,-0.7071067811865479,0.9368813462954315,-0.3496474552512284,0.32338949825653907,0.008117146704367112,13.5 +2026-04-22 16:00:00+00:00,300.0,16.1625,16.225,16.075,0.0,76.5,0.0,1.975,-53.00405357142857,39.03908660392328,16,4,112,-0.8660254037844384,-0.5000000000000004,0.9368813462954315,-0.3496474552512284,0.105988029808154,0.0,0.3 +2026-04-22 17:00:00+00:00,0.0,15.4625,15.6125,15.325,0.0,78.625,0.0,0.5,-50.95375000000001,43.107327369214936,17,4,112,-0.9659258262890683,-0.25881904510252063,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 18:00:00+00:00,0.0,14.15,14.2625,14.0375,0.0,84.875,0.0,0.5249999999999999,-50.95375000000001,43.107327369214936,18,4,112,-1.0,-1.8369701987210297e-16,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 19:00:00+00:00,0.0,13.925,13.9875,13.8625,0.0,87.125,0.0,1.025,-50.95375000000001,43.107327369214936,19,4,112,-0.9659258262890684,0.2588190451025203,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 20:00:00+00:00,0.0,13.7875,13.85,13.675,0.0,89.625,0.0,0.775,,,20,4,112,-0.8660254037844386,0.5000000000000001,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 21:00:00+00:00,0.0,13.4625,13.575,13.375,0.0,91.625,0.0,1.0,,,21,4,112,-0.7071067811865477,0.7071067811865474,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 22:00:00+00:00,0.0,13.375,13.475,13.25,0.0,92.5,0.0,0.6875,,,22,4,112,-0.5000000000000004,0.8660254037844384,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-22 23:00:00+00:00,0.0,13.15,13.2,13.0375,0.0,94.0,0.0,0.725,,,23,4,112,-0.25881904510252157,0.9659258262890681,0.9368813462954315,-0.3496474552512284,0.0,0.0,0.0 +2026-04-23 00:00:00+00:00,0.0,12.7625,12.850000000000001,12.6875,0.0,94.375,0.0,0.8375,,,0,4,113,0.0,1.0,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 01:00:00+00:00,0.0,12.4375,12.5,12.3125,0.0,95.0,0.0,0.9125,,,1,4,113,0.25881904510252074,0.9659258262890683,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 02:00:00+00:00,0.0,12.675,12.7875,12.5375,53.875,94.625,0.0,0.775,,,2,4,113,0.49999999999999994,0.8660254037844387,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 03:00:00+00:00,4500.0,15.25,15.5,14.95,216.75,84.375,0.0,0.95,,,3,4,113,0.7071067811865475,0.7071067811865476,0.9307239310379795,-0.36572252349726897,0.0,0.0,4.5 +2026-04-23 04:00:00+00:00,24000.0,17.112499999999997,17.325,16.7625,473.5,70.0,0.0,1.25,,,4,4,113,0.8660254037844386,0.5000000000000001,0.9307239310379795,-0.36572252349726897,0.10901380383763823,1.5,24.0 +2026-04-23 05:00:00+00:00,31100.0,17.825,18.1375,17.4625,689.25,69.125,0.0,1.725,,,5,4,113,0.9659258262890683,0.25881904510252074,0.9307239310379795,-0.36572252349726897,0.326134166309167,1.5,31.1 +2026-04-23 06:00:00+00:00,32400.0,19.1,19.3875,18.8,866.5,63.875,0.0,2.125,,,6,4,113,1.0,6.123233995736766e-17,0.9307239310379795,-0.36572252349726897,0.5284581348866253,1.5,32.4 +2026-04-23 07:00:00+00:00,32400.0,19.925,20.25,19.612499999999997,969.75,60.5,0.0,3.0374999999999996,,,7,4,113,0.9659258262890683,-0.25881904510252063,0.9307239310379795,-0.36572252349726897,0.7021976654676259,1.3810213956695494,32.4 +2026-04-23 08:00:00+00:00,32400.0,21.5625,21.85,21.225,1027.75,46.0,0.0,2.4875,,,8,4,113,0.8660254037844387,-0.49999999999999983,0.9307239310379795,-0.36572252349726897,0.8355126961612236,1.2300830432882872,32.4 +2026-04-23 09:00:00+00:00,32400.0,21.7875,22.0875,21.4,1009.0,46.5,0.0,2.3625,,,9,4,113,0.7071067811865476,-0.7071067811865475,0.9307239310379795,-0.36572252349726897,0.9193180279391546,1.0975527177051956,32.4 +2026-04-23 10:00:00+00:00,32300.0,20.575,20.9125,20.2125,924.25,56.375,0.0,3.8249999999999997,,,10,4,113,0.49999999999999994,-0.8660254037844387,0.9307239310379795,-0.36572252349726897,0.9479024659356121,0.9750475742119035,32.3 +2026-04-23 11:00:00+00:00,32500.0,20.275000000000002,20.6875,19.875,779.75,57.5,0.0,3.3375,,,11,4,113,0.258819045102521,-0.9659258262890682,0.9307239310379795,-0.36572252349726897,0.9193180279391546,0.8481830838757445,32.5 +2026-04-23 12:00:00+00:00,32400.0,19.3375,19.65,19.0375,583.625,60.75,0.0,3.25,,,12,4,113,1.2246467991473532e-16,-1.0,0.9307239310379795,-0.36572252349726897,0.8355126961612236,0.6985231974109721,32.4 +2026-04-23 13:00:00+00:00,31100.0,18.2625,18.5125,18.112499999999997,360.25,67.75,0.0,3.025,,,13,4,113,-0.2588190451025208,-0.9659258262890683,0.9307239310379795,-0.36572252349726897,0.7021976654676259,0.5130321812734779,31.1 +2026-04-23 14:00:00+00:00,26300.0,17.3375,17.4375,17.2125,118.625,71.25,0.0,2.2375,,,14,4,113,-0.4999999999999998,-0.8660254037844388,0.9307239310379795,-0.36572252349726897,0.5284581348866253,0.22447378925380654,26.3 +2026-04-23 15:00:00+00:00,15100.0,16.525,16.625,16.425,2.5,75.5,0.0,1.7,,,15,4,113,-0.7071067811865471,-0.7071067811865479,0.9307239310379795,-0.36572252349726897,0.326134166309167,0.007665556872781195,15.1 +2026-04-23 16:00:00+00:00,500.0,15.9375,16.025,15.9,0.0,78.875,0.0,1.1,,,16,4,113,-0.8660254037844384,-0.5000000000000004,0.9307239310379795,-0.36572252349726897,0.10901380383763823,0.0,0.5 +2026-04-23 17:00:00+00:00,0.0,15.15,15.2875,15.0375,0.0,81.125,0.0,0.75,,,17,4,113,-0.9659258262890683,-0.25881904510252063,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 18:00:00+00:00,0.0,14.9375,15.0125,14.8875,0.0,82.0,0.0,1.5625,,,18,4,113,-1.0,-1.8369701987210297e-16,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 19:00:00+00:00,0.0,14.8375,14.9125,14.8125,0.0,83.25,0.0,1.5875,,,19,4,113,-0.9659258262890684,0.2588190451025203,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 20:00:00+00:00,0.0,14.0625,14.175,14.0125,0.0,86.125,0.0,1.125,,,20,4,113,-0.8660254037844386,0.5000000000000001,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 21:00:00+00:00,0.0,13.9125,13.9625,13.8125,0.0,86.25,0.0,0.9624999999999999,,,21,4,113,-0.7071067811865477,0.7071067811865474,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 22:00:00+00:00,0.0,13.9125,14.0,13.8,0.0,87.375,0.0,0.4625,,,22,4,113,-0.5000000000000004,0.8660254037844384,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-23 23:00:00+00:00,0.0,13.825000000000001,13.9125,13.7375,0.0,89.5,0.0,0.325,,,23,4,113,-0.25881904510252157,0.9659258262890681,0.9307239310379795,-0.36572252349726897,0.0,0.0,0.0 +2026-04-24 00:00:00+00:00,0.0,13.525,13.625,13.4625,0.0,90.5,0.0,0.65,,,0,4,114,0.0,1.0,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 01:00:00+00:00,0.0,13.0625,13.1375,12.95,0.0,92.125,0.0,0.875,,,1,4,114,0.25881904510252074,0.9659258262890683,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 02:00:00+00:00,0.0,13.2375,13.3875,13.1125,53.375,92.25,0.0,0.475,,,2,4,114,0.49999999999999994,0.8660254037844387,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 03:00:00+00:00,4700.0,15.775,16.0,15.475000000000001,250.375,82.25,0.0,1.2,,,3,4,114,0.7071067811865475,0.7071067811865476,0.9242907221930934,-0.3816892202666588,0.0,0.0,4.7 +2026-04-24 04:00:00+00:00,24700.0,16.8125,17.0625,16.5,463.625,75.875,0.0,1.8,,,4,4,114,0.8660254037844386,0.5000000000000001,0.9242907221930934,-0.3816892202666588,0.11200384250643615,1.5,24.7 +2026-04-24 05:00:00+00:00,31300.0,18.275,18.599999999999998,17.9125,657.75,66.875,0.0,1.4375,,,5,4,114,0.9659258262890683,0.25881904510252074,0.9242907221930934,-0.3816892202666588,0.32883827328836207,1.5,31.3 +2026-04-24 06:00:00+00:00,32400.0,19.2625,19.5625,18.987499999999997,830.125,63.625,0.0,2.1875,,,6,4,114,1.0,6.123233995736766e-17,0.9242907221930934,-0.3816892202666588,0.5308957959483396,1.5,32.4 +2026-04-24 07:00:00+00:00,32300.0,19.6125,20.0125,19.3,982.625,61.0,0.0,2.7625,,,7,4,114,0.9659258262890683,-0.25881904510252063,0.9242907221930934,-0.3816892202666588,0.7044065242329349,1.394968624218851,32.3 +2026-04-24 08:00:00+00:00,31900.0,20.3375,20.65,20.0375,957.375,51.5,0.0,2.675,,,8,4,114,0.8660254037844387,-0.49999999999999983,0.9242907221930934,-0.3816892202666588,0.8375459887495894,1.1430715600815053,31.9 +2026-04-24 09:00:00+00:00,29700.0,20.1375,20.4625,19.7875,957.5,57.25,0.0,3.0375,,,9,4,114,0.7071067811865476,-0.7071067811865475,0.9242907221930934,-0.3816892202666588,0.9212409550148609,1.0393589155885434,29.7 +2026-04-24 10:00:00+00:00,32100.0,19.4875,19.9625,19.0625,827.0,60.75,0.0,3.075,,,10,4,114,0.49999999999999994,-0.8660254037844387,0.9242907221930934,-0.3816892202666588,0.9497877493902428,0.8707208537180315,32.1 +2026-04-24 11:00:00+00:00,32200.0,19.5,19.8125,19.225,696.375,63.875,0.0,3.15,,,11,4,114,0.258819045102521,-0.9659258262890682,0.9242907221930934,-0.3816892202666588,0.9212409550148609,0.755909728295532,32.2 +2026-04-24 12:00:00+00:00,29300.0,18.6875,18.9375,18.5,495.0,70.375,0.0,3.5125,,,12,4,114,1.2246467991473532e-16,-1.0,0.9242907221930934,-0.3816892202666588,0.8375459887495894,0.5910123224863247,29.3 +2026-04-24 13:00:00+00:00,27200.0,17.9125,18.125,17.775,241.5,74.5,0.0,3.55,,,13,4,114,-0.2588190451025208,-0.9659258262890683,0.9242907221930934,-0.3816892202666588,0.7044065242329349,0.34284179900659206,27.2 +2026-04-24 14:00:00+00:00,16900.0,17.3375,17.4375,17.225,59.625,79.375,0.0,2.95,,,14,4,114,-0.4999999999999998,-0.8660254037844388,0.9242907221930934,-0.3816892202666588,0.5308957959483396,0.11231017547142526,16.9 +2026-04-24 15:00:00+00:00,5500.0,17.0625,17.1375,16.975,2.75,80.375,0.0,2.975,,,15,4,114,-0.7071067811865471,-0.7071067811865479,0.9242907221930934,-0.3816892202666588,0.32883827328836207,0.008362773507171696,5.5 +2026-04-24 16:00:00+00:00,200.0,16.975,17.0375,16.9,0.0,81.25,0.0,4.0875,,,16,4,114,-0.8660254037844384,-0.5000000000000004,0.9242907221930934,-0.3816892202666588,0.11200384250643615,0.0,0.2 +2026-04-24 17:00:00+00:00,0.0,16.8625,16.912499999999998,16.8,0.0,85.5,0.0,3.3999999999999995,,,17,4,114,-0.9659258262890683,-0.25881904510252063,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 18:00:00+00:00,0.0,16.6625,16.724999999999998,16.6,0.0,87.0,0.0,3.4375,,,18,4,114,-1.0,-1.8369701987210297e-16,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 19:00:00+00:00,0.0,16.575000000000003,16.6625,16.5125,0.0,88.125,0.0,4.05,,,19,4,114,-0.9659258262890684,0.2588190451025203,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 20:00:00+00:00,0.0,16.5,16.5125,16.412499999999998,0.0,90.25,0.0,3.25,,,20,4,114,-0.8660254037844386,0.5000000000000001,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 21:00:00+00:00,0.0,16.3375,16.4125,16.2875,0.0,90.5,0.0,2.2125,,,21,4,114,-0.7071067811865477,0.7071067811865474,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 22:00:00+00:00,0.0,16.3,16.3,16.2,0.0,91.625,0.0,3.3125,,,22,4,114,-0.5000000000000004,0.8660254037844384,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-24 23:00:00+00:00,0.0,16.3625,16.4125,16.3,0.0,90.375,0.0,1.9125,,,23,4,114,-0.25881904510252157,0.9659258262890681,0.9242907221930934,-0.3816892202666588,0.0,0.0,0.0 +2026-04-25 00:00:00+00:00,0.0,15.6375,15.775,15.5625,0.0,90.125,0.0,0.675,,,0,4,115,0.0,1.0,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 01:00:00+00:00,0.0,14.8375,15.05,14.675,0.0,81.125,0.0,0.8875,,,1,4,115,0.25881904510252074,0.9659258262890683,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 02:00:00+00:00,0.0,15.05,15.275,14.8,21.875,66.375,0.0,1.2125,,,2,4,115,0.49999999999999994,0.8660254037844387,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 03:00:00+00:00,2200.0,17.35,17.7125,16.875,228.25,66.0,0.0,1.1875,,,3,4,115,0.7071067811865475,0.7071067811865476,0.9175836260593937,-0.39754281428255595,0.0,0.0,2.2 +2026-04-25 04:00:00+00:00,19900.0,20.7875,20.9375,20.425,467.5,58.875,0.0,0.8875,,,4,4,115,0.8660254037844386,0.5000000000000001,0.9175836260593937,-0.39754281428255595,0.11495728060820645,1.5,19.9 +2026-04-25 05:00:00+00:00,28600.0,21.3875,21.6375,21.1,675.75,58.0,0.0,1.6625,,,5,4,115,0.9659258262890683,0.25881904510252074,0.9175836260593937,-0.39754281428255595,0.33150129905443615,1.5,28.6 +2026-04-25 06:00:00+00:00,32200.0,23.3375,23.575,23.0625,842.75,43.0,0.0,1.6375,,,6,4,115,1.0,6.123233995736766e-17,0.9175836260593937,-0.39754281428255595,0.533288200499466,1.5,32.2 +2026-04-25 07:00:00+00:00,32200.0,24.6875,25.075,24.3875,948.25,44.5,0.0,2.075,,,7,4,115,0.9659258262890683,-0.25881904510252063,0.9175836260593937,-0.39754281428255595,0.7065665410784384,1.342053359267024,32.2 +2026-04-25 08:00:00+00:00,32300.0,25.2625,25.55,24.975,1004.875,48.375,0.0,1.8624999999999998,,,8,4,115,0.8660254037844387,-0.49999999999999983,0.9175836260593937,-0.39754281428255595,0.8395276882368937,1.1969527796163042,32.3 +2026-04-25 09:00:00+00:00,32400.0,25.6625,26.0375,25.325,969.25,48.125,0.0,2.0625,,,9,4,115,0.7071067811865476,-0.7071067811865475,0.9175836260593937,-0.39754281428255595,0.9231105595246681,1.0499825725090721,32.4 +2026-04-25 10:00:00+00:00,31000.0,25.1125,25.3375,24.8125,894.5,46.875,0.0,2.2375,,,10,4,115,0.49999999999999994,-0.8660254037844387,0.9175836260593937,-0.39754281428255595,0.9516191203907254,0.9399769097038815,31.0 +2026-04-25 11:00:00+00:00,32200.0,23.6125,23.8375,23.375,756.125,52.25,0.0,2.6375,,,11,4,115,0.258819045102521,-0.9659258262890682,0.9175836260593937,-0.39754281428255595,0.9231105595246681,0.8191055688815292,32.2 +2026-04-25 12:00:00+00:00,31900.0,22.5875,22.887500000000003,22.375,508.625,60.5,0.0,2.4375,,,12,4,115,1.2246467991473532e-16,-1.0,0.9175836260593937,-0.39754281428255595,0.8395276882368937,0.6058466053313524,31.9 +2026-04-25 13:00:00+00:00,29600.0,22.0125,22.25,21.8625,250.375,62.0,0.0,2.325,,,13,4,115,-0.2588190451025208,-0.9659258262890683,0.9175836260593937,-0.39754281428255595,0.7065665410784384,0.35435445275663713,29.6 +2026-04-25 14:00:00+00:00,24600.0,21.7875,21.9625,21.662499999999998,79.625,51.125,0.0,2.275,,,14,4,115,-0.4999999999999998,-0.8660254037844388,0.9175836260593937,-0.39754281428255595,0.533288200499466,0.1493095101774706,24.6 +2026-04-25 15:00:00+00:00,12100.0,20.6625,20.8125,20.5375,4.375,41.75,0.0,1.7625,,,15,4,115,-0.7071067811865471,-0.7071067811865479,0.9175836260593937,-0.39754281428255595,0.33150129905443615,0.013197535009603618,12.1 +2026-04-25 16:00:00+00:00,300.0,20.349999999999998,20.575,20.1375,0.0,35.875,0.0,1.1375,,,16,4,115,-0.8660254037844384,-0.5000000000000004,0.9175836260593937,-0.39754281428255595,0.11495728060820645,0.0,0.3 +2026-04-25 17:00:00+00:00,0.0,20.6,20.7875,20.45,0.0,33.5,0.0,1.9875,,,17,4,115,-0.9659258262890683,-0.25881904510252063,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 18:00:00+00:00,0.0,22.675,22.8625,22.4125,0.0,29.375,0.0,4.9375,,,18,4,115,-1.0,-1.8369701987210297e-16,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 19:00:00+00:00,0.0,20.4375,21.0125,20.0875,0.0,39.625,0.0,0.925,,,19,4,115,-0.9659258262890684,0.2588190451025203,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 20:00:00+00:00,0.0,18.6,18.8125,18.4,0.0,40.5,0.0,0.2375,,,20,4,115,-0.8660254037844386,0.5000000000000001,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 21:00:00+00:00,0.0,17.1375,17.3,17.05,0.0,48.5,0.0,0.9125,,,21,4,115,-0.7071067811865477,0.7071067811865474,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 22:00:00+00:00,0.0,17.525,17.85,17.2625,0.0,44.375,0.0,1.1625,,,22,4,115,-0.5000000000000004,0.8660254037844384,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-25 23:00:00+00:00,0.0,20.175,20.8,19.5625,0.0,30.875,0.0,2.225,,,23,4,115,-0.25881904510252157,0.9659258262890681,0.9175836260593937,-0.39754281428255595,0.0,0.0,0.0 +2026-04-26 00:00:00+00:00,0.0,21.474999999999998,21.8875,21.1125,0.0,25.25,0.0,2.25,,,0,4,116,0.0,1.0,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 01:00:00+00:00,0.0,20.3125,21.099999999999998,19.9,0.0,26.625,0.0,1.525,,,1,4,116,0.25881904510252074,0.9659258262890683,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 02:00:00+00:00,0.0,22.5875,22.987499999999997,22.225,50.0,20.25,0.0,2.2625,,,2,4,116,0.49999999999999994,0.8660254037844387,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 03:00:00+00:00,3100.0,22.875,23.0375,22.675,179.875,25.5,0.0,1.9375,,,3,4,116,0.7071067811865475,0.7071067811865476,0.9106046300942163,-0.4132786077829042,0.0,0.0,3.1 +2026-04-26 04:00:00+00:00,8200.0,24.625,24.85,24.325,350.25,29.125,0.0,1.675,,,4,4,116,0.8660254037844386,0.5000000000000001,0.9106046300942163,-0.4132786077829042,0.11787327290827018,1.5,8.2 +2026-04-26 05:00:00+00:00,23300.0,25.475,25.724999999999998,25.275000000000002,641.5,29.125,0.0,3.1375,,,5,4,116,0.9659258262890683,0.25881904510252074,0.9106046300942163,-0.4132786077829042,0.3341227483953702,1.5,23.3 +2026-04-26 06:00:00+00:00,0.0,25.8375,26.6625,24.9375,806.625,36.375,0.0,3.3375,,,6,4,116,1.0,6.123233995736766e-17,0.9106046300942163,-0.4132786077829042,0.5356351794971798,1.5,0.0 +2026-04-26 07:00:00+00:00,0.0,23.4375,23.975,23.0625,627.5,49.125,0.0,5.325,,,7,4,116,0.9659258262890683,-0.25881904510252063,0.9106046300942163,-0.4132786077829042,0.7086778270491481,0.8854517187490357,0.0 +2026-04-26 08:00:00+00:00,0.0,23.0875,23.325,22.8375,260.25,40.25,0.0,2.2875,,,8,4,116,0.8660254037844387,-0.49999999999999983,0.9106046300942163,-0.4132786077829042,0.8414581205871048,0.30928455455206444,0.0 +2026-04-26 09:00:00+00:00,0.0,22.4875,22.875,22.2125,399.625,45.625,0.0,1.4125,,,9,4,116,0.7071067811865476,-0.7071067811865475,0.9106046300942163,-0.4132786077829042,0.9249273025362481,0.4320609835002017,0.0 +2026-04-26 10:00:00+00:00,0.0,24.5875,24.9,24.2375,419.25,34.5,0.0,2.7,,,10,4,116,0.49999999999999994,-0.8660254037844387,0.9106046300942163,-0.4132786077829042,0.9533970860860892,0.43974332009038974,0.0 +2026-04-26 11:00:00+00:00,0.0,23.075,23.7,22.725,558.25,54.25,0.0,6.75,,,11,4,116,0.258819045102521,-0.9659258262890682,0.9106046300942163,-0.4132786077829042,0.9249273025362481,0.6035609484866753,0.0 +2026-04-26 12:00:00+00:00,159600.0,20.325000000000003,20.549999999999997,20.15,396.125,77.375,0.0,7.9750000000000005,,,12,4,116,1.2246467991473532e-16,-1.0,0.9106046300942163,-0.4132786077829042,0.8414581205871048,0.47076020815345443,159.6 +2026-04-26 13:00:00+00:00,16000.0,18.9625,19.15,18.8625,166.75,84.0,0.0,8.325,,,13,4,116,-0.2588190451025208,-0.9659258262890683,0.9106046300942163,-0.4132786077829042,0.7086778270491481,0.23529732924526167,16.0 +2026-04-26 14:00:00+00:00,16400.0,18.2875,18.4375,18.1875,52.25,87.75,0.0,7.1375,,,14,4,116,-0.4999999999999998,-0.8660254037844388,0.9106046300942163,-0.4132786077829042,0.5356351794971798,0.09754773771403324,16.4 +2026-04-26 15:00:00+00:00,5400.0,17.4375,17.5375,17.3375,6.0,88.0,0.0,5.05,,,15,4,116,-0.7071067811865471,-0.7071067811865479,0.9106046300942163,-0.4132786077829042,0.3341227483953702,0.0179574723026645,5.4 +2026-04-26 16:00:00+00:00,300.0,16.975,17.0375,16.875,0.0,87.0,0.0,3.125,,,16,4,116,-0.8660254037844384,-0.5000000000000004,0.9106046300942163,-0.4132786077829042,0.11787327290827018,0.0,0.3 +2026-04-26 17:00:00+00:00,0.0,16.75,16.825,16.65,0.0,86.125,0.0,0.95,,,17,4,116,-0.9659258262890683,-0.25881904510252063,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 18:00:00+00:00,0.0,15.575,15.7375,15.45,0.0,88.25,0.0,0.7250000000000001,,,18,4,116,-1.0,-1.8369701987210297e-16,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 19:00:00+00:00,0.0,15.2375,15.3,15.15,0.0,89.125,0.0,0.3,,,19,4,116,-0.9659258262890684,0.2588190451025203,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 20:00:00+00:00,0.0,15.1125,15.25,15.0125,0.0,89.625,0.0,1.05,,,20,4,116,-0.8660254037844386,0.5000000000000001,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 21:00:00+00:00,0.0,15.375,15.425,15.287500000000001,0.0,87.125,0.0,1.875,,,21,4,116,-0.7071067811865477,0.7071067811865474,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 22:00:00+00:00,0.0,15.575,15.6875,15.4625,0.0,82.0,0.0,2.2625,,,22,4,116,-0.5000000000000004,0.8660254037844384,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-26 23:00:00+00:00,0.0,15.775,16.075,15.5375,0.0,68.25,0.0,2.425,,,23,4,116,-0.25881904510252157,0.9659258262890681,0.9106046300942163,-0.4132786077829042,0.0,0.0,0.0 +2026-04-27 00:00:00+00:00,0.0,14.8,15.05,14.65,0.0,67.375,0.0,1.4375,,,0,4,117,0.0,1.0,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 01:00:00+00:00,0.0,14.2125,14.3625,14.0875,0.0,70.625,0.0,0.9875,,,1,4,117,0.25881904510252074,0.9659258262890683,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 02:00:00+00:00,0.0,14.5,14.674999999999999,14.3125,44.75,75.25,0.0,0.6375000000000001,,,2,4,117,0.49999999999999994,0.8660254037844387,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 03:00:00+00:00,2100.0,17.512500000000003,17.8,17.150000000000002,224.375,68.875,0.0,0.5375,,,3,4,117,0.7071067811865475,0.7071067811865476,0.9033558023246845,-0.4288919379124835,0.0,0.0,2.1 +2026-04-27 04:00:00+00:00,14900.0,18.85,19.05,18.65,439.25,66.5,0.0,1.6875,,,4,4,117,0.8660254037844386,0.5000000000000001,0.9033558023246845,-0.4288919379124835,0.12075099430569003,1.5,14.9 +2026-04-27 05:00:00+00:00,16700.0,19.35,19.625,19.0625,649.75,71.875,0.0,2.225,,,5,4,117,0.9659258262890683,0.25881904510252074,0.9033558023246845,-0.4288919379124835,0.33670215074651655,1.5,16.7 +2026-04-27 06:00:00+00:00,22700.0,20.575,20.9375,20.25,824.0,67.375,0.0,2.5875,,,6,4,117,1.0,6.123233995736766e-17,0.9033558023246845,-0.4288919379124835,0.5379365927520607,1.5,22.7 +2026-04-27 07:00:00+00:00,26500.0,20.6625,21.0625,20.225,937.125,63.75,0.0,3.225,,,7,4,117,0.9659258262890683,-0.25881904510252063,0.9033558023246845,-0.4288919379124835,0.7107405256552832,1.3185191587830123,26.5 +2026-04-27 08:00:00+00:00,17100.0,21.5625,21.825000000000003,21.299999999999997,994.0,51.875,0.0,3.25,,,8,4,117,0.8660254037844387,-0.49999999999999983,0.9033558023246845,-0.4288919379124835,0.8433376470008316,1.1786500976625083,17.1 +2026-04-27 09:00:00+00:00,6600.0,21.625,22.0125,21.275,973.875,51.75,0.0,3.5500000000000003,,,9,4,117,0.7071067811865476,-0.7071067811865475,0.9033558023246845,-0.4288919379124835,0.92669168209611,1.0509158750590755,6.6 +2026-04-27 10:00:00+00:00,2500.0,21.7,22.075,21.3625,861.125,56.125,0.0,3.7625,,,10,4,117,0.49999999999999994,-0.8660254037844387,0.9033558023246845,-0.4288919379124835,0.9551221911984311,0.901586213717337,2.5 +2026-04-27 11:00:00+00:00,3400.0,20.137500000000003,20.4,19.9125,529.0,68.5,0.0,4.25,,,11,4,117,0.258819045102521,-0.9659258262890682,0.9033558023246845,-0.4288919379124835,0.92669168209611,0.5708478992748052,3.4 +2026-04-27 12:00:00+00:00,10200.0,19.5375,19.787499999999998,19.3,322.75,72.375,0.0,3.725,,,12,4,117,1.2246467991473532e-16,-1.0,0.9033558023246845,-0.4288919379124835,0.8433376470008316,0.38270555233458203,10.2 +2026-04-27 13:00:00+00:00,14800.0,18.9125,19.037499999999998,18.7,219.0,73.75,0.0,3.0875,,,13,4,117,-0.2588190451025208,-0.9659258262890683,0.9033558023246845,-0.4288919379124835,0.7107405256552832,0.3081293272226007,14.8 +2026-04-27 14:00:00+00:00,9100.0,18.275,18.4375,18.1,98.375,76.5,0.0,3.1624999999999996,,,14,4,117,-0.4999999999999998,-0.8660254037844388,0.9033558023246845,-0.4288919379124835,0.5379365927520607,0.18287471297819263,9.1 +2026-04-27 15:00:00+00:00,6400.0,17.6,17.6875,17.5,7.875,80.375,0.0,3.2,,,15,4,117,-0.7071067811865471,-0.7071067811865479,0.9033558023246845,-0.4288919379124835,0.33670215074651655,0.023388623988709323,6.4 +2026-04-27 16:00:00+00:00,200.0,17.3625,17.4375,17.3,0.0,79.625,0.0,2.325,,,16,4,117,-0.8660254037844384,-0.5000000000000004,0.9033558023246845,-0.4288919379124835,0.12075099430569003,0.0,0.2 +2026-04-27 17:00:00+00:00,0.0,17.0875,17.2,16.975,0.0,82.75,0.0,0.7375,,,17,4,117,-0.9659258262890683,-0.25881904510252063,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 18:00:00+00:00,0.0,16.799999999999997,16.9125,16.712500000000002,0.0,85.0,0.0,0.775,,,18,4,117,-1.0,-1.8369701987210297e-16,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 19:00:00+00:00,0.0,16.3875,16.45,16.2875,0.0,86.5,0.0,0.625,,,19,4,117,-0.9659258262890684,0.2588190451025203,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 20:00:00+00:00,0.0,16.275,16.3625,16.175,0.0,88.125,0.0,0.9875,,,20,4,117,-0.8660254037844386,0.5000000000000001,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 21:00:00+00:00,0.0,16.15,16.2375,16.1,0.0,89.5,0.0,1.1875,,,21,4,117,-0.7071067811865477,0.7071067811865474,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 22:00:00+00:00,0.0,15.9,15.95,15.825,0.0,91.0,0.0,2.075,,,22,4,117,-0.5000000000000004,0.8660254037844384,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-27 23:00:00+00:00,0.0,15.95,16.05,15.9,0.0,91.0,0.0,1.5125,,,23,4,117,-0.25881904510252157,0.9659258262890681,0.9033558023246845,-0.4288919379124835,0.0,0.0,0.0 +2026-04-28 00:00:00+00:00,0.0,15.9,15.975,15.8625,0.0,91.0,0.0,1.9249999999999998,,,0,4,118,0.0,1.0,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 01:00:00+00:00,0.0,15.649999999999999,15.7125,15.6,0.0,91.0,0.0,1.5875,,,1,4,118,0.25881904510252074,0.9659258262890683,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 02:00:00+00:00,0.0,15.6125,15.7,15.537500000000001,32.5,91.0,0.0,1.6125,,,2,4,118,0.49999999999999994,0.8660254037844387,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 03:00:00+00:00,1500.0,17.175,17.35,16.9375,219.0,85.125,0.0,1.0125,,,3,4,118,0.7071067811865475,0.7071067811865476,0.895839290734909,-0.4443781781046132,0.0,0.0,1.5 +2026-04-28 04:00:00+00:00,10400.0,18.3,18.45,18.075,305.5,76.375,0.0,1.5,,,4,4,118,0.8660254037844386,0.5000000000000001,0.895839290734909,-0.4443781781046132,0.12358963996513016,1.5,10.4 +2026-04-28 05:00:00+00:00,13500.0,18.975,19.4125,18.6375,632.125,70.25,0.0,2.625,,,5,4,118,0.9659258262890683,0.25881904510252074,0.895839290734909,-0.4443781781046132,0.3392390598765679,1.5,13.5 +2026-04-28 06:00:00+00:00,24700.0,19.5375,19.9,19.1625,841.875,69.125,0.0,3.15,,,6,4,118,1.0,6.123233995736766e-17,0.895839290734909,-0.4443781781046132,0.5401923281985579,1.5,24.7 +2026-04-28 07:00:00+00:00,22200.0,19.9125,20.175,19.625,958.0,68.5,0.0,4.2,,,7,4,118,0.9659258262890683,-0.25881904510252063,0.895839290734909,-0.4443781781046132,0.7127548117859337,1.3440807191459865,22.2 +2026-04-28 08:00:00+00:00,25900.0,19.6375,19.9125,19.3,1010.0,69.0,0.0,5.425,,,8,4,118,0.8660254037844387,-0.49999999999999983,0.895839290734909,-0.4443781781046132,0.8451666625552037,1.1950305717767589,25.9 +2026-04-28 09:00:00+00:00,29100.0,20.025,20.3125,19.6375,993.125,66.125,0.0,4.9375,,,9,4,118,0.7071067811865476,-0.7071067811865475,0.895839290734909,-0.4443781781046132,0.9284042316973715,1.0697118411279767,29.1 +2026-04-28 10:00:00+00:00,24900.0,20.075,20.4375,19.7875,919.0,66.75,0.0,5.025,,,10,4,118,0.49999999999999994,-0.8660254037844387,0.895839290734909,-0.4443781781046132,0.9567950164319854,0.9604983138677624,24.9 +2026-04-28 11:00:00+00:00,29600.0,19.8375,20.0625,19.575,772.75,66.875,0.0,4.575,,,11,4,118,0.258819045102521,-0.9659258262890682,0.895839290734909,-0.4443781781046132,0.9284042316973715,0.8323421777033546,29.6 +2026-04-28 12:00:00+00:00,26900.0,19.5875,19.9,19.35,559.625,70.25,0.0,3.5374999999999996,,,12,4,118,1.2246467991473532e-16,-1.0,0.895839290734909,-0.4443781781046132,0.8451666625552037,0.6621475086441274,26.9 +2026-04-28 13:00:00+00:00,21600.0,19.3125,19.475,19.1125,271.125,72.125,0.0,2.6,,,13,4,118,-0.2588190451025208,-0.9659258262890683,0.895839290734909,-0.4443781781046132,0.7127548117859337,0.3803902765954651,21.6 +2026-04-28 14:00:00+00:00,15300.0,18.4875,18.625,18.362499999999997,75.375,74.75,0.0,2.65,,,14,4,118,-0.4999999999999998,-0.8660254037844388,0.895839290734909,-0.4443781781046132,0.5401923281985579,0.13953363656859358,15.3 +2026-04-28 15:00:00+00:00,7800.0,17.6375,17.7625,17.6,4.375,79.25,0.0,1.6,,,15,4,118,-0.7071067811865471,-0.7071067811865479,0.895839290734909,-0.4443781781046132,0.3392390598765679,0.012896510211978077,7.8 +2026-04-28 16:00:00+00:00,300.0,16.75,16.875,16.6625,0.0,83.875,0.0,1.2625,,,16,4,118,-0.8660254037844384,-0.5000000000000004,0.895839290734909,-0.4443781781046132,0.12358963996513016,0.0,0.3 +2026-04-28 17:00:00+00:00,0.0,16.5375,16.5875,16.4375,0.0,87.25,0.0,2.1,,,17,4,118,-0.9659258262890683,-0.25881904510252063,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 18:00:00+00:00,0.0,16.175,16.2625,16.025,0.0,88.25,0.0,1.1125,,,18,4,118,-1.0,-1.8369701987210297e-16,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 19:00:00+00:00,0.0,16.0125,16.1375,15.8875,0.0,88.375,0.0,0.5875,,,19,4,118,-0.9659258262890684,0.2588190451025203,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 20:00:00+00:00,0.0,15.45,15.575,15.325000000000001,0.0,90.625,0.0,0.65,,,20,4,118,-0.8660254037844386,0.5000000000000001,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 21:00:00+00:00,0.0,15.8875,15.95,15.8375,0.0,91.25,0.0,1.2,,,21,4,118,-0.7071067811865477,0.7071067811865474,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 22:00:00+00:00,0.0,15.7625,15.8625,15.6625,0.0,90.5,0.0,0.875,,,22,4,118,-0.5000000000000004,0.8660254037844384,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-28 23:00:00+00:00,0.0,15.225,15.3625,15.1,0.0,91.25,0.0,0.8624999999999999,,,23,4,118,-0.25881904510252157,0.9659258262890681,0.895839290734909,-0.4443781781046132,0.0,0.0,0.0 +2026-04-29 00:00:00+00:00,0.0,14.8875,15.0875,14.7625,0.0,92.0,0.0,0.6875,,,0,4,119,0.0,1.0,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 01:00:00+00:00,0.0,15.375,15.45,15.2,0.0,91.0,0.0,1.0,,,1,4,119,0.25881904510252074,0.9659258262890683,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 02:00:00+00:00,0.0,15.25,15.3625,15.1125,28.875,91.125,0.0,0.7875000000000001,,,2,4,119,0.49999999999999994,0.8660254037844387,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 03:00:00+00:00,3000.0,17.1,17.2875,16.8375,242.625,81.625,0.0,1.0125,,,3,4,119,0.7071067811865475,0.7071067811865476,0.8880573226294932,-0.45973273945210397,0.0,0.0,3.0 +2026-04-29 04:00:00+00:00,14100.0,18.5875,18.8875,18.325000000000003,487.25,74.375,0.0,1.1125,,,4,4,119,0.8660254037844386,0.5000000000000001,0.8880573226294932,-0.45973273945210397,0.12638842541882142,1.5,14.1 +2026-04-29 05:00:00+00:00,22700.0,19.975,20.25,19.625,669.875,68.25,0.0,1.3,,,5,4,119,0.9659258262890683,0.25881904510252074,0.8880573226294932,-0.45973273945210397,0.34173305354076605,1.5,22.7 +2026-04-29 06:00:00+00:00,26400.0,20.4625,20.6875,20.25,837.5,67.875,0.0,3.8874999999999997,,,6,4,119,1.0,6.123233995736766e-17,0.8880573226294932,-0.45973273945210397,0.5424023011300246,1.5,26.4 +2026-04-29 07:00:00+00:00,27700.0,20.4875,20.675,20.2875,957.0,69.375,0.0,4.9875,,,7,4,119,0.9659258262890683,-0.25881904510252063,0.8880573226294932,-0.45973273945210397,0.714720890585,1.3389842281183277,27.7 +2026-04-29 08:00:00+00:00,28700.0,20.725,21.0,20.450000000000003,1017.5,68.125,0.0,5.4,,,8,4,119,0.8660254037844387,-0.49999999999999983,0.8880573226294932,-0.45973273945210397,0.8469455948042693,1.2013758690546659,28.7 +2026-04-29 09:00:00+00:00,28400.0,20.4875,20.7,20.225,1004.625,68.0,0.0,6.0625,,,9,4,119,0.7071067811865476,-0.7071067811865475,0.8880573226294932,-0.45973273945210397,0.9300655187069446,1.0801658375602552,28.4 +2026-04-29 10:00:00+00:00,26800.0,20.4625,20.6625,20.3125,919.75,69.0,0.0,5.325,,,10,4,119,0.49999999999999994,-0.8660254037844387,0.8880573226294932,-0.45973273945210397,0.9584161768412276,0.9596561725735216,26.8 +2026-04-29 11:00:00+00:00,28900.0,20.35,20.587500000000002,19.9875,776.125,70.875,0.0,4.7625,,,11,4,119,0.258819045102521,-0.9659258262890682,0.8880573226294932,-0.45973273945210397,0.9300655187069446,0.8344842211536175,28.9 +2026-04-29 12:00:00+00:00,26700.0,20.8,20.9875,20.5875,577.875,66.875,0.0,2.975,,,12,4,119,1.2246467991473532e-16,-1.0,0.8880573226294932,-0.45973273945210397,0.8469455948042693,0.6823047472530369,26.7 +2026-04-29 13:00:00+00:00,19300.0,20.4375,20.7375,20.275,354.0,70.375,0.0,2.2625,,,13,4,119,-0.2588190451025208,-0.9659258262890683,0.8880573226294932,-0.45973273945210397,0.714720890585,0.49529824112214005,19.3 +2026-04-29 14:00:00+00:00,15100.0,19.1,19.3,19.0,126.125,78.0,0.0,1.9,,,14,4,119,-0.4999999999999998,-0.8660254037844388,0.8880573226294932,-0.45973273945210397,0.5424023011300246,0.23253035567370375,15.1 +2026-04-29 15:00:00+00:00,6600.0,18.0875,18.175,18.0125,5.125,83.75,0.0,1.575,,,15,4,119,-0.7071067811865471,-0.7071067811865479,0.8880573226294932,-0.45973273945210397,0.34173305354076605,0.014997086020502925,6.6 +2026-04-29 16:00:00+00:00,300.0,17.625,17.7,17.55,0.0,86.25,0.0,1.4125,,,16,4,119,-0.8660254037844384,-0.5000000000000004,0.8880573226294932,-0.45973273945210397,0.12638842541882142,0.0,0.3 +2026-04-29 17:00:00+00:00,0.0,17.2,17.2875,17.15,0.0,87.25,0.0,1.1875,,,17,4,119,-0.9659258262890683,-0.25881904510252063,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 18:00:00+00:00,0.0,16.8625,16.9125,16.8,0.0,89.375,0.0,1.0750000000000002,,,18,4,119,-1.0,-1.8369701987210297e-16,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 19:00:00+00:00,0.0,16.75,16.8625,16.675,0.0,90.375,0.0,1.1,,,19,4,119,-0.9659258262890684,0.2588190451025203,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 20:00:00+00:00,0.0,15.9,15.9875,15.8125,0.0,92.25,0.0,1.4875,,,20,4,119,-0.8660254037844386,0.5000000000000001,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 21:00:00+00:00,0.0,15.4875,15.6,15.3875,0.0,93.5,0.0,1.9375,,,21,4,119,-0.7071067811865477,0.7071067811865474,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 22:00:00+00:00,0.0,15.5125,15.662500000000001,15.35,0.0,91.875,0.0,2.025,,,22,4,119,-0.5000000000000004,0.8660254037844384,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-29 23:00:00+00:00,0.0,15.0125,15.125,14.9125,0.0,93.375,0.0,2.0875,,,23,4,119,-0.25881904510252157,0.9659258262890681,0.8880573226294932,-0.45973273945210397,0.0,0.0,0.0 +2026-04-30 00:00:00+00:00,0.0,15.5625,15.6625,15.55,0.0,92.125,0.0,2.025,,,0,4,120,0.0,1.0,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 01:00:00+00:00,0.0,15.3875,15.425,15.325,0.0,92.375,0.0,0.9,,,1,4,120,0.25881904510252074,0.9659258262890683,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 02:00:00+00:00,0.0,15.55,15.6125,15.475,29.625,89.875,0.0,1.2,,,2,4,120,0.49999999999999994,0.8660254037844387,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 03:00:00+00:00,1700.0,16.65,16.7625,16.5,163.625,83.875,0.0,1.0125,,,3,4,120,0.7071067811865475,0.7071067811865476,0.8800122039735357,-0.47495107206704995,0.0,0.0,1.7 +2026-04-30 04:00:00+00:00,8300.0,18.0875,18.325,17.75,479.375,76.875,0.0,1.025,,,4,4,120,0.8660254037844386,0.5000000000000001,0.8800122039735357,-0.47495107206704995,0.12914658663903258,1.5,8.3 +2026-04-30 05:00:00+00:00,9800.0,19.4625,19.7,19.175,684.125,71.0,0.0,1.975,,,5,4,120,0.9659258262890683,0.25881904510252074,0.8800122039735357,-0.47495107206704995,0.3441837331023951,1.5,9.8 +2026-04-30 06:00:00+00:00,11500.0,20.35,20.6125,19.95,857.75,69.125,0.0,2.275,,,6,4,120,1.0,6.123233995736766e-17,0.8800122039735357,-0.47495107206704995,0.5445664533999665,1.5,11.5 +2026-04-30 07:00:00+00:00,14500.0,21.325000000000003,21.675,20.875,971.625,63.625,0.0,2.6875,,,7,4,120,0.9659258262890683,-0.25881904510252063,0.8800122039735357,-0.47495107206704995,0.7166389962915692,1.3558081614703088,14.5 +2026-04-30 08:00:00+00:00,27600.0,23.175,23.5,22.7625,1023.75,48.625,0.0,2.4375,,,8,4,120,0.8660254037844387,-0.49999999999999983,0.8800122039735357,-0.47495107206704995,0.8486749023424633,1.2062923001190498,27.6 +2026-04-30 09:00:00+00:00,27600.0,22.0875,22.475,21.7375,1010.125,55.75,0.0,3.4,,,9,4,120,0.7071067811865476,-0.7071067811865475,0.8800122039735357,-0.47495107206704995,0.9316761427549318,1.0842018526020187,27.6 +2026-04-30 10:00:00+00:00,27000.0,21.6,22.0375,21.1375,925.625,59.0,0.0,3.325,,,10,4,120,0.49999999999999994,-0.8660254037844387,0.8800122039735357,-0.47495107206704995,0.9599863201609001,0.9642064481136138,27.0 +2026-04-30 11:00:00+00:00,27700.0,20.4625,20.8375,20.0875,781.75,66.25,0.0,3.5625,,,11,4,120,0.258819045102521,-0.9659258262890682,0.8800122039735357,-0.47495107206704995,0.9316761427549318,0.8390791221597607,27.7 +2026-04-30 12:00:00+00:00,26300.0,19.825,20.262500000000003,19.5875,588.125,71.375,0.0,3.1625,,,12,4,120,1.2246467991473532e-16,-1.0,0.8800122039735357,-0.47495107206704995,0.8486749023424633,0.6929920967106384,26.3 +2026-04-30 13:00:00+00:00,22300.0,19.375,19.575,19.1625,356.625,74.75,0.0,3.0,,,13,4,120,-0.2588190451025208,-0.9659258262890683,0.8800122039735357,-0.47495107206704995,0.7166389962915692,0.49763549268941093,22.3 +2026-04-30 14:00:00+00:00,16400.0,18.7,18.8125,18.575,128.5,79.375,0.0,2.3375,,,14,4,120,-0.4999999999999998,-0.8660254037844388,0.8800122039735357,-0.47495107206704995,0.5445664533999665,0.2359675282928618,16.4 +2026-04-30 15:00:00+00:00,7200.0,17.799999999999997,17.8875,17.6875,5.125,84.375,0.0,1.9500000000000002,,,15,4,120,-0.7071067811865471,-0.7071067811865479,0.8800122039735357,-0.47495107206704995,0.3441837331023951,0.014890302786260112,7.2 +2026-04-30 16:00:00+00:00,400.0,17.3625,17.4,17.3125,0.0,88.625,0.0,1.95,,,16,4,120,-0.8660254037844384,-0.5000000000000004,0.8800122039735357,-0.47495107206704995,0.12914658663903258,0.0,0.4 +2026-04-30 17:00:00+00:00,0.0,17.3,17.3875,17.2625,0.0,90.25,0.0,1.275,,,17,4,120,-0.9659258262890683,-0.25881904510252063,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 18:00:00+00:00,0.0,17.1125,17.1625,17.075,0.0,91.375,0.0,1.675,,,18,4,120,-1.0,-1.8369701987210297e-16,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 19:00:00+00:00,0.0,16.8375,16.9125,16.8125,0.0,90.875,0.0,2.4125,,,19,4,120,-0.9659258262890684,0.2588190451025203,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 20:00:00+00:00,0.0,16.5875,16.675,16.5375,0.0,88.5,0.0,2.425,,,20,4,120,-0.8660254037844386,0.5000000000000001,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 21:00:00+00:00,0.0,16.2625,16.325,16.1875,0.0,88.875,0.0,2.0,,,21,4,120,-0.7071067811865477,0.7071067811865474,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 22:00:00+00:00,0.0,15.8625,15.9625,15.775,0.0,89.25,0.0,1.45,,,22,4,120,-0.5000000000000004,0.8660254037844384,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-04-30 23:00:00+00:00,0.0,15.6875,15.775,15.6625,0.0,89.5,0.0,1.5875,,,23,4,120,-0.25881904510252157,0.9659258262890681,0.8800122039735357,-0.47495107206704995,0.0,0.0,0.0 +2026-05-01 00:00:00+00:00,0.0,15.575,15.65,15.5125,0.0,87.875,0.0,1.9375,,,0,5,121,0.0,1.0,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 01:00:00+00:00,0.0,15.049999999999999,15.1875,15.0125,0.0,88.375,0.0,1.7999999999999998,,,1,5,121,0.25881904510252074,0.9659258262890683,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 02:00:00+00:00,0.0,15.45,15.575,15.375,27.0,88.25,0.0,1.6500000000000001,,,2,5,121,0.49999999999999994,0.8660254037844387,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 03:00:00+00:00,1800.0,16.5625,16.725,16.4125,203.625,83.375,0.0,1.7374999999999998,,,3,5,121,0.7071067811865475,0.7071067811865476,0.8717063187093218,-0.49002866642905923,0.0,0.0,1.8 +2026-05-01 04:00:00+00:00,16000.0,17.700000000000003,17.875,17.55,451.25,75.625,0.0,2.55,,,4,5,121,0.8660254037844386,0.5000000000000001,0.8717063187093218,-0.49002866642905923,0.13186338008151666,1.5,16.0 +2026-05-01 05:00:00+00:00,23200.0,19.275,19.5875,18.9625,697.0,65.25,0.0,1.75,,,5,5,121,0.9659258262890683,0.25881904510252074,0.8717063187093218,-0.49002866642905923,0.34659072312366324,1.5,23.2 +2026-05-01 06:00:00+00:00,27100.0,20.275,20.6375,20.0125,867.75,62.625,0.0,2.475,,,6,5,121,1.0,6.123233995736766e-17,0.8717063187093218,-0.49002866642905923,0.5466847525912002,1.5,27.1 +2026-05-01 07:00:00+00:00,27100.0,19.7,19.95,19.4125,987.375,64.625,0.0,3.9625000000000004,,,7,5,121,0.9659258262890683,-0.25881904510252063,0.8717063187093218,-0.49002866642905923,0.7185093910469327,1.3741991577330757,27.1 +2026-05-01 08:00:00+00:00,22000.0,19.9,20.4375,19.525000000000002,1030.75,61.625,0.0,4.175,,,8,5,121,0.8660254037844387,-0.49999999999999983,0.8717063187093218,-0.49002866642905923,0.8503550733337439,1.2121407072448376,22.0 +2026-05-01 09:00:00+00:00,18200.0,19.9375,20.2625,19.575,940.0,63.5,0.0,4.3625,,,9,5,121,0.7071067811865476,-0.7071067811865475,0.8717063187093218,-0.49002866642905923,0.9332367340890793,1.007247106402774,18.2 +2026-05-01 10:00:00+00:00,21700.0,20.1625,20.475,19.7375,931.625,63.0,0.0,3.9875000000000003,,,10,5,121,0.49999999999999994,-0.8660254037844387,0.8717063187093218,-0.49002866642905923,0.9615061251008834,0.9689225847648675,21.7 +2026-05-01 11:00:00+00:00,23900.0,20.4875,20.787499999999998,20.1125,776.5,61.375,0.0,3.3625,,,11,5,121,0.258819045102521,-0.9659258262890682,0.8717063187093218,-0.49002866642905923,0.9332367340890793,0.832050402257185,23.9 +2026-05-01 12:00:00+00:00,24500.0,19.9,20.0875,19.75,595.5,65.875,0.0,3.2125,,,12,5,121,1.2246467991473532e-16,-1.0,0.8717063187093218,-0.49002866642905923,0.8503550733337439,0.7002956984373522,24.5 +2026-05-01 13:00:00+00:00,24100.0,19.5875,19.75,19.4125,365.125,65.75,0.0,2.425,,,13,5,121,-0.2588190451025208,-0.9659258262890683,0.8717063187093218,-0.49002866642905923,0.7185093910469327,0.5081701151713273,24.1 +2026-05-01 14:00:00+00:00,21500.0,18.35,18.5,18.1875,125.75,73.125,0.0,2.475,,,14,5,121,-0.4999999999999998,-0.8660254037844388,0.8717063187093218,-0.49002866642905923,0.5466847525912002,0.23002287772608376,21.5 +2026-05-01 15:00:00+00:00,11700.0,17.2375,17.375,17.2,4.75,78.375,0.0,2.35,,,15,5,121,-0.7071067811865471,-0.7071067811865479,0.8717063187093218,-0.49002866642905923,0.34659072312366324,0.013704925386318562,11.7 +2026-05-01 16:00:00+00:00,500.0,16.6125,16.7125,16.5375,0.0,80.875,0.0,1.3125,,,16,5,121,-0.8660254037844384,-0.5000000000000004,0.8717063187093218,-0.49002866642905923,0.13186338008151666,0.0,0.5 +2026-05-01 17:00:00+00:00,0.0,15.8125,15.9125,15.6875,0.0,83.25,0.0,0.9,,,17,5,121,-0.9659258262890683,-0.25881904510252063,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 18:00:00+00:00,0.0,15.3,15.45,15.225,0.0,84.125,0.0,1.2125,,,18,5,121,-1.0,-1.8369701987210297e-16,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 19:00:00+00:00,0.0,15.024999999999999,15.175,14.962499999999999,0.0,84.875,0.0,1.1375000000000002,,,19,5,121,-0.9659258262890684,0.2588190451025203,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 20:00:00+00:00,0.0,14.2875,14.375,14.237499999999999,0.0,86.875,0.0,1.3375,,,20,5,121,-0.8660254037844386,0.5000000000000001,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 21:00:00+00:00,0.0,14.2875,14.375,14.2,0.0,87.125,0.0,1.5750000000000002,,,21,5,121,-0.7071067811865477,0.7071067811865474,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 22:00:00+00:00,0.0,14.025,14.1125,13.9625,0.0,88.25,0.0,1.25,,,22,5,121,-0.5000000000000004,0.8660254037844384,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-01 23:00:00+00:00,0.0,14.0375,14.15,13.9625,0.0,88.0,0.0,1.225,,,23,5,121,-0.25881904510252157,0.9659258262890681,0.8717063187093218,-0.49002866642905923,0.0,0.0,0.0 +2026-05-02 00:00:00+00:00,0.0,14.275,14.3625,14.2125,0.0,86.25,0.0,0.95,,,0,5,122,0.0,1.0,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 01:00:00+00:00,0.0,14.8125,14.8875,14.6875,0.0,83.25,0.0,1.2625,,,1,5,122,0.25881904510252074,0.9659258262890683,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 02:00:00+00:00,0.0,15.725000000000001,15.85,15.525,63.875,78.875,0.0,0.9625,,,2,5,122,0.49999999999999994,0.8660254037844387,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 03:00:00+00:00,3700.0,17.0,17.125,16.7,240.125,72.25,0.0,1.125,,,3,5,122,0.7071067811865475,0.7071067811865476,0.8631421280499114,-0.5049610547215204,0.0,0.0,3.7 +2026-05-02 04:00:00+00:00,14900.0,17.3,17.475,17.125,294.0,70.375,0.0,2.1875,,,4,5,122,0.8660254037844386,0.5000000000000001,0.8631421280499114,-0.5049610547215204,0.13453808270047468,1.5,14.9 +2026-05-02 05:00:00+00:00,22600.0,18.5125,18.7125,18.175,687.625,65.875,0.0,2.7375,-33.32,41.779618635565996,5,5,122,0.9659258262890683,0.25881904510252074,0.8631421280499114,-0.5049610547215204,0.3489536709271422,1.5,22.6 +2026-05-02 06:00:00+00:00,26400.0,20.3875,20.65,19.974999999999998,785.375,59.625,0.0,2.775,-33.32,41.779618635565996,6,5,122,1.0,6.123233995736766e-17,0.8631421280499114,-0.5049610547215204,0.5487571911546758,1.4311885341264345,26.4 +2026-05-02 07:00:00+00:00,28200.0,22.2375,22.5125,21.925,964.875,51.75,0.0,3.9125,-33.32,41.779618635565996,7,5,122,0.9659258262890683,-0.25881904510252063,0.8631421280499114,-0.5049610547215204,0.7203323636704977,1.3394858382919523,28.2 +2026-05-02 08:00:00+00:00,27100.0,23.9,24.3375,23.5,963.125,44.875,0.0,2.825,-33.32,41.779618635565996,8,5,122,0.8660254037844387,-0.49999999999999983,0.8631421280499114,-0.5049610547215204,0.8519866240090339,1.1304461512177304,27.1 +2026-05-02 09:00:00+00:00,21600.0,22.85,23.3125,22.424999999999997,819.875,57.25,0.0,2.975,-33.32,41.779618635565996,9,5,122,0.7071067811865476,-0.7071067811865475,0.8631421280499114,-0.5049610547215204,0.9347479518971653,0.87710809992788,21.6 +2026-05-02 10:00:00+00:00,19500.0,21.1375,21.625,20.7,534.875,63.875,0.0,3.25,-33.32,41.779618635565996,10,5,122,0.49999999999999994,-0.8660254037844387,0.8631421280499114,-0.5049610547215204,0.9629762996088767,0.5554394227742109,19.5 +2026-05-02 11:00:00+00:00,20500.0,19.3625,19.6125,19.175,401.0,73.875,0.0,2.7375,-33.32,41.779618635565996,11,5,122,0.258819045102521,-0.9659258262890682,0.8631421280499114,-0.5049610547215204,0.9347479518971653,0.42899264896609834,20.5 +2026-05-02 12:00:00+00:00,21900.0,19.174999999999997,19.4625,18.9625,283.75,74.5,0.0,2.9125,-33.32,41.779618635565996,12,5,122,1.2246467991473532e-16,-1.0,0.8631421280499114,-0.5049610547215204,0.8519866240090339,0.3330451347520114,21.9 +2026-05-02 13:00:00+00:00,18700.0,18.975,19.25,18.725,223.25,77.5,0.0,3.1125,-33.32,41.779618635565996,13,5,122,-0.2588190451025208,-0.9659258262890683,0.8631421280499114,-0.5049610547215204,0.7203323636704977,0.30992637740503004,18.7 +2026-05-02 14:00:00+00:00,13300.0,19.05,19.1625,18.9125,120.0,77.75,0.0,1.925,-33.32,41.779618635565996,14,5,122,-0.4999999999999998,-0.8660254037844388,0.8631421280499114,-0.5049610547215204,0.5487571911546758,0.2186759498267352,13.3 +2026-05-02 15:00:00+00:00,2300.0,18.5875,18.7125,18.525,3.875,81.75,0.0,1.6125,-33.32,41.779618635565996,15,5,122,-0.7071067811865471,-0.7071067811865479,0.8631421280499114,-0.5049610547215204,0.3489536709271422,0.011104625980017442,2.3 +2026-05-02 16:00:00+00:00,200.0,18.175,18.2375,18.0375,0.0,77.875,0.0,1.2374999999999998,-33.32,41.779618635565996,16,5,122,-0.8660254037844384,-0.5000000000000004,0.8631421280499114,-0.5049610547215204,0.13453808270047468,0.0,0.2 +2026-05-02 17:00:00+00:00,0.0,18.4375,18.5375,18.3375,0.0,74.25,0.0,1.8624999999999998,-33.32,41.779618635565996,17,5,122,-0.9659258262890683,-0.25881904510252063,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 18:00:00+00:00,0.0,18.1375,18.2125,18.075000000000003,0.0,86.0,0.0,2.4625,-33.32,41.779618635565996,18,5,122,-1.0,-1.8369701987210297e-16,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 19:00:00+00:00,0.0,17.6125,17.825,17.475,0.0,74.0,0.0,1.4875,-33.32,41.779618635565996,19,5,122,-0.9659258262890684,0.2588190451025203,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 20:00:00+00:00,0.0,20.0,20.4375,19.525,0.0,54.75,0.0,2.0875,-33.32,41.779618635565996,20,5,122,-0.8660254037844386,0.5000000000000001,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 21:00:00+00:00,0.0,22.3,22.375,22.15,0.0,39.0,0.0,2.275,-78.37166666666667,6.845904696321096,21,5,122,-0.7071067811865477,0.7071067811865474,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 22:00:00+00:00,0.0,20.9625,21.2875,20.6875,0.0,44.125,0.0,1.0375,-78.37166666666667,6.845904696321096,22,5,122,-0.5000000000000004,0.8660254037844384,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-02 23:00:00+00:00,0.0,18.8375,18.975,18.75,0.0,77.5,0.0,2.6625,-78.37166666666667,6.845904696321096,23,5,122,-0.25881904510252157,0.9659258262890681,0.8631421280499114,-0.5049610547215204,0.0,0.0,0.0 +2026-05-03 00:00:00+00:00,0.0,18.2375,18.35,18.175,0.0,84.5,0.0,5.2375,-78.37,6.848153035673197,0,5,123,0.0,1.0,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 01:00:00+00:00,0.0,17.8375,17.9375,17.725,0.0,86.625,0.0,1.5625,-78.37,6.848153035673197,1,5,123,0.25881904510252074,0.9659258262890683,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 02:00:00+00:00,0.0,19.15,19.625,18.7125,52.25,67.375,0.0,2.025,-78.37,6.848153035673197,2,5,123,0.49999999999999994,0.8660254037844387,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 03:00:00+00:00,600.0,22.287499999999998,22.5375,21.975,225.0,51.125,0.0,1.0625,-78.37,6.848153035673197,3,5,123,0.7071067811865475,0.7071067811865476,0.854322169749827,-0.5197438121555155,0.0,0.0,0.6 +2026-05-03 04:00:00+00:00,10600.0,21.45,21.6875,21.2625,427.125,67.375,0.0,1.9875,-78.37,6.848153035673197,4,5,123,0.8660254037844386,0.5000000000000001,0.854322169749827,-0.5197438121555155,0.1371699919356421,1.5,10.6 +2026-05-03 05:00:00+00:00,19500.0,21.2875,21.625,21.0125,659.875,65.875,0.0,4.65,-54.298,43.3748334406024,5,5,123,0.9659258262890683,0.25881904510252074,0.854322169749827,-0.5197438121555155,0.351272246128987,1.5,19.5 +2026-05-03 06:00:00+00:00,24000.0,21.4,21.5875,21.2,833.25,73.25,0.0,6.4875,-48.28,55.35632213216482,6,5,123,1.0,6.123233995736766e-17,0.854322169749827,-0.5197438121555155,0.5507837855197599,1.5,24.0 +2026-05-03 07:00:00+00:00,24900.0,21.3125,21.5375,21.037499999999998,933.0,73.5,0.0,6.95,-48.28,55.35632213216482,7,5,123,0.9659258262890683,-0.25881904510252063,0.854322169749827,-0.5197438121555155,0.7221082284068873,1.2920500879187895,24.9 +2026-05-03 08:00:00+00:00,25600.0,20.85,21.075000000000003,20.6125,809.375,75.625,0.0,6.5875,-48.28,55.35632213216482,8,5,123,0.8660254037844387,-0.49999999999999983,0.854322169749827,-0.5197438121555155,0.8535700971346402,0.9482232364008543,25.6 +2026-05-03 09:00:00+00:00,13400.0,19.9375,20.2,19.65,377.125,79.75,0.0,4.7625,-48.28,55.35632213216482,9,5,123,0.7071067811865476,-0.7071067811865475,0.854322169749827,-0.5197438121555155,0.9362104826002322,0.40282074064431805,13.4 +2026-05-03 10:00:00+00:00,16000.0,20.0,20.175,19.775,338.75,76.25,0.0,3.9250000000000003,-48.28,55.35632213216482,10,5,123,0.49999999999999994,-0.8660254037844387,0.854322169749827,-0.5197438121555155,0.9643975791038776,0.35125554785689944,16.0 +2026-05-03 11:00:00+00:00,17500.0,19.525,19.725,19.3625,283.125,76.0,0.0,3.9,-48.28,55.35632213216482,11,5,123,0.258819045102521,-0.9659258262890682,0.854322169749827,-0.5197438121555155,0.9362104826002322,0.30241596869717613,17.5 +2026-05-03 12:00:00+00:00,14600.0,18.200000000000003,18.4875,17.9125,95.375,83.625,0.3125,3.4625,-48.28,55.35632213216482,12,5,123,1.2246467991473532e-16,-1.0,0.854322169749827,-0.5197438121555155,0.8535700971346402,0.11173657596507364,14.6 +2026-05-03 13:00:00+00:00,13700.0,16.8375,16.9625,16.7125,37.125,88.625,0.0,3.175,-48.28,55.35632213216482,13,5,123,-0.2588190451025208,-0.9659258262890683,0.854322169749827,-0.5197438121555155,0.7221082284068873,0.05141196089387466,13.7 +2026-05-03 14:00:00+00:00,2900.0,16.35,16.4375,16.275,13.75,85.0,0.0,2.275,-48.28,55.35632213216482,14,5,123,-0.4999999999999998,-0.8660254037844388,0.854322169749827,-0.5197438121555155,0.5507837855197599,0.02496442408344409,2.9 +2026-05-03 15:00:00+00:00,700.0,16.225,16.3125,16.1625,4.5,83.625,0.0,3.175,-48.28,55.35632213216482,15,5,123,-0.7071067811865471,-0.7071067811865479,0.854322169749827,-0.5197438121555155,0.351272246128987,0.012810576553057946,0.7 +2026-05-03 16:00:00+00:00,0.0,16.2,16.2875,16.15,0.0,73.625,0.0,3.5,-11.147,13.386558407596779,16,5,123,-0.8660254037844384,-0.5000000000000004,0.854322169749827,-0.5197438121555155,0.1371699919356421,0.0,0.0 +2026-05-03 17:00:00+00:00,0.0,16.025,16.087500000000002,15.925,0.0,68.5,0.0,4.325,0.0,0.0,17,5,123,-0.9659258262890683,-0.25881904510252063,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 18:00:00+00:00,0.0,15.675,15.7125,15.575,0.0,69.5,0.0,3.7125,0.0,0.0,18,5,123,-1.0,-1.8369701987210297e-16,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 19:00:00+00:00,0.0,15.7125,15.8375,15.6375,0.0,68.5,0.0,4.0375,0.0,0.0,19,5,123,-0.9659258262890684,0.2588190451025203,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 20:00:00+00:00,0.0,15.45,15.4875,15.35,0.0,59.625,0.0,4.125,0.0,0.0,20,5,123,-0.8660254037844386,0.5000000000000001,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 21:00:00+00:00,0.0,15.375,15.4375,15.325000000000001,0.0,59.375,0.0,4.175,0.0,0.0,21,5,123,-0.7071067811865477,0.7071067811865474,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 22:00:00+00:00,0.0,15.237499999999999,15.325,15.2,0.0,62.625,0.0,3.825,0.0,0.0,22,5,123,-0.5000000000000004,0.8660254037844384,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-03 23:00:00+00:00,0.0,15.2125,15.2625,15.149999999999999,0.0,56.0,0.0,4.6375,0.0,0.0,23,5,123,-0.25881904510252157,0.9659258262890681,0.854322169749827,-0.5197438121555155,0.0,0.0,0.0 +2026-05-04 00:00:00+00:00,0.0,15.0625,15.1625,15.025,0.0,61.375,0.0,3.975,0.0,0.0,0,5,124,0.0,1.0,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 01:00:00+00:00,0.0,15.025,15.0875,14.9375,0.0,59.0,0.0,3.7875,0.0,0.0,1,5,124,0.25881904510252074,0.9659258262890683,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 02:00:00+00:00,0.0,15.1625,15.1875,15.1,48.875,56.875,0.0,3.5625,0.0,0.0,2,5,124,0.49999999999999994,0.8660254037844387,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 03:00:00+00:00,4500.0,15.9125,16.0375,15.7625,287.75,53.25,0.0,3.925,0.0,0.0,3,5,124,0.7071067811865475,0.7071067811865476,0.8452490573530633,-0.5343725582809787,0.0,0.0,4.5 +2026-05-04 04:00:00+00:00,19000.0,16.675,16.8125,16.475,518.5,52.125,0.0,4.512499999999999,0.0,0.0,4,5,124,0.8660254037844386,0.5000000000000001,0.8452490573530633,-0.5343725582809787,0.1397584256721722,1.5,19.0 +2026-05-04 05:00:00+00:00,22600.0,17.2125,17.45,17.0375,633.25,52.25,0.0,5.35,2.4170000000000003,11.204931473834785,5,5,124,0.9659258262890683,0.25881904510252074,0.8452490573530633,-0.5343725582809787,0.353546140145217,1.5,22.6 +2026-05-04 06:00:00+00:00,26300.0,15.3625,16.2,14.7125,369.75,72.75,0.375,4.6875,-6.727071428571427,26.593698294385252,6,5,124,1.0,6.123233995736766e-17,0.8452490573530633,-0.5343725582809787,0.5527645751778267,0.6689104486861335,26.3 +2026-05-04 07:00:00+00:00,26900.0,13.3625,13.65,13.025,340.0,87.875,0.41250000000000003,5.0625,-23.77575,69.3431883890098,7,5,124,0.9659258262890683,-0.25881904510252063,0.8452490573530633,-0.5343725582809787,0.723837323646559,0.4697188013007435,26.9 +2026-05-04 08:00:00+00:00,19200.0,15.5625,15.7,15.3625,864.625,76.875,0.0,6.3375,-40.504999999999995,71.65032321397207,8,5,124,0.8660254037844387,-0.49999999999999983,0.8452490573530633,-0.5343725582809787,0.8551060604543536,1.0111318817464452,19.2 +2026-05-04 09:00:00+00:00,12500.0,16.174999999999997,16.5,15.8875,584.875,70.625,0.0,6.4125,-43.863749999999996,74.00660328865305,9,5,124,0.7071067811865476,-0.7071067811865475,0.8452490573530633,-0.5343725582809787,0.9376250381196037,0.6237834701737063,12.5 +2026-05-04 10:00:00+00:00,15200.0,16.4875,16.75,16.175,631.125,69.625,0.0,5.375,-43.60768883689839,32.061833012073144,10,5,124,0.49999999999999994,-0.8660254037844387,0.8452490573530633,-0.5343725582809787,0.9657707246834811,0.6534936127897675,15.2 +2026-05-04 11:00:00+00:00,18500.0,16.912499999999998,17.125,16.8125,437.0,66.75,0.0,6.175,-60.28,17.150446058339124,11,5,124,0.258819045102521,-0.9659258262890682,0.8452490573530633,-0.5343725582809787,0.9376250381196037,0.4660711715595805,18.5 +2026-05-04 12:00:00+00:00,15600.0,16.6875,16.775,16.587500000000002,172.125,65.875,0.0,4.8875,-78.29,6.881409739290341,12,5,124,1.2246467991473532e-16,-1.0,0.8452490573530633,-0.5343725582809787,0.8551060604543536,0.20129081988793623,15.6 +2026-05-04 13:00:00+00:00,11300.0,16.9125,17.125,16.675,315.75,61.0,0.0,6.2625,-78.2125,6.873825354196894,13,5,124,-0.2588190451025208,-0.9659258262890683,0.8452490573530633,-0.5343725582809787,0.723837323646559,0.43621679856091106,11.3 +2026-05-04 14:00:00+00:00,8100.0,16.3875,16.5125,16.325000000000003,123.875,62.875,0.0,5.7625,-76.7868262987013,6.5763712565698675,14,5,124,-0.4999999999999998,-0.8660254037844388,0.8452490573530633,-0.5343725582809787,0.5527645751778267,0.22410082983365728,8.1 +2026-05-04 15:00:00+00:00,5400.0,15.75,15.85,15.6625,6.0,67.75,0.0,4.9625,-78.406875,6.849366568948788,15,5,124,-0.7071067811865471,-0.7071067811865479,0.8452490573530633,-0.5343725582809787,0.353546140145217,0.016970910777121016,5.4 +2026-05-04 16:00:00+00:00,200.0,15.4625,15.5125,15.3875,0.0,64.375,0.0,4.3875,-78.4475,6.841145737374694,16,5,124,-0.8660254037844384,-0.5000000000000004,0.8452490573530633,-0.5343725582809787,0.1397584256721722,0.0,0.2 +2026-05-04 17:00:00+00:00,0.0,15.4,15.4375,15.3,0.0,66.0,0.0,3.5625,-78.49083333333333,6.922682725007059,17,5,124,-0.9659258262890683,-0.25881904510252063,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 18:00:00+00:00,0.0,15.2875,15.375,15.2375,0.0,63.5,0.0,4.2,-78.488125,6.925633958647155,18,5,124,-1.0,-1.8369701987210297e-16,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 19:00:00+00:00,0.0,15.1125,15.1875,15.0375,0.0,61.5,0.0,3.7625,-78.4875,6.9261683731579415,19,5,124,-0.9659258262890684,0.2588190451025203,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 20:00:00+00:00,0.0,14.925,14.975,14.85,0.0,62.25,0.0,3.7625,-78.485625,6.9277727225879255,20,5,124,-0.8660254037844386,0.5000000000000001,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 21:00:00+00:00,0.0,15.0125,15.0625,14.9375,0.0,64.375,0.0,3.85,-71.16729166666667,10.569508104093586,21,5,124,-0.7071067811865477,0.7071067811865474,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 22:00:00+00:00,0.0,14.9125,14.95,14.825000000000001,0.0,64.375,0.0,4.35,-48.334999999999994,55.34653956060246,22,5,124,-0.5000000000000004,0.8660254037844384,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-04 23:00:00+00:00,0.0,14.850000000000001,14.9125,14.8375,0.0,61.125,0.0,4.225,-48.315625000000004,55.34689318196491,23,5,124,-0.25881904510252157,0.9659258262890681,0.8452490573530633,-0.5343725582809787,0.0,0.0,0.0 +2026-05-05 00:00:00+00:00,0.0,14.875,14.9375,14.787500000000001,0.0,59.625,0.0,3.7125000000000004,-48.154875000000004,55.63377653664333,0,5,125,0.0,1.0,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 01:00:00+00:00,0.0,14.7,14.8,14.6375,0.0,62.5,0.0,3.825,-48.056666666666665,55.850540433076084,1,5,125,0.25881904510252074,0.9659258262890683,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 02:00:00+00:00,0.0,14.8125,14.8875,14.7,53.375,62.875,0.0,3.375,-48.025000000000006,55.837867191539466,2,5,125,0.49999999999999994,0.8660254037844387,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 03:00:00+00:00,3600.0,15.275,15.375,15.1125,158.125,63.0,0.0,3.625,-48.038124999999994,55.84858843989852,3,5,125,0.7071067811865475,0.7071067811865476,0.835925479418637,-0.548842958284719,0.0,0.0,3.6 +2026-05-05 04:00:00+00:00,14100.0,15.950000000000001,16.087500000000002,15.825000000000001,295.5,57.5,0.0,4.9,-48.146874999999994,55.9104580026179,4,5,125,0.8660254037844386,0.5000000000000001,0.835925479418637,-0.548842958284719,0.14230272217405132,1.5,14.1 +2026-05-05 05:00:00+00:00,8800.0,16.675,16.975,16.4625,655.875,55.625,0.0,4.7125,-48.1365,55.793513712019724,5,5,125,0.9659258262890683,0.25881904510252074,0.835925479418637,-0.548842958284719,0.35577506567238637,1.5,8.8 +2026-05-05 06:00:00+00:00,15900.0,17.1375,17.3625,16.900000000000002,865.0,54.0,0.0,6.0875,-50.648250000000004,50.75593757302357,6,5,125,1.0,6.123233995736766e-17,0.835925479418637,-0.548842958284719,0.5546996217410376,1.5,15.9 +2026-05-05 07:00:00+00:00,22900.0,17.125,17.3625,16.875,536.75,55.375,0.0,4.8625,-54.572125,42.937402437298175,7,5,125,0.9659258262890683,-0.25881904510252063,0.835925479418637,-0.548842958284719,0.7255200106222984,0.7398141913957891,22.9 +2026-05-05 08:00:00+00:00,18900.0,16.0375,16.3875,15.7125,208.875,66.875,0.05,5.0875,-57.505424999999995,37.003460726295586,8,5,125,0.8660254037844387,-0.49999999999999983,0.835925479418637,-0.548842958284719,0.8565951051079511,0.2438433266247498,18.9 +2026-05-05 09:00:00+00:00,14800.0,14.075,14.25,13.9,249.375,84.75,0.2,3.625,-71.961875,8.980979757010552,9,5,125,0.7071067811865476,-0.7071067811865475,0.835925479418637,-0.548842958284719,0.9389923541206335,0.26557724235522634,14.8 +2026-05-05 10:00:00+00:00,15900.0,14.225,14.387500000000001,14.0375,243.5,81.625,0.0625,3.8875,-74.77199999999999,5.118764352849229,10,5,125,0.49999999999999994,-0.8660254037844387,0.835925479418637,-0.548842958284719,0.9670965213080238,0.25178458885433663,15.9 +2026-05-05 11:00:00+00:00,15500.0,15.05,15.2625,14.825,159.5,79.875,0.0625,3.325,-76.81175,4.9720221992666165,11,5,125,0.258819045102521,-0.9659258262890682,0.835925479418637,-0.548842958284719,0.9389923541206335,0.16986293796755328,15.5 +2026-05-05 12:00:00+00:00,11500.0,14.6375,14.75,14.5125,69.75,77.125,0.0,3.1375,-78.27375,6.691195863471145,12,5,125,1.2246467991473532e-16,-1.0,0.835925479418637,-0.548842958284719,0.8565951051079511,0.08142703546176563,11.5 +2026-05-05 13:00:00+00:00,12500.0,14.55,14.7375,14.375,63.0,75.625,0.0125,3.1625,-78.39000000000001,6.859663500007372,13,5,125,-0.2588190451025208,-0.9659258262890683,0.835925479418637,-0.548842958284719,0.7255200106222984,0.08683426932079126,12.5 +2026-05-05 14:00:00+00:00,11700.0,15.2,15.287500000000001,15.174999999999999,40.125,67.625,0.0,3.025,-76.6102205882353,6.838555216530658,14,5,125,-0.4999999999999998,-0.8660254037844388,0.835925479418637,-0.548842958284719,0.5546996217410376,0.07233644738040297,11.7 +2026-05-05 15:00:00+00:00,6200.0,15.0625,15.1375,15.025,7.875,71.125,0.0,2.825,-77.651875,7.634397862907503,15,5,125,-0.7071067811865471,-0.7071067811865479,0.835925479418637,-0.548842958284719,0.35577506567238637,0.022134772106968435,6.2 +2026-05-05 16:00:00+00:00,500.0,14.95,14.975,14.850000000000001,0.0,73.875,0.0,2.7,-77.699375,7.663226685226445,16,5,125,-0.8660254037844384,-0.5000000000000004,0.835925479418637,-0.548842958284719,0.14230272217405132,0.0,0.5 +2026-05-05 17:00:00+00:00,0.0,14.9875,15.075,14.925,0.0,70.375,0.0,2.6875,-77.69875,7.684561498007984,17,5,125,-0.9659258262890683,-0.25881904510252063,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 18:00:00+00:00,0.0,14.3,14.375,14.2,0.0,71.625,0.0,1.7625,-77.69250000000001,7.691611773007441,18,5,125,-1.0,-1.8369701987210297e-16,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 19:00:00+00:00,0.0,13.6875,13.8,13.5375,0.0,73.125,0.0,1.675,-77.69062500000001,7.693750270782555,19,5,125,-0.9659258262890684,0.2588190451025203,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 20:00:00+00:00,0.0,12.8,12.9,12.65,0.0,76.875,0.0,1.3624999999999998,-77.68625,7.698662356756098,20,5,125,-0.8660254037844386,0.5000000000000001,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 21:00:00+00:00,0.0,12.475,12.5625,12.375,0.0,80.5,0.0,1.1,-65.685625,19.042119583417353,21,5,125,-0.7071067811865477,0.7071067811865474,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 22:00:00+00:00,0.0,12.75,12.8125,12.6,0.0,81.0,0.0,1.0,-47.685,54.56710413945994,22,5,125,-0.5000000000000004,0.8660254037844384,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-05 23:00:00+00:00,0.0,12.125,12.2625,12.0625,0.0,81.375,0.0,1.475,-47.676874999999995,54.567258245176966,23,5,125,-0.25881904510252157,0.9659258262890681,0.835925479418637,-0.548842958284719,0.0,0.0,0.0 +2026-05-06 00:00:00+00:00,0.0,12.2375,12.4,12.0875,0.0,79.75,0.0,1.9124999999999999,-47.67333333333333,54.56736027523603,0,5,126,0.0,1.0,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 01:00:00+00:00,0.0,13.3125,13.475,13.175,0.25,73.125,0.0,2.55,-47.67,54.56651686244963,1,5,126,0.25881904510252074,0.9659258262890683,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 02:00:00+00:00,0.0,14.125,14.25,13.975,68.875,69.25,0.0,2.95,-47.673125,54.569912092005126,2,5,126,0.49999999999999994,0.8660254037844387,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 03:00:00+00:00,4700.0,15.0875,15.175,14.8625,232.5,66.5,0.0,1.3,-47.70375,54.579533652734696,3,5,126,0.7071067811865475,0.7071067811865476,0.8263541987239096,-0.5631507242749186,0.0,0.0,4.7 +2026-05-06 04:00:00+00:00,16300.0,16.262500000000003,16.474999999999998,16.075,463.75,60.75,0.0,2.075,-47.795625,54.62825685847786,4,5,126,0.8660254037844386,0.5000000000000001,0.8263541987239096,-0.5631507242749186,0.14480223999184078,1.5,16.3 +2026-05-06 05:00:00+00:00,21900.0,16.6875,17.1375,16.3375,461.5,59.25,0.0,2.3499999999999996,-47.830375,54.557215950130434,5,5,126,0.9659258262890683,0.25881904510252074,0.8263541987239096,-0.5631507242749186,0.35795875614402217,1.2892546755144012,21.9 +2026-05-06 06:00:00+00:00,23500.0,17.475,17.8375,17.025000000000002,745.75,57.75,0.0,2.9625,-52.50266071428571,45.40147690573914,6,5,126,1.0,6.123233995736766e-17,0.8263541987239096,-0.5631507242749186,0.5565890079782309,1.339857577692529,23.5 +2026-05-06 07:00:00+00:00,22500.0,18.2375,18.5,17.7125,865.0,57.0,0.0,2.925,-60.49575,29.345172597038854,7,5,126,0.9659258262890683,-0.25881904510252063,0.8263541987239096,-0.5631507242749186,0.7271566720839766,1.189564825859295,22.5 +2026-05-06 08:00:00+00:00,17200.0,18.5125,18.900000000000002,18.1125,995.75,57.0,0.0,4.5625,-63.79725,22.803398271968152,8,5,126,0.8660254037844387,-0.49999999999999983,0.8263541987239096,-0.5631507242749186,0.8580378440288455,1.1604965992228717,17.2 +2026-05-06 09:00:00+00:00,19400.0,18.912499999999998,19.262500000000003,18.474999999999998,1106.125,51.625,0.0,4.7,-67.045,16.42019843566656,9,5,126,0.7071067811865476,-0.7071067811865475,0.8263541987239096,-0.5631507242749186,0.9403131882361581,1.1763367927178308,19.4 +2026-05-06 10:00:00+00:00,16800.0,19.4,19.6875,19.05,982.875,49.375,0.0,4.0125,-70.70416666666667,9.555803283287537,10,5,126,0.49999999999999994,-0.8660254037844387,0.8263541987239096,-0.5631507242749186,0.9683757759646208,1.0149727248401441,16.8 +2026-05-06 11:00:00+00:00,19500.0,18.9625,19.275,18.675,799.75,51.25,0.0,3.2625,-77.52125,7.638930035242724,11,5,126,0.258819045102521,-0.9659258262890682,0.8263541987239096,-0.5631507242749186,0.9403131882361581,0.8505144987918047,19.5 +2026-05-06 12:00:00+00:00,19800.0,18.7875,19.099999999999998,18.4875,598.875,51.875,0.0,2.9125,-77.510625,7.634371938531244,12,5,126,1.2246467991473532e-16,-1.0,0.8263541987239096,-0.5631507242749186,0.8580378440288455,0.6979587254427289,19.8 +2026-05-06 13:00:00+00:00,20100.0,18.125,18.3125,17.9625,378.0,55.5,0.0,2.575,-77.48625,7.637768407722242,13,5,126,-0.2588190451025208,-0.9659258262890683,0.8263541987239096,-0.5631507242749186,0.7271566720839766,0.5198329528032526,20.1 +2026-05-06 14:00:00+00:00,20100.0,17.275,17.424999999999997,17.15,147.125,59.125,0.0,2.5375,-76.01227205882353,7.094084567094168,14,5,126,-0.4999999999999998,-0.8660254037844388,0.8263541987239096,-0.5631507242749186,0.5565890079782309,0.2643332834301218,20.1 +2026-05-06 15:00:00+00:00,9600.0,16.1875,16.3375,16.1375,6.0,64.0,0.0,1.6125,-77.572,7.678803682866226,15,5,126,-0.7071067811865471,-0.7071067811865479,0.8263541987239096,-0.5631507242749186,0.35795875614402217,0.016761707590653104,9.6 +2026-05-06 16:00:00+00:00,500.0,14.8625,15.0625,14.7,0.0,69.125,0.0,1.1625,-77.71937499999999,7.680123256118135,16,5,126,-0.8660254037844384,-0.5000000000000004,0.8263541987239096,-0.5631507242749186,0.14480223999184078,0.0,0.5 +2026-05-06 17:00:00+00:00,0.0,13.9,13.9375,13.8,0.0,74.125,0.0,1.1375000000000002,-77.69,7.676997025747323,17,5,126,-0.9659258262890683,-0.25881904510252063,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 18:00:00+00:00,0.0,13.6375,13.775,13.5375,0.0,76.125,0.0,1.175,-77.68249999999999,7.685558426902587,18,5,126,-1.0,-1.8369701987210297e-16,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 19:00:00+00:00,0.0,13.7,13.775,13.6375,0.0,76.25,0.0,1.3125,-77.676875,7.69198104494761,19,5,126,-0.9659258262890684,0.2588190451025203,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 20:00:00+00:00,0.0,13.4,13.475,13.3,0.0,78.875,0.0,0.375,-77.669375,7.7005466188554825,20,5,126,-0.8660254037844386,0.5000000000000001,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 21:00:00+00:00,0.0,12.8375,12.9125,12.7625,0.0,83.5,0.0,0.7375,-68.1515,14.391100803390037,21,5,126,-0.7071067811865477,0.7071067811865474,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 22:00:00+00:00,0.0,12.4875,12.5625,12.4,0.0,85.0,0.0,0.4375,-47.6445,54.65285491475567,22,5,126,-0.5000000000000004,0.8660254037844384,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-06 23:00:00+00:00,0.0,12.3125,12.375,12.25,0.0,84.375,0.0,0.3875,-47.6325,54.657527987832935,23,5,126,-0.25881904510252157,0.9659258262890681,0.8263541987239096,-0.5631507242749186,0.0,0.0,0.0 +2026-05-07 00:00:00+00:00,0.0,12.325,12.45,12.162500000000001,0.0,82.75,0.0,0.3375,-47.6325,54.65593132649618,0,5,127,0.0,1.0,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 01:00:00+00:00,0.0,12.0,12.0625,11.95,0.25,85.375,0.0,0.36250000000000004,-47.59125,54.63510785581618,1,5,127,0.25881904510252074,0.9659258262890683,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 02:00:00+00:00,0.0,12.975,13.125,12.5625,69.625,82.125,0.0,0.7625,-47.62125,54.66072777064596,2,5,127,0.49999999999999994,0.8660254037844387,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 03:00:00+00:00,5400.0,15.2125,15.4,15.05,269.25,71.875,0.0,1.9375,-47.6225,54.65480517911181,3,5,127,0.7071067811865475,0.7071067811865476,0.8165380514459161,-0.5772916165517272,0.0,0.0,5.4 +2026-05-07 04:00:00+00:00,18900.0,16.3875,16.575,16.1625,495.875,68.875,0.0,2.3375,-47.77375,54.71389481125126,4,5,127,0.8660254037844386,0.5000000000000001,0.8165380514459161,-0.5772916165517272,0.14725635784559873,1.5,18.9 +2026-05-07 05:00:00+00:00,22600.0,17.0875,17.325,16.8,701.75,69.375,0.0,3.4375,-47.776250000000005,54.69250407581767,5,5,127,0.9659258262890683,0.25881904510252074,0.8165380514459161,-0.5772916165517272,0.3600969651642495,1.5,22.6 +2026-05-07 06:00:00+00:00,25000.0,18.0625,18.4,17.75,873.25,67.0,0.0,4.0625,-50.54280357142857,49.23815935026364,6,5,127,1.0,6.123233995736766e-17,0.8165380514459161,-0.5772916165517272,0.5584328368298687,1.5,25.0 +2026-05-07 07:00:00+00:00,25800.0,18.8625,19.15,18.475,982.625,63.0,0.0,4.125,-62.14651785714286,26.26589402585539,7,5,127,0.9659258262890683,-0.25881904510252063,0.8165380514459161,-0.5772916165517272,0.728747710953969,1.3483747327503675,25.8 +2026-05-07 08:00:00+00:00,14100.0,19.0375,19.425,18.7875,1034.125,62.25,0.0,4.3875,-75.8955,5.603482860388408,8,5,127,0.8660254037844387,-0.49999999999999983,0.8165380514459161,-0.5772916165517272,0.8594349103236308,1.2032615705715137,14.1 +2026-05-07 09:00:00+00:00,11200.0,19.237499999999997,19.5,18.925,1025.5,65.0,0.0,4.9,-77.794375,7.877327797493684,9,5,127,0.7071067811865476,-0.7071067811865475,0.8165380514459161,-0.5772916165517272,0.9415883182726198,1.089117165218574,11.2 +2026-05-07 10:00:00+00:00,15700.0,18.825,19.262500000000003,18.475,924.875,66.875,0.0,5.237500000000001,-77.685,7.93237459192811,10,5,127,0.49999999999999994,-0.8660254037844387,0.8165380514459161,-0.5772916165517272,0.9696093158141383,0.9538635664029518,15.7 +2026-05-07 11:00:00+00:00,19400.0,18.5875,18.95,18.325,739.5,67.375,0.0,5.2375,-77.69624999999999,7.9052433812417595,11,5,127,0.258819045102521,-0.9659258262890682,0.8165380514459161,-0.5772916165517272,0.9415883182726198,0.7853750791605416,19.4 +2026-05-07 12:00:00+00:00,20400.0,18.7125,18.9125,18.4375,608.25,65.875,0.0,4.449999999999999,-77.706875,7.888585470739772,12,5,127,1.2246467991473532e-16,-1.0,0.8165380514459161,-0.5772916165517272,0.8594349103236308,0.7077324794392585,20.4 +2026-05-07 13:00:00+00:00,19600.0,18.2125,18.400000000000002,18.075,381.375,68.0,0.0,4.4125,-77.72125,7.884007679050884,13,5,127,-0.2588190451025208,-0.9659258262890683,0.8165380514459161,-0.5772916165517272,0.728747710953969,0.5233292595880131,19.6 +2026-05-07 14:00:00+00:00,15700.0,17.6125,17.7875,17.5125,165.0,73.625,0.0,4.0625,-76.14240625,7.382554692324077,14,5,127,-0.4999999999999998,-0.8660254037844388,0.8165380514459161,-0.5772916165517272,0.5584328368298687,0.29546973085730033,15.7 +2026-05-07 15:00:00+00:00,7800.0,17.05,17.1625,16.9875,7.375,75.125,0.0,3.25,-77.66983333333334,7.88646238816873,15,5,127,-0.7071067811865471,-0.7071067811865479,0.8165380514459161,-0.5772916165517272,0.3600969651642495,0.020480594710472144,7.8 +2026-05-07 16:00:00+00:00,400.0,16.8,16.875,16.75,0.0,79.25,0.0,3.8125,-77.833125,7.904505934117582,16,5,127,-0.8660254037844384,-0.5000000000000004,0.8165380514459161,-0.5772916165517272,0.14725635784559873,0.0,0.4 +2026-05-07 17:00:00+00:00,0.0,16.8375,16.9125,16.7375,0.0,82.0,0.0,3.75,-77.82124999999999,7.901453848290621,17,5,127,-0.9659258262890683,-0.25881904510252063,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 18:00:00+00:00,0.0,16.8625,16.9375,16.8125,0.0,83.0,0.0,3.9125,-77.819375,7.919819646252476,18,5,127,-1.0,-1.8369701987210297e-16,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 19:00:00+00:00,0.0,16.7375,16.8,16.6375,0.0,83.25,0.0,3.8,-76.8925,7.070993270632725,19,5,127,-0.9659258262890684,0.2588190451025203,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 20:00:00+00:00,0.0,16.6125,16.65,16.5375,0.0,85.0,0.0,3.3625,-76.00812499999999,7.176788213574373,20,5,127,-0.8660254037844386,0.5000000000000001,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 21:00:00+00:00,0.0,16.5,16.575000000000003,16.4625,0.0,86.375,0.0,2.975,-66.792125,11.33469274965875,21,5,127,-0.7071067811865477,0.7071067811865474,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 22:00:00+00:00,0.0,16.375,16.4625,16.3125,0.0,86.0,0.0,3.5,-45.879125,53.129930396113195,22,5,127,-0.5000000000000004,0.8660254037844384,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-07 23:00:00+00:00,0.0,16.3625,16.424999999999997,16.3,0.0,87.25,0.0,3.2875,-45.884166666666665,53.132646835276546,23,5,127,-0.25881904510252157,0.9659258262890681,0.8165380514459161,-0.5772916165517272,0.0,0.0,0.0 +2026-05-08 00:00:00+00:00,0.0,16.1,16.1875,16.075,0.0,85.25,0.0,2.0749999999999997,-45.887708333333336,53.13616126490422,0,5,128,0.0,1.0,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 01:00:00+00:00,0.0,15.95,16.0,15.825,0.25,85.25,0.0,1.6625,-26.199011363636366,40.03028440858836,1,5,128,0.25881904510252074,0.9659258262890683,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 02:00:00+00:00,0.0,15.8125,16.0125,15.6375,72.25,86.5,0.0,0.6125,48.10406666666667,12.059397630340689,2,5,128,0.49999999999999994,0.8660254037844387,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 03:00:00+00:00,1800.0,17.6375,17.775000000000002,17.4375,279.875,80.0,0.0,1.725,57.00109253065774,15.530687982555868,3,5,128,0.7071067811865475,0.7071067811865476,0.8064799463209448,-0.5912614448635781,0.0,0.0,1.8 +2026-05-08 04:00:00+00:00,13400.0,18.0625,18.275,17.887500000000003,363.0,79.375,0.0,2.225,45.120530769230776,7.554763076017241,4,5,128,0.8660254037844386,0.5000000000000001,0.8064799463209448,-0.5912614448635781,0.14966447448388892,1.5,13.4 +2026-05-08 05:00:00+00:00,19500.0,18.825,19.175,18.625,683.375,76.0,0.0,3.2750000000000004,32.429923076923075,0.8463983586111025,5,5,128,0.9659258262890683,0.25881904510252074,0.8064799463209448,-0.5912614448635781,0.3621894659200653,1.5,19.5 +2026-05-08 06:00:00+00:00,24200.0,19.75,20.049999999999997,19.55,870.625,73.125,0.0,3.5125,14.535036255411256,3.0549568354464656,6,5,128,1.0,6.123233995736766e-17,0.8064799463209448,-0.5912614448635781,0.5602312304040209,1.5,24.2 +2026-05-08 07:00:00+00:00,25600.0,19.9,20.1375,19.6375,868.875,74.625,0.0,3.5625,-1.0386158293460928,8.774356283846545,7,5,128,0.9659258262890683,-0.25881904510252063,0.8064799463209448,-0.5912614448635781,0.7302935489656636,1.18976129698888,25.6 +2026-05-08 08:00:00+00:00,17800.0,20.075,20.5,19.8125,1005.875,73.5,0.0,4.0375,-19.541182291666665,23.118272563290343,8,5,128,0.8660254037844387,-0.49999999999999983,0.8064799463209448,-0.5912614448635781,0.8607869556362875,1.1685527916213188,17.8 +2026-05-08 09:00:00+00:00,13200.0,20.5,20.825000000000003,20.175,955.875,73.875,0.0,3.725,-33.11979887820513,30.45753629648241,9,5,128,0.7071067811865476,-0.7071067811865475,0.8064799463209448,-0.5912614448635781,0.9428185404018401,1.01384832715805,13.2 +2026-05-08 10:00:00+00:00,14500.0,20.675,20.875,20.4,908.375,73.75,0.0,3.65,-41.539606227106226,29.667192708592278,10,5,128,0.49999999999999994,-0.8660254037844387,0.8064799463209448,-0.5912614448635781,0.9707979863241526,0.9356993038680352,14.5 +2026-05-08 11:00:00+00:00,18800.0,21.0625,21.3125,20.8125,770.25,73.0,0.0,2.8874999999999997,-48.1231456043956,25.452076326692954,11,5,128,0.258819045102521,-0.9659258262890682,0.8064799463209448,-0.5912614448635781,0.9428185404018401,0.8169652663721596,18.8 +2026-05-08 12:00:00+00:00,20300.0,20.5875,20.825,20.275,574.125,76.375,0.0,2.9,-54.99776785714286,20.868428898500042,12,5,128,1.2246467991473532e-16,-1.0,0.8064799463209448,-0.5912614448635781,0.8607869556362875,0.6669768823060416,20.3 +2026-05-08 13:00:00+00:00,19500.0,20.0,20.125,19.8375,363.875,76.875,0.0,3.1125,-63.326750000000004,15.315902184330856,13,5,128,-0.2588190451025208,-0.9659258262890683,0.8064799463209448,-0.5912614448635781,0.7302935489656636,0.49825854345196796,19.5 +2026-05-08 14:00:00+00:00,15300.0,19.4,19.55,19.25,146.875,77.875,0.0,2.5625,-73.0839,8.945715222384399,14,5,128,-0.4999999999999998,-0.8660254037844388,0.8064799463209448,-0.5912614448635781,0.5602312304040209,0.26216853332878,15.3 +2026-05-08 15:00:00+00:00,5300.0,18.5875,18.725,18.4625,9.125,81.875,0.0,2.4125,-78.33937499999999,6.932450376971095,15,5,128,-0.7071067811865471,-0.7071067811865479,0.8064799463209448,-0.5912614448635781,0.3621894659200653,0.025193996122498702,5.3 +2026-05-08 16:00:00+00:00,300.0,17.9875,18.025,17.9375,0.0,90.125,0.0,1.9874999999999998,-78.508125,7.0201915260554,16,5,128,-0.8660254037844384,-0.5000000000000004,0.8064799463209448,-0.5912614448635781,0.14966447448388892,0.0,0.3 +2026-05-08 17:00:00+00:00,0.0,17.8375,17.9125,17.8125,0.0,86.875,0.0,1.375,-78.488125,6.986452776326003,17,5,128,-0.9659258262890683,-0.25881904510252063,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 18:00:00+00:00,0.0,18.2625,18.4125,18.1,0.0,71.5,0.0,1.325,-78.51250000000002,7.019275247488161,18,5,128,-1.0,-1.8369701987210297e-16,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 19:00:00+00:00,0.0,19.3375,19.575,19.125,0.0,56.75,0.0,1.9124999999999999,-78.49,7.010322151418343,19,5,128,-0.9659258262890684,0.2588190451025203,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 20:00:00+00:00,0.0,18.975,19.15,18.7875,0.0,57.125,0.0,1.8375,-78.47125,7.003104519901632,20,5,128,-0.8660254037844386,0.5000000000000001,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 21:00:00+00:00,0.0,18.3,18.45,18.175,0.0,65.25,0.0,1.825,-70.9475,10.807733149617142,21,5,128,-0.7071067811865477,0.7071067811865474,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 22:00:00+00:00,0.0,17.775,17.8625,17.625,0.0,87.375,0.0,1.8125,-48.358125,55.138960415745665,22,5,128,-0.5000000000000004,0.8660254037844384,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-08 23:00:00+00:00,0.0,17.65,17.7375,17.575,0.0,93.375,0.0,3.1875,-48.356875,55.13826376237437,23,5,128,-0.25881904510252157,0.9659258262890681,0.8064799463209448,-0.5912614448635781,0.0,0.0,0.0 +2026-05-09 00:00:00+00:00,0.0,17.7,17.7625,17.6375,0.0,94.0,0.0,1.9000000000000001,-48.360625,55.140428769604554,0,5,129,0.0,1.0,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 01:00:00+00:00,0.0,17.5625,17.6375,17.5,0.0,94.375,0.0,1.7125000000000001,-48.359375,55.139694578671424,1,5,129,0.25881904510252074,0.9659258262890683,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 02:00:00+00:00,0.0,17.4875,17.55,17.424999999999997,41.375,93.75,0.0,1.5750000000000002,-48.36,55.14008040134387,2,5,129,0.49999999999999994,0.8660254037844387,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 03:00:00+00:00,1200.0,18.375,18.575,18.225,235.375,87.5,0.0,1.4875,-48.3625,55.141573841709864,3,5,129,0.7071067811865475,0.7071067811865476,0.7961828637826158,-0.6050560696488488,0.0,0.0,1.2 +2026-05-09 04:00:00+00:00,7300.0,20.0375,20.15,19.775,460.5,76.125,0.0,1.8875,-48.371249999999996,55.15047599144847,4,5,129,0.8660254037844386,0.5000000000000001,0.7961828637826158,-0.6050560696488488,0.15202600851983428,1.5,7.3 +2026-05-09 05:00:00+00:00,14000.0,21.3375,21.537499999999998,21.1375,659.0,70.75,0.0,1.8125,-48.355000000000004,55.126582063465534,5,5,129,0.9659258262890683,0.25881904510252074,0.7961828637826158,-0.6050560696488488,0.36423605057375624,1.5,14.0 +2026-05-09 06:00:00+00:00,22600.0,21.7375,22.0375,21.525,824.25,66.625,0.0,2.5875000000000004,-50.628125000000004,50.885128532108155,6,5,129,1.0,6.123233995736766e-17,0.7961828637826158,-0.6050560696488488,0.5619843289553794,1.466677908140467,22.6 +2026-05-09 07:00:00+00:00,22700.0,22.85,23.1375,22.4625,937.5,54.375,0.0,2.825,-54.48655,43.1887347670277,7,5,129,0.9659258262890683,-0.25881904510252063,0.7961828637826158,-0.6050560696488488,0.7317946252874774,1.2810971379185978,22.7 +2026-05-09 08:00:00+00:00,19400.0,24.5,24.825,24.2125,985.875,42.25,0.0,2.9125,-57.6915625,36.78160743064788,8,5,129,0.8660254037844387,-0.49999999999999983,0.7961828637826158,-0.6050560696488488,0.8620946484998009,1.1435809301398623,19.4 +2026-05-09 09:00:00+00:00,19200.0,24.45,24.8125,24.1,967.875,45.625,0.0,3.175,-69.82062499999999,12.94118802103707,9,5,129,0.7071067811865476,-0.7071067811865475,0.7961828637826158,-0.6050560696488488,0.9440046673413993,1.0252862443210442,19.2 +2026-05-09 10:00:00+00:00,15000.0,23.925,24.25,23.6625,886.375,54.875,0.0,2.6875,-78.33500000000001,6.91151123127207,10,5,129,0.49999999999999994,-0.8660254037844387,0.7961828637826158,-0.6050560696488488,0.9719426493909245,0.9119622444343336,15.0 +2026-05-09 11:00:00+00:00,16500.0,22.7375,23.0375,22.4125,757.125,62.125,0.0,2.9875,-78.31437500000001,6.924667974892367,11,5,129,0.258819045102521,-0.9659258262890682,0.7961828637826158,-0.6050560696488488,0.9440046673413993,0.8020352294785696,16.5 +2026-05-09 12:00:00+00:00,15000.0,22.65,22.975,22.3375,572.5,61.125,0.0,2.8125,-78.30937499999999,6.942855552952734,12,5,129,1.2246467991473532e-16,-1.0,0.7961828637826158,-0.6050560696488488,0.8620946484998009,0.6640802155497109,15.0 +2026-05-09 13:00:00+00:00,11800.0,21.75,21.8375,21.5875,360.375,67.125,0.0,2.2875,-78.383125,6.915894547766997,13,5,129,-0.2588190451025208,-0.9659258262890683,0.7961828637826158,-0.6050560696488488,0.7317946252874774,0.49245373981590895,11.8 +2026-05-09 14:00:00+00:00,3300.0,20.7125,20.8625,20.6375,140.75,66.375,0.0,2.45,-76.4923125,6.798749006787328,14,5,129,-0.4999999999999998,-0.8660254037844388,0.7961828637826158,-0.6050560696488488,0.5619843289553794,0.25045182356174794,3.3 +2026-05-09 15:00:00+00:00,1600.0,19.775,19.875,19.65,9.5,68.625,0.0,2.2125,-77.58354166666666,7.587416494598149,15,5,129,-0.7071067811865471,-0.7071067811865479,0.7961828637826158,-0.6050560696488488,0.36423605057375624,0.026081987175721067,1.6 +2026-05-09 16:00:00+00:00,400.0,19.2125,19.3,19.125,0.0,75.0,0.0,1.875,-76.99329166666666,6.927461817229071,16,5,129,-0.8660254037844384,-0.5000000000000004,0.7961828637826158,-0.6050560696488488,0.15202600851983428,0.0,0.4 +2026-05-09 17:00:00+00:00,0.0,19.0,19.0875,18.9125,0.0,73.25,0.0,1.8125,-75.959375,6.87205766583052,17,5,129,-0.9659258262890683,-0.25881904510252063,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 18:00:00+00:00,0.0,18.5875,18.6625,18.5125,0.0,78.875,0.0,1.9,-75.951875,6.877513896447852,18,5,129,-1.0,-1.8369701987210297e-16,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 19:00:00+00:00,0.0,18.7,18.8,18.6125,0.0,72.0,0.0,1.85,-75.940625,6.884328027907542,19,5,129,-0.9659258262890684,0.2588190451025203,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 20:00:00+00:00,0.0,18.85,18.975,18.675,0.0,65.0,0.0,2.3,-75.93625,6.887106461836254,20,5,129,-0.8660254037844386,0.5000000000000001,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 21:00:00+00:00,0.0,18.25,18.3625,18.1375,0.0,67.0,0.0,2.1125,-63.920625,17.184745824786006,21,5,129,-0.7071067811865477,0.7071067811865474,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 22:00:00+00:00,0.0,18.2875,18.35,18.1875,0.0,65.125,0.0,2.0625,-45.908125,53.19943285157434,22,5,129,-0.5000000000000004,0.8660254037844384,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-09 23:00:00+00:00,0.0,18.3625,18.5,18.25,0.0,70.125,0.0,2.1875,-45.89812500000001,53.197780826796084,23,5,129,-0.25881904510252157,0.9659258262890681,0.7961828637826158,-0.6050560696488488,0.0,0.0,0.0 +2026-05-10 00:00:00+00:00,0.0,18.4875,18.6,18.3125,0.0,67.0,0.0,2.45,-45.88875,53.194908845521425,0,5,130,0.0,1.0,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 +2026-05-10 01:00:00+00:00,0.0,18.85,18.95,18.725,0.5,60.625,0.0,2.7625,-28.004333333333328,44.80180827033287,1,5,130,0.25881904510252074,0.9659258262890683,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 +2026-05-10 02:00:00+00:00,0.0,19.8875,20.0375,19.7125,77.625,46.5,0.0,2.675,31.97426785714286,41.315048099086695,2,5,130,0.49999999999999994,0.8660254037844387,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 +2026-05-10 03:00:00+00:00,4200.0,21.4625,21.6625,21.3375,268.875,43.875,0.0,1.8,56.729325,15.297314385946965,3,5,130,0.7071067811865475,0.7071067811865476,0.7856498550787145,-0.6186714032625031,0.0,0.0,4.2 +2026-05-10 04:00:00+00:00,13400.0,23.1375,23.3125,22.9,486.875,44.5,0.0,1.85,44.82966712962963,7.322156307647513,4,5,130,0.8660254037844386,0.5000000000000001,0.7856498550787145,-0.6186714032625031,0.15434039824522255,1.5,13.4 +2026-05-10 05:00:00+00:00,20600.0,24.4375,24.65,24.225,692.375,39.0,0.0,2.3875,32.235140217391304,1.0290817943745925,5,5,130,0.9659258262890683,0.25881904510252074,0.7856498550787145,-0.6186714032625031,0.3662365296369906,1.5,20.6 +2026-05-10 06:00:00+00:00,24700.0,25.3875,25.675,25.075,852.625,40.125,0.0,2.175,15.727814970355732,1.5337886944536958,6,5,130,1.0,6.123233995736766e-17,0.7856498550787145,-0.6186714032625031,0.5636922898493237,1.5,24.7 +2026-05-10 07:00:00+00:00,27800.0,25.6625,25.9625,25.325,964.625,40.375,0.0,2.4,0.08945465870558733,5.990604836267913,7,5,130,0.9659258262890683,-0.25881904510252063,0.7856498550787145,-0.6186714032625031,0.7332513951348235,1.3155447182240052,27.8 +2026-05-10 08:00:00+00:00,20000.0,25.9375,26.1875,25.6625,1010.625,36.75,0.0,3.05,-14.919032913165266,14.228009841542084,8,5,130,0.8660254037844387,-0.49999999999999983,0.7856498550787145,-0.6186714032625031,0.8633586726779535,1.1705737510752718,20.0 +2026-05-10 09:00:00+00:00,13200.0,25.6125,25.975,25.3,994.875,31.5,0.0,3.4125,-32.978053571428575,31.21064146131005,9,5,130,0.7071067811865476,-0.7071067811865475,0.7856498550787145,-0.6186714032625031,0.9451475265265916,1.052613451421871,13.2 +2026-05-10 10:00:00+00:00,17700.0,25.45,25.7375,25.212500000000002,911.875,35.375,0.0,2.3875,-41.17341666666667,29.95113655219979,10,5,130,0.49999999999999994,-0.8660254037844387,0.7856498550787145,-0.6186714032625031,0.9730441814534249,0.9371362753929044,17.7 +2026-05-10 11:00:00+00:00,20200.0,25.0875,25.3125,24.900000000000002,771.75,35.875,0.0,2.4875,-47.71735897435897,25.588640329693554,11,5,130,0.258819045102521,-0.9659258262890682,0.7856498550787145,-0.6186714032625031,0.9451475265265916,0.8165391945066757,20.2 +2026-05-10 12:00:00+00:00,17800.0,24.4625,24.7125,24.25,590.375,34.375,0.0,2.375,-54.51798958333333,21.054775498826615,12,5,130,1.2246467991473532e-16,-1.0,0.7856498550787145,-0.6186714032625031,0.8633586726779535,0.6838119760455794,17.8 +2026-05-10 13:00:00+00:00,16100.0,23.2625,23.4875,23.125,374.25,44.625,0.0,2.325,-63.01656359649123,15.389319659252564,13,5,130,-0.2588190451025208,-0.9659258262890683,0.7856498550787145,-0.6186714032625031,0.7332513951348235,0.5103979378466594,16.1 +2026-05-10 14:00:00+00:00,10500.0,22.1,22.3125,21.95,145.5,48.75,0.0,2.025,-72.76093958333334,9.017864972938789,14,5,130,-0.4999999999999998,-0.8660254037844388,0.7856498550787145,-0.6186714032625031,0.5636922898493237,0.25811954965517175,10.5 +2026-05-10 15:00:00+00:00,7000.0,20.625,20.7375,20.5125,7.5,52.25,0.0,1.4375,-78.20035714285714,6.792803258261073,15,5,130,-0.7071067811865471,-0.7071067811865479,0.7856498550787145,-0.6186714032625031,0.3662365296369906,0.020478568883977557,7.0 +2026-05-10 16:00:00+00:00,800.0,19.5125,19.6,19.400000000000002,0.0,57.125,0.0,1.4125,-76.5295,6.628890442600482,16,5,130,-0.8660254037844384,-0.5000000000000004,0.7856498550787145,-0.6186714032625031,0.15434039824522255,0.0,0.8 +2026-05-10 17:00:00+00:00,0.0,19.225,19.325,19.075,0.0,49.5,0.0,2.0125,-75.98175,6.852869332136237,17,5,130,-0.9659258262890683,-0.25881904510252063,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 +2026-05-10 18:00:00+00:00,0.0,19.1,19.1625,18.9875,0.0,48.75,0.0,2.075,-76.01062499999999,6.836977394714228,18,5,130,-1.0,-1.8369701987210297e-16,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 +2026-05-10 19:00:00+00:00,0.0,18.9,18.9625,18.8625,0.0,59.625,0.0,2.2125,-76.005,6.841752638517905,19,5,130,-0.9659258262890684,0.2588190451025203,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 +2026-05-10 20:00:00+00:00,0.0,18.1875,18.3125,18.0375,0.0,70.125,0.0,1.6625,-75.994375,6.848068576552565,20,5,130,-0.8660254037844386,0.5000000000000001,0.7856498550787145,-0.6186714032625031,0.0,0.0,0.0 diff --git a/Data/ims/ims_merged_15min.csv b/Data/ims/ims_merged_15min.csv index 774b01f91c9abf032627a42f01763211725802d8..d82df7a44e542f0406c5636e2fa112e18a908294 100644 --- a/Data/ims/ims_merged_15min.csv +++ b/Data/ims/ims_merged_15min.csv @@ -1,673 +1,673 @@ timestamp_utc,air_temperature_c,tdmax_c,tdmin_c,ghi_w_m2,rh_percent,rain_mm,wind_speed_ms -2026-03-14 22:00:00+00:00,16.15,16.25,16.05,0.0,79.5,0.0,2.95 -2026-03-14 22:15:00+00:00,16.0,16.1,15.9,0.0,80.0,0.0,2.4 -2026-03-14 22:30:00+00:00,15.8,15.850000000000001,15.7,0.0,81.0,0.0,1.8 -2026-03-14 22:45:00+00:00,15.7,15.8,15.7,0.0,81.0,0.0,2.3 -2026-03-14 23:00:00+00:00,15.7,15.75,15.6,0.0,80.5,0.0,1.7999999999999998 -2026-03-14 23:15:00+00:00,15.7,15.8,15.7,0.0,80.0,0.0,1.8 -2026-03-14 23:30:00+00:00,15.6,15.649999999999999,15.5,0.0,79.5,0.0,2.0 -2026-03-14 23:45:00+00:00,15.6,15.6,15.5,0.0,80.0,0.0,1.9 -2026-03-15 00:00:00+00:00,15.45,15.55,15.45,0.0,79.5,0.0,1.65 -2026-03-15 00:15:00+00:00,15.4,15.4,15.3,0.0,80.0,0.0,1.1 -2026-03-15 00:30:00+00:00,15.25,15.3,15.149999999999999,0.0,81.0,0.0,2.05 -2026-03-15 00:45:00+00:00,15.1,15.3,15.0,0.0,80.0,0.0,1.3 -2026-03-15 01:00:00+00:00,15.0,15.1,15.0,0.0,80.5,0.0,2.25 -2026-03-15 01:15:00+00:00,15.1,15.1,15.1,0.0,80.0,0.0,2.5 -2026-03-15 01:30:00+00:00,14.95,15.05,14.850000000000001,0.0,80.0,0.0,1.65 -2026-03-15 01:45:00+00:00,14.8,14.9,14.8,0.0,80.0,0.0,2.0 -2026-03-15 02:00:00+00:00,14.9,14.9,14.8,0.0,81.0,0.0,1.6 -2026-03-15 02:15:00+00:00,14.9,14.9,14.8,0.0,82.0,0.5,1.5 -2026-03-15 02:30:00+00:00,14.4,14.65,14.25,0.0,88.5,0.1,1.7999999999999998 -2026-03-15 02:45:00+00:00,14.1,14.2,13.9,0.0,90.0,0.0,2.0 -2026-03-15 03:00:00+00:00,13.9,13.95,13.8,0.0,90.5,0.0,1.4 -2026-03-15 03:15:00+00:00,13.9,14.0,13.8,0.0,91.0,0.1,2.0 -2026-03-15 03:30:00+00:00,14.0,14.05,13.9,0.0,91.5,0.1,2.8499999999999996 -2026-03-15 03:45:00+00:00,14.0,14.1,13.9,1.0,91.0,0.0,2.4 -2026-03-15 04:00:00+00:00,13.850000000000001,13.9,13.850000000000001,5.5,84.5,0.0,2.95 -2026-03-15 04:15:00+00:00,13.9,14.0,13.9,15.0,82.0,0.0,4.4 -2026-03-15 04:30:00+00:00,14.05,14.1,13.9,27.5,81.5,0.0,2.6 -2026-03-15 04:45:00+00:00,14.0,14.1,13.9,37.0,81.0,0.0,2.3 -2026-03-15 05:00:00+00:00,14.35,14.55,14.15,196.0,79.0,0.0,1.9 -2026-03-15 05:15:00+00:00,15.1,15.2,14.8,242.0,76.0,0.0,2.0 -2026-03-15 05:30:00+00:00,15.05,15.1,14.850000000000001,125.0,77.0,0.0,2.7 -2026-03-15 05:45:00+00:00,14.7,14.9,14.6,79.0,77.0,0.0,3.3 -2026-03-15 06:00:00+00:00,14.6,14.7,14.55,210.0,73.0,0.0,5.25 -2026-03-15 06:15:00+00:00,15.0,15.2,14.7,483.0,73.0,0.0,5.9 -2026-03-15 06:30:00+00:00,15.7,15.850000000000001,15.399999999999999,486.0,70.0,0.0,4.95 -2026-03-15 06:45:00+00:00,15.7,16.0,15.1,277.0,70.0,0.0,5.6 -2026-03-15 07:00:00+00:00,14.0,14.45,13.6,173.5,84.0,0.15,3.6 -2026-03-15 07:15:00+00:00,13.8,13.9,13.6,372.0,88.0,0.0,3.4 -2026-03-15 07:30:00+00:00,13.85,14.0,13.649999999999999,261.0,84.0,0.0,3.1500000000000004 -2026-03-15 07:45:00+00:00,14.1,14.2,14.0,160.0,83.0,0.0,2.2 -2026-03-15 08:00:00+00:00,14.399999999999999,14.55,14.15,342.5,84.0,0.0,2.15 -2026-03-15 08:15:00+00:00,15.0,15.0,14.8,327.0,82.0,0.0,2.6 -2026-03-15 08:30:00+00:00,14.7,14.85,14.6,216.5,85.0,0.15,4.25 -2026-03-15 08:45:00+00:00,14.9,15.1,14.7,469.0,83.0,0.0,6.4 -2026-03-15 09:00:00+00:00,15.350000000000001,15.5,15.1,279.0,80.5,0.0,5.2 -2026-03-15 09:15:00+00:00,15.5,15.5,15.4,170.0,78.0,0.0,4.6 -2026-03-15 09:30:00+00:00,15.6,15.75,15.4,353.0,79.5,0.05,5.9 -2026-03-15 09:45:00+00:00,15.6,15.7,15.4,320.0,79.0,0.0,6.4 -2026-03-15 10:00:00+00:00,15.8,15.9,15.6,470.0,78.0,0.0,5.75 -2026-03-15 10:15:00+00:00,15.3,15.9,14.1,183.0,82.0,3.3,6.2 -2026-03-15 10:30:00+00:00,14.35,14.55,14.15,490.5,86.0,0.0,5.25 -2026-03-15 10:45:00+00:00,15.2,15.5,14.8,627.0,81.0,0.0,6.4 -2026-03-15 11:00:00+00:00,15.2,15.5,14.7,302.0,78.0,0.15,6.300000000000001 -2026-03-15 11:15:00+00:00,14.0,14.2,13.8,259.0,80.0,0.0,3.4 -2026-03-15 11:30:00+00:00,14.95,15.1,14.6,334.5,79.0,0.05,5.65 -2026-03-15 11:45:00+00:00,15.3,15.4,15.1,332.0,76.0,0.0,5.5 -2026-03-15 12:00:00+00:00,15.45,15.6,15.350000000000001,236.5,74.0,0.0,5.1 -2026-03-15 12:15:00+00:00,15.3,15.5,15.2,154.0,75.0,0.0,4.9 -2026-03-15 12:30:00+00:00,15.149999999999999,15.2,15.0,143.0,75.5,0.0,6.0 -2026-03-15 12:45:00+00:00,14.8,14.9,14.7,247.0,70.0,0.0,5.0 -2026-03-15 13:00:00+00:00,14.7,14.95,14.5,408.0,64.5,0.0,4.5 -2026-03-15 13:15:00+00:00,14.8,15.0,14.6,164.0,66.0,0.0,4.4 -2026-03-15 13:30:00+00:00,14.55,14.649999999999999,14.45,129.0,73.0,0.0,4.35 -2026-03-15 13:45:00+00:00,14.7,14.8,14.5,88.0,76.0,0.0,2.4 -2026-03-15 14:00:00+00:00,15.100000000000001,15.2,14.85,137.0,76.5,0.0,4.0 -2026-03-15 14:15:00+00:00,15.1,15.3,15.0,227.0,66.0,0.0,4.3 -2026-03-15 14:30:00+00:00,15.3,15.45,15.2,132.0,67.0,0.0,4.45 -2026-03-15 14:45:00+00:00,15.0,15.1,15.0,42.0,72.0,0.0,2.2 -2026-03-15 15:00:00+00:00,15.149999999999999,15.25,15.05,48.0,74.0,0.0,3.5 -2026-03-15 15:15:00+00:00,15.3,15.3,15.3,27.0,76.0,0.0,3.6 -2026-03-15 15:30:00+00:00,15.25,15.3,15.149999999999999,9.0,75.5,0.0,4.15 -2026-03-15 15:45:00+00:00,15.1,15.2,15.1,3.0,77.0,0.0,4.4 -2026-03-15 16:00:00+00:00,15.1,15.2,15.0,0.0,75.5,0.0,3.6 -2026-03-15 16:15:00+00:00,15.1,15.2,15.0,0.0,75.0,0.0,3.4 -2026-03-15 16:30:00+00:00,15.1,15.1,15.0,0.0,74.5,0.0,3.3499999999999996 -2026-03-15 16:45:00+00:00,15.0,15.1,15.0,0.0,76.0,0.0,4.1 -2026-03-15 17:00:00+00:00,14.95,15.05,14.9,0.0,75.0,0.0,3.45 -2026-03-15 17:15:00+00:00,15.0,15.1,14.9,0.0,75.0,0.0,3.4 -2026-03-15 17:30:00+00:00,15.0,15.1,15.0,0.0,76.0,0.0,3.4000000000000004 -2026-03-15 17:45:00+00:00,14.9,15.0,14.9,0.0,76.0,0.0,3.6 -2026-03-15 18:00:00+00:00,14.850000000000001,14.9,14.8,0.0,75.5,0.0,2.95 -2026-03-15 18:15:00+00:00,14.8,14.9,14.8,0.0,74.0,0.0,2.1 -2026-03-15 18:30:00+00:00,14.75,14.8,14.7,0.0,75.5,0.0,2.7 -2026-03-15 18:45:00+00:00,14.7,14.8,14.6,0.0,75.0,0.0,2.1 -2026-03-15 19:00:00+00:00,14.6,14.7,14.55,0.0,74.0,0.0,2.4000000000000004 -2026-03-15 19:15:00+00:00,14.6,14.6,14.5,0.0,74.0,0.0,3.0 -2026-03-15 19:30:00+00:00,14.6,14.649999999999999,14.55,0.0,74.0,0.0,2.45 -2026-03-15 19:45:00+00:00,14.6,14.7,14.5,0.0,76.0,0.0,2.0 -2026-03-15 20:00:00+00:00,14.649999999999999,14.7,14.55,0.0,76.0,0.0,2.8 -2026-03-15 20:15:00+00:00,14.7,14.8,14.6,0.0,73.0,0.0,4.7 -2026-03-15 20:30:00+00:00,14.8,14.9,14.8,0.0,74.5,0.0,4.6 -2026-03-15 20:45:00+00:00,14.8,14.9,14.7,0.0,75.0,0.0,3.7 -2026-03-15 21:00:00+00:00,14.7,14.75,14.6,0.0,73.5,0.0,2.85 -2026-03-15 21:15:00+00:00,14.6,14.7,14.6,0.0,73.0,0.0,3.2 -2026-03-15 21:30:00+00:00,14.55,14.6,14.4,0.0,73.0,0.0,3.3 -2026-03-15 21:45:00+00:00,14.6,14.8,14.6,0.0,74.0,0.0,4.0 -2026-03-15 22:00:00+00:00,14.55,14.649999999999999,14.5,0.0,73.0,0.0,4.85 -2026-03-15 22:15:00+00:00,14.4,14.5,14.3,0.0,70.0,0.0,4.3 -2026-03-15 22:30:00+00:00,14.45,14.5,14.4,0.0,72.5,0.0,3.75 -2026-03-15 22:45:00+00:00,14.6,14.7,14.5,0.0,76.0,0.0,2.7 -2026-03-15 23:00:00+00:00,14.8,14.850000000000001,14.7,0.0,76.5,0.0,5.0 -2026-03-15 23:15:00+00:00,14.8,14.9,14.8,0.0,75.0,0.0,4.9 -2026-03-15 23:30:00+00:00,14.8,14.850000000000001,14.7,0.0,74.0,0.0,5.15 -2026-03-15 23:45:00+00:00,14.7,14.7,14.6,0.0,72.0,0.0,4.7 -2026-03-16 00:00:00+00:00,14.649999999999999,14.7,14.6,0.0,72.5,0.0,5.75 -2026-03-16 00:15:00+00:00,14.6,14.6,14.6,0.0,72.0,0.0,5.0 -2026-03-16 00:30:00+00:00,14.5,14.55,14.4,0.0,71.5,0.0,4.25 -2026-03-16 00:45:00+00:00,14.5,14.5,14.4,0.0,71.0,0.0,3.5 -2026-03-16 01:00:00+00:00,14.45,14.5,14.4,0.0,72.5,0.0,4.1 -2026-03-16 01:15:00+00:00,14.4,14.4,14.4,0.0,74.0,0.0,3.6 -2026-03-16 01:30:00+00:00,14.4,14.5,14.3,0.0,76.5,0.0,3.2 -2026-03-16 01:45:00+00:00,14.5,14.5,14.4,0.0,76.0,0.0,2.9 -2026-03-16 02:00:00+00:00,14.5,14.55,14.4,0.0,75.5,0.0,3.3 -2026-03-16 02:15:00+00:00,14.5,14.6,14.5,0.0,71.0,0.0,3.8 -2026-03-16 02:30:00+00:00,14.45,14.55,14.3,0.0,66.5,0.0,3.8499999999999996 -2026-03-16 02:45:00+00:00,14.3,14.3,14.2,0.0,67.0,0.0,3.4 -2026-03-16 03:00:00+00:00,14.2,14.25,14.149999999999999,0.0,65.5,0.0,3.05 -2026-03-16 03:15:00+00:00,14.1,14.1,13.9,0.0,63.0,0.0,2.0 -2026-03-16 03:30:00+00:00,13.95,14.05,13.95,0.0,64.5,0.0,3.0 -2026-03-16 03:45:00+00:00,14.0,14.2,14.0,0.0,63.0,0.0,3.9 -2026-03-16 04:00:00+00:00,14.1,14.2,13.95,13.5,61.5,0.0,3.55 -2026-03-16 04:15:00+00:00,14.3,14.3,14.2,49.0,62.0,0.0,2.7 -2026-03-16 04:30:00+00:00,14.6,14.75,14.5,111.5,61.5,0.0,3.5 -2026-03-16 04:45:00+00:00,15.0,15.1,14.8,170.0,61.0,0.0,2.7 -2026-03-16 05:00:00+00:00,15.399999999999999,15.55,15.25,228.5,62.0,0.0,3.1 -2026-03-16 05:15:00+00:00,15.7,15.8,15.6,235.0,62.0,0.0,2.8 -2026-03-16 05:30:00+00:00,15.5,15.65,15.4,140.5,62.0,0.0,2.35 -2026-03-16 05:45:00+00:00,15.3,15.4,15.2,164.0,64.0,0.0,2.2 -2026-03-16 06:00:00+00:00,15.45,15.55,15.350000000000001,178.5,64.0,0.0,2.1 -2026-03-16 06:15:00+00:00,15.8,16.1,15.4,375.0,64.0,0.0,2.5 -2026-03-16 06:30:00+00:00,16.1,16.35,15.95,432.0,63.5,0.0,3.1500000000000004 -2026-03-16 06:45:00+00:00,16.0,16.3,15.8,300.0,63.0,0.0,4.2 -2026-03-16 07:00:00+00:00,16.25,16.55,16.05,575.5,64.5,0.0,3.5999999999999996 -2026-03-16 07:15:00+00:00,16.2,16.8,16.0,679.0,65.0,0.0,4.7 -2026-03-16 07:30:00+00:00,16.25,16.45,16.15,548.5,65.5,0.0,4.4 -2026-03-16 07:45:00+00:00,16.5,17.0,16.3,781.0,64.0,0.0,4.4 -2026-03-16 08:00:00+00:00,16.95,17.15,16.75,513.0,61.5,0.0,3.35 -2026-03-16 08:15:00+00:00,17.0,17.3,16.6,561.0,60.0,0.0,4.7 -2026-03-16 08:30:00+00:00,16.799999999999997,17.1,16.45,616.0,62.5,0.0,4.15 -2026-03-16 08:45:00+00:00,17.1,17.3,17.0,834.0,58.0,0.0,4.2 -2026-03-16 09:00:00+00:00,17.3,17.65,17.0,679.0,58.0,0.0,4.25 -2026-03-16 09:15:00+00:00,16.9,18.0,16.5,775.0,60.0,0.0,4.3 -2026-03-16 09:30:00+00:00,17.55,17.700000000000003,17.25,743.5,58.5,0.0,4.05 -2026-03-16 09:45:00+00:00,17.3,17.6,17.1,829.0,60.0,0.0,5.0 -2026-03-16 10:00:00+00:00,17.75,18.15,17.200000000000003,889.5,58.5,0.0,3.8 -2026-03-16 10:15:00+00:00,17.7,18.2,17.5,929.0,59.0,0.0,4.0 -2026-03-16 10:30:00+00:00,17.9,18.35,17.5,716.0,59.0,0.0,3.25 -2026-03-16 10:45:00+00:00,17.8,18.1,17.4,826.0,60.0,0.0,3.8 -2026-03-16 11:00:00+00:00,17.3,17.75,16.9,658.5,61.0,0.0,4.75 -2026-03-16 11:15:00+00:00,17.2,17.4,17.1,592.0,62.0,0.0,3.2 -2026-03-16 11:30:00+00:00,17.75,18.15,17.200000000000003,680.0,61.0,0.0,3.9499999999999997 -2026-03-16 11:45:00+00:00,17.2,17.4,16.9,621.0,64.0,0.0,3.4 -2026-03-16 12:00:00+00:00,16.95,17.3,16.7,308.5,66.0,0.0,3.85 -2026-03-16 12:15:00+00:00,16.6,16.9,16.4,326.0,68.0,0.0,2.6 -2026-03-16 12:30:00+00:00,16.9,17.1,16.65,319.0,67.5,0.0,3.8499999999999996 -2026-03-16 12:45:00+00:00,16.8,16.9,16.7,245.0,69.0,0.0,2.9 -2026-03-16 13:00:00+00:00,17.049999999999997,17.35,16.85,354.5,67.0,0.0,3.2 -2026-03-16 13:15:00+00:00,17.1,17.5,16.8,554.0,64.0,0.0,4.4 -2026-03-16 13:30:00+00:00,16.9,17.1,16.700000000000003,245.0,64.5,0.0,3.95 -2026-03-16 13:45:00+00:00,16.4,16.6,16.3,153.0,67.0,0.0,3.6 -2026-03-16 14:00:00+00:00,16.45,16.6,16.35,269.0,63.5,0.0,4.25 -2026-03-16 14:15:00+00:00,16.5,16.6,16.4,286.0,63.0,0.0,3.7 -2026-03-16 14:30:00+00:00,16.3,16.450000000000003,16.15,160.5,63.5,0.0,3.3499999999999996 -2026-03-16 14:45:00+00:00,16.1,16.2,16.0,180.0,65.0,0.0,2.7 -2026-03-16 15:00:00+00:00,16.1,16.15,15.95,102.0,64.0,0.0,2.35 -2026-03-16 15:15:00+00:00,15.8,15.9,15.6,64.0,66.0,0.0,2.5 -2026-03-16 15:30:00+00:00,15.6,15.7,15.5,19.5,65.5,0.0,1.65 -2026-03-16 15:45:00+00:00,15.2,15.4,15.1,3.0,64.0,0.0,2.0 -2026-03-16 16:00:00+00:00,14.65,14.85,14.45,0.0,64.5,0.0,1.4 -2026-03-16 16:15:00+00:00,14.1,14.3,14.0,0.0,67.0,0.0,1.3 -2026-03-16 16:30:00+00:00,13.8,13.95,13.649999999999999,0.0,68.0,0.0,1.45 -2026-03-16 16:45:00+00:00,13.6,13.6,13.5,0.0,70.0,0.0,1.5 -2026-03-16 17:00:00+00:00,13.6,13.649999999999999,13.5,0.0,68.0,0.0,1.7000000000000002 -2026-03-16 17:15:00+00:00,13.5,13.7,13.4,0.0,68.0,0.0,1.4 -2026-03-16 17:30:00+00:00,13.2,13.4,12.95,0.0,71.0,0.0,1.4 -2026-03-16 17:45:00+00:00,12.8,12.9,12.7,0.0,74.0,0.0,1.4 -2026-03-16 18:00:00+00:00,12.649999999999999,12.75,12.5,0.0,75.5,0.0,1.3 -2026-03-16 18:15:00+00:00,12.4,12.5,12.4,0.0,77.0,0.0,1.2 -2026-03-16 18:30:00+00:00,12.25,12.3,12.149999999999999,0.0,78.5,0.0,1.2 -2026-03-16 18:45:00+00:00,12.2,12.2,12.1,0.0,78.0,0.0,1.3 -2026-03-16 19:00:00+00:00,12.149999999999999,12.25,12.1,0.0,78.5,0.0,1.25 -2026-03-16 19:15:00+00:00,12.2,12.3,12.2,0.0,79.0,0.0,1.2 -2026-03-16 19:30:00+00:00,12.05,12.149999999999999,12.0,0.0,80.0,0.0,1.2 -2026-03-16 19:45:00+00:00,12.0,12.1,12.0,0.0,80.0,0.0,1.5 -2026-03-16 20:00:00+00:00,12.05,12.05,11.95,0.0,80.5,0.0,1.35 -2026-03-16 20:15:00+00:00,11.9,12.0,11.7,0.0,81.0,0.0,1.0 -2026-03-16 20:30:00+00:00,11.75,11.850000000000001,11.649999999999999,0.0,81.5,0.0,1.0 -2026-03-16 20:45:00+00:00,11.6,11.8,11.5,0.0,83.0,0.0,1.1 -2026-03-16 21:00:00+00:00,11.649999999999999,11.75,11.5,0.0,82.0,0.0,1.15 -2026-03-16 21:15:00+00:00,11.6,11.6,11.5,0.0,82.0,0.0,1.1 -2026-03-16 21:30:00+00:00,11.5,11.6,11.45,0.0,83.0,0.0,1.05 -2026-03-16 21:45:00+00:00,11.6,11.7,11.5,0.0,83.0,0.0,1.1 -2026-03-16 22:00:00+00:00,11.4,11.5,11.3,0.0,83.5,0.0,1.1 -2026-03-16 22:15:00+00:00,11.1,11.3,11.1,0.0,85.0,0.0,1.4 -2026-03-16 22:30:00+00:00,11.3,11.4,11.149999999999999,0.0,84.0,0.0,0.95 -2026-03-16 22:45:00+00:00,11.3,11.4,11.2,0.0,84.0,0.0,0.4 -2026-03-16 23:00:00+00:00,11.15,11.35,10.850000000000001,0.0,84.0,0.0,1.45 -2026-03-16 23:15:00+00:00,11.5,11.6,11.4,0.0,82.0,0.0,1.7 -2026-03-16 23:30:00+00:00,11.0,11.25,10.850000000000001,0.0,85.0,0.0,1.45 -2026-03-16 23:45:00+00:00,10.9,11.0,10.8,0.0,86.0,0.0,1.3 -2026-03-17 00:00:00+00:00,10.8,10.95,10.649999999999999,0.0,86.0,0.0,1.05 -2026-03-17 00:15:00+00:00,11.2,11.6,10.6,0.0,84.0,0.0,2.2 -2026-03-17 00:30:00+00:00,12.05,12.2,11.75,0.0,77.5,0.0,2.05 -2026-03-17 00:45:00+00:00,12.3,12.4,12.2,0.0,76.0,0.0,2.3 -2026-03-17 01:00:00+00:00,12.2,12.350000000000001,12.0,0.0,75.5,0.0,2.1 -2026-03-17 01:15:00+00:00,11.8,12.0,11.5,0.0,78.0,0.0,2.0 -2026-03-17 01:30:00+00:00,11.899999999999999,12.1,11.65,0.0,77.0,0.0,2.0 -2026-03-17 01:45:00+00:00,11.5,11.6,11.5,0.0,79.0,0.0,1.8 -2026-03-17 02:00:00+00:00,10.85,11.149999999999999,10.55,0.0,82.5,0.0,1.45 -2026-03-17 02:15:00+00:00,10.5,10.7,10.5,0.0,84.0,0.0,1.4 -2026-03-17 02:30:00+00:00,10.850000000000001,11.05,10.55,0.0,82.0,0.0,1.65 -2026-03-17 02:45:00+00:00,11.5,12.0,10.6,0.0,78.0,0.0,2.4 -2026-03-17 03:00:00+00:00,11.85,12.05,11.7,0.0,76.5,0.0,2.15 -2026-03-17 03:15:00+00:00,12.2,12.3,12.0,0.0,75.0,0.0,2.8 -2026-03-17 03:30:00+00:00,12.1,12.2,12.05,0.0,74.5,0.0,2.55 -2026-03-17 03:45:00+00:00,11.9,12.0,11.8,1.0,75.0,0.0,2.4 -2026-03-17 04:00:00+00:00,12.149999999999999,12.2,12.1,16.5,72.5,0.0,2.1 -2026-03-17 04:15:00+00:00,12.2,12.3,12.1,49.0,72.0,0.0,1.9 -2026-03-17 04:30:00+00:00,12.4,12.6,12.25,97.0,71.5,0.0,1.2000000000000002 -2026-03-17 04:45:00+00:00,12.9,13.1,12.5,146.0,70.0,0.0,1.6 -2026-03-17 05:00:00+00:00,13.3,13.45,13.2,201.5,69.5,0.0,1.75 -2026-03-17 05:15:00+00:00,13.6,13.8,13.5,261.0,68.0,0.0,2.0 -2026-03-17 05:30:00+00:00,14.05,14.25,13.95,322.0,67.5,0.0,2.05 -2026-03-17 05:45:00+00:00,14.3,14.4,14.1,383.0,67.0,0.0,2.2 -2026-03-17 06:00:00+00:00,14.350000000000001,14.55,14.2,441.5,65.5,0.0,2.5 -2026-03-17 06:15:00+00:00,14.7,14.9,14.5,495.0,63.0,0.0,2.4 -2026-03-17 06:30:00+00:00,15.149999999999999,15.350000000000001,14.95,547.0,62.0,0.0,2.7 -2026-03-17 06:45:00+00:00,15.3,15.6,15.0,598.0,62.0,0.0,2.6 -2026-03-17 07:00:00+00:00,15.75,16.0,15.5,643.5,61.5,0.0,2.8 -2026-03-17 07:15:00+00:00,16.2,16.4,15.9,687.0,61.0,0.0,2.8 -2026-03-17 07:30:00+00:00,16.45,16.8,16.3,723.0,59.5,0.0,2.7 -2026-03-17 07:45:00+00:00,17.1,17.5,16.9,756.0,56.0,0.0,3.2 -2026-03-17 08:00:00+00:00,17.45,17.65,17.2,792.5,53.5,0.0,3.1500000000000004 -2026-03-17 08:15:00+00:00,17.9,18.0,17.7,817.0,51.0,0.0,3.7 -2026-03-17 08:30:00+00:00,17.9,18.2,17.700000000000003,841.5,51.5,0.0,3.25 -2026-03-17 08:45:00+00:00,18.3,18.6,18.3,865.0,50.0,0.0,3.1 -2026-03-17 09:00:00+00:00,18.55,18.75,18.35,883.5,48.5,0.0,3.3 -2026-03-17 09:15:00+00:00,18.8,19.2,18.4,898.0,47.0,0.0,2.6 -2026-03-17 09:30:00+00:00,19.7,20.049999999999997,19.299999999999997,907.5,40.0,0.0,3.3 -2026-03-17 09:45:00+00:00,19.9,20.2,19.7,918.0,33.0,0.0,3.3 -2026-03-17 10:00:00+00:00,20.4,20.6,20.15,912.5,35.0,0.0,2.95 -2026-03-17 10:15:00+00:00,20.5,20.8,20.2,908.0,35.0,0.0,3.6 -2026-03-17 10:30:00+00:00,21.05,21.25,20.7,895.0,32.0,0.0,2.8499999999999996 -2026-03-17 10:45:00+00:00,21.3,21.4,21.2,877.0,30.0,0.0,2.4 -2026-03-17 11:00:00+00:00,20.1,20.65,19.25,855.0,41.5,0.0,3.95 -2026-03-17 11:15:00+00:00,19.3,19.5,18.9,828.0,49.0,0.0,2.6 -2026-03-17 11:30:00+00:00,18.799999999999997,19.3,18.35,800.0,51.5,0.0,2.8 -2026-03-17 11:45:00+00:00,18.4,18.6,18.1,771.0,54.0,0.0,2.4 -2026-03-17 12:00:00+00:00,18.1,18.35,17.95,734.5,54.5,0.0,2.8499999999999996 -2026-03-17 12:15:00+00:00,18.2,18.8,17.9,699.0,55.0,0.0,2.8 -2026-03-17 12:30:00+00:00,18.5,18.8,18.15,654.5,55.0,0.0,2.75 -2026-03-17 12:45:00+00:00,17.8,18.0,17.6,611.0,58.0,0.0,2.8 -2026-03-17 13:00:00+00:00,17.700000000000003,18.1,17.4,562.0,58.5,0.0,3.0 -2026-03-17 13:15:00+00:00,17.8,18.3,17.5,509.0,58.0,0.0,2.6 -2026-03-17 13:30:00+00:00,17.45,17.65,17.1,456.0,59.5,0.0,2.75 -2026-03-17 13:45:00+00:00,17.7,18.1,17.3,402.0,59.0,0.0,2.8 -2026-03-17 14:00:00+00:00,17.450000000000003,17.8,17.1,344.5,61.0,0.0,2.5 -2026-03-17 14:15:00+00:00,17.2,17.3,17.0,286.0,63.0,0.0,2.4 -2026-03-17 14:30:00+00:00,17.15,17.299999999999997,17.0,227.0,63.5,0.0,2.45 -2026-03-17 14:45:00+00:00,16.8,17.0,16.6,170.0,65.0,0.0,2.4 -2026-03-17 15:00:00+00:00,16.55,16.6,16.45,116.5,68.0,0.0,2.2 -2026-03-17 15:15:00+00:00,16.3,16.5,16.3,49.0,69.0,0.0,1.9 -2026-03-17 15:30:00+00:00,16.25,16.35,16.25,15.5,70.5,0.0,1.6 -2026-03-17 15:45:00+00:00,16.1,16.2,15.9,3.0,73.0,0.0,1.5 -2026-03-17 16:00:00+00:00,15.8,15.850000000000001,15.7,0.0,74.5,0.0,1.55 -2026-03-17 16:15:00+00:00,15.6,15.6,15.5,0.0,77.0,0.0,1.3 -2026-03-17 16:30:00+00:00,15.4,15.55,15.3,0.0,77.5,0.0,1.65 -2026-03-17 16:45:00+00:00,15.1,15.2,15.0,0.0,79.0,0.0,1.8 -2026-03-17 17:00:00+00:00,14.850000000000001,14.9,14.75,0.0,80.0,0.0,1.55 -2026-03-17 17:15:00+00:00,14.9,14.9,14.7,0.0,79.0,0.0,2.1 -2026-03-17 17:30:00+00:00,14.9,15.0,14.8,0.0,80.0,0.0,1.9 -2026-03-17 17:45:00+00:00,14.9,15.0,14.8,0.0,80.0,0.0,2.4 -2026-03-17 18:00:00+00:00,14.9,14.9,14.8,0.0,80.0,0.0,2.5999999999999996 -2026-03-17 18:15:00+00:00,14.9,14.9,14.8,0.0,80.0,0.0,2.8 -2026-03-17 18:30:00+00:00,14.9,14.9,14.8,0.0,80.5,0.0,2.75 -2026-03-17 18:45:00+00:00,14.8,14.8,14.7,0.0,82.0,0.0,2.5 -2026-03-17 19:00:00+00:00,14.7,14.7,14.6,0.0,84.0,0.0,2.6 -2026-03-17 19:15:00+00:00,14.7,14.7,14.6,0.0,84.0,0.0,2.1 -2026-03-17 19:30:00+00:00,14.5,14.649999999999999,14.3,0.0,83.0,0.0,2.15 -2026-03-17 19:45:00+00:00,13.5,14.0,13.3,0.0,82.0,0.0,1.7 -2026-03-17 20:00:00+00:00,13.5,13.7,13.4,0.0,77.0,0.0,1.45 -2026-03-17 20:15:00+00:00,14.0,14.6,13.7,0.0,73.0,0.0,2.0 -2026-03-17 20:30:00+00:00,16.15,16.6,15.45,0.0,57.5,0.0,1.95 -2026-03-17 20:45:00+00:00,16.7,16.9,16.6,0.0,53.0,0.0,1.9 -2026-03-17 21:00:00+00:00,17.05,17.200000000000003,16.85,0.0,50.0,0.0,1.85 -2026-03-17 21:15:00+00:00,16.9,17.0,16.5,0.0,51.0,0.0,1.6 -2026-03-17 21:30:00+00:00,16.950000000000003,17.3,16.7,0.0,49.0,0.0,2.05 -2026-03-17 21:45:00+00:00,17.4,17.6,17.2,0.0,47.0,0.0,2.3 -2026-03-17 22:00:00+00:00,17.65,17.8,17.45,0.0,45.0,0.0,2.4 -2026-03-17 22:15:00+00:00,17.6,17.8,17.5,0.0,44.0,0.0,2.5 -2026-03-17 22:30:00+00:00,17.35,17.6,17.15,0.0,45.0,0.0,2.5999999999999996 -2026-03-17 22:45:00+00:00,17.6,17.7,17.6,0.0,43.0,0.0,2.4 -2026-03-17 23:00:00+00:00,17.8,17.9,17.700000000000003,0.0,42.0,0.0,3.1500000000000004 -2026-03-17 23:15:00+00:00,17.7,17.9,17.6,0.0,42.0,0.0,2.9 -2026-03-17 23:30:00+00:00,17.7,17.75,17.6,0.0,41.5,0.0,3.45 -2026-03-17 23:45:00+00:00,17.8,17.9,17.7,0.0,39.0,0.0,3.5 -2026-03-18 00:00:00+00:00,18.2,18.3,17.95,0.0,37.0,0.0,3.75 -2026-03-18 00:15:00+00:00,18.3,18.4,18.2,0.0,36.0,0.0,4.1 -2026-03-18 00:30:00+00:00,18.3,18.35,18.2,0.0,35.5,0.0,4.0 -2026-03-18 00:45:00+00:00,18.2,18.3,18.1,0.0,36.0,0.0,4.2 -2026-03-18 01:00:00+00:00,18.3,18.5,18.25,0.0,34.5,0.0,4.85 -2026-03-18 01:15:00+00:00,18.5,18.6,18.4,0.0,33.0,0.0,4.8 -2026-03-18 01:30:00+00:00,18.4,18.549999999999997,18.35,0.0,33.0,0.0,4.55 -2026-03-18 01:45:00+00:00,18.2,18.3,18.1,0.0,33.0,0.0,4.4 -2026-03-18 02:00:00+00:00,18.299999999999997,18.4,18.200000000000003,0.0,32.5,0.0,4.449999999999999 -2026-03-18 02:15:00+00:00,18.3,18.4,18.3,0.0,31.0,0.0,3.8 -2026-03-18 02:30:00+00:00,18.4,18.5,18.3,0.0,31.0,0.0,4.4 -2026-03-18 02:45:00+00:00,18.5,18.5,18.4,0.0,30.0,0.0,5.2 -2026-03-18 03:00:00+00:00,18.25,18.45,18.1,0.0,31.0,0.0,4.65 -2026-03-18 03:15:00+00:00,18.2,18.3,18.1,0.0,31.0,0.0,4.7 -2026-03-18 03:30:00+00:00,18.05,18.15,17.9,0.0,31.5,0.0,4.8 -2026-03-18 03:45:00+00:00,18.0,18.1,18.0,1.0,32.0,0.0,4.8 -2026-03-18 04:00:00+00:00,17.75,17.9,17.65,16.5,32.5,0.0,4.449999999999999 -2026-03-18 04:15:00+00:00,17.7,17.8,17.6,45.0,33.0,0.0,4.2 -2026-03-18 04:30:00+00:00,17.85,18.05,17.700000000000003,88.0,33.0,0.0,5.0 -2026-03-18 04:45:00+00:00,18.1,18.1,18.0,127.0,33.0,0.0,5.5 -2026-03-18 05:00:00+00:00,18.1,18.15,18.0,181.5,33.5,0.0,4.6 -2026-03-18 05:15:00+00:00,18.2,18.2,18.1,243.0,34.0,0.0,5.0 -2026-03-18 05:30:00+00:00,18.299999999999997,18.4,18.200000000000003,305.0,34.5,0.0,5.2 -2026-03-18 05:45:00+00:00,18.5,18.7,18.4,362.0,35.0,0.0,4.9 -2026-03-18 06:00:00+00:00,18.85,19.0,18.700000000000003,418.5,35.0,0.0,4.7 -2026-03-18 06:15:00+00:00,19.2,19.2,19.1,471.0,35.0,0.0,4.7 -2026-03-18 06:30:00+00:00,19.4,19.549999999999997,19.25,521.0,34.5,0.0,4.85 -2026-03-18 06:45:00+00:00,19.7,19.8,19.6,570.0,34.0,0.0,5.6 -2026-03-18 07:00:00+00:00,20.25,20.4,20.05,615.5,34.0,0.0,4.95 -2026-03-18 07:15:00+00:00,20.7,20.9,20.5,655.0,33.0,0.0,4.8 -2026-03-18 07:30:00+00:00,21.1,21.200000000000003,20.85,690.0,31.5,0.0,5.55 -2026-03-18 07:45:00+00:00,21.6,21.8,21.3,732.0,30.0,0.0,5.6 -2026-03-18 08:00:00+00:00,21.9,22.1,21.700000000000003,761.5,30.0,0.0,6.050000000000001 -2026-03-18 08:15:00+00:00,22.4,22.6,22.1,791.0,29.0,0.0,5.1 -2026-03-18 08:30:00+00:00,23.0,23.15,22.75,811.5,28.5,0.0,5.35 -2026-03-18 08:45:00+00:00,23.0,23.1,22.9,690.0,28.0,0.0,6.9 -2026-03-18 09:00:00+00:00,23.3,23.55,23.1,614.0,27.0,0.0,6.4 -2026-03-18 09:15:00+00:00,24.0,24.4,23.5,682.0,27.0,0.0,4.9 -2026-03-18 09:30:00+00:00,24.5,24.65,24.35,812.0,26.0,0.0,6.35 -2026-03-18 09:45:00+00:00,24.7,24.8,24.5,859.0,27.0,0.0,6.6 -2026-03-18 10:00:00+00:00,25.15,25.4,24.95,881.0,26.0,0.0,6.45 -2026-03-18 10:15:00+00:00,25.9,26.0,25.6,865.0,23.0,0.0,6.2 -2026-03-18 10:30:00+00:00,25.7,26.0,25.450000000000003,492.0,23.5,0.0,5.8 -2026-03-18 10:45:00+00:00,25.2,25.4,25.1,437.0,25.0,0.0,5.5 -2026-03-18 11:00:00+00:00,25.6,25.75,25.45,644.0,23.5,0.0,6.05 -2026-03-18 11:15:00+00:00,25.6,25.7,25.4,339.0,24.0,0.0,4.8 -2026-03-18 11:30:00+00:00,25.55,25.75,25.4,476.0,25.0,0.0,4.95 -2026-03-18 11:45:00+00:00,25.4,25.8,25.3,607.0,25.0,0.0,5.1 -2026-03-18 12:00:00+00:00,25.85,26.0,25.75,511.0,24.5,0.0,4.6 -2026-03-18 12:15:00+00:00,25.6,25.8,25.6,271.0,24.0,0.0,5.4 -2026-03-18 12:30:00+00:00,25.55,25.65,25.45,127.0,24.0,0.0,4.05 -2026-03-18 12:45:00+00:00,25.5,25.5,25.4,43.0,23.0,0.0,4.0 -2026-03-18 13:00:00+00:00,25.4,25.5,25.3,70.5,22.5,0.0,2.3 -2026-03-18 13:15:00+00:00,25.4,25.5,25.3,103.0,23.0,0.0,2.4 -2026-03-18 13:30:00+00:00,25.3,25.4,25.2,163.5,24.0,0.0,3.0 -2026-03-18 13:45:00+00:00,25.2,25.3,25.0,130.0,25.0,0.0,2.8 -2026-03-18 14:00:00+00:00,25.0,25.0,24.9,40.5,25.5,0.0,1.6 -2026-03-18 14:15:00+00:00,25.0,25.1,24.8,18.0,25.0,0.0,1.6 -2026-03-18 14:30:00+00:00,23.8,24.35,23.5,133.5,33.5,0.0,0.7 -2026-03-18 14:45:00+00:00,23.6,23.9,23.4,66.0,36.0,0.0,1.3 -2026-03-18 15:00:00+00:00,23.75,23.9,23.6,28.0,30.0,0.0,2.05 -2026-03-18 15:15:00+00:00,24.1,24.1,23.9,31.0,28.0,0.0,2.5 -2026-03-18 15:30:00+00:00,24.299999999999997,24.4,24.200000000000003,7.5,27.5,0.0,2.8499999999999996 -2026-03-18 15:45:00+00:00,24.1,24.3,23.9,0.0,28.0,0.0,1.9 -2026-03-18 16:00:00+00:00,23.65,23.85,23.450000000000003,0.0,30.0,0.0,1.75 -2026-03-18 16:15:00+00:00,23.6,23.7,23.5,0.0,30.0,0.0,2.0 -2026-03-18 16:30:00+00:00,23.7,23.799999999999997,23.6,0.0,29.5,0.0,2.05 -2026-03-18 16:45:00+00:00,24.3,24.9,23.9,0.0,27.0,0.0,3.1 -2026-03-18 17:00:00+00:00,21.8,23.5,20.1,0.0,46.0,0.9,4.3 -2026-03-18 17:15:00+00:00,17.7,18.1,17.6,0.0,70.0,0.5,3.2 -2026-03-18 17:30:00+00:00,17.15,17.4,16.950000000000003,0.0,74.0,0.05,2.55 -2026-03-18 17:45:00+00:00,16.9,17.2,16.5,0.0,78.0,0.0,3.0 -2026-03-18 18:00:00+00:00,16.25,16.45,16.15,0.0,80.5,0.0,2.55 -2026-03-18 18:15:00+00:00,16.4,16.6,16.2,0.0,77.0,0.0,2.0 -2026-03-18 18:30:00+00:00,16.35,16.700000000000003,16.15,0.0,77.5,0.0,1.3 -2026-03-18 18:45:00+00:00,15.9,16.3,15.5,0.0,80.0,0.0,0.8 -2026-03-18 19:00:00+00:00,17.35,17.950000000000003,16.65,0.5,63.0,0.0,3.2 -2026-03-18 19:15:00+00:00,18.3,18.3,18.1,1.0,58.0,0.0,2.5 -2026-03-18 19:30:00+00:00,18.35,18.45,18.3,0.5,59.0,0.0,2.6 -2026-03-18 19:45:00+00:00,18.4,18.5,18.3,0.0,61.0,0.0,2.1 -2026-03-18 20:00:00+00:00,18.5,18.55,18.4,0.0,63.0,0.0,2.4 -2026-03-18 20:15:00+00:00,18.5,18.5,18.4,0.0,65.0,0.0,2.5 -2026-03-18 20:30:00+00:00,18.45,18.55,18.4,0.0,67.0,0.0,4.15 -2026-03-18 20:45:00+00:00,18.2,18.3,18.2,0.0,70.0,0.0,5.1 -2026-03-18 21:00:00+00:00,18.1,18.200000000000003,18.0,0.0,71.5,0.0,4.6 -2026-03-18 21:15:00+00:00,17.8,17.9,17.7,0.0,73.0,0.0,3.0 -2026-03-18 21:30:00+00:00,17.75,17.85,17.6,0.0,72.5,0.0,2.85 -2026-03-18 21:45:00+00:00,18.2,18.5,18.0,0.0,69.0,0.0,3.9 -2026-03-18 22:00:00+00:00,18.4,18.55,18.25,0.0,67.0,0.0,4.3 -2026-03-18 22:15:00+00:00,18.0,18.1,17.9,0.0,69.0,0.0,4.4 -2026-03-18 22:30:00+00:00,17.8,17.85,17.7,0.0,70.0,0.0,4.550000000000001 -2026-03-18 22:45:00+00:00,17.9,18.0,17.8,0.0,70.0,0.0,5.9 -2026-03-18 23:00:00+00:00,17.55,17.700000000000003,17.5,0.0,72.0,0.0,5.75 -2026-03-18 23:15:00+00:00,17.5,17.5,17.4,0.0,72.0,0.0,5.0 -2026-03-18 23:30:00+00:00,17.35,17.35,17.3,0.0,72.5,0.0,3.2 -2026-03-18 23:45:00+00:00,17.3,17.3,17.2,0.0,73.0,0.0,2.8 -2026-03-19 00:00:00+00:00,17.2,17.25,17.1,0.0,73.0,0.0,2.75 -2026-03-19 00:15:00+00:00,17.3,17.4,17.2,0.0,72.0,0.0,4.1 -2026-03-19 00:30:00+00:00,17.3,17.35,17.2,0.0,72.5,0.0,3.0 -2026-03-19 00:45:00+00:00,17.2,17.3,17.2,0.0,73.0,0.0,2.5 -2026-03-19 01:00:00+00:00,17.1,17.25,17.0,0.0,73.5,0.05,2.25 -2026-03-19 01:15:00+00:00,16.8,16.9,16.8,0.0,76.0,0.0,1.8 -2026-03-19 01:30:00+00:00,16.6,16.700000000000003,16.5,0.0,78.0,0.0,2.8 -2026-03-19 01:45:00+00:00,16.5,16.5,16.4,0.0,78.0,0.0,2.4 -2026-03-19 02:00:00+00:00,16.3,16.45,16.2,0.0,79.5,0.15,2.45 -2026-03-19 02:15:00+00:00,15.9,16.0,15.9,0.0,81.0,0.0,1.9 -2026-03-19 02:30:00+00:00,16.200000000000003,16.299999999999997,16.05,0.0,79.5,0.0,1.65 -2026-03-19 02:45:00+00:00,16.5,16.5,16.4,0.0,77.0,0.0,1.7 -2026-03-19 03:00:00+00:00,16.5,16.7,16.4,0.0,76.5,0.0,2.0 -2026-03-19 03:15:00+00:00,16.4,16.5,16.3,0.0,78.0,0.0,1.8 -2026-03-19 03:30:00+00:00,16.200000000000003,16.299999999999997,16.05,0.0,79.0,0.0,1.5 -2026-03-19 03:45:00+00:00,15.9,16.0,15.9,1.0,81.0,0.0,1.3 -2026-03-19 04:00:00+00:00,15.75,15.8,15.649999999999999,6.0,82.5,0.0,1.5499999999999998 -2026-03-19 04:15:00+00:00,15.7,15.7,15.6,28.0,82.0,0.0,1.7 -2026-03-19 04:30:00+00:00,15.850000000000001,15.95,15.7,72.5,81.5,0.0,2.1500000000000004 -2026-03-19 04:45:00+00:00,15.8,16.0,15.7,126.0,84.0,0.0,2.1 -2026-03-19 05:00:00+00:00,15.95,16.0,15.9,155.5,84.0,0.0,2.4000000000000004 -2026-03-19 05:15:00+00:00,16.0,16.1,15.9,192.0,85.0,0.0,2.5 -2026-03-19 05:30:00+00:00,15.850000000000001,15.95,15.8,178.0,86.5,0.0,2.55 -2026-03-19 05:45:00+00:00,15.8,15.9,15.8,178.0,88.0,0.0,1.5 -2026-03-19 06:00:00+00:00,16.0,16.1,15.9,158.5,87.5,0.0,1.4 -2026-03-19 06:15:00+00:00,16.5,17.0,16.1,360.0,85.0,0.0,1.5 -2026-03-19 06:30:00+00:00,17.4,17.5,17.15,275.0,76.5,0.0,2.7 -2026-03-19 06:45:00+00:00,17.5,17.6,17.4,230.0,77.0,0.0,2.7 -2026-03-19 07:00:00+00:00,18.15,18.65,17.9,545.0,72.5,0.0,1.85 -2026-03-19 07:15:00+00:00,19.3,19.7,19.0,630.0,65.0,0.0,1.3 -2026-03-19 07:30:00+00:00,19.549999999999997,19.75,19.35,657.5,61.5,0.0,1.85 -2026-03-19 07:45:00+00:00,19.9,20.2,19.7,701.0,59.0,0.0,1.9 -2026-03-19 08:00:00+00:00,19.75,19.950000000000003,19.450000000000003,739.0,57.0,0.0,2.55 -2026-03-19 08:15:00+00:00,19.8,20.1,19.6,762.0,58.0,0.0,2.4 -2026-03-19 08:30:00+00:00,19.85,20.5,19.45,767.5,60.0,0.0,3.2 -2026-03-19 08:45:00+00:00,19.4,19.8,19.1,701.0,65.0,0.0,4.3 -2026-03-19 09:00:00+00:00,19.1,19.2,18.9,525.0,69.0,0.0,2.95 -2026-03-19 09:15:00+00:00,18.5,19.1,18.3,424.0,73.0,0.0,3.9 -2026-03-19 09:30:00+00:00,18.15,18.45,18.0,347.0,75.5,0.0,3.65 -2026-03-19 09:45:00+00:00,17.8,17.9,17.8,336.0,78.0,0.0,3.5 -2026-03-19 10:00:00+00:00,17.450000000000003,17.6,17.25,292.5,80.5,0.0,4.4 -2026-03-19 10:15:00+00:00,17.2,17.3,17.1,282.0,81.0,0.0,5.0 -2026-03-19 10:30:00+00:00,17.15,17.25,17.0,256.5,80.0,0.0,4.949999999999999 -2026-03-19 10:45:00+00:00,17.0,17.1,16.8,231.0,82.0,0.0,5.2 -2026-03-19 11:00:00+00:00,16.65,16.75,16.5,286.0,83.0,0.0,5.550000000000001 -2026-03-19 11:15:00+00:00,16.5,16.6,16.4,333.0,82.0,0.0,4.8 -2026-03-19 11:30:00+00:00,16.8,16.95,16.55,306.0,81.0,0.0,4.55 -2026-03-19 11:45:00+00:00,16.8,17.0,16.6,262.0,79.0,0.0,4.2 -2026-03-19 12:00:00+00:00,16.45,16.55,16.3,188.5,81.5,0.0,4.699999999999999 -2026-03-19 12:15:00+00:00,16.4,16.4,16.3,165.0,82.0,0.0,4.5 -2026-03-19 12:30:00+00:00,16.45,16.55,16.35,188.0,81.0,0.0,4.55 -2026-03-19 12:45:00+00:00,16.5,16.7,16.4,315.0,81.0,0.0,3.9 -2026-03-19 13:00:00+00:00,16.7,16.75,16.65,251.0,78.5,0.0,4.5 -2026-03-19 13:15:00+00:00,16.7,16.7,16.6,235.0,80.0,0.0,4.0 -2026-03-19 13:30:00+00:00,16.95,17.2,16.75,240.5,78.5,0.0,4.35 -2026-03-19 13:45:00+00:00,16.5,16.8,16.3,132.0,82.0,0.0,5.7 -2026-03-19 14:00:00+00:00,16.25,16.3,16.15,106.5,83.5,0.0,4.9 -2026-03-19 14:15:00+00:00,16.1,16.1,16.0,34.0,86.0,0.0,4.0 -2026-03-19 14:30:00+00:00,16.0,16.1,15.9,64.5,86.5,0.0,4.55 -2026-03-19 14:45:00+00:00,16.1,16.1,16.0,34.0,87.0,0.0,4.3 -2026-03-19 15:00:00+00:00,16.15,16.25,16.05,55.5,87.5,0.0,4.4 -2026-03-19 15:15:00+00:00,16.2,16.3,16.1,45.0,89.0,0.0,4.9 -2026-03-19 15:30:00+00:00,16.1,16.15,16.05,10.5,88.0,0.0,4.6 -2026-03-19 15:45:00+00:00,16.0,16.0,15.9,1.0,89.0,0.0,4.5 -2026-03-19 16:00:00+00:00,15.65,16.0,14.8,0.0,89.0,2.0,3.8499999999999996 -2026-03-19 16:15:00+00:00,13.3,13.7,13.2,0.0,88.0,0.0,2.4 -2026-03-19 16:30:00+00:00,13.3,13.4,13.2,0.0,88.5,0.0,1.75 -2026-03-19 16:45:00+00:00,13.2,13.5,13.0,0.0,90.0,0.0,1.5 -2026-03-19 17:00:00+00:00,13.4,13.45,13.25,0.0,87.5,0.0,2.0 -2026-03-19 17:15:00+00:00,13.5,13.6,13.4,0.0,87.0,0.0,1.3 -2026-03-19 17:30:00+00:00,13.3,13.4,13.2,0.0,90.5,0.0,1.5 -2026-03-19 17:45:00+00:00,13.0,13.2,12.9,0.0,91.0,0.0,1.7 -2026-03-19 18:00:00+00:00,13.149999999999999,13.25,13.05,0.0,89.5,0.0,1.85 -2026-03-19 18:15:00+00:00,13.4,13.5,13.2,0.0,87.0,0.0,1.4 -2026-03-19 18:30:00+00:00,13.45,13.55,13.350000000000001,0.0,88.0,0.0,1.7 -2026-03-19 18:45:00+00:00,13.8,14.0,13.6,0.0,85.0,0.0,2.3 -2026-03-19 19:00:00+00:00,14.149999999999999,14.25,14.0,0.0,83.0,0.0,1.85 -2026-03-19 19:15:00+00:00,14.4,14.7,14.2,0.0,83.0,0.0,3.0 -2026-03-19 19:30:00+00:00,15.1,15.2,14.899999999999999,1.0,86.5,0.0,3.75 -2026-03-19 19:45:00+00:00,15.4,15.4,15.3,1.0,88.0,0.0,3.7 -2026-03-19 20:00:00+00:00,15.149999999999999,15.3,14.9,0.5,87.0,0.0,4.95 -2026-03-19 20:15:00+00:00,15.3,15.4,15.2,0.0,87.0,0.0,5.5 -2026-03-19 20:30:00+00:00,15.2,15.35,15.1,0.0,89.0,0.1,4.9 -2026-03-19 20:45:00+00:00,15.0,15.2,14.7,0.0,88.0,0.0,7.0 -2026-03-19 21:00:00+00:00,14.85,14.95,14.75,0.0,87.0,0.0,5.85 -2026-03-19 21:15:00+00:00,15.0,15.1,14.9,0.0,89.0,0.0,5.1 -2026-03-19 21:30:00+00:00,14.9,15.0,14.850000000000001,0.0,87.0,0.0,4.35 -2026-03-19 21:45:00+00:00,14.9,15.0,14.8,0.0,86.0,0.0,4.8 -2026-03-19 22:00:00+00:00,14.9,14.95,14.8,0.0,84.0,0.0,5.35 -2026-03-19 22:15:00+00:00,14.9,15.0,14.8,0.0,83.0,0.0,4.9 -2026-03-19 22:30:00+00:00,14.9,15.0,14.850000000000001,0.0,82.0,0.0,4.35 -2026-03-19 22:45:00+00:00,15.0,15.1,14.9,0.0,83.0,0.0,4.5 -2026-03-19 23:00:00+00:00,15.0,15.05,14.9,0.0,81.5,0.0,4.1 -2026-03-19 23:15:00+00:00,15.0,15.1,14.9,0.0,81.0,0.0,5.6 -2026-03-19 23:30:00+00:00,15.0,15.1,14.95,0.0,81.0,0.0,4.25 -2026-03-19 23:45:00+00:00,15.0,15.1,15.0,0.0,82.0,0.0,4.2 -2026-03-20 00:00:00+00:00,14.95,15.05,14.9,0.0,80.0,0.0,4.95 -2026-03-20 00:15:00+00:00,15.0,15.1,14.9,0.0,83.0,0.0,3.1 -2026-03-20 00:30:00+00:00,14.9,14.9,14.8,0.0,79.0,0.0,3.35 -2026-03-20 00:45:00+00:00,14.8,14.8,14.8,0.0,78.0,0.0,3.0 -2026-03-20 01:00:00+00:00,14.850000000000001,14.9,14.8,0.0,79.0,0.0,3.65 -2026-03-20 01:15:00+00:00,14.8,14.9,14.7,0.0,80.0,0.0,3.2 -2026-03-20 01:30:00+00:00,14.8,14.9,14.75,0.0,78.5,0.0,4.1 -2026-03-20 01:45:00+00:00,14.9,14.9,14.8,0.0,74.0,0.0,5.9 -2026-03-20 02:00:00+00:00,14.5,14.75,14.149999999999999,0.0,77.5,0.0,4.4 -2026-03-20 02:15:00+00:00,13.6,13.7,13.6,0.0,77.0,0.0,5.2 -2026-03-20 02:30:00+00:00,13.55,13.6,13.5,0.0,79.5,0.0,4.2 -2026-03-20 02:45:00+00:00,13.8,13.9,13.6,0.0,84.0,0.0,5.5 -2026-03-20 03:00:00+00:00,13.95,14.0,13.9,0.0,85.5,0.0,3.25 -2026-03-20 03:15:00+00:00,13.9,14.1,13.6,0.0,87.0,1.4,3.6 -2026-03-20 03:30:00+00:00,13.649999999999999,13.75,13.649999999999999,0.0,88.5,0.0,4.550000000000001 -2026-03-20 03:45:00+00:00,13.6,13.8,13.6,3.0,89.0,0.0,4.0 -2026-03-20 04:00:00+00:00,13.649999999999999,13.7,13.6,11.5,89.0,0.0,3.0 -2026-03-20 04:15:00+00:00,13.8,13.9,13.7,17.0,89.0,0.0,2.6 -2026-03-20 04:30:00+00:00,13.25,13.55,12.899999999999999,11.5,92.0,0.95,4.4 -2026-03-20 04:45:00+00:00,12.9,13.0,12.8,24.0,95.0,0.0,4.9 -2026-03-20 05:00:00+00:00,12.95,13.0,12.850000000000001,50.0,95.0,0.30000000000000004,4.2 -2026-03-20 05:15:00+00:00,13.1,13.2,13.1,70.0,94.0,0.2,3.7 -2026-03-20 05:30:00+00:00,13.05,13.1,12.9,50.5,94.0,1.05,4.55 -2026-03-20 05:45:00+00:00,12.5,12.8,12.4,24.0,95.0,1.5,3.4 -2026-03-20 06:00:00+00:00,12.55,12.7,12.350000000000001,98.5,95.5,0.25,1.35 -2026-03-20 06:15:00+00:00,13.2,13.4,12.9,134.0,95.0,0.2,2.4 -2026-03-20 06:30:00+00:00,13.5,13.7,13.3,88.0,95.0,0.65,2.4000000000000004 -2026-03-20 06:45:00+00:00,14.1,14.2,13.9,218.0,94.0,0.0,5.9 -2026-03-20 07:00:00+00:00,14.45,14.55,14.3,320.5,91.0,0.0,5.949999999999999 -2026-03-20 07:15:00+00:00,14.7,14.8,14.7,250.0,90.0,0.0,5.4 -2026-03-20 07:30:00+00:00,14.8,14.9,14.65,466.5,88.5,0.0,5.1 -2026-03-20 07:45:00+00:00,14.9,15.0,14.9,255.0,89.0,0.0,5.0 -2026-03-20 08:00:00+00:00,15.1,15.149999999999999,14.9,357.0,88.5,0.0,5.449999999999999 -2026-03-20 08:15:00+00:00,15.2,15.4,15.1,527.0,87.0,0.0,5.5 -2026-03-20 08:30:00+00:00,15.45,15.5,15.3,445.5,85.0,0.0,5.3 -2026-03-20 08:45:00+00:00,15.1,15.3,14.9,366.0,86.0,0.0,5.4 -2026-03-20 09:00:00+00:00,14.9,15.05,14.75,432.5,87.0,0.0,4.55 -2026-03-20 09:15:00+00:00,15.3,15.5,14.8,433.0,86.0,0.0,3.8 -2026-03-20 09:30:00+00:00,15.4,15.5,15.25,396.0,82.0,0.0,5.5 -2026-03-20 09:45:00+00:00,15.6,15.6,15.5,192.0,78.0,0.0,4.2 -2026-03-20 10:00:00+00:00,14.8,15.2,14.55,141.5,86.5,0.35,4.4 -2026-03-20 10:15:00+00:00,14.2,14.5,14.1,319.0,89.0,0.0,4.9 -2026-03-20 10:30:00+00:00,15.05,15.35,14.75,389.5,88.5,0.0,4.1 -2026-03-20 10:45:00+00:00,15.7,15.8,15.6,314.0,85.0,0.0,5.6 -2026-03-20 11:00:00+00:00,15.75,16.05,15.55,427.0,82.5,0.0,4.95 -2026-03-20 11:15:00+00:00,16.1,16.3,15.9,325.0,80.0,0.0,3.9 -2026-03-20 11:30:00+00:00,16.1,16.15,16.0,332.5,78.5,0.0,4.1 -2026-03-20 11:45:00+00:00,16.4,16.5,16.1,468.0,76.0,0.0,4.1 -2026-03-20 12:00:00+00:00,16.3,16.6,16.15,418.0,75.5,0.0,4.15 -2026-03-20 12:15:00+00:00,16.8,16.8,16.6,486.0,71.0,0.0,4.3 -2026-03-20 12:30:00+00:00,16.95,17.2,16.75,531.5,70.0,0.0,2.5 -2026-03-20 12:45:00+00:00,17.2,17.5,17.0,551.0,68.0,0.0,2.1 -2026-03-20 13:00:00+00:00,17.4,17.55,17.15,551.5,65.0,0.0,2.4 -2026-03-20 13:15:00+00:00,17.6,17.9,17.4,505.0,64.0,0.0,1.7 -2026-03-20 13:30:00+00:00,17.95,18.1,17.75,429.5,59.0,0.0,1.75 -2026-03-20 13:45:00+00:00,18.1,18.3,17.9,394.0,57.0,0.0,1.7 -2026-03-20 14:00:00+00:00,18.299999999999997,18.4,18.1,321.0,56.5,0.0,0.9500000000000001 -2026-03-20 14:15:00+00:00,18.1,18.5,18.0,280.0,54.0,0.0,1.1 -2026-03-20 14:30:00+00:00,18.0,18.200000000000003,17.85,118.0,55.0,0.0,1.2 -2026-03-20 14:45:00+00:00,17.6,17.7,17.5,192.0,55.0,0.0,1.0 -2026-03-20 15:00:00+00:00,17.4,17.65,17.05,116.5,60.0,0.0,1.1 -2026-03-20 15:15:00+00:00,16.8,17.2,16.5,58.0,62.0,0.0,1.1 -2026-03-20 15:30:00+00:00,15.850000000000001,16.75,15.149999999999999,15.0,67.5,0.0,0.65 -2026-03-20 15:45:00+00:00,14.3,14.7,14.1,3.0,75.0,0.0,0.9 -2026-03-20 16:00:00+00:00,14.1,14.35,13.8,0.0,74.0,0.0,1.15 -2026-03-20 16:15:00+00:00,13.9,14.3,13.7,0.0,75.0,0.0,1.1 -2026-03-20 16:30:00+00:00,14.4,14.85,14.0,0.0,68.5,0.0,1.65 -2026-03-20 16:45:00+00:00,14.6,15.0,14.2,0.0,68.0,0.0,1.5 -2026-03-20 17:00:00+00:00,15.5,16.0,14.65,0.0,60.5,0.0,1.95 -2026-03-20 17:15:00+00:00,16.2,16.8,15.2,0.0,53.0,0.0,2.9 -2026-03-20 17:30:00+00:00,15.9,16.55,15.2,0.0,57.5,0.0,1.65 -2026-03-20 17:45:00+00:00,15.2,15.5,15.0,0.0,61.0,0.0,0.7 -2026-03-20 18:00:00+00:00,15.2,15.600000000000001,14.3,0.0,61.0,0.0,1.25 -2026-03-20 18:15:00+00:00,16.0,16.7,15.2,0.0,56.0,0.0,1.7 -2026-03-20 18:30:00+00:00,16.35,16.7,16.0,0.0,56.0,0.0,1.15 -2026-03-20 18:45:00+00:00,16.4,16.7,16.2,0.0,61.0,0.0,2.0 -2026-03-20 19:00:00+00:00,16.200000000000003,16.299999999999997,16.1,0.0,73.5,0.0,2.75 -2026-03-20 19:15:00+00:00,15.9,16.0,15.9,0.0,77.0,0.0,2.5 -2026-03-20 19:30:00+00:00,15.9,15.95,15.9,0.0,76.0,0.0,2.35 -2026-03-20 19:45:00+00:00,15.9,15.9,15.8,0.0,73.0,0.0,2.1 -2026-03-20 20:00:00+00:00,15.75,15.850000000000001,15.75,0.0,69.0,0.0,2.75 -2026-03-20 20:15:00+00:00,15.7,15.8,15.7,0.0,67.0,0.0,4.2 -2026-03-20 20:30:00+00:00,15.649999999999999,15.7,15.55,0.0,69.0,0.0,3.35 -2026-03-20 20:45:00+00:00,15.5,15.5,15.5,0.0,68.0,0.0,4.1 -2026-03-20 21:00:00+00:00,15.45,15.5,15.4,0.0,65.5,0.0,3.95 -2026-03-20 21:15:00+00:00,15.4,15.5,15.3,0.0,66.0,0.0,2.8 -2026-03-20 21:30:00+00:00,15.25,15.350000000000001,15.25,0.0,68.0,0.0,3.5 -2026-03-20 21:45:00+00:00,15.2,15.2,15.1,0.0,69.0,0.0,3.1 -2026-03-20 22:00:00+00:00,15.1,15.2,15.1,0.0,69.0,0.0,3.1500000000000004 -2026-03-20 22:15:00+00:00,15.1,15.1,15.0,0.0,71.0,0.0,3.5 -2026-03-20 22:30:00+00:00,15.05,15.1,15.0,0.0,69.5,0.0,3.4000000000000004 -2026-03-20 22:45:00+00:00,15.0,15.1,15.0,0.0,70.0,0.0,3.8 -2026-03-20 23:00:00+00:00,14.9,14.95,14.850000000000001,0.0,69.5,0.0,4.0 -2026-03-20 23:15:00+00:00,14.8,14.9,14.7,0.0,70.0,0.0,3.4 -2026-03-20 23:30:00+00:00,14.649999999999999,14.75,14.6,0.0,70.5,0.0,2.0 -2026-03-20 23:45:00+00:00,14.5,14.6,14.4,0.0,69.0,0.0,2.3 -2026-03-21 00:00:00+00:00,14.45,14.5,14.4,0.0,68.0,0.0,3.4 -2026-03-21 00:15:00+00:00,14.4,14.4,14.3,0.0,69.0,0.0,2.6 -2026-03-21 00:30:00+00:00,14.3,14.3,14.25,0.0,70.0,0.0,1.9 -2026-03-21 00:45:00+00:00,14.2,14.3,14.2,0.0,71.0,0.0,1.9 -2026-03-21 01:00:00+00:00,14.149999999999999,14.2,14.0,0.0,71.0,0.0,1.2999999999999998 -2026-03-21 01:15:00+00:00,14.2,14.3,14.1,0.0,70.0,0.0,1.5 -2026-03-21 01:30:00+00:00,14.1,14.2,13.9,0.0,71.0,0.0,1.65 -2026-03-21 01:45:00+00:00,14.1,14.1,14.0,0.0,71.0,0.0,1.9 -2026-03-21 02:00:00+00:00,14.1,14.2,14.05,0.0,71.0,0.0,1.5 -2026-03-21 02:15:00+00:00,14.0,14.2,14.0,0.0,72.0,0.0,1.3 -2026-03-21 02:30:00+00:00,14.05,14.05,14.0,0.0,72.0,0.0,1.7999999999999998 -2026-03-21 02:45:00+00:00,14.0,14.1,13.9,0.0,71.0,0.0,2.0 -2026-03-21 03:00:00+00:00,14.0,14.1,13.8,0.0,71.0,0.0,2.55 -2026-03-21 03:15:00+00:00,14.0,14.0,13.9,0.0,72.0,0.0,2.5 -2026-03-21 03:30:00+00:00,13.9,14.0,13.75,0.0,72.5,0.0,1.85 -2026-03-21 03:45:00+00:00,13.7,13.8,13.6,6.0,74.0,0.0,1.3 -2026-03-21 04:00:00+00:00,13.7,13.95,13.5,26.0,74.0,0.0,1.75 -2026-03-21 04:15:00+00:00,13.4,13.5,13.3,84.0,77.0,0.0,1.8 -2026-03-21 04:30:00+00:00,13.35,13.7,13.15,89.5,78.0,0.0,1.7999999999999998 -2026-03-21 04:45:00+00:00,13.2,13.3,13.0,129.0,78.0,0.5,2.6 -2026-03-21 05:00:00+00:00,13.25,13.4,13.149999999999999,153.5,79.0,0.0,2.05 -2026-03-21 05:15:00+00:00,13.5,13.6,13.4,135.0,78.0,0.0,1.7 -2026-03-21 05:30:00+00:00,13.45,13.55,13.4,27.0,76.0,0.0,1.9500000000000002 -2026-03-21 05:45:00+00:00,13.0,13.3,12.9,27.0,77.0,0.0,3.4 -2026-03-21 06:00:00+00:00,13.05,13.2,12.9,223.0,77.0,0.0,1.7000000000000002 -2026-03-21 06:15:00+00:00,13.7,13.9,13.5,105.0,74.0,0.0,1.5 -2026-03-21 06:30:00+00:00,13.850000000000001,13.95,13.7,62.5,74.0,0.0,1.7000000000000002 -2026-03-21 06:45:00+00:00,13.6,13.9,13.5,67.0,76.0,0.1,1.4 -2026-03-21 07:00:00+00:00,13.45,13.5,13.4,52.5,76.5,0.2,1.5 -2026-03-21 07:15:00+00:00,13.0,13.5,12.8,40.0,83.0,1.1,1.4 -2026-03-21 07:30:00+00:00,12.649999999999999,12.8,12.6,44.5,88.0,0.7,1.5 -2026-03-21 07:45:00+00:00,12.3,12.7,11.7,19.0,90.0,1.9,2.7 -2026-03-21 08:00:00+00:00,12.15,12.5,11.899999999999999,101.0,90.5,0.1,1.8 -2026-03-21 08:15:00+00:00,12.9,13.2,12.7,195.0,89.0,0.0,2.4 -2026-03-21 08:30:00+00:00,13.15,13.25,13.0,74.5,88.0,0.2,2.15 -2026-03-21 08:45:00+00:00,13.0,13.2,12.8,272.0,90.0,0.1,2.1 -2026-03-21 09:00:00+00:00,13.7,13.850000000000001,13.45,149.0,85.0,0.0,3.7 -2026-03-21 09:15:00+00:00,12.7,13.7,12.2,24.0,84.0,0.2,2.4 -2026-03-21 09:30:00+00:00,12.25,12.350000000000001,12.149999999999999,24.0,88.5,0.8999999999999999,1.85 -2026-03-21 09:45:00+00:00,12.5,12.7,12.4,122.0,90.0,0.4,1.6 -2026-03-21 10:00:00+00:00,13.8,14.25,13.3,452.0,86.0,0.0,2.9 -2026-03-21 10:15:00+00:00,14.6,14.7,14.6,302.0,79.0,0.0,3.0 -2026-03-21 10:30:00+00:00,14.7,14.7,14.6,268.0,77.0,0.0,3.65 -2026-03-21 10:45:00+00:00,14.7,14.8,14.7,260.0,77.0,0.0,3.3 -2026-03-21 11:00:00+00:00,13.95,14.399999999999999,13.649999999999999,191.5,82.5,0.25,3.35 -2026-03-21 11:15:00+00:00,13.5,13.8,13.2,607.0,82.0,0.0,3.2 -2026-03-21 11:30:00+00:00,14.5,14.75,14.15,544.5,78.5,0.0,3.25 -2026-03-21 11:45:00+00:00,14.8,14.8,14.5,341.0,78.0,0.0,4.5 -2026-03-21 12:00:00+00:00,14.9,15.1,14.45,238.5,72.0,0.0,4.15 -2026-03-21 12:15:00+00:00,13.5,14.1,13.3,154.0,76.0,0.0,2.9 -2026-03-21 12:30:00+00:00,13.45,13.55,13.350000000000001,158.5,78.0,0.0,3.3499999999999996 -2026-03-21 12:45:00+00:00,13.8,13.9,13.7,237.0,79.0,0.0,3.3 -2026-03-21 13:00:00+00:00,14.25,14.350000000000001,14.0,146.5,80.0,0.15,2.4000000000000004 -2026-03-21 13:15:00+00:00,14.1,14.1,14.0,81.0,83.0,0.0,2.2 -2026-03-21 13:30:00+00:00,14.1,14.2,14.05,80.5,78.5,0.0,4.45 -2026-03-21 13:45:00+00:00,13.8,14.0,13.7,36.0,79.0,0.3,4.4 -2026-03-21 14:00:00+00:00,13.25,13.5,13.15,54.0,82.0,0.25,3.95 -2026-03-21 14:15:00+00:00,12.8,13.0,12.6,29.0,81.0,0.3,5.2 -2026-03-21 14:30:00+00:00,12.35,12.5,12.3,16.0,86.0,0.5,1.95 -2026-03-21 14:45:00+00:00,12.2,12.3,11.8,6.0,91.0,3.3,3.3 -2026-03-21 15:00:00+00:00,10.6,11.25,10.350000000000001,4.0,96.0,3.35,2.4 -2026-03-21 15:15:00+00:00,10.2,10.6,10.1,5.0,96.0,0.1,1.7 -2026-03-21 15:30:00+00:00,10.0,10.15,9.95,4.5,96.0,0.35,1.95 -2026-03-21 15:45:00+00:00,9.8,10.0,9.7,0.0,95.0,1.0,2.5 -2026-03-21 16:00:00+00:00,9.9,10.05,9.8,0.0,96.0,1.15,2.2 -2026-03-21 16:15:00+00:00,10.1,10.2,10.0,0.0,97.0,0.8,3.3 -2026-03-21 16:30:00+00:00,10.3,10.3,10.25,0.0,97.0,1.05,4.0 -2026-03-21 16:45:00+00:00,10.3,10.4,10.3,0.0,97.0,0.7,3.5 -2026-03-21 17:00:00+00:00,10.4,10.4,10.3,0.0,97.0,0.35,3.65 -2026-03-21 17:15:00+00:00,10.3,10.4,10.3,0.0,96.0,0.2,3.4 -2026-03-21 17:30:00+00:00,10.45,10.55,10.4,0.0,93.0,0.1,2.95 -2026-03-21 17:45:00+00:00,10.5,10.5,10.4,0.0,91.0,0.0,2.4 -2026-03-21 18:00:00+00:00,10.3,10.4,10.25,0.0,92.5,0.05,2.6 -2026-03-21 18:15:00+00:00,10.5,10.6,10.3,0.0,87.0,0.0,3.2 -2026-03-21 18:30:00+00:00,10.5,10.65,10.4,0.5,87.0,0.0,3.0999999999999996 -2026-03-21 18:45:00+00:00,10.4,10.5,10.3,1.0,88.0,0.0,3.3 -2026-03-21 19:00:00+00:00,10.65,10.9,10.5,1.0,84.5,0.0,3.8 -2026-03-21 19:15:00+00:00,10.9,11.0,10.8,1.0,82.0,0.0,3.7 -2026-03-21 19:30:00+00:00,10.9,11.0,10.75,0.5,81.5,0.0,3.3499999999999996 -2026-03-21 19:45:00+00:00,10.8,10.9,10.8,0.0,85.0,0.0,2.0 -2026-03-21 20:00:00+00:00,10.75,10.8,10.7,0.0,86.0,0.0,1.9500000000000002 -2026-03-21 20:15:00+00:00,10.7,10.7,10.7,0.0,86.0,0.0,1.9 -2026-03-21 20:30:00+00:00,10.8,10.95,10.7,0.0,85.0,0.0,1.5499999999999998 -2026-03-21 20:45:00+00:00,10.8,11.0,10.6,0.0,86.0,0.0,1.4 -2026-03-21 21:00:00+00:00,10.8,10.9,10.7,0.0,84.5,0.0,1.75 -2026-03-21 21:15:00+00:00,10.8,10.8,10.7,0.0,85.0,0.1,2.1 -2026-03-21 21:30:00+00:00,10.649999999999999,10.75,10.5,0.0,87.0,0.15,2.45 -2026-03-21 21:45:00+00:00,10.5,10.5,10.4,0.0,89.0,0.2,3.0 +2026-05-16 21:00:00+00:00,17.15,17.25,17.05,0.0,88.5,0.0,0.95 +2026-05-16 21:15:00+00:00,16.9,17.1,16.7,0.0,89.0,0.0,0.1 +2026-05-16 21:30:00+00:00,16.55,16.65,16.55,0.0,89.5,0.0,0.6499999999999999 +2026-05-16 21:45:00+00:00,16.4,16.5,16.4,0.0,90.0,0.0,1.0 +2026-05-16 22:00:00+00:00,16.5,16.55,16.35,0.0,90.5,0.0,0.3 +2026-05-16 22:15:00+00:00,16.2,16.3,16.1,0.0,91.0,0.0,0.4 +2026-05-16 22:30:00+00:00,16.15,16.25,16.1,0.0,91.0,0.0,0.2 +2026-05-16 22:45:00+00:00,16.1,16.2,16.0,0.0,92.0,0.0,0.9 +2026-05-16 23:00:00+00:00,15.9,16.0,15.8,0.0,92.0,0.0,1.4500000000000002 +2026-05-16 23:15:00+00:00,16.2,16.3,16.0,0.0,91.0,0.0,1.4 +2026-05-16 23:30:00+00:00,16.7,16.9,16.5,0.0,89.5,0.0,2.25 +2026-05-16 23:45:00+00:00,17.0,17.0,16.9,0.0,88.0,0.0,1.4 +2026-05-17 00:00:00+00:00,16.95,17.05,16.9,0.0,88.0,0.0,3.5999999999999996 +2026-05-17 00:15:00+00:00,16.9,17.0,16.8,0.0,88.0,0.0,4.4 +2026-05-17 00:30:00+00:00,16.9,17.0,16.9,0.0,87.0,0.0,3.9000000000000004 +2026-05-17 00:45:00+00:00,16.9,17.0,16.9,0.0,87.0,0.0,4.2 +2026-05-17 01:00:00+00:00,16.9,16.95,16.8,0.0,87.0,0.0,2.45 +2026-05-17 01:15:00+00:00,16.9,17.0,16.9,0.0,86.0,0.0,2.5 +2026-05-17 01:30:00+00:00,17.05,17.2,17.0,0.0,85.5,0.0,3.3 +2026-05-17 01:45:00+00:00,17.0,17.0,16.9,5.0,87.0,0.0,1.8 +2026-05-17 02:00:00+00:00,16.95,17.0,16.85,23.5,87.5,0.0,2.2 +2026-05-17 02:15:00+00:00,17.1,17.2,17.0,51.0,87.0,0.0,2.6 +2026-05-17 02:30:00+00:00,17.5,17.6,17.35,86.0,84.5,0.0,2.4 +2026-05-17 02:45:00+00:00,17.8,17.9,17.7,129.0,82.0,0.0,3.5 +2026-05-17 03:00:00+00:00,18.05,18.3,17.85,178.5,79.5,0.0,1.55 +2026-05-17 03:15:00+00:00,17.6,17.9,17.6,230.0,84.0,0.0,1.4 +2026-05-17 03:30:00+00:00,18.2,18.450000000000003,17.95,283.5,81.5,0.0,0.9 +2026-05-17 03:45:00+00:00,18.4,18.6,18.2,330.0,80.0,0.0,1.7 +2026-05-17 04:00:00+00:00,18.75,19.0,18.55,382.5,78.0,0.0,1.9 +2026-05-17 04:15:00+00:00,19.4,19.6,19.1,436.0,75.0,0.0,2.4 +2026-05-17 04:30:00+00:00,19.55,19.700000000000003,19.45,477.0,74.0,0.0,2.75 +2026-05-17 04:45:00+00:00,20.0,20.1,19.8,519.0,72.0,0.0,2.9 +2026-05-17 05:00:00+00:00,20.6,20.9,20.3,563.0,68.0,0.0,2.6 +2026-05-17 05:15:00+00:00,21.3,21.5,21.2,600.0,63.0,0.0,3.1 +2026-05-17 05:30:00+00:00,21.75,21.9,21.55,637.5,59.5,0.0,3.1500000000000004 +2026-05-17 05:45:00+00:00,22.0,22.1,21.8,667.0,55.0,0.0,3.4 +2026-05-17 06:00:00+00:00,22.65,22.9,22.25,710.5,51.0,0.0,3.3 +2026-05-17 06:15:00+00:00,23.2,23.4,23.0,751.0,47.0,0.0,4.0 +2026-05-17 06:30:00+00:00,23.700000000000003,23.85,23.4,781.5,41.5,0.0,3.75 +2026-05-17 06:45:00+00:00,24.2,24.4,23.9,811.0,39.0,0.0,3.9 +2026-05-17 07:00:00+00:00,24.65,24.9,24.2,848.0,37.0,0.0,4.15 +2026-05-17 07:15:00+00:00,24.9,25.1,24.7,884.0,35.0,0.0,4.0 +2026-05-17 07:30:00+00:00,25.75,26.0,25.4,910.5,33.5,0.0,3.4 +2026-05-17 07:45:00+00:00,26.2,26.3,26.0,934.0,33.0,0.0,3.3 +2026-05-17 08:00:00+00:00,26.3,26.7,26.049999999999997,949.5,33.5,0.0,3.65 +2026-05-17 08:15:00+00:00,27.1,27.3,27.0,960.0,33.0,0.0,3.2 +2026-05-17 08:30:00+00:00,27.6,28.0,27.200000000000003,961.0,34.0,0.0,2.2 +2026-05-17 08:45:00+00:00,27.9,28.4,27.2,952.0,37.0,0.0,2.1 +2026-05-17 09:00:00+00:00,27.75,28.299999999999997,27.1,948.0,38.5,0.0,1.95 +2026-05-17 09:15:00+00:00,27.0,27.2,26.9,940.0,43.0,0.0,3.9 +2026-05-17 09:30:00+00:00,26.9,27.1,26.75,934.5,42.0,0.0,3.8499999999999996 +2026-05-17 09:45:00+00:00,26.7,27.0,26.4,926.0,39.0,0.0,4.5 +2026-05-17 10:00:00+00:00,27.45,27.700000000000003,27.1,907.5,33.0,0.0,3.65 +2026-05-17 10:15:00+00:00,27.8,27.9,27.5,883.0,31.0,0.0,3.3 +2026-05-17 10:30:00+00:00,28.5,28.85,28.2,858.5,28.0,0.0,2.7 +2026-05-17 10:45:00+00:00,28.8,29.1,28.4,830.0,27.0,0.0,2.7 +2026-05-17 11:00:00+00:00,29.1,29.35,28.799999999999997,796.0,26.0,0.0,2.6500000000000004 +2026-05-17 11:15:00+00:00,28.8,29.1,28.6,761.0,25.0,0.0,3.3 +2026-05-17 11:30:00+00:00,28.85,29.15,28.6,720.0,23.5,0.0,3.35 +2026-05-17 11:45:00+00:00,29.3,29.6,29.0,673.0,23.0,0.0,2.4 +2026-05-17 12:00:00+00:00,29.5,29.75,29.35,631.0,22.5,0.0,2.8 +2026-05-17 12:15:00+00:00,29.3,29.5,29.2,583.0,22.0,0.0,3.5 +2026-05-17 12:30:00+00:00,29.6,29.7,29.45,527.0,22.5,0.0,2.5 +2026-05-17 12:45:00+00:00,29.6,29.7,29.5,475.0,23.0,0.0,2.6 +2026-05-17 13:00:00+00:00,29.95,30.15,29.6,415.5,22.5,0.0,1.85 +2026-05-17 13:15:00+00:00,30.0,30.3,29.8,347.0,22.0,0.0,2.2 +2026-05-17 13:30:00+00:00,30.1,30.2,29.9,315.0,23.0,0.0,1.7000000000000002 +2026-05-17 13:45:00+00:00,30.3,30.4,30.1,253.0,23.0,0.0,1.2 +2026-05-17 14:00:00+00:00,30.05,30.15,29.95,205.5,23.0,0.0,1.15 +2026-05-17 14:15:00+00:00,30.0,30.2,29.9,152.0,24.0,0.0,1.0 +2026-05-17 14:30:00+00:00,29.549999999999997,29.85,29.15,105.5,27.0,0.0,0.7 +2026-05-17 14:45:00+00:00,28.5,28.7,28.4,62.0,31.0,0.0,0.6 +2026-05-17 15:00:00+00:00,28.200000000000003,28.299999999999997,28.0,36.0,30.5,0.0,0.45 +2026-05-17 15:15:00+00:00,27.5,27.9,27.3,15.0,31.0,0.0,0.5 +2026-05-17 15:30:00+00:00,26.65,27.0,26.25,1.5,32.0,0.0,0.65 +2026-05-17 15:45:00+00:00,26.2,26.4,25.9,0.0,32.0,0.0,1.4 +2026-05-17 16:00:00+00:00,26.75,27.200000000000003,26.25,0.0,29.5,0.0,2.0999999999999996 +2026-05-17 16:15:00+00:00,27.8,28.0,27.3,0.0,27.0,0.0,2.5 +2026-05-17 16:30:00+00:00,28.3,28.55,27.950000000000003,0.0,26.5,0.0,3.35 +2026-05-17 16:45:00+00:00,28.9,29.1,28.7,0.0,26.0,0.0,3.5 +2026-05-17 17:00:00+00:00,28.85,29.0,28.6,0.0,26.5,0.0,3.4000000000000004 +2026-05-17 17:15:00+00:00,29.1,29.2,28.9,0.0,27.0,0.0,3.1 +2026-05-17 17:30:00+00:00,29.1,29.25,29.0,0.0,27.0,0.0,3.3 +2026-05-17 17:45:00+00:00,29.3,29.4,29.1,0.0,27.0,0.0,3.6 +2026-05-17 18:00:00+00:00,29.45,29.5,29.35,0.0,27.0,0.0,3.8499999999999996 +2026-05-17 18:15:00+00:00,29.1,29.3,29.0,0.0,28.0,0.0,3.9 +2026-05-17 18:30:00+00:00,28.700000000000003,28.85,28.55,0.0,29.0,0.0,3.65 +2026-05-17 18:45:00+00:00,28.4,28.6,28.3,0.0,29.0,0.0,3.0 +2026-05-17 19:00:00+00:00,28.4,28.55,28.3,0.0,29.0,0.0,3.8499999999999996 +2026-05-17 19:15:00+00:00,28.2,28.4,28.0,0.0,29.0,0.0,4.6 +2026-05-17 19:30:00+00:00,27.799999999999997,27.9,27.65,0.0,30.5,0.0,5.0 +2026-05-17 19:45:00+00:00,27.4,27.6,27.3,0.0,32.0,0.0,5.1 +2026-05-17 20:00:00+00:00,26.950000000000003,27.05,26.700000000000003,0.0,34.5,0.0,5.15 +2026-05-17 20:15:00+00:00,26.5,26.7,26.3,0.0,35.0,0.0,5.0 +2026-05-17 20:30:00+00:00,26.45,26.5,26.35,0.0,35.0,0.0,5.1 +2026-05-17 20:45:00+00:00,26.5,26.6,26.4,0.0,35.0,0.0,5.5 +2026-05-17 21:00:00+00:00,26.6,26.65,26.5,0.0,35.0,0.0,4.5 +2026-05-17 21:15:00+00:00,26.9,27.1,26.6,0.0,34.0,0.0,4.3 +2026-05-17 21:30:00+00:00,26.85,27.05,26.7,0.0,34.0,0.0,3.5999999999999996 +2026-05-17 21:45:00+00:00,26.8,26.9,26.6,0.0,34.0,0.0,3.6 +2026-05-17 22:00:00+00:00,27.05,27.15,26.9,0.0,32.0,0.0,4.9 +2026-05-17 22:15:00+00:00,26.9,27.0,26.8,0.0,31.0,0.0,4.4 +2026-05-17 22:30:00+00:00,27.1,27.25,26.9,0.0,29.5,0.0,5.5 +2026-05-17 22:45:00+00:00,27.3,27.4,27.1,0.0,29.0,0.0,6.3 +2026-05-17 23:00:00+00:00,27.25,27.4,27.1,0.0,27.5,0.0,5.0 +2026-05-17 23:15:00+00:00,27.0,27.3,26.9,0.0,29.0,0.0,3.2 +2026-05-17 23:30:00+00:00,26.6,26.75,26.55,0.0,33.0,0.0,4.75 +2026-05-17 23:45:00+00:00,26.3,26.5,26.0,0.0,36.0,0.0,5.9 +2026-05-18 00:00:00+00:00,25.8,25.950000000000003,25.7,0.0,38.0,0.0,6.0 +2026-05-18 00:15:00+00:00,25.7,25.8,25.6,0.0,39.0,0.0,5.8 +2026-05-18 00:30:00+00:00,25.450000000000003,25.6,25.299999999999997,0.0,39.5,0.0,4.15 +2026-05-18 00:45:00+00:00,24.9,25.2,24.6,0.0,42.0,0.0,3.8 +2026-05-18 01:00:00+00:00,23.9,24.25,23.6,0.0,48.0,0.0,4.199999999999999 +2026-05-18 01:15:00+00:00,23.3,23.4,23.2,0.0,52.0,0.0,3.6 +2026-05-18 01:30:00+00:00,22.85,23.1,22.6,0.0,59.5,0.0,3.3 +2026-05-18 01:45:00+00:00,22.4,22.5,22.3,1.0,65.0,0.0,3.3 +2026-05-18 02:00:00+00:00,22.2,22.3,22.2,10.0,64.0,0.0,2.2 +2026-05-18 02:15:00+00:00,22.4,22.5,22.3,20.0,61.0,0.0,1.3 +2026-05-18 02:30:00+00:00,22.25,22.450000000000003,22.2,14.5,63.0,0.0,1.35 +2026-05-18 02:45:00+00:00,22.5,22.7,22.2,30.0,56.0,0.0,1.8 +2026-05-18 03:00:00+00:00,23.35,23.6,23.049999999999997,74.0,43.0,0.0,1.6 +2026-05-18 03:15:00+00:00,24.0,24.2,23.8,113.0,34.0,0.0,1.7 +2026-05-18 03:30:00+00:00,24.1,24.299999999999997,23.8,111.5,43.5,0.0,1.2000000000000002 +2026-05-18 03:45:00+00:00,23.6,23.8,23.4,163.0,56.0,0.0,0.0 +2026-05-18 04:00:00+00:00,24.25,24.450000000000003,24.05,196.0,49.5,0.0,0.44999999999999996 +2026-05-18 04:15:00+00:00,24.6,24.8,24.2,335.0,50.0,0.0,1.1 +2026-05-18 04:30:00+00:00,24.9,25.049999999999997,24.549999999999997,291.0,40.0,0.0,1.35 +2026-05-18 04:45:00+00:00,25.3,25.5,25.1,474.0,38.0,0.0,1.4 +2026-05-18 05:00:00+00:00,25.2,25.35,25.0,300.5,37.5,0.0,1.75 +2026-05-18 05:15:00+00:00,25.2,25.6,25.0,517.0,37.0,0.0,1.6 +2026-05-18 05:30:00+00:00,25.5,25.65,25.35,622.0,39.0,0.0,1.75 +2026-05-18 05:45:00+00:00,26.4,27.1,25.5,713.0,36.0,0.0,0.5 +2026-05-18 06:00:00+00:00,27.4,27.7,27.0,576.5,32.5,0.0,1.05 +2026-05-18 06:15:00+00:00,26.8,27.0,26.6,479.0,29.0,0.0,0.9 +2026-05-18 06:30:00+00:00,27.0,27.450000000000003,26.15,650.5,31.5,0.0,1.45 +2026-05-18 06:45:00+00:00,26.0,26.9,25.4,547.0,47.0,0.0,2.4 +2026-05-18 07:00:00+00:00,25.8,26.15,25.299999999999997,431.0,46.5,0.0,2.1500000000000004 +2026-05-18 07:15:00+00:00,25.5,25.9,25.1,463.0,48.0,0.0,2.4 +2026-05-18 07:30:00+00:00,26.6,26.950000000000003,25.950000000000003,480.5,33.0,0.0,1.4 +2026-05-18 07:45:00+00:00,27.7,27.9,27.4,769.0,23.0,0.0,1.2 +2026-05-18 08:00:00+00:00,28.2,28.450000000000003,27.95,890.0,20.5,0.0,1.8 +2026-05-18 08:15:00+00:00,28.9,29.4,28.5,960.0,20.0,0.0,1.5 +2026-05-18 08:30:00+00:00,28.8,29.299999999999997,28.5,963.5,20.5,0.0,2.15 +2026-05-18 08:45:00+00:00,28.3,29.0,27.2,984.0,28.0,0.0,2.3 +2026-05-18 09:00:00+00:00,27.85,28.1,27.45,981.5,27.0,0.0,2.0 +2026-05-18 09:15:00+00:00,27.8,28.3,27.5,945.0,26.0,0.0,1.8 +2026-05-18 09:30:00+00:00,27.950000000000003,28.45,27.35,968.0,27.0,0.0,2.8 +2026-05-18 09:45:00+00:00,28.0,28.3,27.6,961.0,27.0,0.0,2.4 +2026-05-18 10:00:00+00:00,27.85,28.299999999999997,27.55,907.5,31.0,0.0,2.75 +2026-05-18 10:15:00+00:00,26.8,27.3,26.7,839.0,34.0,0.0,3.7 +2026-05-18 10:30:00+00:00,26.85,27.1,26.65,864.0,36.5,0.0,3.25 +2026-05-18 10:45:00+00:00,27.1,27.3,26.6,814.0,35.0,0.0,3.2 +2026-05-18 11:00:00+00:00,26.200000000000003,26.700000000000003,25.85,527.0,40.0,0.0,3.0999999999999996 +2026-05-18 11:15:00+00:00,26.0,26.3,25.8,700.0,39.0,0.0,3.1 +2026-05-18 11:30:00+00:00,26.2,26.45,25.85,470.5,40.0,0.0,2.4 +2026-05-18 11:45:00+00:00,25.9,26.6,25.2,357.0,44.0,0.0,2.3 +2026-05-18 12:00:00+00:00,25.3,25.95,24.75,271.5,48.5,0.0,2.7 +2026-05-18 12:15:00+00:00,24.4,24.6,24.2,219.0,57.0,0.0,2.1 +2026-05-18 12:30:00+00:00,23.6,24.1,23.0,232.0,62.5,0.0,3.0 +2026-05-18 12:45:00+00:00,23.2,23.5,23.0,241.0,66.0,0.0,2.9 +2026-05-18 13:00:00+00:00,22.6,22.85,22.4,184.0,65.5,0.0,3.0 +2026-05-18 13:15:00+00:00,22.6,22.8,22.4,167.0,68.0,0.0,2.6 +2026-05-18 13:30:00+00:00,22.35,22.5,22.2,155.5,70.5,0.0,2.85 +2026-05-18 13:45:00+00:00,21.7,22.0,21.6,78.0,71.0,0.0,3.2 +2026-05-18 14:00:00+00:00,21.75,21.9,21.65,78.5,69.5,0.0,2.1500000000000004 +2026-05-18 14:15:00+00:00,21.5,22.1,21.2,69.0,72.0,0.0,1.5 +2026-05-18 14:30:00+00:00,21.4,21.5,21.35,51.5,72.0,0.0,2.5 +2026-05-18 14:45:00+00:00,21.2,21.3,21.1,33.0,74.0,0.0,3.0 +2026-05-18 15:00:00+00:00,21.05,21.200000000000003,20.9,14.5,75.5,0.0,2.2 +2026-05-18 15:15:00+00:00,20.9,21.1,20.7,2.0,77.0,0.0,2.2 +2026-05-18 15:30:00+00:00,20.700000000000003,20.8,20.65,0.0,78.5,0.0,1.95 +2026-05-18 15:45:00+00:00,20.6,20.8,20.5,0.0,81.0,0.0,2.1 +2026-05-18 16:00:00+00:00,20.55,20.55,20.45,0.0,80.5,0.0,1.4500000000000002 +2026-05-18 16:15:00+00:00,20.7,20.8,20.6,0.0,81.0,0.0,0.5 +2026-05-18 16:30:00+00:00,20.5,20.700000000000003,20.3,0.0,82.5,0.0,2.25 +2026-05-18 16:45:00+00:00,20.4,20.6,20.3,0.0,82.0,0.0,1.4 +2026-05-18 17:00:00+00:00,20.299999999999997,20.45,20.2,0.0,84.0,0.0,2.6 +2026-05-18 17:15:00+00:00,20.3,20.4,20.2,0.0,85.0,0.0,2.5 +2026-05-18 17:30:00+00:00,20.1,20.15,20.0,0.0,86.5,0.0,3.8 +2026-05-18 17:45:00+00:00,20.0,20.0,20.0,0.0,86.0,0.0,2.8 +2026-05-18 18:00:00+00:00,20.0,20.1,20.0,0.0,85.5,0.0,2.6500000000000004 +2026-05-18 18:15:00+00:00,20.0,20.1,19.8,0.0,86.0,0.0,1.3 +2026-05-18 18:30:00+00:00,19.85,19.95,19.75,0.0,85.5,0.0,1.9 +2026-05-18 18:45:00+00:00,19.7,19.8,19.6,0.0,87.0,0.0,1.4 +2026-05-18 19:00:00+00:00,19.55,19.6,19.45,0.0,86.0,0.0,1.25 +2026-05-18 19:15:00+00:00,19.5,19.5,19.4,0.0,86.0,0.0,1.8 +2026-05-18 19:30:00+00:00,19.6,19.65,19.5,0.0,86.5,0.0,1.95 +2026-05-18 19:45:00+00:00,19.5,19.6,19.5,0.0,89.0,0.0,2.9 +2026-05-18 20:00:00+00:00,19.4,19.45,19.3,0.0,87.5,0.0,4.05 +2026-05-18 20:15:00+00:00,19.3,19.5,19.2,0.0,87.0,0.0,5.2 +2026-05-18 20:30:00+00:00,19.25,19.35,19.2,0.0,85.5,0.0,3.75 +2026-05-18 20:45:00+00:00,19.2,19.3,19.1,0.0,85.0,0.0,3.1 +2026-05-18 21:00:00+00:00,19.2,19.3,19.15,0.0,85.5,0.0,2.6500000000000004 +2026-05-18 21:15:00+00:00,19.1,19.2,19.0,0.0,86.0,0.0,3.1 +2026-05-18 21:30:00+00:00,19.05,19.15,18.95,0.0,86.0,0.0,3.4000000000000004 +2026-05-18 21:45:00+00:00,19.0,19.1,19.0,0.0,87.0,0.0,4.6 +2026-05-18 22:00:00+00:00,18.95,19.05,18.95,0.0,88.0,0.0,4.7 +2026-05-18 22:15:00+00:00,18.8,19.0,18.7,0.0,89.0,0.0,4.9 +2026-05-18 22:30:00+00:00,18.85,18.95,18.75,0.0,86.5,0.0,5.15 +2026-05-18 22:45:00+00:00,18.8,18.9,18.7,0.0,87.0,0.0,4.9 +2026-05-18 23:00:00+00:00,18.8,18.85,18.7,0.0,87.5,0.0,4.85 +2026-05-18 23:15:00+00:00,18.6,18.8,18.6,0.0,90.0,0.0,4.0 +2026-05-18 23:30:00+00:00,18.45,18.55,18.4,0.0,90.0,0.0,4.55 +2026-05-18 23:45:00+00:00,18.4,18.5,18.3,0.0,90.0,0.0,4.4 +2026-05-19 00:00:00+00:00,18.35,18.4,18.25,0.0,89.5,0.0,2.55 +2026-05-19 00:15:00+00:00,18.3,18.4,18.2,0.0,90.0,0.0,0.7 +2026-05-19 00:30:00+00:00,18.4,18.45,18.35,0.0,90.0,0.0,2.3 +2026-05-19 00:45:00+00:00,18.4,18.5,18.3,0.0,89.0,0.0,3.4 +2026-05-19 01:00:00+00:00,18.5,18.5,18.35,0.0,88.5,0.0,3.0999999999999996 +2026-05-19 01:15:00+00:00,18.4,18.5,18.4,0.0,89.0,0.0,2.7 +2026-05-19 01:30:00+00:00,18.35,18.4,18.3,2.5,88.0,0.0,2.8 +2026-05-19 01:45:00+00:00,18.3,18.4,18.2,8.0,87.0,0.0,2.0 +2026-05-19 02:00:00+00:00,18.3,18.3,18.2,21.5,85.5,0.0,2.45 +2026-05-19 02:15:00+00:00,18.3,18.5,18.2,54.0,84.0,0.0,3.8 +2026-05-19 02:30:00+00:00,18.55,18.6,18.4,73.0,85.5,0.0,2.65 +2026-05-19 02:45:00+00:00,18.6,18.7,18.6,96.0,87.0,0.0,0.7 +2026-05-19 03:00:00+00:00,18.8,18.9,18.7,117.5,84.5,0.0,2.15 +2026-05-19 03:15:00+00:00,18.9,19.0,18.8,134.0,82.0,0.0,2.4 +2026-05-19 03:30:00+00:00,19.35,19.5,19.1,256.0,77.5,0.0,1.9 +2026-05-19 03:45:00+00:00,19.9,20.0,19.8,238.0,74.0,0.0,1.7 +2026-05-19 04:00:00+00:00,19.950000000000003,20.25,19.75,333.5,73.0,0.0,2.1 +2026-05-19 04:15:00+00:00,20.0,20.3,19.8,329.0,71.0,0.0,2.3 +2026-05-19 04:30:00+00:00,20.55,20.7,20.3,426.0,71.0,0.0,1.75 +2026-05-19 04:45:00+00:00,20.4,20.9,20.1,460.0,71.0,0.0,2.8 +2026-05-19 05:00:00+00:00,20.45,20.65,20.2,419.0,68.5,0.0,1.9 +2026-05-19 05:15:00+00:00,20.8,20.9,20.7,340.0,68.0,0.0,2.1 +2026-05-19 05:30:00+00:00,21.25,21.45,20.9,524.5,67.0,0.0,2.0 +2026-05-19 05:45:00+00:00,21.0,21.6,20.8,751.0,68.0,0.0,2.2 +2026-05-19 06:00:00+00:00,21.25,21.75,20.799999999999997,815.0,66.0,0.0,2.8 +2026-05-19 06:15:00+00:00,21.6,21.9,21.2,747.0,66.0,0.0,3.3 +2026-05-19 06:30:00+00:00,21.3,21.5,21.049999999999997,819.5,66.0,0.0,3.2 +2026-05-19 06:45:00+00:00,21.2,21.5,21.0,623.0,64.0,0.0,3.0 +2026-05-19 07:00:00+00:00,22.0,22.35,21.65,805.0,64.5,0.0,3.1 +2026-05-19 07:15:00+00:00,22.4,22.8,22.2,744.0,64.0,0.0,3.5 +2026-05-19 07:30:00+00:00,21.75,22.1,21.45,968.0,64.5,0.0,4.3 +2026-05-19 07:45:00+00:00,21.7,22.3,21.2,736.0,65.0,0.0,3.7 +2026-05-19 08:00:00+00:00,21.9,22.200000000000003,21.7,952.5,66.5,0.0,4.7 +2026-05-19 08:15:00+00:00,22.0,22.1,21.9,1040.0,65.0,0.0,3.9 +2026-05-19 08:30:00+00:00,22.1,22.25,21.9,1032.5,66.0,0.0,4.05 +2026-05-19 08:45:00+00:00,22.2,22.5,22.0,1044.0,62.0,0.0,4.9 +2026-05-19 09:00:00+00:00,22.200000000000003,22.450000000000003,22.0,1018.0,65.0,0.0,4.85 +2026-05-19 09:15:00+00:00,21.9,22.2,21.7,1066.0,67.0,0.0,4.1 +2026-05-19 09:30:00+00:00,21.9,22.2,21.6,759.5,65.5,0.0,4.449999999999999 +2026-05-19 09:45:00+00:00,22.0,22.4,21.4,1081.0,66.0,0.0,3.2 +2026-05-19 10:00:00+00:00,22.2,22.65,21.8,908.0,63.0,0.0,3.9000000000000004 +2026-05-19 10:15:00+00:00,21.7,21.9,21.5,969.0,64.0,0.0,6.3 +2026-05-19 10:30:00+00:00,22.0,22.4,21.700000000000003,887.5,63.0,0.0,5.6 +2026-05-19 10:45:00+00:00,22.4,22.6,22.1,919.0,61.0,0.0,4.9 +2026-05-19 11:00:00+00:00,22.0,22.15,21.85,861.5,61.5,0.0,5.2 +2026-05-19 11:15:00+00:00,22.2,22.5,21.8,835.0,61.0,0.0,4.6 +2026-05-19 11:30:00+00:00,22.85,23.15,22.549999999999997,798.0,57.0,0.0,3.75 +2026-05-19 11:45:00+00:00,22.9,23.1,22.7,734.0,55.0,0.0,4.4 +2026-05-19 12:00:00+00:00,22.2,22.549999999999997,21.95,719.5,59.0,0.0,4.85 +2026-05-19 12:15:00+00:00,21.7,21.9,21.6,675.0,63.0,0.0,5.3 +2026-05-19 12:30:00+00:00,22.1,22.299999999999997,21.799999999999997,582.5,63.0,0.0,3.5999999999999996 +2026-05-19 12:45:00+00:00,22.0,22.1,21.7,541.0,65.0,0.0,4.0 +2026-05-19 13:00:00+00:00,21.25,21.549999999999997,21.1,498.0,70.5,0.0,4.45 +2026-05-19 13:15:00+00:00,21.4,21.7,21.0,441.0,69.0,0.0,2.2 +2026-05-19 13:30:00+00:00,22.05,22.2,21.7,313.0,62.5,0.0,3.0999999999999996 +2026-05-19 13:45:00+00:00,21.5,21.7,21.1,312.0,67.0,0.0,2.9 +2026-05-19 14:00:00+00:00,20.7,20.950000000000003,20.450000000000003,238.0,73.5,0.0,4.1 +2026-05-19 14:15:00+00:00,20.2,20.5,19.9,202.0,77.0,0.0,3.3 +2026-05-19 14:30:00+00:00,19.95,20.1,19.799999999999997,105.0,79.0,0.0,2.6 +2026-05-19 14:45:00+00:00,19.8,19.9,19.7,59.0,80.0,0.0,3.2 +2026-05-19 15:00:00+00:00,19.6,19.700000000000003,19.5,31.0,81.0,0.0,3.55 +2026-05-19 15:15:00+00:00,19.4,19.4,19.3,16.0,82.0,0.0,3.8 +2026-05-19 15:30:00+00:00,19.25,19.35,19.15,3.5,82.5,0.0,3.3 +2026-05-19 15:45:00+00:00,19.0,19.1,19.0,0.0,83.0,0.0,2.3 +2026-05-19 16:00:00+00:00,18.95,19.0,18.9,0.0,85.0,0.0,2.15 +2026-05-19 16:15:00+00:00,18.9,18.9,18.8,0.0,85.0,0.0,2.3 +2026-05-19 16:30:00+00:00,18.7,18.75,18.6,0.0,86.0,0.0,3.0 +2026-05-19 16:45:00+00:00,18.6,18.7,18.6,0.0,86.0,0.0,2.8 +2026-05-19 17:00:00+00:00,18.6,18.65,18.55,0.0,86.0,0.0,1.8 +2026-05-19 17:15:00+00:00,18.6,18.6,18.5,0.0,85.0,0.0,0.8 +2026-05-19 17:30:00+00:00,18.6,18.6,18.55,0.0,86.0,0.0,0.7 +2026-05-19 17:45:00+00:00,18.5,18.5,18.4,0.0,86.0,0.0,1.0 +2026-05-19 18:00:00+00:00,18.45,18.5,18.4,0.0,87.0,0.0,1.8 +2026-05-19 18:15:00+00:00,18.5,18.5,18.4,0.0,87.0,0.0,2.1 +2026-05-19 18:30:00+00:00,18.45,18.5,18.4,0.0,87.0,0.0,1.9500000000000002 +2026-05-19 18:45:00+00:00,18.4,18.5,18.4,0.0,87.0,0.0,1.1 +2026-05-19 19:00:00+00:00,18.45,18.5,18.35,0.0,86.5,0.0,0.8500000000000001 +2026-05-19 19:15:00+00:00,18.3,18.4,18.2,0.0,87.0,0.0,0.7 +2026-05-19 19:30:00+00:00,18.049999999999997,18.15,17.95,0.0,87.0,0.0,0.65 +2026-05-19 19:45:00+00:00,18.0,18.0,18.0,0.0,88.0,0.0,0.6 +2026-05-19 20:00:00+00:00,18.05,18.2,18.0,0.0,87.5,0.0,0.4 +2026-05-19 20:15:00+00:00,18.0,18.1,17.9,0.0,88.0,0.0,0.7 +2026-05-19 20:30:00+00:00,17.95,18.1,17.85,0.0,88.0,0.0,0.6000000000000001 +2026-05-19 20:45:00+00:00,18.2,18.2,18.1,0.0,87.0,0.0,1.4 +2026-05-19 21:00:00+00:00,18.2,18.3,18.15,0.0,87.0,0.0,1.2000000000000002 +2026-05-19 21:15:00+00:00,18.2,18.3,18.2,0.0,88.0,0.0,1.2 +2026-05-19 21:30:00+00:00,18.299999999999997,18.35,18.25,0.0,87.0,0.0,2.0 +2026-05-19 21:45:00+00:00,18.4,18.5,18.3,0.0,86.0,0.0,4.9 +2026-05-19 22:00:00+00:00,18.45,18.5,18.4,0.0,86.5,0.0,4.85 +2026-05-19 22:15:00+00:00,18.5,18.5,18.4,0.0,87.0,0.0,4.2 +2026-05-19 22:30:00+00:00,18.45,18.5,18.4,0.0,87.0,0.0,4.15 +2026-05-19 22:45:00+00:00,18.5,18.5,18.4,0.0,87.0,0.0,2.5 +2026-05-19 23:00:00+00:00,18.3,18.4,18.2,0.0,86.0,0.0,1.5499999999999998 +2026-05-19 23:15:00+00:00,18.2,18.3,18.2,0.0,87.0,0.0,2.2 +2026-05-19 23:30:00+00:00,18.3,18.35,18.2,0.0,86.0,0.0,0.85 +2026-05-19 23:45:00+00:00,18.4,18.5,18.3,0.0,86.0,0.0,1.4 +2026-05-20 00:00:00+00:00,18.5,18.6,18.45,0.0,87.0,0.0,2.2 +2026-05-20 00:15:00+00:00,18.6,18.6,18.5,0.0,88.0,0.0,2.7 +2026-05-20 00:30:00+00:00,18.55,18.6,18.45,0.0,86.0,0.0,1.85 +2026-05-20 00:45:00+00:00,18.4,18.5,18.3,0.0,87.0,0.0,1.0 +2026-05-20 01:00:00+00:00,18.4,18.5,18.35,0.0,87.5,0.0,1.75 +2026-05-20 01:15:00+00:00,18.4,18.5,18.4,0.0,88.0,0.0,0.8 +2026-05-20 01:30:00+00:00,18.35,18.45,18.35,0.0,89.0,0.0,0.65 +2026-05-20 01:45:00+00:00,18.3,18.3,18.2,5.0,89.0,0.0,1.3 +2026-05-20 02:00:00+00:00,18.2,18.25,18.15,27.5,88.5,0.0,1.05 +2026-05-20 02:15:00+00:00,18.3,18.4,18.2,68.0,88.0,0.0,1.2 +2026-05-20 02:30:00+00:00,18.5,18.6,18.35,108.0,86.5,0.0,1.3 +2026-05-20 02:45:00+00:00,18.8,18.9,18.7,154.0,85.0,0.0,2.0 +2026-05-20 03:00:00+00:00,19.25,19.45,19.049999999999997,201.5,83.5,0.0,1.35 +2026-05-20 03:15:00+00:00,19.8,20.0,19.6,236.0,81.0,0.0,1.4 +2026-05-20 03:30:00+00:00,19.549999999999997,19.75,19.35,184.0,83.0,0.0,2.85 +2026-05-20 03:45:00+00:00,19.3,19.4,19.2,208.0,84.0,0.0,5.8 +2026-05-20 04:00:00+00:00,19.25,19.35,19.1,180.5,82.5,0.0,2.7 +2026-05-20 04:15:00+00:00,19.5,19.7,19.3,264.0,82.0,0.0,1.4 +2026-05-20 04:30:00+00:00,19.85,20.0,19.65,165.0,81.0,0.0,3.6500000000000004 +2026-05-20 04:45:00+00:00,19.9,20.3,19.6,481.0,81.0,0.0,3.4 +2026-05-20 05:00:00+00:00,20.15,20.35,20.0,317.5,79.0,0.0,5.25 +2026-05-20 05:15:00+00:00,20.1,20.2,20.0,197.0,80.0,0.0,4.9 +2026-05-20 05:30:00+00:00,20.05,20.1,20.0,238.0,78.0,0.0,4.6 +2026-05-20 05:45:00+00:00,20.1,20.2,20.1,242.0,79.0,0.0,4.5 +2026-05-20 06:00:00+00:00,20.15,20.4,20.0,511.5,76.5,0.0,4.75 +2026-05-20 06:15:00+00:00,21.1,21.3,20.7,804.0,62.0,0.0,4.2 +2026-05-20 06:30:00+00:00,21.299999999999997,21.5,21.15,962.5,59.5,0.0,5.5 +2026-05-20 06:45:00+00:00,21.7,22.0,21.3,934.0,62.0,0.0,3.9 +2026-05-20 07:00:00+00:00,21.799999999999997,22.15,21.35,940.5,59.5,0.0,4.55 +2026-05-20 07:15:00+00:00,21.7,22.1,21.4,960.0,62.0,0.0,4.3 +2026-05-20 07:30:00+00:00,21.6,21.75,21.45,819.5,63.0,0.0,4.55 +2026-05-20 07:45:00+00:00,21.3,21.7,21.1,711.0,63.0,0.0,5.2 +2026-05-20 08:00:00+00:00,21.2,21.35,20.9,793.5,65.5,0.0,4.95 +2026-05-20 08:15:00+00:00,21.3,21.5,21.0,834.0,67.0,0.0,4.8 +2026-05-20 08:30:00+00:00,21.65,21.85,21.35,764.5,64.0,0.0,4.95 +2026-05-20 08:45:00+00:00,21.5,21.7,21.3,711.0,65.0,0.0,5.3 +2026-05-20 09:00:00+00:00,21.35,21.6,21.15,659.0,67.0,0.0,4.45 +2026-05-20 09:15:00+00:00,21.4,21.6,21.1,576.0,68.0,0.0,4.0 +2026-05-20 09:30:00+00:00,21.049999999999997,21.45,20.75,482.0,69.0,0.0,5.0 +2026-05-20 09:45:00+00:00,20.7,20.8,20.5,323.0,74.0,0.0,3.7 +2026-05-20 10:00:00+00:00,20.95,21.25,20.6,320.5,75.5,0.0,4.699999999999999 +2026-05-20 10:15:00+00:00,20.3,20.5,20.2,401.0,77.0,0.0,6.0 +2026-05-20 10:30:00+00:00,20.6,20.9,20.35,762.0,72.5,0.0,5.3 +2026-05-20 10:45:00+00:00,20.9,21.1,20.7,988.0,65.0,0.0,5.3 +2026-05-20 11:00:00+00:00,20.95,21.5,20.7,793.0,65.0,0.0,5.5 +2026-05-20 11:15:00+00:00,20.6,20.9,20.3,463.0,67.0,0.0,4.9 +2026-05-20 11:30:00+00:00,20.65,20.85,20.35,520.5,67.0,0.0,5.35 +2026-05-20 11:45:00+00:00,20.2,20.6,19.9,504.0,68.0,0.0,6.2 +2026-05-20 12:00:00+00:00,20.35,20.5,20.15,555.0,67.0,0.0,6.2 +2026-05-20 12:15:00+00:00,20.2,20.7,19.9,412.0,67.0,0.0,5.9 +2026-05-20 12:30:00+00:00,20.1,20.25,19.95,345.5,69.0,0.0,5.15 +2026-05-20 12:45:00+00:00,20.0,20.3,19.7,252.0,66.0,0.0,5.7 +2026-05-20 13:00:00+00:00,19.85,20.25,19.5,324.5,66.5,0.0,4.6 +2026-05-20 13:15:00+00:00,20.1,20.4,19.9,385.0,63.0,0.0,5.2 +2026-05-20 13:30:00+00:00,19.549999999999997,19.85,19.4,187.5,65.0,0.0,5.5 +2026-05-20 13:45:00+00:00,19.3,19.5,19.1,299.0,66.0,0.0,6.1 +2026-05-20 14:00:00+00:00,19.55,19.7,19.4,143.0,62.5,0.0,4.9 +2026-05-20 14:15:00+00:00,19.3,19.4,19.2,89.0,66.0,0.0,5.4 +2026-05-20 14:30:00+00:00,19.2,19.3,19.15,133.5,66.0,0.0,5.85 +2026-05-20 14:45:00+00:00,19.0,19.2,18.8,33.0,65.0,0.0,5.1 +2026-05-20 15:00:00+00:00,18.85,18.9,18.85,26.0,68.5,0.0,3.5 +2026-05-20 15:15:00+00:00,18.9,18.9,18.8,7.0,69.0,0.0,3.3 +2026-05-20 15:30:00+00:00,18.75,18.8,18.65,2.0,71.0,0.0,3.6999999999999997 +2026-05-20 15:45:00+00:00,18.7,18.9,18.6,0.0,72.0,0.0,4.9 +2026-05-20 16:00:00+00:00,18.7,18.75,18.6,0.0,73.5,0.0,3.45 +2026-05-20 16:15:00+00:00,18.5,18.7,18.5,0.0,74.0,0.0,4.8 +2026-05-20 16:30:00+00:00,18.5,18.5,18.4,0.0,75.0,0.0,4.05 +2026-05-20 16:45:00+00:00,18.5,18.5,18.4,0.0,75.0,0.0,4.4 +2026-05-20 17:00:00+00:00,18.55,18.55,18.45,0.0,75.5,0.0,4.35 +2026-05-20 17:15:00+00:00,18.6,18.6,18.5,0.0,76.0,0.0,3.6 +2026-05-20 17:30:00+00:00,18.5,18.55,18.4,0.0,75.0,0.0,3.8 +2026-05-20 17:45:00+00:00,18.3,18.4,18.2,0.0,76.0,0.0,3.0 +2026-05-20 18:00:00+00:00,18.35,18.4,18.25,0.0,76.5,0.0,3.95 +2026-05-20 18:15:00+00:00,18.4,18.5,18.4,0.0,76.0,0.0,4.1 +2026-05-20 18:30:00+00:00,18.4,18.5,18.35,0.0,76.0,0.0,3.4000000000000004 +2026-05-20 18:45:00+00:00,18.4,18.4,18.3,0.0,76.0,0.0,2.4 +2026-05-20 19:00:00+00:00,18.200000000000003,18.35,18.15,0.0,77.5,0.0,3.5999999999999996 +2026-05-20 19:15:00+00:00,18.0,18.1,17.9,0.0,78.0,0.0,3.1 +2026-05-20 19:30:00+00:00,17.95,18.0,17.9,0.0,78.5,0.0,2.5999999999999996 +2026-05-20 19:45:00+00:00,18.0,18.0,17.9,0.0,78.0,0.0,2.5 +2026-05-20 20:00:00+00:00,18.0,18.0,18.0,0.0,77.5,0.0,3.05 +2026-05-20 20:15:00+00:00,18.0,18.1,18.0,0.0,79.0,0.0,4.0 +2026-05-20 20:30:00+00:00,18.05,18.15,18.05,0.0,79.0,0.0,3.4000000000000004 +2026-05-20 20:45:00+00:00,18.1,18.2,18.0,0.0,78.0,0.0,4.9 +2026-05-20 21:00:00+00:00,18.05,18.15,18.05,0.0,78.0,0.0,3.9 +2026-05-20 21:15:00+00:00,18.0,18.0,17.9,0.0,80.0,0.0,3.8 +2026-05-20 21:30:00+00:00,17.9,17.95,17.8,0.0,81.0,0.0,3.6 +2026-05-20 21:45:00+00:00,17.9,18.0,17.8,0.0,82.0,0.0,3.2 +2026-05-20 22:00:00+00:00,17.9,17.95,17.8,0.0,80.0,0.0,4.4 +2026-05-20 22:15:00+00:00,17.9,18.0,17.8,0.0,81.0,0.0,3.0 +2026-05-20 22:30:00+00:00,17.9,17.95,17.85,0.0,79.5,0.0,2.95 +2026-05-20 22:45:00+00:00,18.0,18.0,17.9,0.0,79.0,0.0,3.2 +2026-05-20 23:00:00+00:00,17.9,18.0,17.9,0.0,77.0,0.0,3.25 +2026-05-20 23:15:00+00:00,17.9,18.0,17.9,0.0,77.0,0.0,3.3 +2026-05-20 23:30:00+00:00,17.9,18.0,17.85,0.0,77.0,0.0,4.4 +2026-05-20 23:45:00+00:00,17.9,18.0,17.9,0.0,80.0,0.0,3.2 +2026-05-21 00:00:00+00:00,17.85,17.95,17.75,0.0,81.0,0.1,2.85 +2026-05-21 00:15:00+00:00,17.3,17.6,17.2,0.0,87.0,0.2,3.9 +2026-05-21 00:30:00+00:00,17.15,17.25,17.15,0.0,88.5,0.0,3.55 +2026-05-21 00:45:00+00:00,17.1,17.2,17.1,0.0,85.0,0.0,3.8 +2026-05-21 01:00:00+00:00,17.15,17.25,17.1,0.0,84.5,0.0,2.95 +2026-05-21 01:15:00+00:00,17.2,17.2,17.1,0.0,84.0,0.0,2.6 +2026-05-21 01:30:00+00:00,17.25,17.3,17.2,0.5,83.0,0.0,2.3 +2026-05-21 01:45:00+00:00,17.4,17.5,17.3,4.0,82.0,0.0,3.4 +2026-05-21 02:00:00+00:00,17.5,17.55,17.4,24.5,80.0,0.0,4.1 +2026-05-21 02:15:00+00:00,17.6,17.8,17.5,108.0,79.0,0.0,3.4 +2026-05-21 02:30:00+00:00,18.0,18.1,17.85,178.0,79.0,0.0,3.6500000000000004 +2026-05-21 02:45:00+00:00,18.2,18.3,18.1,215.0,78.0,0.0,4.1 +2026-05-21 03:00:00+00:00,18.299999999999997,18.4,18.15,247.5,78.0,0.0,4.6 +2026-05-21 03:15:00+00:00,18.3,18.4,18.2,204.0,78.0,0.0,3.6 +2026-05-21 03:30:00+00:00,18.15,18.25,18.05,79.0,78.5,0.0,4.35 +2026-05-21 03:45:00+00:00,18.2,18.3,18.0,148.0,78.0,0.0,4.0 +2026-05-21 04:00:00+00:00,18.3,18.45,18.25,153.5,78.0,0.0,4.15 +2026-05-21 04:15:00+00:00,18.7,18.9,18.4,365.0,76.0,0.0,4.4 +2026-05-21 04:30:00+00:00,18.5,18.65,18.35,197.0,79.0,0.0,4.1 +2026-05-21 04:45:00+00:00,18.6,18.7,18.5,152.0,77.0,0.0,3.6 +2026-05-21 05:00:00+00:00,18.700000000000003,18.799999999999997,18.55,221.5,77.0,0.0,3.8 +2026-05-21 05:15:00+00:00,18.7,18.8,18.6,200.0,78.0,0.0,4.5 +2026-05-21 05:30:00+00:00,18.799999999999997,19.0,18.7,238.0,77.0,0.0,3.85 +2026-05-21 05:45:00+00:00,18.9,19.2,18.7,111.0,78.0,0.0,4.1 +2026-05-21 06:00:00+00:00,18.8,18.9,18.7,185.5,80.0,0.0,4.35 +2026-05-21 06:15:00+00:00,18.8,19.2,18.6,490.0,78.0,0.0,4.6 +2026-05-21 06:30:00+00:00,19.5,19.65,19.25,830.0,73.0,0.0,4.15 +2026-05-21 06:45:00+00:00,20.0,20.2,19.8,769.0,70.0,0.0,5.3 +2026-05-21 07:00:00+00:00,19.9,20.1,19.75,766.5,72.0,0.0,4.55 +2026-05-21 07:15:00+00:00,19.9,20.3,19.7,470.0,71.0,0.0,5.4 +2026-05-21 07:30:00+00:00,19.9,20.15,19.65,555.0,73.0,0.0,4.85 +2026-05-21 07:45:00+00:00,19.5,19.8,19.4,340.0,75.0,0.0,4.8 +2026-05-21 08:00:00+00:00,19.35,19.549999999999997,19.15,347.0,75.0,0.0,5.15 +2026-05-21 08:15:00+00:00,19.9,20.0,19.7,707.0,71.0,0.0,4.9 +2026-05-21 08:30:00+00:00,20.0,20.2,19.85,725.5,70.0,0.0,5.300000000000001 +2026-05-21 08:45:00+00:00,20.3,20.5,20.1,801.0,69.0,0.0,4.9 +2026-05-21 09:00:00+00:00,20.0,20.25,19.75,457.5,72.0,0.0,5.15 +2026-05-21 09:15:00+00:00,20.2,20.5,19.7,550.0,72.0,0.0,4.5 +2026-05-21 09:30:00+00:00,20.2,20.4,20.0,615.0,70.0,0.0,5.4 +2026-05-21 09:45:00+00:00,20.2,20.4,20.0,389.0,72.0,0.0,4.9 +2026-05-21 10:00:00+00:00,20.0,20.35,19.799999999999997,617.5,72.0,0.0,5.8 +2026-05-21 10:15:00+00:00,20.2,20.3,19.9,702.0,73.0,0.0,5.1 +2026-05-21 10:30:00+00:00,20.0,20.15,19.9,253.0,74.5,0.0,4.2 +2026-05-21 10:45:00+00:00,20.1,20.2,19.9,442.0,74.0,0.0,4.7 +2026-05-21 11:00:00+00:00,20.200000000000003,20.45,20.0,448.5,73.5,0.0,4.85 +2026-05-21 11:15:00+00:00,19.8,20.1,19.7,354.0,75.0,0.0,4.7 +2026-05-21 11:30:00+00:00,19.6,19.75,19.45,310.0,76.5,0.0,5.0 +2026-05-21 11:45:00+00:00,19.8,19.9,19.7,248.0,77.0,0.0,4.5 +2026-05-21 12:00:00+00:00,19.65,19.799999999999997,19.55,292.5,76.5,0.0,4.45 +2026-05-21 12:15:00+00:00,19.7,19.8,19.5,290.0,76.0,0.0,4.8 +2026-05-21 12:30:00+00:00,19.5,19.65,19.35,293.5,77.0,0.0,5.55 +2026-05-21 12:45:00+00:00,19.8,19.9,19.6,217.0,76.0,0.0,3.6 +2026-05-21 13:00:00+00:00,19.5,19.65,19.35,153.0,79.0,0.0,4.800000000000001 +2026-05-21 13:15:00+00:00,19.3,19.4,19.2,171.0,80.0,0.0,5.5 +2026-05-21 13:30:00+00:00,19.3,19.4,19.25,145.5,79.0,0.0,4.75 +2026-05-21 13:45:00+00:00,19.3,19.4,19.2,110.0,80.0,0.0,4.7 +2026-05-21 14:00:00+00:00,19.3,19.4,19.25,97.5,80.0,0.0,3.8 +2026-05-21 14:15:00+00:00,19.2,19.3,19.1,89.0,81.0,0.0,3.9 +2026-05-21 14:30:00+00:00,19.1,19.15,19.05,57.0,81.5,0.0,3.8499999999999996 +2026-05-21 14:45:00+00:00,19.0,19.1,18.9,64.0,82.0,0.0,3.2 +2026-05-21 15:00:00+00:00,19.0,19.05,18.9,26.0,82.5,0.0,3.3 +2026-05-21 15:15:00+00:00,18.9,18.9,18.8,13.0,83.0,0.0,3.1 +2026-05-21 15:30:00+00:00,18.799999999999997,18.9,18.700000000000003,5.0,83.5,0.0,3.8499999999999996 +2026-05-21 15:45:00+00:00,18.7,18.8,18.6,0.0,84.0,0.0,3.4 +2026-05-21 16:00:00+00:00,18.7,18.7,18.6,0.0,84.5,0.0,2.5999999999999996 +2026-05-21 16:15:00+00:00,18.6,18.7,18.5,0.0,85.0,0.0,3.1 +2026-05-21 16:30:00+00:00,18.5,18.6,18.45,0.0,85.0,0.0,2.5999999999999996 +2026-05-21 16:45:00+00:00,18.5,18.5,18.4,0.0,85.0,0.0,2.4 +2026-05-21 17:00:00+00:00,18.4,18.45,18.35,0.0,85.5,0.0,1.6 +2026-05-21 17:15:00+00:00,18.4,18.4,18.3,0.0,86.0,0.0,1.5 +2026-05-21 17:30:00+00:00,18.4,18.5,18.3,0.0,85.5,0.0,1.9000000000000001 +2026-05-21 17:45:00+00:00,18.4,18.5,18.3,0.0,85.0,0.0,1.4 +2026-05-21 18:00:00+00:00,18.35,18.45,18.25,0.0,85.0,0.0,1.65 +2026-05-21 18:15:00+00:00,18.3,18.4,18.2,0.0,86.0,0.0,2.1 +2026-05-21 18:30:00+00:00,18.25,18.35,18.2,0.0,86.5,0.0,3.3 +2026-05-21 18:45:00+00:00,18.2,18.2,18.1,0.0,87.0,0.0,3.9 +2026-05-21 19:00:00+00:00,18.2,18.2,18.1,0.0,87.0,0.0,3.1 +2026-05-21 19:15:00+00:00,18.1,18.2,18.0,0.0,87.0,0.0,2.6 +2026-05-21 19:30:00+00:00,18.1,18.15,18.0,0.0,87.0,0.0,1.2000000000000002 +2026-05-21 19:45:00+00:00,18.1,18.2,18.1,0.0,86.0,0.0,1.1 +2026-05-21 20:00:00+00:00,18.2,18.25,18.1,0.0,86.0,0.0,1.05 +2026-05-21 20:15:00+00:00,18.1,18.2,18.1,0.0,86.0,0.0,0.6 +2026-05-21 20:30:00+00:00,18.15,18.2,18.1,0.0,86.5,0.0,0.55 +2026-05-21 20:45:00+00:00,18.1,18.2,18.1,0.0,87.0,0.0,0.8 +2026-05-21 21:00:00+00:00,18.2,18.2,18.1,0.0,87.0,0.0,0.8500000000000001 +2026-05-21 21:15:00+00:00,18.2,18.2,18.1,0.0,87.0,0.0,1.0 +2026-05-21 21:30:00+00:00,18.05,18.15,18.0,0.0,87.0,0.0,1.1 +2026-05-21 21:45:00+00:00,18.0,18.1,17.9,0.0,87.0,0.0,0.8 +2026-05-21 22:00:00+00:00,17.95,18.0,17.85,0.0,87.5,0.0,0.8500000000000001 +2026-05-21 22:15:00+00:00,17.9,18.0,17.9,0.0,88.0,0.0,1.4 +2026-05-21 22:30:00+00:00,17.9,17.95,17.85,0.0,88.0,0.0,1.85 +2026-05-21 22:45:00+00:00,17.9,17.9,17.8,0.0,87.0,0.0,2.1 +2026-05-21 23:00:00+00:00,17.9,17.95,17.85,0.0,87.0,0.0,2.5999999999999996 +2026-05-21 23:15:00+00:00,17.9,17.9,17.8,0.0,87.0,0.0,3.1 +2026-05-21 23:30:00+00:00,17.75,17.85,17.7,0.0,87.0,0.0,2.9000000000000004 +2026-05-21 23:45:00+00:00,17.7,17.7,17.6,0.0,87.0,0.0,2.6 +2026-05-22 00:00:00+00:00,17.55,17.6,17.5,0.0,88.0,0.0,2.25 +2026-05-22 00:15:00+00:00,17.6,17.6,17.5,0.0,88.0,0.0,2.4 +2026-05-22 00:30:00+00:00,17.5,17.55,17.4,0.0,88.0,0.0,2.8 +2026-05-22 00:45:00+00:00,17.4,17.5,17.4,0.0,89.0,0.0,3.3 +2026-05-22 01:00:00+00:00,17.4,17.5,17.3,0.0,88.5,0.0,3.0999999999999996 +2026-05-22 01:15:00+00:00,17.6,17.6,17.5,0.0,88.0,0.0,1.8 +2026-05-22 01:30:00+00:00,17.55,17.6,17.5,0.5,88.0,0.0,2.7 +2026-05-22 01:45:00+00:00,17.6,17.7,17.5,8.0,86.0,0.0,3.3 +2026-05-22 02:00:00+00:00,17.55,17.65,17.5,23.0,87.0,0.0,2.25 +2026-05-22 02:15:00+00:00,17.6,17.6,17.5,70.0,87.0,0.0,3.0 +2026-05-22 02:30:00+00:00,17.700000000000003,17.799999999999997,17.6,77.5,86.5,0.0,1.35 +2026-05-22 02:45:00+00:00,17.8,17.8,17.7,113.0,86.0,0.0,1.3 +2026-05-22 03:00:00+00:00,18.3,18.450000000000003,18.05,269.0,84.5,0.0,1.75 +2026-05-22 03:15:00+00:00,18.6,18.7,18.6,237.0,82.0,0.0,1.8 +2026-05-22 03:30:00+00:00,18.7,18.8,18.65,240.0,82.0,0.0,2.05 +2026-05-22 03:45:00+00:00,18.7,18.8,18.6,349.0,82.0,0.0,2.0 +2026-05-22 04:00:00+00:00,19.05,19.15,18.85,450.0,79.5,0.0,2.65 +2026-05-22 04:15:00+00:00,19.3,19.4,19.2,499.0,78.0,0.0,3.3 +2026-05-22 04:30:00+00:00,19.6,19.85,19.35,555.0,75.5,0.0,2.1 +2026-05-22 04:45:00+00:00,20.1,20.4,19.8,685.0,74.0,0.0,1.7 +2026-05-22 05:00:00+00:00,20.5,20.75,20.3,503.5,69.5,0.0,1.55 +2026-05-22 05:15:00+00:00,20.9,21.0,20.6,609.0,65.0,0.0,2.9 +2026-05-22 05:30:00+00:00,21.2,21.35,20.9,648.0,62.5,0.0,2.5 +2026-05-22 05:45:00+00:00,21.5,21.7,21.2,541.0,61.0,0.0,4.0 +2026-05-22 06:00:00+00:00,21.35,21.6,21.15,810.5,64.5,0.0,3.45 +2026-05-22 06:15:00+00:00,21.4,21.6,21.2,682.0,66.0,0.0,3.2 +2026-05-22 06:30:00+00:00,21.5,21.8,21.1,681.0,65.0,0.0,3.9 +2026-05-22 06:45:00+00:00,21.2,21.4,21.0,395.0,67.0,0.0,4.1 +2026-05-22 07:00:00+00:00,21.549999999999997,21.8,21.299999999999997,830.5,67.0,0.0,3.9 +2026-05-22 07:15:00+00:00,21.8,22.2,21.4,983.0,68.0,0.0,4.3 +2026-05-22 07:30:00+00:00,21.049999999999997,21.35,20.9,795.5,71.0,0.0,5.35 +2026-05-22 07:45:00+00:00,21.1,21.4,20.7,814.0,69.0,0.0,4.4 +2026-05-22 08:00:00+00:00,21.15,21.45,20.9,987.5,68.5,0.0,5.2 +2026-05-22 08:15:00+00:00,21.5,21.9,21.1,978.0,67.0,0.0,4.2 +2026-05-22 08:30:00+00:00,21.3,21.7,20.8,915.0,70.0,0.0,4.15 +2026-05-22 08:45:00+00:00,21.1,21.8,20.8,760.0,71.0,0.0,4.9 +2026-05-22 09:00:00+00:00,21.200000000000003,21.4,20.9,900.0,70.5,0.0,4.8 +2026-05-22 09:15:00+00:00,21.2,21.3,21.0,1005.0,70.0,0.0,4.6 +2026-05-22 09:30:00+00:00,21.35,21.7,21.05,1029.5,68.5,0.0,5.9 +2026-05-22 09:45:00+00:00,21.3,21.5,21.1,1024.0,69.0,0.0,6.4 +2026-05-22 10:00:00+00:00,21.2,21.35,21.05,994.5,68.0,0.0,6.949999999999999 +2026-05-22 10:15:00+00:00,21.4,21.8,21.1,972.0,67.0,0.0,6.1 +2026-05-22 10:30:00+00:00,21.3,21.65,21.15,952.0,70.0,0.0,6.55 +2026-05-22 10:45:00+00:00,21.3,21.5,21.2,923.0,70.0,0.0,6.0 +2026-05-22 11:00:00+00:00,21.3,21.5,21.0,890.0,71.0,0.0,6.4 +2026-05-22 11:15:00+00:00,21.0,21.1,20.8,836.0,71.0,0.0,6.6 +2026-05-22 11:30:00+00:00,20.950000000000003,21.15,20.75,813.0,70.5,0.0,6.85 +2026-05-22 11:45:00+00:00,20.8,20.9,20.7,728.0,70.0,0.0,6.7 +2026-05-22 12:00:00+00:00,20.7,20.85,20.55,680.0,69.5,0.0,6.65 +2026-05-22 12:15:00+00:00,20.7,21.0,20.5,669.0,70.0,0.0,5.5 +2026-05-22 12:30:00+00:00,20.7,20.8,20.6,612.5,68.0,0.0,5.65 +2026-05-22 12:45:00+00:00,20.7,20.8,20.4,552.0,68.0,0.0,5.5 +2026-05-22 13:00:00+00:00,20.45,20.55,20.3,495.0,72.0,0.0,5.449999999999999 +2026-05-22 13:15:00+00:00,20.4,20.6,20.2,442.0,70.0,0.0,4.4 +2026-05-22 13:30:00+00:00,20.65,20.75,20.55,378.5,70.0,0.0,3.45 +2026-05-22 13:45:00+00:00,20.7,20.8,20.5,320.0,71.0,0.0,3.1 +2026-05-22 14:00:00+00:00,20.5,20.700000000000003,20.35,234.0,72.0,0.0,2.75 +2026-05-22 14:15:00+00:00,20.0,20.1,19.9,110.0,75.0,0.0,3.0 +2026-05-22 14:30:00+00:00,19.95,20.0,19.85,94.0,75.0,0.0,2.25 +2026-05-22 14:45:00+00:00,19.8,19.8,19.7,55.0,76.0,0.0,1.4 +2026-05-22 15:00:00+00:00,19.5,19.65,19.4,34.0,77.5,0.0,1.7000000000000002 +2026-05-22 15:15:00+00:00,19.4,19.5,19.2,12.0,77.0,0.0,1.6 +2026-05-22 15:30:00+00:00,19.15,19.15,19.0,3.5,79.0,0.0,1.7999999999999998 +2026-05-22 15:45:00+00:00,18.9,19.0,18.8,0.0,80.0,0.0,1.8 +2026-05-22 16:00:00+00:00,18.75,18.85,18.7,0.0,81.5,0.0,1.4500000000000002 +2026-05-22 16:15:00+00:00,18.6,18.7,18.5,0.0,83.0,0.0,0.2 +2026-05-22 16:30:00+00:00,18.299999999999997,18.45,18.200000000000003,0.0,83.5,0.0,1.0 +2026-05-22 16:45:00+00:00,18.0,18.1,18.0,0.0,84.0,0.0,1.0 +2026-05-22 17:00:00+00:00,17.799999999999997,17.9,17.75,0.0,85.5,0.0,1.05 +2026-05-22 17:15:00+00:00,17.7,17.8,17.7,0.0,87.0,0.0,1.8 +2026-05-22 17:30:00+00:00,17.75,17.8,17.7,0.0,87.0,0.0,1.7 +2026-05-22 17:45:00+00:00,17.8,17.9,17.8,0.0,87.0,0.0,1.8 +2026-05-22 18:00:00+00:00,17.75,17.799999999999997,17.65,0.0,87.0,0.0,1.25 +2026-05-22 18:15:00+00:00,17.7,17.7,17.7,0.0,87.0,0.0,1.3 +2026-05-22 18:30:00+00:00,17.85,17.9,17.799999999999997,0.0,87.0,0.0,1.35 +2026-05-22 18:45:00+00:00,17.9,17.9,17.8,0.0,87.0,0.0,1.0 +2026-05-22 19:00:00+00:00,17.75,17.85,17.700000000000003,0.0,87.0,0.0,0.7 +2026-05-22 19:15:00+00:00,17.6,17.7,17.6,0.0,88.0,0.0,0.9 +2026-05-22 19:30:00+00:00,17.700000000000003,17.75,17.6,0.0,87.5,0.0,0.8 +2026-05-22 19:45:00+00:00,17.8,17.9,17.8,0.0,87.0,0.0,0.8 +2026-05-22 20:00:00+00:00,17.8,17.85,17.75,0.0,87.0,0.0,0.75 +2026-05-22 20:15:00+00:00,17.8,17.8,17.7,0.0,88.0,0.0,1.1 +2026-05-22 20:30:00+00:00,17.8,17.85,17.75,0.0,88.0,0.0,1.35 +2026-05-22 20:45:00+00:00,17.7,17.8,17.7,0.0,88.0,0.0,1.5 +2026-05-22 21:00:00+00:00,17.65,17.75,17.6,0.0,89.0,, +2026-05-22 21:15:00+00:00,17.3,17.5,17.2,0.0,89.0,, +2026-05-22 21:30:00+00:00,17.0,17.15,16.9,0.0,90.5,, +2026-05-22 21:45:00+00:00,16.9,16.9,16.8,0.0,91.0,, +2026-05-22 22:00:00+00:00,16.75,16.799999999999997,16.65,0.0,91.5,, +2026-05-22 22:15:00+00:00,16.8,16.8,16.7,0.0,92.0,, +2026-05-22 22:30:00+00:00,16.7,16.8,16.65,0.0,92.0,, +2026-05-22 22:45:00+00:00,16.9,16.9,16.8,0.0,91.0,, +2026-05-22 23:00:00+00:00,16.700000000000003,16.85,16.65,0.0,91.0,, +2026-05-22 23:15:00+00:00,16.5,16.6,16.4,0.0,92.0,, +2026-05-22 23:30:00+00:00,16.4,16.5,16.35,0.0,92.0,, +2026-05-22 23:45:00+00:00,16.3,16.4,16.2,0.0,92.0,, +2026-05-23 00:00:00+00:00,16.2,16.3,16.1,0.0,92.5,, +2026-05-23 00:15:00+00:00,16.1,16.2,16.0,0.0,93.0,, +2026-05-23 00:30:00+00:00,16.25,16.3,16.1,0.0,93.0,, +2026-05-23 00:45:00+00:00,16.2,16.2,16.1,0.0,93.0,, +2026-05-23 01:00:00+00:00,16.0,16.1,15.9,0.0,93.5,, +2026-05-23 01:15:00+00:00,16.2,16.5,15.9,0.0,93.0,, +2026-05-23 01:30:00+00:00,16.299999999999997,16.450000000000003,16.15,1.0,91.0,, +2026-05-23 01:45:00+00:00,16.0,16.1,15.9,8.0,92.0,, +2026-05-23 02:00:00+00:00,15.9,16.0,15.850000000000001,26.5,92.0,, +2026-05-23 02:15:00+00:00,16.1,16.3,15.9,71.0,92.0,, +2026-05-23 02:30:00+00:00,16.85,17.1,16.55,81.0,91.0,, +2026-05-23 02:45:00+00:00,17.5,17.6,17.3,111.0,88.0,, +2026-05-23 03:00:00+00:00,18.0,18.15,17.8,185.5,84.0,, +2026-05-23 03:15:00+00:00,18.4,18.7,18.0,249.0,82.0,, +2026-05-23 03:30:00+00:00,18.85,19.05,18.7,314.5,79.0,, +2026-05-23 03:45:00+00:00,19.6,19.8,19.1,413.0,77.0,, +2026-05-23 04:00:00+00:00,19.4,19.75,19.2,379.5,75.5,, +2026-05-23 04:15:00+00:00,19.2,19.3,19.1,453.0,76.0,, +2026-05-23 04:30:00+00:00,20.0,20.25,19.700000000000003,444.5,73.5,, +2026-05-23 04:45:00+00:00,20.5,20.7,20.2,519.0,71.0,, +2026-05-23 05:00:00+00:00,20.5,20.65,20.15,594.5,70.5,, +2026-05-23 05:15:00+00:00,20.7,20.9,20.5,601.0,70.0,, +2026-05-23 05:30:00+00:00,21.25,21.55,20.950000000000003,706.0,66.0,, +2026-05-23 05:45:00+00:00,21.9,22.4,21.3,335.0,65.0,, +2026-05-23 06:00:00+00:00,21.6,21.799999999999997,21.45,771.0,67.0,, +2026-05-23 06:15:00+00:00,22.1,22.2,21.8,897.0,66.0,, +2026-05-23 06:30:00+00:00,21.799999999999997,22.1,21.6,922.0,66.0,, +2026-05-23 06:45:00+00:00,21.7,21.9,21.4,945.0,65.0,, +2026-05-23 07:00:00+00:00,21.75,21.95,21.549999999999997,967.5,65.5,, +2026-05-23 07:15:00+00:00,21.9,22.1,21.7,990.0,64.0,, +2026-05-23 07:30:00+00:00,21.9,22.1,21.65,1009.5,64.0,, +2026-05-23 07:45:00+00:00,22.2,22.4,22.0,1026.0,60.0,, +2026-05-23 08:00:00+00:00,22.2,22.4,21.95,1038.0,59.0,, +2026-05-23 08:15:00+00:00,22.1,22.3,22.0,1047.0,58.0,, +2026-05-23 08:30:00+00:00,22.35,22.65,22.1,1050.5,58.5,, +2026-05-23 08:45:00+00:00,22.7,22.9,22.4,1049.0,59.0,, +2026-05-23 09:00:00+00:00,23.0,23.4,22.7,1045.5,56.0,, +2026-05-23 09:15:00+00:00,23.0,23.6,22.7,1038.0,54.0,, +2026-05-23 09:30:00+00:00,22.450000000000003,22.85,22.200000000000003,1030.0,61.0,, +2026-05-23 09:45:00+00:00,22.5,23.0,22.0,1017.0,62.0,, +2026-05-23 10:00:00+00:00,22.15,22.450000000000003,21.85,995.0,65.0,, +2026-05-23 10:15:00+00:00,22.0,22.3,21.7,969.0,67.0,, +2026-05-23 10:30:00+00:00,21.9,22.3,21.4,942.5,66.5,, +2026-05-23 10:45:00+00:00,22.5,22.9,22.3,908.0,63.0,, +2026-05-23 11:00:00+00:00,22.2,22.45,21.799999999999997,873.5,63.5,, +2026-05-23 11:15:00+00:00,21.7,21.9,21.5,835.0,66.0,, +2026-05-23 11:30:00+00:00,21.75,22.0,21.3,796.5,65.5,, +2026-05-23 11:45:00+00:00,22.0,22.4,21.7,748.0,64.0,, +2026-05-23 12:00:00+00:00,22.450000000000003,22.549999999999997,22.299999999999997,702.0,63.5,, +2026-05-23 12:15:00+00:00,22.2,22.6,21.8,648.0,66.0,, +2026-05-23 12:30:00+00:00,22.2,22.450000000000003,21.85,599.0,63.0,, +2026-05-23 12:45:00+00:00,21.8,22.2,21.4,548.0,65.0,, +2026-05-23 13:00:00+00:00,21.65,21.85,21.5,487.5,65.5,, +2026-05-23 13:15:00+00:00,22.1,22.3,21.9,433.0,65.0,, +2026-05-23 13:30:00+00:00,21.9,22.1,21.75,353.5,66.0,, +2026-05-23 13:45:00+00:00,21.5,21.8,21.5,301.0,69.0,, +2026-05-23 14:00:00+00:00,21.1,21.4,20.9,181.0,70.0,, +2026-05-23 14:15:00+00:00,20.5,20.6,20.4,189.0,72.0,, +2026-05-23 14:30:00+00:00,20.6,20.7,20.5,134.0,71.5,, +2026-05-23 14:45:00+00:00,20.4,20.5,20.2,83.0,74.0,, +2026-05-23 15:00:00+00:00,19.950000000000003,20.1,19.85,39.5,76.0,, +2026-05-23 15:15:00+00:00,19.7,19.8,19.6,16.0,78.0,, +2026-05-23 15:30:00+00:00,19.4,19.549999999999997,19.299999999999997,4.0,78.5,, +2026-05-23 15:45:00+00:00,19.2,19.2,19.0,0.0,80.0,, +2026-05-23 16:00:00+00:00,18.95,19.0,18.85,0.0,81.5,, +2026-05-23 16:15:00+00:00,18.8,18.8,18.7,0.0,82.0,, +2026-05-23 16:30:00+00:00,18.7,18.75,18.65,0.0,83.0,, +2026-05-23 16:45:00+00:00,18.6,18.7,18.5,0.0,83.0,, +2026-05-23 17:00:00+00:00,18.3,18.4,18.1,0.0,83.5,, +2026-05-23 17:15:00+00:00,17.9,18.0,17.9,0.0,85.0,, +2026-05-23 17:30:00+00:00,17.95,18.05,17.9,0.0,84.5,, +2026-05-23 17:45:00+00:00,17.8,17.9,17.7,0.0,85.0,, +2026-05-23 18:00:00+00:00,17.75,17.8,17.65,0.0,86.0,, +2026-05-23 18:15:00+00:00,17.6,17.7,17.5,0.0,86.0,, +2026-05-23 18:30:00+00:00,17.45,17.55,17.35,0.0,86.5,, +2026-05-23 18:45:00+00:00,17.1,17.2,17.0,0.0,88.0,, +2026-05-23 19:00:00+00:00,16.85,16.95,16.8,0.0,88.0,, +2026-05-23 19:15:00+00:00,16.8,16.9,16.8,0.0,88.0,, +2026-05-23 19:30:00+00:00,16.75,16.8,16.65,0.0,88.0,, +2026-05-23 19:45:00+00:00,16.7,16.7,16.7,0.0,89.0,, +2026-05-23 20:00:00+00:00,16.799999999999997,16.85,16.700000000000003,0.0,89.0,, +2026-05-23 20:15:00+00:00,16.8,17.0,16.7,0.0,88.0,, +2026-05-23 20:30:00+00:00,16.6,16.7,16.6,0.0,89.5,, +2026-05-23 20:45:00+00:00,16.5,16.6,16.4,0.0,89.0,, diff --git a/Data/layout.json b/Data/layout.json new file mode 100644 index 0000000000000000000000000000000000000000..d5bdc9ab1bd61c4cad0a4b2b5fc761f2c6dac370 --- /dev/null +++ b/Data/layout.json @@ -0,0 +1,536 @@ +{ + "site": { + "latitude": 30.87, + "longitude": 34.79, + "altitude_m": 475.0, + "timezone": "Asia/Jerusalem", + "name": "Sde Boker Agrivoltaic Research Site" + }, + "panel_geometry": { + "width_m": 1.13, + "height_m": 2.05, + "row_spacing_m": 3.0, + "row_azimuth_deg": 315.0, + "tilt_axis": "single_axis_NS" + }, + "canopy_geometry": { + "height_m": 1.2, + "width_m": 0.6, + "trellis_type": "VSP", + "n_vertical_zones": 3, + "zone_labels": [ + "basal_trunk", + "fruiting_zone", + "apical_canopy" + ], + "zone_heights_m": [ + 0.2, + 0.6, + 1.0 + ], + "lai_distribution": [ + 0.15, + 0.35, + 0.5 + ] + }, + "rows": [ + { + "row_id": 501, + "type": "treatment", + "panel_center_x_m": 0.0, + "panel_center_y_m": 0.0, + "panel_height_m": 2.05, + "devices": [ + "Crop_2Soil11", + "Crop_2Soil8", + "Tracker501" + ] + }, + { + "row_id": 502, + "type": "treatment", + "panel_center_x_m": 3.0, + "panel_center_y_m": 0.0, + "panel_height_m": 2.05, + "devices": [ + "Crop_2Soil1", + "Crop_2Soil17", + "Crop_2Soil6", + "Tracker502" + ] + }, + { + "row_id": 503, + "type": "treatment", + "panel_center_x_m": 6.0, + "panel_center_y_m": 0.0, + "panel_height_m": 2.05, + "devices": [ + "Crop_2Soil13", + "Tracker503" + ] + }, + { + "row_id": 504, + "type": "treatment", + "panel_center_x_m": 9.0, + "panel_center_y_m": 0.0, + "panel_height_m": 2.05, + "devices": [ + "Crop_2Soil19", + "Crop_2Soil20", + "Crop_2Soil7" + ] + }, + { + "row_id": 509, + "type": "treatment", + "panel_center_x_m": 12.0, + "panel_center_y_m": 0.0, + "panel_height_m": 2.05, + "devices": [ + "Crop_2Soil9", + "Tracker509" + ] + }, + { + "row_id": 202, + "type": "reference", + "panel_center_x_m": 0.0, + "panel_center_y_m": -30.0, + "panel_height_m": 0.0, + "devices": [ + "Crop_2Soil10", + "Crop_2Soil14", + "Crop_2Soil18", + "Crop_2Soil2", + "Crop_2Soil3", + "Crop_2Soil4", + "Crop_2Soil5" + ] + } + ], + "devices": { + "Crop_2Soil11": { + "uuid": "a4cfc5c0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 501, + "label": "501 north", + "position": "north", + "position_m": [ + 0.0, + 5.0, + 0.6 + ] + }, + "Crop_2Soil8": { + "uuid": "933b7f70-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 501, + "label": "501 south", + "position": "south", + "position_m": [ + 0.0, + -5.0, + 0.6 + ] + }, + "Crop_2Soil1": { + "uuid": "38437e20-2b63-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 502, + "label": "502 north", + "position": "north", + "position_m": [ + 3.0, + 5.0, + 0.6 + ] + }, + "Crop_2Soil17": { + "uuid": "d232bae0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 502, + "label": "502 south", + "position": "south", + "position_m": [ + 3.0, + -5.0, + 0.6 + ] + }, + "Crop_2Soil6": { + "uuid": "8766eef0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 502, + "label": "502 south-east", + "position": "south-east", + "position_m": [ + 3.5, + -5.0, + 0.6 + ] + }, + "Crop_2Soil13": { + "uuid": "bafcce10-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 503, + "label": "503", + "position": null, + "position_m": [ + 6.0, + 0.0, + 0.6 + ] + }, + "Crop_2Soil7": { + "uuid": "8d965680-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 504, + "label": "504 north", + "position": "north", + "position_m": [ + 9.0, + 5.0, + 0.6 + ] + }, + "Crop_2Soil19": { + "uuid": "dde80390-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 504, + "label": "504 center", + "position": "center", + "position_m": [ + 9.0, + 0.0, + 0.6 + ] + }, + "Crop_2Soil20": { + "uuid": "e44b2550-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 504, + "label": "504 center-east", + "position": "center-east", + "position_m": [ + 9.5, + 0.0, + 0.6 + ] + }, + "Crop_2Soil9": { + "uuid": "9908c9d0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 509, + "label": "509 south", + "position": "south", + "position_m": [ + 12.0, + -5.0, + 0.6 + ] + }, + "Crop_2Soil4": { + "uuid": "7bea6980-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 north (ref)", + "position": "north", + "position_m": [ + 0.0, + -25.0, + 0.6 + ] + }, + "Crop_2Soil3": { + "uuid": "7362e120-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 north", + "position": "north", + "position_m": [ + 0.0, + -25.0, + 0.6 + ] + }, + "Crop_2Soil18": { + "uuid": "d7b8ea20-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 north-east", + "position": "north-east", + "position_m": [ + 0.5, + -25.0, + 0.6 + ] + }, + "Crop_2Soil2": { + "uuid": "79a26ac0-2b63-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 center (ref)", + "position": "center", + "position_m": [ + 0.0, + -30.0, + 0.6 + ] + }, + "Crop_2Soil5": { + "uuid": "81a95c00-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 center", + "position": "center", + "position_m": [ + 0.0, + -30.0, + 0.6 + ] + }, + "Crop_2Soil14": { + "uuid": "c05cd7b0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 south", + "position": "south", + "position_m": [ + 0.0, + -35.0, + 0.6 + ] + }, + "Crop_2Soil10": { + "uuid": "9f4047b0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "reference", + "row": 202, + "label": "202 south (ref)", + "position": "south", + "position_m": [ + 0.0, + -35.0, + 0.6 + ] + }, + "Crop_2Soil12": { + "uuid": "aa114ae0-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": null, + "label": "unallocated", + "position": null, + "position_m": [ + 0.0, + 0.0, + 0.6 + ] + }, + "Crop_2Soil15": { + "uuid": "c6574c90-2b64-11f1-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": null, + "label": "unallocated", + "position": null, + "position_m": [ + 0.0, + 0.0, + 0.6 + ] + }, + "Thermocouples1": { + "uuid": "d172ffe0-4fac-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 1", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples2": { + "uuid": "e0d87f50-4fac-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 2", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples3": { + "uuid": "e737d080-4fac-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 3", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples4": { + "uuid": "ed4901b0-4fac-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 4", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples5": { + "uuid": "f3f07f70-4fac-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 5", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples6": { + "uuid": "faa591c0-4fac-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 6", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples7": { + "uuid": "0095a660-4fad-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 7", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples8": { + "uuid": "07168950-4fad-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 8", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples9": { + "uuid": "0e69fe80-4fad-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 9", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples10": { + "uuid": "14e36760-4fad-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 10", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples11": { + "uuid": "1b513780-4fad-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 11", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Thermocouples12": { + "uuid": "2121dd40-4fad-11f1-829c-09d61d29d108", + "area": "treatment", + "row": null, + "label": "Panel surface thermocouples 12", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Tracker501": { + "uuid": "aac06e50-f769-11f0-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 501, + "label": "Tracker row 501", + "position": null, + "position_m": [ + 0.0, + 0.0, + 2.05 + ] + }, + "Tracker502": { + "uuid": "b99bd630-f769-11f0-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 502, + "label": "Tracker row 502", + "position": null, + "position_m": [ + 3.0, + 0.0, + 2.05 + ] + }, + "Tracker503": { + "uuid": "caffe4c0-f769-11f0-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 503, + "label": "Tracker row 503", + "position": null, + "position_m": [ + 6.0, + 0.0, + 2.05 + ] + }, + "Tracker509": { + "uuid": "bacf7c50-fcdc-11f0-b902-5ff1ea8c4cf9", + "area": "treatment", + "row": 509, + "label": "Tracker row 509", + "position": null, + "position_m": [ + 12.0, + 0.0, + 2.05 + ] + } + } +} \ No newline at end of file diff --git a/Data/processed/stage1_labels.csv b/Data/processed/stage1_labels.csv new file mode 100644 index 0000000000000000000000000000000000000000..5e6a6ebfa367fcaca0a0334fe0e1e1670da61027 --- /dev/null +++ b/Data/processed/stage1_labels.csv @@ -0,0 +1,13251 @@ +time,A +2024-05-05 07:45:00+00:00,1.159219380968257 +2024-05-05 08:00:00+00:00,1.4391785219132749 +2024-05-05 08:15:00+00:00,2.396554121914703 +2024-05-05 08:30:00+00:00,2.012540503303697 +2024-05-05 08:45:00+00:00,2.8521279136565285 +2024-05-05 09:00:00+00:00,2.0576166294616236 +2024-05-05 09:15:00+00:00,2.285394645464997 +2024-05-05 09:30:00+00:00,1.8513104098914377 +2024-05-05 09:45:00+00:00,1.265522781436286 +2024-05-05 10:00:00+00:00,1.3874137381326448 +2024-05-05 10:15:00+00:00,9.363278111780348 +2024-05-05 10:30:00+00:00,1.6704643377642203 +2024-05-05 10:45:00+00:00,10.076003512958962 +2024-05-05 11:00:00+00:00,9.855534482308034 +2024-05-05 11:15:00+00:00,6.302000939723235 +2024-05-05 11:30:00+00:00,10.1525892708319 +2024-05-05 11:45:00+00:00,10.245540166403677 +2024-05-05 12:00:00+00:00,8.477492605326553 +2024-05-05 12:15:00+00:00,10.31982433668606 +2024-05-05 12:30:00+00:00,10.257698222129179 +2024-05-05 12:45:00+00:00,10.131717803218393 +2024-05-05 13:00:00+00:00,10.197883126823752 +2024-05-05 13:15:00+00:00,10.042001031552171 +2024-05-05 13:45:00+00:00,9.547446041936922 +2024-05-05 14:00:00+00:00,8.753178730972722 +2024-05-05 14:15:00+00:00,7.755438607717241 +2024-05-05 14:30:00+00:00,5.705500037833515 +2024-05-05 14:45:00+00:00,5.190573274481153 +2024-05-05 15:00:00+00:00,3.2260634970625266 +2024-05-05 15:15:00+00:00,0.6862054682832754 +2024-05-05 15:30:00+00:00,0.3965823637369903 +2024-05-06 03:45:00+00:00,0.0 +2024-05-06 04:00:00+00:00,0.0 +2024-05-06 04:30:00+00:00,0.0 +2024-05-06 04:45:00+00:00,0.19157317924902584 +2024-05-06 05:00:00+00:00,0.8750714664972457 +2024-05-06 05:15:00+00:00,0.39658554794304934 +2024-05-06 05:30:00+00:00,0.7752791861662744 +2024-05-06 05:45:00+00:00,1.266319046619294 +2024-05-06 06:00:00+00:00,0.0217565216535911 +2024-05-06 06:15:00+00:00,1.5803500510641826 +2024-05-06 06:30:00+00:00,2.7152028835259463 +2024-05-06 06:45:00+00:00,2.5097628106702197 +2024-05-06 07:00:00+00:00,2.306669621655329 +2024-05-06 07:15:00+00:00,2.4083335043130063 +2024-05-06 07:30:00+00:00,2.425094028417514 +2024-05-06 07:45:00+00:00,1.6143939333751938 +2024-05-06 08:00:00+00:00,1.6655758072426678 +2024-05-06 08:15:00+00:00,0.49925138813386627 +2024-05-06 08:30:00+00:00,0.8205456911623152 +2024-05-06 08:45:00+00:00,2.313223193671936 +2024-05-06 09:00:00+00:00,6.489914517144179 +2024-05-06 09:15:00+00:00,6.911547588798531 +2024-05-06 09:30:00+00:00,6.087808146258766 +2024-05-06 09:45:00+00:00,7.671704441681658 +2024-05-06 10:00:00+00:00,2.0970041761912626 +2024-05-06 10:15:00+00:00,6.103110399331881 +2024-05-06 10:30:00+00:00,6.396386796185405 +2024-05-06 10:45:00+00:00,5.5606470533743355 +2024-05-06 11:00:00+00:00,6.1829017972730815 +2024-05-06 11:15:00+00:00,6.12028551754627 +2024-05-06 11:30:00+00:00,4.3141656155872825 +2024-05-06 11:45:00+00:00,6.038881684600804 +2024-05-06 12:00:00+00:00,7.007717651743541 +2024-05-06 12:15:00+00:00,1.7827423072958368 +2024-05-06 12:30:00+00:00,0.9716490431948497 +2024-05-06 12:45:00+00:00,6.376432099820887 +2024-05-06 13:00:00+00:00,1.5327239529637475 +2024-05-06 13:15:00+00:00,4.179558824090404 +2024-05-06 13:30:00+00:00,5.649108200976848 +2024-05-06 13:45:00+00:00,6.354248248038694 +2024-05-06 14:00:00+00:00,5.617066277350197 +2024-05-06 14:15:00+00:00,4.828252742400159 +2024-05-06 14:30:00+00:00,4.285593786724643 +2024-05-06 14:45:00+00:00,3.472508033967695 +2024-05-06 15:00:00+00:00,0.0 +2024-05-07 03:30:00+00:00,0.0 +2024-05-07 04:45:00+00:00,0.1860764762749465 +2024-05-07 05:00:00+00:00,0.0 +2024-05-07 05:15:00+00:00,0.25476263038784897 +2024-05-07 05:45:00+00:00,0.01749458202666676 +2024-05-07 06:00:00+00:00,0.02728800326122216 +2024-05-07 06:15:00+00:00,0.4090347343908771 +2024-05-07 06:30:00+00:00,0.8475149211318049 +2024-05-07 06:45:00+00:00,1.27922225765701 +2024-05-07 07:00:00+00:00,1.2190492375851636 +2024-05-07 07:15:00+00:00,2.118500178967607 +2024-05-07 07:30:00+00:00,1.7101324380710392 +2024-05-07 07:45:00+00:00,1.300866232008943 +2024-05-07 08:00:00+00:00,2.7943463107126822 +2024-05-07 08:15:00+00:00,1.5689787299251432 +2024-05-07 08:30:00+00:00,2.1614210443922746 +2024-05-07 08:45:00+00:00,2.8259845380804274 +2024-05-07 09:00:00+00:00,4.289316041751614 +2024-05-07 09:15:00+00:00,4.3383055352192486 +2024-05-07 09:30:00+00:00,7.106929266847015 +2024-05-07 09:45:00+00:00,3.879064822111563 +2024-05-07 10:00:00+00:00,6.5863879761202515 +2024-05-07 10:15:00+00:00,6.864542988010586 +2024-05-07 10:30:00+00:00,2.8387603531534387 +2024-05-07 10:45:00+00:00,6.552431761166883 +2024-05-07 11:00:00+00:00,6.848843152393746 +2024-05-07 11:15:00+00:00,7.225909621436523 +2024-05-07 11:30:00+00:00,7.2186477117809975 +2024-05-07 11:45:00+00:00,6.9889640219392355 +2024-05-07 12:00:00+00:00,7.233383815497479 +2024-05-07 12:15:00+00:00,7.07549344364517 +2024-05-07 12:30:00+00:00,6.405381458905721 +2024-05-07 12:45:00+00:00,6.593012746978417 +2024-05-07 13:00:00+00:00,6.340517437389649 +2024-05-07 13:15:00+00:00,5.802296459899584 +2024-05-07 13:30:00+00:00,5.133845569846966 +2024-05-07 13:45:00+00:00,4.6020451468673595 +2024-05-07 14:00:00+00:00,4.398198578391546 +2024-05-07 14:15:00+00:00,3.6693550707986597 +2024-05-07 14:30:00+00:00,2.8070525214418898 +2024-05-07 14:45:00+00:00,2.1492706344118364 +2024-05-07 15:30:00+00:00,0.0 +2024-05-08 08:00:00+00:00,0.3731008414106749 +2024-05-08 08:15:00+00:00,0.4887413575755204 +2024-05-08 08:30:00+00:00,0.7063547843940812 +2024-05-08 09:30:00+00:00,10.797829582971357 +2024-05-08 09:45:00+00:00,9.097051407462253 +2024-05-08 10:00:00+00:00,6.913769858520435 +2024-05-08 10:15:00+00:00,7.135075195694464 +2024-05-08 10:30:00+00:00,6.284823104482442 +2024-05-08 10:45:00+00:00,5.99993839047474 +2024-05-08 11:00:00+00:00,7.43728403213653 +2024-05-08 11:15:00+00:00,7.234175500859286 +2024-05-08 11:30:00+00:00,7.116363082836267 +2024-05-08 11:45:00+00:00,7.06003588627849 +2024-05-08 12:00:00+00:00,7.505701451194833 +2024-05-08 12:15:00+00:00,7.291352668589274 +2024-05-08 12:30:00+00:00,7.302768229075289 +2024-05-08 12:45:00+00:00,6.461079676871583 +2024-05-08 13:00:00+00:00,6.847969292932342 +2024-05-08 13:15:00+00:00,6.612020000035805 +2024-05-08 13:30:00+00:00,6.8493230046888325 +2024-05-08 13:45:00+00:00,6.30544067827719 +2024-05-08 14:00:00+00:00,6.4254880923176 +2024-05-08 14:15:00+00:00,6.121318236002236 +2024-05-08 14:30:00+00:00,5.718722285725316 +2024-05-08 14:45:00+00:00,5.110913638987794 +2024-05-08 15:00:00+00:00,0.371993002869337 +2024-05-08 15:15:00+00:00,0.3479614949088119 +2024-05-09 06:15:00+00:00,0.0 +2024-05-09 06:30:00+00:00,0.0 +2024-05-09 06:45:00+00:00,0.0 +2024-05-09 07:00:00+00:00,0.0 +2024-05-09 07:15:00+00:00,0.2325610369646648 +2024-05-09 07:30:00+00:00,0.48612834220273005 +2024-05-09 07:45:00+00:00,0.629611220860147 +2024-05-09 08:00:00+00:00,0.7398699260860324 +2024-05-09 08:15:00+00:00,0.6805321636635602 +2024-05-09 08:30:00+00:00,0.8061216451816935 +2024-05-09 08:45:00+00:00,1.0345018180773151 +2024-05-09 09:00:00+00:00,3.5065921066775028 +2024-05-09 09:15:00+00:00,7.528589155081728 +2024-05-09 09:30:00+00:00,6.826600215691934 +2024-05-09 09:45:00+00:00,7.026806159156548 +2024-05-09 10:00:00+00:00,7.5619529750163705 +2024-05-09 10:15:00+00:00,7.200199078883302 +2024-05-09 10:30:00+00:00,6.806883278068322 +2024-05-09 10:45:00+00:00,7.4812473680845475 +2024-05-09 11:00:00+00:00,7.80689305670394 +2024-05-09 11:15:00+00:00,8.225849775877291 +2024-05-09 11:30:00+00:00,7.781277625860607 +2024-05-09 11:45:00+00:00,7.69738391778058 +2024-05-09 12:00:00+00:00,7.611841236653278 +2024-05-09 12:15:00+00:00,7.669301722030407 +2024-05-09 12:30:00+00:00,7.283094579140769 +2024-05-09 12:45:00+00:00,7.045743213595369 +2024-05-09 13:00:00+00:00,6.531632127914817 +2024-05-09 13:15:00+00:00,6.114064785480373 +2024-05-09 13:30:00+00:00,5.807982044329449 +2024-05-09 13:45:00+00:00,4.967300206248572 +2024-05-09 14:00:00+00:00,4.603757124168427 +2024-05-09 14:15:00+00:00,4.382126468041832 +2024-05-09 14:30:00+00:00,3.7836228925039093 +2024-05-09 14:45:00+00:00,2.7153971553253746 +2024-05-09 15:00:00+00:00,0.6932855819029917 +2024-05-09 15:15:00+00:00,0.6018521067344289 +2024-05-09 15:30:00+00:00,0.6304388384948915 +2024-05-10 05:45:00+00:00,0.0 +2024-05-10 06:30:00+00:00,0.0 +2024-05-10 06:45:00+00:00,0.23065789941791803 +2024-05-10 07:00:00+00:00,0.7684444126047403 +2024-05-10 07:15:00+00:00,1.0201043175462234 +2024-05-10 07:30:00+00:00,1.2473985641292018 +2024-05-10 07:45:00+00:00,0.753406094110513 +2024-05-10 08:00:00+00:00,0.7408651629392071 +2024-05-10 08:15:00+00:00,1.1844601060416684 +2024-05-10 08:30:00+00:00,1.1485096083594395 +2024-05-10 08:45:00+00:00,2.1741251601019975 +2024-05-10 09:00:00+00:00,2.544350435009304 +2024-05-10 09:15:00+00:00,3.4343557417646102 +2024-05-10 09:30:00+00:00,4.148977717795331 +2024-05-10 09:45:00+00:00,2.6711395703273304 +2024-05-10 10:00:00+00:00,5.161739408188386 +2024-05-10 10:15:00+00:00,5.772526436845943 +2024-05-10 10:30:00+00:00,5.886760860298972 +2024-05-10 10:45:00+00:00,5.068070277670244 +2024-05-10 11:00:00+00:00,3.465821608060887 +2024-05-10 11:15:00+00:00,2.01548593298565 +2024-05-10 11:30:00+00:00,2.982668764701998 +2024-05-10 11:45:00+00:00,1.9105404161497161 +2024-05-10 12:00:00+00:00,1.2576068366409296 +2024-05-10 12:15:00+00:00,0.34255910004515466 +2024-05-10 12:30:00+00:00,0.5445018309938425 +2024-05-10 12:45:00+00:00,0.3332857394404112 +2024-05-10 13:00:00+00:00,0.0 +2024-05-10 13:15:00+00:00,0.0 +2024-05-10 13:45:00+00:00,0.0 +2024-05-11 04:45:00+00:00,0.22191802353029222 +2024-05-11 05:00:00+00:00,0.0 +2024-05-11 05:15:00+00:00,0.0 +2024-05-11 05:30:00+00:00,0.3319367714500301 +2024-05-11 05:45:00+00:00,0.0 +2024-05-11 06:00:00+00:00,0.25673894388659035 +2024-05-11 06:15:00+00:00,0.29056659428006015 +2024-05-11 06:30:00+00:00,0.2434358501516014 +2024-05-11 06:45:00+00:00,0.4641693126985189 +2024-05-11 07:00:00+00:00,0.688928842875101 +2024-05-11 07:15:00+00:00,0.6812619598017415 +2024-05-11 07:30:00+00:00,0.653662948709153 +2024-05-11 07:45:00+00:00,0.6256003793055429 +2024-05-11 08:00:00+00:00,1.1165635192918957 +2024-05-11 08:15:00+00:00,1.130069859042907 +2024-05-11 08:30:00+00:00,1.5955142994988003 +2024-05-11 08:45:00+00:00,1.9940936782299048 +2024-05-11 09:00:00+00:00,2.025610274130594 +2024-05-11 09:15:00+00:00,2.4626717506418108 +2024-05-11 09:30:00+00:00,3.761289267952854 +2024-05-11 09:45:00+00:00,3.599633014084705 +2024-05-11 10:00:00+00:00,4.588191129845701 +2024-05-11 10:15:00+00:00,4.52143148765442 +2024-05-11 10:30:00+00:00,4.724976763535375 +2024-05-11 10:45:00+00:00,4.9581660936050245 +2024-05-11 11:00:00+00:00,4.580364499626166 +2024-05-11 11:15:00+00:00,4.533702473772631 +2024-05-11 11:30:00+00:00,4.510316560606959 +2024-05-11 11:45:00+00:00,4.634721035809623 +2024-05-11 12:00:00+00:00,4.185088365767391 +2024-05-11 12:15:00+00:00,3.9933905187845835 +2024-05-11 12:30:00+00:00,3.884308343722529 +2024-05-11 12:45:00+00:00,3.3683811346306722 +2024-05-11 13:00:00+00:00,3.0115250576686416 +2024-05-11 13:15:00+00:00,2.8489005474767093 +2024-05-11 13:30:00+00:00,2.5185099344998987 +2024-05-11 13:45:00+00:00,2.0352555220838617 +2024-05-11 14:00:00+00:00,1.6696890042963635 +2024-05-11 14:15:00+00:00,1.3114270510803456 +2024-05-11 14:30:00+00:00,0.5778721544826946 +2024-05-11 14:45:00+00:00,0.0 +2024-05-11 15:00:00+00:00,0.0 +2024-05-11 15:15:00+00:00,0.0 +2024-05-12 04:45:00+00:00,0.9225298080612694 +2024-05-12 05:15:00+00:00,0.02561930644900756 +2024-05-12 05:30:00+00:00,0.08755048078024563 +2024-05-12 05:45:00+00:00,0.015287169207713669 +2024-05-12 06:00:00+00:00,0.11208922780039288 +2024-05-12 06:15:00+00:00,0.01815810525888617 +2024-05-12 06:30:00+00:00,0.025094764138963166 +2024-05-12 06:45:00+00:00,0.2128818198678144 +2024-05-12 07:00:00+00:00,0.0 +2024-05-12 07:15:00+00:00,0.18110382638634026 +2024-05-12 07:30:00+00:00,0.16106027034357573 +2024-05-12 07:45:00+00:00,0.1765192807896434 +2024-05-12 08:00:00+00:00,0.4150276611286221 +2024-05-12 08:15:00+00:00,0.6584112644827689 +2024-05-12 08:30:00+00:00,0.3057241599041589 +2024-05-12 08:45:00+00:00,0.5630992871009763 +2024-05-12 09:00:00+00:00,1.3873620280969992 +2024-05-12 09:15:00+00:00,4.274172180489415 +2024-05-12 09:30:00+00:00,5.124208875364572 +2024-05-12 09:45:00+00:00,5.470983104095434 +2024-05-12 10:00:00+00:00,5.71099940836773 +2024-05-12 10:15:00+00:00,6.275997989699416 +2024-05-12 10:30:00+00:00,3.4485857414558527 +2024-05-12 10:45:00+00:00,3.6428736281291716 +2024-05-12 11:00:00+00:00,4.451239897940988 +2024-05-12 11:15:00+00:00,6.5673604822844425 +2024-05-12 11:30:00+00:00,7.066710633395335 +2024-05-12 11:45:00+00:00,7.037994347400225 +2024-05-12 12:00:00+00:00,6.4021069122981675 +2024-05-12 12:15:00+00:00,6.583725193586992 +2024-05-12 12:30:00+00:00,6.232690401846269 +2024-05-12 12:45:00+00:00,6.057511132618921 +2024-05-12 13:00:00+00:00,3.1643745271176735 +2024-05-12 13:15:00+00:00,5.054446769675027 +2024-05-12 13:30:00+00:00,3.557772268309645 +2024-05-12 13:45:00+00:00,4.9349122372378265 +2024-05-12 14:00:00+00:00,4.113410218031912 +2024-05-12 14:15:00+00:00,0.03260299119491261 +2024-05-12 14:30:00+00:00,3.3135517080957975 +2024-05-12 14:45:00+00:00,2.077775682706561 +2024-05-12 15:00:00+00:00,0.0 +2024-05-12 15:15:00+00:00,0.4659063479368193 +2024-05-12 15:30:00+00:00,0.0 +2024-05-13 05:30:00+00:00,0.0 +2024-05-13 05:45:00+00:00,0.0 +2024-05-13 06:15:00+00:00,0.31291601791723456 +2024-05-13 06:30:00+00:00,0.8830144264048663 +2024-05-13 06:45:00+00:00,0.8266339065198551 +2024-05-13 07:00:00+00:00,0.8901889956916844 +2024-05-13 07:15:00+00:00,0.769347832278076 +2024-05-13 07:30:00+00:00,2.094077225638555 +2024-05-13 07:45:00+00:00,1.3135061768055472 +2024-05-13 08:00:00+00:00,1.2849417457341556 +2024-05-13 08:15:00+00:00,1.181292417659389 +2024-05-13 08:30:00+00:00,0.7885551927664363 +2024-05-13 08:45:00+00:00,0.9911721667956379 +2024-05-13 09:00:00+00:00,4.350408523391122 +2024-05-13 09:15:00+00:00,6.392640735353407 +2024-05-13 09:30:00+00:00,6.77261541468168 +2024-05-13 09:45:00+00:00,7.246939815819225 +2024-05-13 10:00:00+00:00,6.409132663076524 +2024-05-13 10:15:00+00:00,6.399070471089268 +2024-05-13 10:30:00+00:00,6.564062845196066 +2024-05-13 10:45:00+00:00,6.836005640222998 +2024-05-13 11:00:00+00:00,7.2552895055658855 +2024-05-13 11:15:00+00:00,6.885934489917278 +2024-05-13 11:30:00+00:00,1.9477449531163147 +2024-05-13 11:45:00+00:00,6.809837051375475 +2024-05-13 12:00:00+00:00,6.782793625076927 +2024-05-13 12:15:00+00:00,6.755207786112644 +2024-05-13 12:30:00+00:00,6.606486409238242 +2024-05-13 12:45:00+00:00,1.990810816188855 +2024-05-13 13:00:00+00:00,6.14065531272329 +2024-05-13 13:15:00+00:00,5.103340621966622 +2024-05-13 13:30:00+00:00,4.685492065589575 +2024-05-13 13:45:00+00:00,4.3700533162325 +2024-05-13 14:00:00+00:00,0.17174315367216053 +2024-05-13 14:15:00+00:00,2.8763932209747294 +2024-05-13 14:30:00+00:00,2.179532361268075 +2024-05-13 14:45:00+00:00,0.8119868544326538 +2024-05-13 15:00:00+00:00,0.0 +2024-05-13 15:15:00+00:00,0.0 +2024-05-14 06:00:00+00:00,0.0 +2024-05-14 06:30:00+00:00,0.09545538971465617 +2024-05-14 06:45:00+00:00,0.7771321765256081 +2024-05-14 07:00:00+00:00,0.17430379302026777 +2024-05-14 07:15:00+00:00,0.9734628480836034 +2024-05-14 07:30:00+00:00,0.8875399729277031 +2024-05-14 07:45:00+00:00,0.8080217123811511 +2024-05-14 08:00:00+00:00,0.3434898849410246 +2024-05-14 08:15:00+00:00,0.5893165265195086 +2024-05-14 08:30:00+00:00,0.6613845699270711 +2024-05-14 08:45:00+00:00,0.34243497210644613 +2024-05-14 09:00:00+00:00,0.6761620556877006 +2024-05-14 09:15:00+00:00,2.639448814297956 +2024-05-14 09:30:00+00:00,4.075318562934359 +2024-05-14 09:45:00+00:00,4.539488335622102 +2024-05-14 10:00:00+00:00,5.2840422264414215 +2024-05-14 10:15:00+00:00,5.399512200301215 +2024-05-14 10:30:00+00:00,5.713540676287426 +2024-05-14 10:45:00+00:00,5.60473072118598 +2024-05-14 11:00:00+00:00,5.620282786951113 +2024-05-14 11:15:00+00:00,5.6359237497761825 +2024-05-14 11:30:00+00:00,5.198300653562872 +2024-05-14 11:45:00+00:00,5.356013585950554 +2024-05-14 12:00:00+00:00,5.264240947731629 +2024-05-14 12:15:00+00:00,5.0461814110279875 +2024-05-14 12:30:00+00:00,5.3220519644410444 +2024-05-14 12:45:00+00:00,4.816928336896618 +2024-05-14 13:00:00+00:00,4.55287068595141 +2024-05-14 13:15:00+00:00,4.205012457279141 +2024-05-14 13:30:00+00:00,3.7287962505073384 +2024-05-14 13:45:00+00:00,3.3566614769396335 +2024-05-14 14:00:00+00:00,2.571599828281942 +2024-05-14 14:15:00+00:00,2.209374993788991 +2024-05-14 14:30:00+00:00,1.8424183156324834 +2024-05-14 14:45:00+00:00,1.2976525030202188 +2024-05-14 15:00:00+00:00,0.0 +2024-05-14 15:15:00+00:00,0.15091264254795256 +2024-05-14 15:30:00+00:00,0.0 +2024-05-15 05:45:00+00:00,0.0 +2024-05-15 06:00:00+00:00,0.1412538164794619 +2024-05-15 06:15:00+00:00,0.013025074632081246 +2024-05-15 06:30:00+00:00,1.3243890845472541 +2024-05-15 06:45:00+00:00,0.5594133470889209 +2024-05-15 07:00:00+00:00,0.5690761385046528 +2024-05-15 07:15:00+00:00,0.7859412474275993 +2024-05-15 07:30:00+00:00,0.0 +2024-05-15 07:45:00+00:00,0.0 +2024-05-15 08:00:00+00:00,0.0 +2024-05-15 08:15:00+00:00,0.12435577085136562 +2024-05-15 08:30:00+00:00,0.2522231052512369 +2024-05-15 08:45:00+00:00,0.42042843966518917 +2024-05-15 09:00:00+00:00,0.917723717403375 +2024-05-15 09:15:00+00:00,3.05763961336636 +2024-05-15 09:30:00+00:00,6.29732933102447 +2024-05-15 09:45:00+00:00,7.0165119476730045 +2024-05-15 10:00:00+00:00,6.274020286230297 +2024-05-15 10:15:00+00:00,6.5617799707982005 +2024-05-15 10:30:00+00:00,6.0907595740084695 +2024-05-15 10:45:00+00:00,6.071045187423478 +2024-05-15 11:00:00+00:00,6.27744137169434 +2024-05-15 11:15:00+00:00,5.999688166927059 +2024-05-15 11:30:00+00:00,6.1338125688594305 +2024-05-15 11:45:00+00:00,6.061933558755789 +2024-05-15 12:00:00+00:00,6.01018203109922 +2024-05-15 12:15:00+00:00,7.241377191976635 +2024-05-15 12:30:00+00:00,6.87669594982089 +2024-05-15 12:45:00+00:00,6.518386409909932 +2024-05-15 13:00:00+00:00,6.267052307583655 +2024-05-15 13:15:00+00:00,6.592312688644784 +2024-05-15 13:30:00+00:00,6.091076905874434 +2024-05-15 13:45:00+00:00,5.790160217968415 +2024-05-15 14:00:00+00:00,5.496415335788984 +2024-05-15 14:15:00+00:00,2.59473877366878 +2024-05-15 14:30:00+00:00,1.8157423619937583 +2024-05-15 14:45:00+00:00,0.768105353045426 +2024-05-15 15:00:00+00:00,0.5623166056306323 +2024-05-15 15:15:00+00:00,0.35594353174208493 +2024-05-15 15:30:00+00:00,0.0 +2024-05-16 06:15:00+00:00,0.0021180155995104144 +2024-05-16 06:30:00+00:00,0.2653758851644703 +2024-05-16 06:45:00+00:00,0.2849759578650426 +2024-05-16 08:00:00+00:00,0.0 +2024-05-16 08:15:00+00:00,0.0 +2024-05-16 08:30:00+00:00,0.02613494609410183 +2024-05-16 08:45:00+00:00,0.12717094634000947 +2024-05-16 09:00:00+00:00,0.3727140786868064 +2024-05-16 09:15:00+00:00,1.1727489380504226 +2024-05-16 09:30:00+00:00,4.479283127638272 +2024-05-16 09:45:00+00:00,5.464470582264527 +2024-05-16 10:00:00+00:00,6.469561778286092 +2024-05-16 10:15:00+00:00,6.768656370550499 +2024-05-16 10:30:00+00:00,7.200845397403081 +2024-05-16 10:45:00+00:00,6.952701494856679 +2024-05-16 11:00:00+00:00,6.590887592891956 +2024-05-16 11:15:00+00:00,6.502225782554811 +2024-05-16 11:30:00+00:00,6.8949275759993185 +2024-05-16 11:45:00+00:00,6.678159736300648 +2024-05-16 12:00:00+00:00,6.474834787591955 +2024-05-16 12:15:00+00:00,6.082082587447293 +2024-05-16 12:30:00+00:00,5.87128120891901 +2024-05-16 12:45:00+00:00,5.858137614060063 +2024-05-16 13:00:00+00:00,5.8480137104545635 +2024-05-16 13:15:00+00:00,4.987494568225956 +2024-05-16 13:30:00+00:00,4.72662437499932 +2024-05-16 13:45:00+00:00,3.961368600462273 +2024-05-16 14:00:00+00:00,3.335054587262105 +2024-05-16 14:15:00+00:00,2.3682823117045517 +2024-05-16 14:30:00+00:00,1.8200020199768208 +2024-05-16 14:45:00+00:00,0.9113520778595836 +2024-05-16 15:00:00+00:00,0.29818340941752264 +2024-05-16 15:15:00+00:00,0.0 +2024-05-17 06:00:00+00:00,0.0 +2024-05-17 06:15:00+00:00,0.0 +2024-05-17 06:30:00+00:00,0.0 +2024-05-17 06:45:00+00:00,0.013311079980977025 +2024-05-17 07:00:00+00:00,0.033163579612722316 +2024-05-17 07:15:00+00:00,0.11805210587842829 +2024-05-17 07:30:00+00:00,0.17922805421781818 +2024-05-17 07:45:00+00:00,0.21184006372766295 +2024-05-17 08:00:00+00:00,0.46256676683413 +2024-05-17 08:15:00+00:00,0.6396224791107246 +2024-05-17 08:30:00+00:00,0.7136936051299252 +2024-05-17 08:45:00+00:00,0.9821919371605783 +2024-05-17 09:00:00+00:00,1.3091240604422272 +2024-05-17 09:15:00+00:00,3.9893098206679745 +2024-05-17 09:30:00+00:00,5.117413508797579 +2024-05-17 09:45:00+00:00,5.545879624207879 +2024-05-17 10:00:00+00:00,5.907467755230254 +2024-05-17 10:15:00+00:00,6.1364578185052014 +2024-05-17 10:30:00+00:00,6.694216837337604 +2024-05-17 10:45:00+00:00,6.685167855386872 +2024-05-17 11:00:00+00:00,6.332266477455036 +2024-05-17 11:15:00+00:00,6.148960901242501 +2024-05-17 11:30:00+00:00,6.045628049824827 +2024-05-17 11:45:00+00:00,6.279285600945104 +2024-05-17 12:00:00+00:00,5.93932248524457 +2024-05-17 12:15:00+00:00,5.645968251790405 +2024-05-17 12:30:00+00:00,5.097753795180642 +2024-05-17 12:45:00+00:00,5.142792672479756 +2024-05-17 13:00:00+00:00,4.742899821355594 +2024-05-17 13:15:00+00:00,4.338243587194615 +2024-05-17 13:30:00+00:00,3.7192292736447814 +2024-05-17 13:45:00+00:00,3.2770045000499435 +2024-05-17 14:00:00+00:00,2.343617153356014 +2024-05-17 14:15:00+00:00,1.8362865322963846 +2024-05-17 14:30:00+00:00,0.9213409023291805 +2024-05-17 14:45:00+00:00,0.048420281437485 +2024-05-17 15:00:00+00:00,0.36524367998661633 +2024-05-17 15:15:00+00:00,0.007197901613881674 +2024-05-18 05:30:00+00:00,0.0 +2024-05-18 05:45:00+00:00,0.0 +2024-05-18 06:00:00+00:00,0.0 +2024-05-18 06:15:00+00:00,0.040154072261870066 +2024-05-18 06:30:00+00:00,0.07393791081271783 +2024-05-18 06:45:00+00:00,0.09700588003224175 +2024-05-18 07:00:00+00:00,0.17930561408907475 +2024-05-18 07:15:00+00:00,0.263492208299027 +2024-05-18 07:30:00+00:00,0.3285325978056679 +2024-05-18 07:45:00+00:00,0.4673224213492524 +2024-05-18 08:00:00+00:00,0.527854583573339 +2024-05-18 08:15:00+00:00,0.7799053725949059 +2024-05-18 08:30:00+00:00,0.9717219877137697 +2024-05-18 08:45:00+00:00,1.0968444696272186 +2024-05-18 09:00:00+00:00,1.3388652672637609 +2024-05-18 09:15:00+00:00,3.1436971049177327 +2024-05-18 09:30:00+00:00,4.655458923581675 +2024-05-18 09:45:00+00:00,5.137322649859934 +2024-05-18 10:00:00+00:00,5.2848534224033 +2024-05-18 10:15:00+00:00,5.598291505544634 +2024-05-18 10:30:00+00:00,5.636636307526377 +2024-05-18 10:45:00+00:00,5.545475284979862 +2024-05-18 11:00:00+00:00,5.589633985670239 +2024-05-18 11:15:00+00:00,5.383360995278289 +2024-05-18 11:30:00+00:00,5.384254730610373 +2024-05-18 11:45:00+00:00,4.88440703174129 +2024-05-18 12:00:00+00:00,4.919516456735288 +2024-05-18 12:15:00+00:00,4.94248530396299 +2024-05-18 12:30:00+00:00,4.254527104588841 +2024-05-18 12:45:00+00:00,4.271243838460254 +2024-05-18 13:00:00+00:00,4.185737456498251 +2024-05-18 13:15:00+00:00,3.384329615473886 +2024-05-18 13:30:00+00:00,3.0931600914708435 +2024-05-18 13:45:00+00:00,2.544878316360065 +2024-05-18 14:00:00+00:00,2.0472403558556254 +2024-05-18 14:15:00+00:00,1.5377382437766904 +2024-05-18 14:30:00+00:00,0.8796660357953863 +2024-05-18 14:45:00+00:00,0.5367508426450058 +2024-05-18 15:00:00+00:00,0.06237107278892551 +2024-05-18 15:15:00+00:00,0.0 +2024-05-19 06:00:00+00:00,0.0 +2024-05-19 06:15:00+00:00,0.0 +2024-05-19 06:30:00+00:00,0.0 +2024-05-19 06:45:00+00:00,0.01696838840197068 +2024-05-19 07:00:00+00:00,0.08253457125240238 +2024-05-19 07:15:00+00:00,0.1924106549045015 +2024-05-19 07:30:00+00:00,0.32156605254199233 +2024-05-19 07:45:00+00:00,0.4543440530919449 +2024-05-19 08:00:00+00:00,0.6528732238654666 +2024-05-19 08:15:00+00:00,1.0120230840405005 +2024-05-19 08:30:00+00:00,1.244060905262382 +2024-05-19 08:45:00+00:00,1.614671644695223 +2024-05-19 09:00:00+00:00,1.9593714128320856 +2024-05-19 09:15:00+00:00,2.3178989794222504 +2024-05-19 09:30:00+00:00,3.763614661699774 +2024-05-19 09:45:00+00:00,4.796998570568887 +2024-05-19 10:00:00+00:00,4.550241753053895 +2024-05-19 10:15:00+00:00,5.442772012678688 +2024-05-19 10:30:00+00:00,5.748024008996866 +2024-05-19 10:45:00+00:00,5.864476661162868 +2024-05-19 11:00:00+00:00,5.837112703321518 +2024-05-19 11:15:00+00:00,5.921174353270211 +2024-05-19 11:30:00+00:00,1.317726782722061 +2024-05-19 11:45:00+00:00,1.2809012880978594 +2024-05-19 12:00:00+00:00,1.0146030654949727 +2024-05-19 12:15:00+00:00,5.167536673853886 +2024-05-19 12:30:00+00:00,4.803755681039196 +2024-05-19 12:45:00+00:00,4.6133187680841115 +2024-05-19 13:00:00+00:00,4.2336847292935165 +2024-05-19 13:15:00+00:00,3.7528564132509357 +2024-05-19 13:30:00+00:00,2.6291835402434445 +2024-05-19 13:45:00+00:00,0.15195850395272648 +2024-05-19 14:00:00+00:00,0.2432156577420337 +2024-05-19 14:15:00+00:00,0.33411243304540883 +2024-05-19 14:30:00+00:00,1.4290125201938992 +2024-05-19 14:45:00+00:00,0.6562530313025037 +2024-05-19 15:00:00+00:00,0.1640468978716083 +2024-05-19 15:15:00+00:00,0.0 +2024-05-20 04:15:00+00:00,0.0 +2024-05-20 04:30:00+00:00,0.0 +2024-05-20 04:45:00+00:00,0.0 +2024-05-20 05:00:00+00:00,0.07713696836556094 +2024-05-20 05:15:00+00:00,0.1231351845501849 +2024-05-20 05:30:00+00:00,0.11223430375728549 +2024-05-20 05:45:00+00:00,0.0 +2024-05-20 06:00:00+00:00,0.0 +2024-05-20 06:15:00+00:00,0.0 +2024-05-20 06:30:00+00:00,0.0 +2024-05-20 06:45:00+00:00,0.035808528406425566 +2024-05-20 07:00:00+00:00,0.8436566896320559 +2024-05-20 07:15:00+00:00,1.1418203930181665 +2024-05-20 07:30:00+00:00,1.2679861109745822 +2024-05-20 07:45:00+00:00,1.5919980956419164 +2024-05-20 08:00:00+00:00,1.8331830768697115 +2024-05-20 08:15:00+00:00,1.6945508379402647 +2024-05-20 08:30:00+00:00,2.190277938662092 +2024-05-20 08:45:00+00:00,2.868377429508256 +2024-05-20 09:00:00+00:00,2.7763559126618875 +2024-05-20 09:15:00+00:00,5.474090280603995 +2024-05-20 09:30:00+00:00,6.137355813941362 +2024-05-20 09:45:00+00:00,6.937083024845991 +2024-05-20 10:00:00+00:00,5.690426927649457 +2024-05-20 10:15:00+00:00,5.6567560856535675 +2024-05-20 10:30:00+00:00,3.2060921902082278 +2024-05-20 10:45:00+00:00,3.539611066215684 +2024-05-20 11:00:00+00:00,2.323109075099785 +2024-05-20 11:15:00+00:00,1.6430900811774785 +2024-05-20 11:30:00+00:00,0.8967761698065568 +2024-05-20 11:45:00+00:00,0.44401721418829787 +2024-05-20 12:00:00+00:00,0.4439986804763352 +2024-05-20 12:15:00+00:00,3.6775787037919185 +2024-05-20 12:30:00+00:00,3.8184789038194724 +2024-05-20 12:45:00+00:00,5.006306209086847 +2024-05-20 13:00:00+00:00,4.672133089762824 +2024-05-20 13:15:00+00:00,4.272147959715893 +2024-05-20 13:30:00+00:00,3.941566779698679 +2024-05-20 13:45:00+00:00,3.206182615922155 +2024-05-20 14:00:00+00:00,2.4655386736010168 +2024-05-20 14:15:00+00:00,2.1029943709827705 +2024-05-20 14:30:00+00:00,1.4549816138251084 +2024-05-20 14:45:00+00:00,0.8436537560928212 +2024-05-20 15:00:00+00:00,0.34295193987483863 +2024-05-20 15:15:00+00:00,0.0 +2024-05-21 04:45:00+00:00,0.0 +2024-05-21 05:00:00+00:00,0.0 +2024-05-21 05:15:00+00:00,0.0 +2024-05-21 05:30:00+00:00,0.0 +2024-05-21 05:45:00+00:00,0.0 +2024-05-21 06:00:00+00:00,0.0 +2024-05-21 06:15:00+00:00,0.0 +2024-05-21 06:30:00+00:00,0.0 +2024-05-21 06:45:00+00:00,0.0 +2024-05-21 07:00:00+00:00,0.0 +2024-05-21 07:15:00+00:00,0.03898978656435137 +2024-05-21 07:30:00+00:00,0.05544487861435132 +2024-05-21 07:45:00+00:00,0.11770805464971179 +2024-05-21 08:00:00+00:00,0.31322785096402694 +2024-05-21 08:15:00+00:00,0.4653058709854716 +2024-05-21 08:30:00+00:00,0.7156201133103917 +2024-05-21 08:45:00+00:00,0.7745908256135217 +2024-05-21 09:00:00+00:00,0.8311318681489606 +2024-05-21 09:15:00+00:00,1.117690694842442 +2024-05-21 09:30:00+00:00,3.3418389160955213 +2024-05-21 09:45:00+00:00,4.707503111721052 +2024-05-21 10:00:00+00:00,5.6013565052828564 +2024-05-21 10:15:00+00:00,6.143179714538103 +2024-05-21 10:30:00+00:00,6.728128490354939 +2024-05-21 10:45:00+00:00,6.575494849145542 +2024-05-21 11:00:00+00:00,6.537049509176651 +2024-05-21 11:15:00+00:00,7.102514599997244 +2024-05-21 11:30:00+00:00,6.859312056882196 +2024-05-21 11:45:00+00:00,6.545908878917283 +2024-05-21 12:00:00+00:00,6.715227284883259 +2024-05-21 12:15:00+00:00,6.122261499161215 +2024-05-21 12:30:00+00:00,6.2661091288373 +2024-05-21 12:45:00+00:00,6.054699708667282 +2024-05-21 13:00:00+00:00,5.425677318502125 +2024-05-21 13:15:00+00:00,4.582282032440885 +2024-05-21 13:30:00+00:00,4.25598655232205 +2024-05-21 13:45:00+00:00,3.631339176330739 +2024-05-21 14:00:00+00:00,2.7771337782984165 +2024-05-21 14:15:00+00:00,2.112660925560079 +2024-05-21 14:30:00+00:00,1.4772485028121891 +2024-05-21 14:45:00+00:00,0.8033061515622626 +2024-05-21 15:00:00+00:00,0.2349039370727164 +2024-05-21 15:15:00+00:00,0.0 +2024-05-22 06:00:00+00:00,0.0 +2024-05-22 06:15:00+00:00,0.0601551707297554 +2024-05-22 06:30:00+00:00,0.15781183842342306 +2024-05-22 06:45:00+00:00,0.241118632266623 +2024-05-22 07:00:00+00:00,0.7430203603379597 +2024-05-22 07:15:00+00:00,0.7062550715059517 +2024-05-22 07:30:00+00:00,0.8934364096923889 +2024-05-22 07:45:00+00:00,0.943236075928048 +2024-05-22 08:00:00+00:00,1.027274956977903 +2024-05-22 08:15:00+00:00,1.4900909421556552 +2024-05-22 08:30:00+00:00,1.4283802132481922 +2024-05-22 08:45:00+00:00,1.5840052870522834 +2024-05-22 09:00:00+00:00,2.014914357205426 +2024-05-22 09:15:00+00:00,3.136618376228033 +2024-05-22 09:30:00+00:00,6.1698294439633585 +2024-05-22 09:45:00+00:00,8.20380857435918 +2024-05-22 10:00:00+00:00,7.188324709580327 +2024-05-22 10:15:00+00:00,8.573843778420198 +2024-05-22 10:30:00+00:00,8.372988948301748 +2024-05-22 10:45:00+00:00,7.942822165939002 +2024-05-22 11:00:00+00:00,8.141813879560344 +2024-05-22 11:15:00+00:00,7.721637570331077 +2024-05-22 11:30:00+00:00,7.502036753960597 +2024-05-22 11:45:00+00:00,7.061062840854207 +2024-05-22 12:00:00+00:00,2.6001628224928703 +2024-05-22 12:15:00+00:00,6.652093753231488 +2024-05-22 12:30:00+00:00,6.528486521287768 +2024-05-22 12:45:00+00:00,6.833837775968979 +2024-05-22 13:00:00+00:00,6.504639867473274 +2024-05-22 13:15:00+00:00,5.255866109441174 +2024-05-22 13:30:00+00:00,3.689573884921531 +2024-05-22 13:45:00+00:00,5.626199852439426 +2024-05-22 14:00:00+00:00,5.047905318044842 +2024-05-22 14:15:00+00:00,4.532484629201676 +2024-05-22 14:30:00+00:00,1.0308540272568338 +2024-05-22 14:45:00+00:00,2.0818765986420864 +2024-05-22 15:00:00+00:00,1.3143493407468887 +2024-05-22 15:15:00+00:00,0.49422738963106716 +2024-05-23 03:45:00+00:00,1.4407189815525667 +2024-05-23 04:00:00+00:00,0.14132107127711735 +2024-05-23 04:15:00+00:00,8.923844538844893 +2024-05-23 04:30:00+00:00,10.34853341148226 +2024-05-23 04:45:00+00:00,13.33111448925027 +2024-05-23 05:00:00+00:00,15.052199002695524 +2024-05-23 05:15:00+00:00,15.567571986672426 +2024-05-23 05:30:00+00:00,15.302791864822325 +2024-05-23 05:45:00+00:00,7.74416931336748 +2024-05-23 06:00:00+00:00,13.22226653813632 +2024-05-23 06:15:00+00:00,3.218178178319709 +2024-05-23 06:30:00+00:00,3.6097214206831914 +2024-05-23 06:45:00+00:00,0.0 +2024-05-23 07:00:00+00:00,0.0 +2024-05-23 07:15:00+00:00,0.0 +2024-05-23 07:30:00+00:00,0.0 +2024-05-23 07:45:00+00:00,0.0 +2024-05-23 08:00:00+00:00,0.0 +2024-05-23 08:15:00+00:00,1.7468477236867497 +2024-05-23 08:30:00+00:00,5.707329752288796 +2024-05-23 08:45:00+00:00,0.17701314100605936 +2024-05-23 09:00:00+00:00,0.0 +2024-05-23 09:15:00+00:00,0.0 +2024-05-23 09:30:00+00:00,0.0 +2024-05-23 09:45:00+00:00,0.0 +2024-05-23 10:00:00+00:00,0.0 +2024-05-23 10:15:00+00:00,0.0 +2024-05-23 10:30:00+00:00,0.0 +2024-05-23 10:45:00+00:00,0.0 +2024-05-23 11:00:00+00:00,0.0 +2024-05-23 11:15:00+00:00,0.06616526775750309 +2024-05-23 11:30:00+00:00,0.0 +2024-05-23 11:45:00+00:00,1.4253639915305145 +2024-05-23 12:00:00+00:00,0.6194596060046802 +2024-05-23 12:15:00+00:00,0.6123104887461697 +2024-05-23 12:30:00+00:00,0.0 +2024-05-23 12:45:00+00:00,0.35772497093017286 +2024-05-23 13:00:00+00:00,0.7892517842046995 +2024-05-23 13:15:00+00:00,1.6162345042631638 +2024-05-23 13:30:00+00:00,0.4561035009664214 +2024-05-23 13:45:00+00:00,2.5199518177442286 +2024-05-23 14:00:00+00:00,2.586378544410747 +2024-05-23 14:15:00+00:00,2.6877911191919064 +2024-05-23 14:30:00+00:00,2.251913688728978 +2024-05-23 14:45:00+00:00,1.893850777978803 +2024-05-23 15:00:00+00:00,1.3117786422145692 +2024-05-23 15:15:00+00:00,0.0 +2024-05-23 15:30:00+00:00,0.27374386210977275 +2024-05-23 15:45:00+00:00,0.0 +2024-05-24 03:00:00+00:00,1.9554487953437292 +2024-05-24 03:15:00+00:00,2.7154360947711176 +2024-05-24 03:30:00+00:00,3.3976994165560512 +2024-05-24 03:45:00+00:00,5.838277556650453 +2024-05-24 04:00:00+00:00,6.547234894973029 +2024-05-24 04:15:00+00:00,6.7658689008557396 +2024-05-24 04:30:00+00:00,7.083142214427154 +2024-05-24 04:45:00+00:00,6.092282948084113 +2024-05-24 05:00:00+00:00,6.959372072933718 +2024-05-24 05:15:00+00:00,7.04719092664912 +2024-05-24 05:30:00+00:00,7.419140120065663 +2024-05-24 05:45:00+00:00,7.1276329492344255 +2024-05-24 06:00:00+00:00,7.445641288179602 +2024-05-24 06:15:00+00:00,7.24498105586844 +2024-05-24 06:30:00+00:00,7.554519962408323 +2024-05-24 06:45:00+00:00,6.988308055040842 +2024-05-24 07:00:00+00:00,6.562652139261738 +2024-05-24 07:15:00+00:00,6.461196320772893 +2024-05-24 07:30:00+00:00,5.949331178526287 +2024-05-24 07:45:00+00:00,6.023973453600192 +2024-05-24 08:00:00+00:00,6.410428346205826 +2024-05-24 08:15:00+00:00,6.3389322865968225 +2024-05-24 08:30:00+00:00,7.01789101464396 +2024-05-24 08:45:00+00:00,6.273281634555692 +2024-05-24 09:00:00+00:00,4.886243362473808 +2024-05-24 09:15:00+00:00,4.02081920358692 +2024-05-24 09:30:00+00:00,4.5972547305306 +2024-05-24 09:45:00+00:00,4.3889245662948575 +2024-05-24 10:00:00+00:00,3.5282041115559943 +2024-05-24 10:15:00+00:00,3.821331325889326 +2024-05-24 10:30:00+00:00,4.602283633443165 +2024-05-24 10:45:00+00:00,3.650600265172054 +2024-05-24 11:00:00+00:00,3.250502347344251 +2024-05-24 11:15:00+00:00,2.267166757134066 +2024-05-24 11:30:00+00:00,3.2548238332158457 +2024-05-24 11:45:00+00:00,4.965511220205118 +2024-05-24 12:00:00+00:00,4.729214746476768 +2024-05-24 12:15:00+00:00,4.893970628822973 +2024-05-24 12:30:00+00:00,5.187742901836633 +2024-05-24 12:45:00+00:00,6.2249839319024325 +2024-05-24 13:00:00+00:00,6.605786747545039 +2024-05-24 13:15:00+00:00,7.548873486065668 +2024-05-24 13:30:00+00:00,8.14095050404025 +2024-05-24 13:45:00+00:00,8.368632843113009 +2024-05-24 14:00:00+00:00,8.654224973379796 +2024-05-24 14:15:00+00:00,8.132046226876906 +2024-05-24 14:30:00+00:00,7.876719097962244 +2024-05-24 14:45:00+00:00,7.197655057311694 +2024-05-24 15:00:00+00:00,6.279133052032018 +2024-05-24 15:15:00+00:00,4.504458484319757 +2024-05-24 15:30:00+00:00,2.9695177856645327 +2024-05-24 15:45:00+00:00,1.4419175039166552 +2024-05-25 03:15:00+00:00,1.2729983096900552 +2024-05-25 03:30:00+00:00,6.374158703660393 +2024-05-25 03:45:00+00:00,5.729029022450369 +2024-05-25 04:00:00+00:00,6.941292011859476 +2024-05-25 04:15:00+00:00,9.60834107180827 +2024-05-25 04:30:00+00:00,9.898959864758133 +2024-05-25 04:45:00+00:00,8.817083594952914 +2024-05-25 05:00:00+00:00,9.062769300656282 +2024-05-25 05:15:00+00:00,10.527655612602038 +2024-05-25 05:30:00+00:00,10.794459521074081 +2024-05-25 05:45:00+00:00,11.201078171141187 +2024-05-25 06:00:00+00:00,10.081414482070386 +2024-05-25 06:15:00+00:00,10.199972169088088 +2024-05-25 06:30:00+00:00,10.06138002066275 +2024-05-25 06:45:00+00:00,10.269934174916546 +2024-05-25 07:00:00+00:00,12.256521287452443 +2024-05-25 07:15:00+00:00,10.790880535388787 +2024-05-25 07:30:00+00:00,10.538026577423677 +2024-05-25 07:45:00+00:00,10.551319908228969 +2024-05-25 08:00:00+00:00,11.992095314127674 +2024-05-25 08:15:00+00:00,12.161796266866368 +2024-05-25 08:30:00+00:00,10.936641375724552 +2024-05-25 08:45:00+00:00,11.84042269387175 +2024-05-25 09:00:00+00:00,10.75646594052971 +2024-05-25 09:15:00+00:00,10.46570845938707 +2024-05-25 09:30:00+00:00,10.54726229845229 +2024-05-25 09:45:00+00:00,11.221852448514632 +2024-05-25 10:00:00+00:00,11.623718548469762 +2024-05-25 10:15:00+00:00,11.162317612385246 +2024-05-25 10:30:00+00:00,8.300131932559063 +2024-05-25 10:45:00+00:00,10.57568879685133 +2024-05-25 11:00:00+00:00,10.771466398475646 +2024-05-25 11:15:00+00:00,10.520793797236037 +2024-05-25 11:30:00+00:00,9.995710303305124 +2024-05-25 11:45:00+00:00,10.200698885866174 +2024-05-25 12:00:00+00:00,9.89107087231283 +2024-05-25 12:15:00+00:00,10.710933445812143 +2024-05-25 12:30:00+00:00,10.632221466496144 +2024-05-25 12:45:00+00:00,10.895341929122289 +2024-05-25 13:00:00+00:00,11.32102151279273 +2024-05-25 13:15:00+00:00,11.16072190921642 +2024-05-25 13:30:00+00:00,11.589415418486361 +2024-05-25 13:45:00+00:00,11.333384594532989 +2024-05-25 14:00:00+00:00,11.04660755013025 +2024-05-25 14:15:00+00:00,10.426006746807385 +2024-05-25 14:30:00+00:00,10.01700277516014 +2024-05-25 14:45:00+00:00,9.218985885061079 +2024-05-25 15:00:00+00:00,7.73781640547738 +2024-05-25 15:15:00+00:00,6.152784527155699 +2024-05-25 15:30:00+00:00,4.516995406392199 +2024-05-25 15:45:00+00:00,2.651710141269868 +2024-05-25 16:00:00+00:00,1.2756882002830618 +2024-05-26 03:00:00+00:00,3.675091306519807 +2024-05-26 03:15:00+00:00,5.690841731217226 +2024-05-26 03:30:00+00:00,7.3699498256758105 +2024-05-26 03:45:00+00:00,8.674105459129075 +2024-05-26 04:00:00+00:00,9.340160489982463 +2024-05-26 04:15:00+00:00,9.985908468255632 +2024-05-26 04:30:00+00:00,10.139915855694433 +2024-05-26 04:45:00+00:00,10.577953122667694 +2024-05-26 05:00:00+00:00,10.635817290562755 +2024-05-26 05:15:00+00:00,11.194888334893351 +2024-05-26 05:30:00+00:00,11.338110809914298 +2024-05-26 05:45:00+00:00,11.29233572162074 +2024-05-26 06:00:00+00:00,11.568365668719558 +2024-05-26 06:15:00+00:00,11.708189965106287 +2024-05-26 06:30:00+00:00,11.760994540706337 +2024-05-26 06:45:00+00:00,12.095477625091545 +2024-05-26 07:00:00+00:00,11.75631016243555 +2024-05-26 07:15:00+00:00,11.983501716986444 +2024-05-26 07:30:00+00:00,12.263566343217008 +2024-05-26 07:45:00+00:00,12.18480148171681 +2024-05-26 08:00:00+00:00,11.944428357325707 +2024-05-26 08:15:00+00:00,11.96246971058866 +2024-05-26 08:30:00+00:00,11.889328644117352 +2024-05-26 08:45:00+00:00,11.48271767353145 +2024-05-26 09:00:00+00:00,11.006038541681184 +2024-05-26 09:15:00+00:00,11.525314938106243 +2024-05-26 09:30:00+00:00,10.516067929703265 +2024-05-26 09:45:00+00:00,11.147196129901793 +2024-05-26 10:00:00+00:00,10.249467652433879 +2024-05-26 10:15:00+00:00,10.120584144348818 +2024-05-26 10:30:00+00:00,9.293619354072641 +2024-05-26 10:45:00+00:00,8.927028911215874 +2024-05-26 11:00:00+00:00,9.80412043469221 +2024-05-26 11:15:00+00:00,9.352671098680299 +2024-05-26 11:30:00+00:00,8.891142527767043 +2024-05-26 11:45:00+00:00,8.710959692417536 +2024-05-26 12:00:00+00:00,10.569642796789704 +2024-05-26 12:15:00+00:00,10.117481560110727 +2024-05-26 12:30:00+00:00,9.611856914568271 +2024-05-26 12:45:00+00:00,10.227621111665135 +2024-05-26 13:00:00+00:00,10.53662916094985 +2024-05-26 13:15:00+00:00,10.034115683492201 +2024-05-26 13:30:00+00:00,10.588811781848015 +2024-05-26 13:45:00+00:00,10.165620826835541 +2024-05-26 14:00:00+00:00,10.454158625720243 +2024-05-26 14:15:00+00:00,9.789859137771487 +2024-05-26 14:30:00+00:00,8.951629420497122 +2024-05-26 14:45:00+00:00,7.726756527245775 +2024-05-26 15:00:00+00:00,6.121993372001166 +2024-05-26 15:15:00+00:00,4.584503572236916 +2024-05-26 15:30:00+00:00,2.7567406298209245 +2024-05-26 15:45:00+00:00,1.9981202086962067 +2024-05-26 16:00:00+00:00,0.31684635039553233 +2024-05-27 03:00:00+00:00,1.478269484365112 +2024-05-27 03:15:00+00:00,2.570198485613279 +2024-05-27 03:30:00+00:00,3.787628935109806 +2024-05-27 03:45:00+00:00,3.718517770966335 +2024-05-27 04:00:00+00:00,3.909097950313057 +2024-05-27 04:15:00+00:00,5.340155879169496 +2024-05-27 04:30:00+00:00,5.556100399817743 +2024-05-27 04:45:00+00:00,5.658088536694284 +2024-05-27 05:00:00+00:00,8.052694198540154 +2024-05-27 05:15:00+00:00,8.967238229257209 +2024-05-27 05:30:00+00:00,8.671732606060566 +2024-05-27 05:45:00+00:00,7.3010747272364425 +2024-05-27 06:00:00+00:00,8.4523065413495 +2024-05-27 06:15:00+00:00,8.06638656509096 +2024-05-27 06:30:00+00:00,7.822562752181331 +2024-05-27 06:45:00+00:00,8.57389934703332 +2024-05-27 07:00:00+00:00,8.250655804001596 +2024-05-27 07:15:00+00:00,8.508532641515918 +2024-05-27 07:30:00+00:00,7.963831552757945 +2024-05-27 07:45:00+00:00,7.1014608118925375 +2024-05-27 08:00:00+00:00,7.024881241109949 +2024-05-27 08:15:00+00:00,6.393779892493273 +2024-05-27 08:30:00+00:00,4.954623029061757 +2024-05-27 08:45:00+00:00,5.340980739222358 +2024-05-27 09:00:00+00:00,2.6357286673209144 +2024-05-27 09:15:00+00:00,3.239650105808489 +2024-05-27 09:30:00+00:00,2.633293215791937 +2024-05-27 09:45:00+00:00,2.2988074981098334 +2024-05-27 10:00:00+00:00,5.181539166833293 +2024-05-27 10:15:00+00:00,8.695268750442558 +2024-05-27 10:30:00+00:00,11.678092751718205 +2024-05-27 10:45:00+00:00,11.048019322398703 +2024-05-27 11:00:00+00:00,10.35781172914438 +2024-05-27 11:15:00+00:00,9.710060590225227 +2024-05-27 11:30:00+00:00,11.05704131312303 +2024-05-27 11:45:00+00:00,12.594021807142273 +2024-05-27 12:00:00+00:00,13.402683246964237 +2024-05-27 12:15:00+00:00,13.277959557057294 +2024-05-27 12:30:00+00:00,13.994450280215535 +2024-05-27 12:45:00+00:00,15.360270807851784 +2024-05-27 13:00:00+00:00,16.088337634228893 +2024-05-27 13:15:00+00:00,15.121342658020259 +2024-05-27 13:30:00+00:00,14.816296541411905 +2024-05-27 13:45:00+00:00,14.410546620683396 +2024-05-27 14:00:00+00:00,13.415323012167843 +2024-05-27 14:15:00+00:00,12.749179566719913 +2024-05-27 14:30:00+00:00,11.572397873879734 +2024-05-27 14:45:00+00:00,10.047255645047427 +2024-05-27 15:00:00+00:00,8.299663290927445 +2024-05-27 15:15:00+00:00,6.492015307347156 +2024-05-27 15:30:00+00:00,4.535160698768274 +2024-05-27 15:45:00+00:00,3.0062466089257867 +2024-05-27 16:00:00+00:00,1.326284600589353 +2024-05-28 03:00:00+00:00,3.517651564056923 +2024-05-28 03:15:00+00:00,5.67334121008219 +2024-05-28 03:30:00+00:00,6.150779715564228 +2024-05-28 03:45:00+00:00,6.583855918816592 +2024-05-28 04:00:00+00:00,8.451654180429081 +2024-05-28 04:15:00+00:00,8.60581354603638 +2024-05-28 04:30:00+00:00,12.644107529002614 +2024-05-28 04:45:00+00:00,12.380380215731714 +2024-05-28 05:00:00+00:00,13.358571682180187 +2024-05-28 05:15:00+00:00,14.048387444501346 +2024-05-28 05:30:00+00:00,14.543604366885093 +2024-05-28 05:45:00+00:00,15.161068047796862 +2024-05-28 06:00:00+00:00,14.467419863105425 +2024-05-28 06:15:00+00:00,15.422585135507457 +2024-05-28 06:30:00+00:00,15.193934721683041 +2024-05-28 06:45:00+00:00,15.487113658616142 +2024-05-28 07:00:00+00:00,15.491185524530959 +2024-05-28 07:15:00+00:00,15.807124472788908 +2024-05-28 07:30:00+00:00,16.615325926710707 +2024-05-28 07:45:00+00:00,17.074321572521733 +2024-05-28 08:00:00+00:00,17.414622832859653 +2024-05-28 08:15:00+00:00,16.725827811379 +2024-05-28 08:30:00+00:00,17.661445941656915 +2024-05-28 08:45:00+00:00,18.554842236028932 +2024-05-28 09:00:00+00:00,18.43299969988508 +2024-05-28 09:15:00+00:00,15.182079134310824 +2024-05-28 09:30:00+00:00,18.04445986360657 +2024-05-28 09:45:00+00:00,17.58301933025884 +2024-05-28 10:00:00+00:00,17.22838499978913 +2024-05-28 10:15:00+00:00,17.110719074739915 +2024-05-28 10:30:00+00:00,17.59443091063554 +2024-05-28 10:45:00+00:00,16.623437084271828 +2024-05-28 11:00:00+00:00,15.907862669745914 +2024-05-28 11:15:00+00:00,17.896761778206592 +2024-05-28 11:30:00+00:00,14.232211103982646 +2024-05-28 11:45:00+00:00,15.213649535784995 +2024-05-28 12:00:00+00:00,13.585543384062797 +2024-05-28 12:15:00+00:00,11.791847002043639 +2024-05-28 12:30:00+00:00,11.679698370288516 +2024-05-28 12:45:00+00:00,13.056558973474923 +2024-05-28 13:00:00+00:00,14.067493506657591 +2024-05-28 13:15:00+00:00,16.138495798079777 +2024-05-28 13:30:00+00:00,13.58115860040026 +2024-05-28 13:45:00+00:00,12.032965148223578 +2024-05-28 14:00:00+00:00,14.310738816754382 +2024-05-28 14:15:00+00:00,14.795198689064156 +2024-05-28 14:30:00+00:00,10.064492717009692 +2024-05-28 14:45:00+00:00,7.163297383924208 +2024-05-28 15:00:00+00:00,6.450144766382147 +2024-05-28 15:15:00+00:00,6.8593306439598996 +2024-05-28 15:30:00+00:00,6.2033330677700045 +2024-05-28 15:45:00+00:00,5.586469244810091 +2024-05-28 16:00:00+00:00,2.1227990544498168 +2024-05-29 03:00:00+00:00,3.7475415262351226 +2024-05-29 03:15:00+00:00,6.875149025112246 +2024-05-29 03:30:00+00:00,9.086208674363743 +2024-05-29 03:45:00+00:00,10.830440464883623 +2024-05-29 04:00:00+00:00,11.723240956201906 +2024-05-29 04:15:00+00:00,12.286082531328233 +2024-05-29 04:30:00+00:00,13.135962279591991 +2024-05-29 04:45:00+00:00,12.810674067078901 +2024-05-29 05:00:00+00:00,10.677558534698987 +2024-05-29 05:15:00+00:00,13.018825243451063 +2024-05-29 05:30:00+00:00,14.096347501847726 +2024-05-29 05:45:00+00:00,13.722481171119888 +2024-05-29 06:00:00+00:00,14.548950414565452 +2024-05-29 06:15:00+00:00,14.403698559127896 +2024-05-29 06:30:00+00:00,15.2371957070496 +2024-05-29 06:45:00+00:00,14.981747880566822 +2024-05-29 07:00:00+00:00,15.259382434743264 +2024-05-29 07:15:00+00:00,15.27362926990073 +2024-05-29 07:30:00+00:00,15.84648936432922 +2024-05-29 07:45:00+00:00,16.022022027215197 +2024-05-29 08:00:00+00:00,15.336950665843842 +2024-05-29 08:15:00+00:00,16.201475742902307 +2024-05-29 08:30:00+00:00,16.21579778498463 +2024-05-29 08:45:00+00:00,16.44351144363349 +2024-05-29 09:00:00+00:00,16.26392800305198 +2024-05-29 09:15:00+00:00,16.53586246407701 +2024-05-29 09:30:00+00:00,15.541109058200146 +2024-05-29 09:45:00+00:00,15.361488004363114 +2024-05-29 10:00:00+00:00,15.357286914578792 +2024-05-29 10:15:00+00:00,15.18924402707802 +2024-05-29 10:30:00+00:00,15.018499953127897 +2024-05-29 10:45:00+00:00,13.627268797290725 +2024-05-29 11:00:00+00:00,14.620352146491605 +2024-05-29 11:15:00+00:00,14.16160763217416 +2024-05-29 11:30:00+00:00,14.1549653863625 +2024-05-29 11:45:00+00:00,14.875458114605605 +2024-05-29 12:00:00+00:00,15.55510894644777 +2024-05-29 12:15:00+00:00,15.616531365075968 +2024-05-29 12:30:00+00:00,15.660685094921957 +2024-05-29 12:45:00+00:00,15.572706838737911 +2024-05-29 13:00:00+00:00,15.201784264562102 +2024-05-29 13:15:00+00:00,14.816712315342835 +2024-05-29 13:30:00+00:00,14.765328071719356 +2024-05-29 13:45:00+00:00,14.11104329622551 +2024-05-29 14:00:00+00:00,13.874878191803596 +2024-05-29 14:15:00+00:00,13.396180884697635 +2024-05-29 14:30:00+00:00,12.165103903219874 +2024-05-29 14:45:00+00:00,11.050332749721967 +2024-05-29 15:00:00+00:00,9.520737559988707 +2024-05-29 15:15:00+00:00,7.60867138894635 +2024-05-29 15:30:00+00:00,5.498099634465026 +2024-05-29 15:45:00+00:00,3.4578678184173803 +2024-05-29 16:00:00+00:00,1.6952637896284457 +2024-05-30 03:00:00+00:00,2.046201415962113 +2024-05-30 03:15:00+00:00,4.513161258055843 +2024-05-30 03:30:00+00:00,9.280488124503009 +2024-05-30 03:45:00+00:00,9.990360565754791 +2024-05-30 04:00:00+00:00,11.504164586450663 +2024-05-30 04:15:00+00:00,12.197916014223928 +2024-05-30 04:30:00+00:00,13.184477124706529 +2024-05-30 04:45:00+00:00,9.302897016395894 +2024-05-30 05:00:00+00:00,13.639976218551766 +2024-05-30 05:15:00+00:00,12.992346210650645 +2024-05-30 05:30:00+00:00,10.126327774725834 +2024-05-30 05:45:00+00:00,13.611526574973546 +2024-05-30 06:00:00+00:00,13.87305579365842 +2024-05-30 06:15:00+00:00,15.302629323114497 +2024-05-30 06:30:00+00:00,14.392773000771323 +2024-05-30 06:45:00+00:00,14.904404207163637 +2024-05-30 07:00:00+00:00,15.228591752253587 +2024-05-30 07:15:00+00:00,15.460163664723119 +2024-05-30 07:30:00+00:00,15.558207986713754 +2024-05-30 07:45:00+00:00,15.671976758208132 +2024-05-30 08:00:00+00:00,15.423704992286227 +2024-05-30 08:15:00+00:00,15.509276022583158 +2024-05-30 08:30:00+00:00,15.497394973804436 +2024-05-30 08:45:00+00:00,15.483067855702085 +2024-05-30 09:00:00+00:00,15.967995963067722 +2024-05-30 09:15:00+00:00,16.39432743744229 +2024-05-30 09:30:00+00:00,16.761455152635072 +2024-05-30 09:45:00+00:00,16.420455264837358 +2024-05-30 10:00:00+00:00,16.16990399700642 +2024-05-30 10:15:00+00:00,15.872669963840728 +2024-05-30 10:30:00+00:00,15.925253944272104 +2024-05-30 10:45:00+00:00,16.456319975184048 +2024-05-30 11:00:00+00:00,15.863696301105142 +2024-05-30 11:15:00+00:00,15.450892080950474 +2024-05-30 11:30:00+00:00,15.556715399196277 +2024-05-30 11:45:00+00:00,15.902362729019075 +2024-05-30 12:00:00+00:00,15.976543437069276 +2024-05-30 12:15:00+00:00,16.031349697792574 +2024-05-30 12:30:00+00:00,16.469106045747413 +2024-05-30 12:45:00+00:00,15.774704891766852 +2024-05-30 13:00:00+00:00,15.698329117372447 +2024-05-30 13:15:00+00:00,15.449451570414757 +2024-05-30 13:30:00+00:00,14.487466102940765 +2024-05-30 13:45:00+00:00,14.339058300331528 +2024-05-30 14:00:00+00:00,13.548676177696537 +2024-05-30 14:15:00+00:00,12.918376662072308 +2024-05-30 14:30:00+00:00,11.88721520327813 +2024-05-30 14:45:00+00:00,9.689655633008318 +2024-05-30 15:00:00+00:00,5.353258371699218 +2024-05-30 15:15:00+00:00,4.943975499582951 +2024-05-30 15:30:00+00:00,1.7778535086070952 +2024-05-30 15:45:00+00:00,3.284832602935069 +2024-05-30 16:00:00+00:00,1.0081798835649969 +2024-05-31 03:00:00+00:00,4.427652309058371 +2024-05-31 03:15:00+00:00,7.2999008557724165 +2024-05-31 03:30:00+00:00,8.81599962544411 +2024-05-31 03:45:00+00:00,10.163510066802885 +2024-05-31 04:00:00+00:00,10.879325794714976 +2024-05-31 04:15:00+00:00,11.656957409085447 +2024-05-31 04:30:00+00:00,12.183867528624683 +2024-05-31 04:45:00+00:00,12.79650178915782 +2024-05-31 05:00:00+00:00,13.421714960537733 +2024-05-31 05:15:00+00:00,13.84210073724815 +2024-05-31 05:30:00+00:00,14.349321785026499 +2024-05-31 05:45:00+00:00,13.931665136547881 +2024-05-31 06:00:00+00:00,14.187515706527613 +2024-05-31 06:15:00+00:00,14.392351375768222 +2024-05-31 06:30:00+00:00,14.597463453206013 +2024-05-31 06:45:00+00:00,15.067032633775995 +2024-05-31 07:00:00+00:00,15.307221706097694 +2024-05-31 07:15:00+00:00,15.236571215062861 +2024-05-31 07:30:00+00:00,15.911957326522174 +2024-05-31 07:45:00+00:00,15.44393592588321 +2024-05-31 08:00:00+00:00,15.676315646078345 +2024-05-31 08:15:00+00:00,13.678459084558792 +2024-05-31 08:30:00+00:00,13.88230255066925 +2024-05-31 08:45:00+00:00,14.910137164605647 +2024-05-31 09:00:00+00:00,14.455986601846996 +2024-05-31 09:15:00+00:00,13.760245265842178 +2024-05-31 09:30:00+00:00,14.139179980453454 +2024-05-31 09:45:00+00:00,12.67057321499073 +2024-05-31 10:00:00+00:00,13.49814327262027 +2024-05-31 10:15:00+00:00,13.821908181613637 +2024-05-31 10:30:00+00:00,14.235948371321932 +2024-05-31 10:45:00+00:00,13.993549432157003 +2024-05-31 11:00:00+00:00,13.114362637425877 +2024-05-31 11:15:00+00:00,12.368728801288377 +2024-05-31 11:30:00+00:00,13.317232096903389 +2024-05-31 11:45:00+00:00,12.722050118657618 +2024-05-31 12:00:00+00:00,11.532695539739262 +2024-05-31 12:15:00+00:00,12.878750942086443 +2024-05-31 12:30:00+00:00,12.640172767305398 +2024-05-31 12:45:00+00:00,12.928140642143283 +2024-05-31 13:00:00+00:00,13.264173583875198 +2024-05-31 13:15:00+00:00,13.131260446718578 +2024-05-31 13:30:00+00:00,11.902631748370636 +2024-05-31 13:45:00+00:00,12.849791627876707 +2024-05-31 14:00:00+00:00,12.136676084300788 +2024-05-31 14:15:00+00:00,7.9721939446466745 +2024-05-31 14:30:00+00:00,10.816930918181834 +2024-05-31 14:45:00+00:00,7.091360379786565 +2024-05-31 15:00:00+00:00,6.4190294754115875 +2024-05-31 15:15:00+00:00,5.6958518651321 +2024-05-31 15:30:00+00:00,6.081882104958907 +2024-05-31 15:45:00+00:00,3.232297951248036 +2024-05-31 16:00:00+00:00,1.927493889404633 +2024-06-01 02:45:00+00:00,2.073170865963549 +2024-06-01 03:00:00+00:00,4.001836930812809 +2024-06-01 03:15:00+00:00,5.971689865206872 +2024-06-01 03:30:00+00:00,7.871217930115467 +2024-06-01 03:45:00+00:00,9.542075022757478 +2024-06-01 04:00:00+00:00,9.823567696926931 +2024-06-01 04:15:00+00:00,10.08639161499609 +2024-06-01 04:30:00+00:00,10.82079891698874 +2024-06-01 04:45:00+00:00,11.541403838530567 +2024-06-01 05:00:00+00:00,12.245984351421319 +2024-06-01 05:15:00+00:00,12.71603069771015 +2024-06-01 05:30:00+00:00,13.325784828262037 +2024-06-01 05:45:00+00:00,13.745816135693893 +2024-06-01 06:00:00+00:00,14.069366887635729 +2024-06-01 06:15:00+00:00,14.600833671647692 +2024-06-01 06:30:00+00:00,14.11609861331105 +2024-06-01 06:45:00+00:00,14.023419119363679 +2024-06-01 07:00:00+00:00,13.034604373495055 +2024-06-01 07:15:00+00:00,13.168178404700722 +2024-06-01 07:30:00+00:00,12.793124415778312 +2024-06-01 07:45:00+00:00,12.435361040763011 +2024-06-01 08:00:00+00:00,13.141107916645108 +2024-06-01 08:15:00+00:00,12.599911337692756 +2024-06-01 08:30:00+00:00,12.176950243721468 +2024-06-01 08:45:00+00:00,10.870012457594143 +2024-06-01 09:00:00+00:00,10.553742781156679 +2024-06-01 09:15:00+00:00,10.00723848288174 +2024-06-01 09:30:00+00:00,10.23514342992623 +2024-06-01 09:45:00+00:00,4.53957997257414 +2024-06-01 10:00:00+00:00,5.34247676466981 +2024-06-01 10:15:00+00:00,4.70089907408085 +2024-06-01 10:30:00+00:00,9.791317174471525 +2024-06-01 10:45:00+00:00,5.315517882767189 +2024-06-01 11:00:00+00:00,5.506143774666397 +2024-06-01 11:15:00+00:00,9.363337256414924 +2024-06-01 11:30:00+00:00,9.594837600339346 +2024-06-01 11:45:00+00:00,5.9725484583142485 +2024-06-01 12:00:00+00:00,9.630611472588354 +2024-06-01 12:15:00+00:00,10.132422397898686 +2024-06-01 12:30:00+00:00,10.625798352142201 +2024-06-01 12:45:00+00:00,9.388586473239663 +2024-06-01 13:00:00+00:00,10.214722149655474 +2024-06-01 13:15:00+00:00,9.813114274624114 +2024-06-01 13:30:00+00:00,11.093509466947346 +2024-06-01 13:45:00+00:00,11.361357070440611 +2024-06-01 14:00:00+00:00,10.803520531666688 +2024-06-01 14:15:00+00:00,10.648971026201549 +2024-06-01 14:30:00+00:00,9.362183803768763 +2024-06-01 14:45:00+00:00,8.68571489196992 +2024-06-01 15:00:00+00:00,7.927892043099798 +2024-06-01 15:15:00+00:00,6.058874903284146 +2024-06-01 15:30:00+00:00,4.4576209780498885 +2024-06-01 15:45:00+00:00,2.622494206495519 +2024-06-01 16:00:00+00:00,1.2397546187191704 +2024-06-01 16:15:00+00:00,0.27834965777668996 +2024-06-02 03:00:00+00:00,3.6660495474024937 +2024-06-02 03:15:00+00:00,5.834780263741522 +2024-06-02 03:30:00+00:00,7.561609018467472 +2024-06-02 03:45:00+00:00,9.10591065485949 +2024-06-02 04:00:00+00:00,10.251138809571534 +2024-06-02 04:15:00+00:00,11.576109563869519 +2024-06-02 04:30:00+00:00,12.063705533174055 +2024-06-02 04:45:00+00:00,12.88183895686375 +2024-06-02 05:00:00+00:00,13.589570303615888 +2024-06-02 05:15:00+00:00,14.005596263614454 +2024-06-02 05:30:00+00:00,13.994040019737174 +2024-06-02 05:45:00+00:00,14.414708674069576 +2024-06-02 06:00:00+00:00,14.988179896810717 +2024-06-02 06:15:00+00:00,15.386506003429586 +2024-06-02 06:30:00+00:00,14.558657315288176 +2024-06-02 06:45:00+00:00,14.097792701558397 +2024-06-02 07:00:00+00:00,14.330376058088488 +2024-06-02 07:15:00+00:00,13.769737963778244 +2024-06-02 07:30:00+00:00,12.91664626722731 +2024-06-02 07:45:00+00:00,10.91907297078246 +2024-06-02 08:00:00+00:00,11.371402868794718 +2024-06-02 08:15:00+00:00,11.813864505387407 +2024-06-02 08:30:00+00:00,11.931175151431585 +2024-06-02 08:45:00+00:00,9.98791586928516 +2024-06-02 09:00:00+00:00,11.177888629738607 +2024-06-02 09:15:00+00:00,10.859309793678586 +2024-06-02 09:30:00+00:00,9.491843242595124 +2024-06-02 09:45:00+00:00,4.627776880345407 +2024-06-02 10:00:00+00:00,4.408595130218421 +2024-06-02 10:15:00+00:00,4.919301226403702 +2024-06-02 10:30:00+00:00,5.000667050333122 +2024-06-02 10:45:00+00:00,4.675223830929033 +2024-06-02 11:00:00+00:00,1.9828934138390608 +2024-06-02 11:15:00+00:00,4.471614019819626 +2024-06-02 11:30:00+00:00,5.078685973047249 +2024-06-02 11:45:00+00:00,4.297274079296866 +2024-06-02 12:00:00+00:00,5.899238079942272 +2024-06-02 12:15:00+00:00,10.640882414788384 +2024-06-02 12:30:00+00:00,9.311830800464866 +2024-06-02 12:45:00+00:00,11.457275889715362 +2024-06-02 13:00:00+00:00,11.819436132988153 +2024-06-02 13:15:00+00:00,12.772204778279423 +2024-06-02 13:30:00+00:00,10.36824875254993 +2024-06-02 13:45:00+00:00,10.476061220520437 +2024-06-02 14:00:00+00:00,10.949550806030919 +2024-06-02 14:15:00+00:00,9.902300497775485 +2024-06-02 14:30:00+00:00,9.221007357833033 +2024-06-02 14:45:00+00:00,7.655498318503069 +2024-06-02 15:00:00+00:00,6.209992541493021 +2024-06-02 15:15:00+00:00,4.978988019253567 +2024-06-02 15:30:00+00:00,3.1958560396774365 +2024-06-02 15:45:00+00:00,1.772436690001403 +2024-06-02 16:00:00+00:00,0.6532457295780842 +2024-06-03 03:15:00+00:00,2.6400531412595694 +2024-06-03 03:30:00+00:00,5.475877737308284 +2024-06-03 03:45:00+00:00,6.732425049492705 +2024-06-03 04:00:00+00:00,10.878526746499668 +2024-06-03 04:15:00+00:00,11.701190716184549 +2024-06-03 04:30:00+00:00,12.295273596540026 +2024-06-03 04:45:00+00:00,12.772904034336893 +2024-06-03 05:00:00+00:00,13.225685370283383 +2024-06-03 05:15:00+00:00,13.461057384777508 +2024-06-03 05:30:00+00:00,13.684044628216457 +2024-06-03 05:45:00+00:00,13.821390185329477 +2024-06-03 06:00:00+00:00,14.022365826131628 +2024-06-03 06:15:00+00:00,13.989259258751625 +2024-06-03 06:30:00+00:00,14.473837832706216 +2024-06-03 06:45:00+00:00,14.859358626662353 +2024-06-03 07:00:00+00:00,14.863698578313027 +2024-06-03 07:15:00+00:00,14.724296876924138 +2024-06-03 07:30:00+00:00,14.997096076242675 +2024-06-03 07:45:00+00:00,14.913334520484758 +2024-06-03 08:00:00+00:00,14.42223288790892 +2024-06-03 08:15:00+00:00,14.040610443689946 +2024-06-03 08:30:00+00:00,13.3613756074145 +2024-06-03 08:45:00+00:00,12.839281523565399 +2024-06-03 09:00:00+00:00,13.003824122163884 +2024-06-03 09:15:00+00:00,12.353529989147134 +2024-06-03 09:30:00+00:00,11.74287451202292 +2024-06-03 09:45:00+00:00,10.747803804499808 +2024-06-03 10:00:00+00:00,11.150683725107946 +2024-06-03 10:15:00+00:00,10.617078896956944 +2024-06-03 10:30:00+00:00,9.552987372764665 +2024-06-03 10:45:00+00:00,8.170582505368635 +2024-06-03 11:00:00+00:00,8.102952345078785 +2024-06-03 11:15:00+00:00,8.589199761750589 +2024-06-03 11:30:00+00:00,8.506799225324025 +2024-06-03 11:45:00+00:00,8.447360556780806 +2024-06-03 12:00:00+00:00,8.526391549601831 +2024-06-03 12:15:00+00:00,8.57838157435355 +2024-06-03 12:30:00+00:00,4.744654237270804 +2024-06-03 12:45:00+00:00,4.798581441894523 +2024-06-03 13:00:00+00:00,8.474456024943347 +2024-06-03 13:15:00+00:00,8.977367013033454 +2024-06-03 13:30:00+00:00,10.337491872343875 +2024-06-03 13:45:00+00:00,10.759094775651242 +2024-06-03 14:00:00+00:00,10.397094113489064 +2024-06-03 14:15:00+00:00,9.959517845510133 +2024-06-03 14:30:00+00:00,9.130351600378598 +2024-06-03 14:45:00+00:00,7.293286706025295 +2024-06-03 15:00:00+00:00,6.050259493042725 +2024-06-03 15:15:00+00:00,4.38955064953616 +2024-06-03 15:30:00+00:00,2.7117424955041907 +2024-06-03 15:45:00+00:00,1.3456886005364466 +2024-06-03 16:00:00+00:00,0.17794838554378978 +2024-06-04 03:00:00+00:00,1.4393614455543198 +2024-06-04 03:15:00+00:00,3.3872173060531967 +2024-06-04 03:30:00+00:00,5.4705677967855 +2024-06-04 03:45:00+00:00,7.757959064785406 +2024-06-04 04:00:00+00:00,9.49378086777313 +2024-06-04 04:15:00+00:00,10.877207840809097 +2024-06-04 04:30:00+00:00,11.798855150290125 +2024-06-04 04:45:00+00:00,12.369237089809788 +2024-06-04 05:00:00+00:00,12.831146194067811 +2024-06-04 05:15:00+00:00,13.351021745779244 +2024-06-04 05:30:00+00:00,13.870900925482397 +2024-06-04 05:45:00+00:00,14.573181080858173 +2024-06-04 06:00:00+00:00,14.326206274800024 +2024-06-04 06:15:00+00:00,14.7392017643897 +2024-06-04 06:30:00+00:00,14.879322406874946 +2024-06-04 06:45:00+00:00,14.773106859446036 +2024-06-04 07:00:00+00:00,14.53114613799588 +2024-06-04 07:15:00+00:00,14.512575482657954 +2024-06-04 07:30:00+00:00,14.666550976496145 +2024-06-04 07:45:00+00:00,14.000510048120812 +2024-06-04 08:00:00+00:00,13.490473817747432 +2024-06-04 08:15:00+00:00,13.443333718610884 +2024-06-04 08:30:00+00:00,13.059098460113749 +2024-06-04 08:45:00+00:00,13.35018017609329 +2024-06-04 09:00:00+00:00,12.784770149203515 +2024-06-04 09:15:00+00:00,12.407204966958522 +2024-06-04 09:30:00+00:00,12.3382010895615 +2024-06-04 09:45:00+00:00,12.34432451520417 +2024-06-04 10:00:00+00:00,11.664905328083588 +2024-06-04 10:15:00+00:00,11.387692012458606 +2024-06-04 10:30:00+00:00,11.05370152014958 +2024-06-04 10:45:00+00:00,10.74040915662136 +2024-06-04 11:00:00+00:00,11.228677803268056 +2024-06-04 11:15:00+00:00,10.492044590441214 +2024-06-04 11:30:00+00:00,9.7191617509521 +2024-06-04 11:45:00+00:00,10.234375291733024 +2024-06-04 12:00:00+00:00,10.635780199340626 +2024-06-04 12:15:00+00:00,10.71525108230568 +2024-06-04 12:30:00+00:00,9.77789964406723 +2024-06-04 12:45:00+00:00,9.9448865697275 +2024-06-04 13:00:00+00:00,10.043650516288482 +2024-06-04 13:15:00+00:00,11.161194669183303 +2024-06-04 13:30:00+00:00,11.078465789813805 +2024-06-04 13:45:00+00:00,11.793599767414893 +2024-06-04 14:00:00+00:00,11.08807066052115 +2024-06-04 14:15:00+00:00,10.101631167735592 +2024-06-04 14:30:00+00:00,8.67024704468683 +2024-06-04 14:45:00+00:00,7.128873121764799 +2024-06-04 15:00:00+00:00,5.6590532715392134 +2024-06-04 15:15:00+00:00,3.863254955430559 +2024-06-04 15:30:00+00:00,3.158821378953592 +2024-06-04 15:45:00+00:00,2.392847275561629 +2024-06-04 16:00:00+00:00,0.9956112605148464 +2024-06-04 16:15:00+00:00,0.0 +2024-06-05 03:00:00+00:00,2.9051787515680583 +2024-06-05 03:15:00+00:00,4.81183735435596 +2024-06-05 03:30:00+00:00,6.687113229008307 +2024-06-05 03:45:00+00:00,8.349984788463837 +2024-06-05 04:00:00+00:00,9.41008973837469 +2024-06-05 04:15:00+00:00,10.322051697445856 +2024-06-05 04:30:00+00:00,10.775307077206193 +2024-06-05 04:45:00+00:00,11.241661178648132 +2024-06-05 05:00:00+00:00,11.85421406709053 +2024-06-05 05:15:00+00:00,11.709620305200655 +2024-06-05 05:30:00+00:00,12.318296070507591 +2024-06-05 05:45:00+00:00,12.039293796014721 +2024-06-05 06:00:00+00:00,11.394009494732122 +2024-06-05 06:15:00+00:00,11.30341464578342 +2024-06-05 06:30:00+00:00,10.488865723789662 +2024-06-05 06:45:00+00:00,11.043739702797069 +2024-06-05 07:00:00+00:00,10.797423848100486 +2024-06-05 07:15:00+00:00,10.383595458693044 +2024-06-05 07:30:00+00:00,10.05939952794565 +2024-06-05 07:45:00+00:00,9.177676472671573 +2024-06-05 08:00:00+00:00,8.490835100826391 +2024-06-05 08:15:00+00:00,8.364579068300234 +2024-06-05 08:30:00+00:00,8.068658109839493 +2024-06-05 08:45:00+00:00,7.769877932825757 +2024-06-05 09:00:00+00:00,7.673890216525864 +2024-06-05 09:15:00+00:00,6.590327573642057 +2024-06-05 09:30:00+00:00,6.836911645600096 +2024-06-05 09:45:00+00:00,5.568931441382515 +2024-06-05 10:00:00+00:00,5.894553093800246 +2024-06-05 10:15:00+00:00,6.320051580569073 +2024-06-05 10:30:00+00:00,2.80461052332622 +2024-06-05 10:45:00+00:00,3.20499815866466 +2024-06-05 11:00:00+00:00,2.893132757107547 +2024-06-05 11:15:00+00:00,1.9722078297619228 +2024-06-05 11:30:00+00:00,2.166226120141417 +2024-06-05 11:45:00+00:00,3.319543601818561 +2024-06-05 12:00:00+00:00,1.817129492231738 +2024-06-05 12:15:00+00:00,2.9964176675375302 +2024-06-05 12:30:00+00:00,3.2481332007363393 +2024-06-05 12:45:00+00:00,3.130141972750289 +2024-06-05 13:00:00+00:00,5.813619979428801 +2024-06-05 13:15:00+00:00,6.7746429096686045 +2024-06-05 13:30:00+00:00,6.170933084615028 +2024-06-05 13:45:00+00:00,6.240793265420967 +2024-06-05 14:00:00+00:00,7.263207244360559 +2024-06-05 14:15:00+00:00,7.501502732077288 +2024-06-05 14:30:00+00:00,6.428266546698473 +2024-06-05 14:45:00+00:00,5.9591478849326265 +2024-06-05 15:00:00+00:00,4.747366362899023 +2024-06-05 15:15:00+00:00,3.6615752262799512 +2024-06-05 15:30:00+00:00,2.539446964878994 +2024-06-05 15:45:00+00:00,1.240139336890053 +2024-06-05 16:00:00+00:00,0.22653527399327023 +2024-06-06 03:00:00+00:00,2.877070607375052 +2024-06-06 03:15:00+00:00,4.571613293437075 +2024-06-06 03:30:00+00:00,6.124492574987669 +2024-06-06 03:45:00+00:00,7.907061535305721 +2024-06-06 04:00:00+00:00,9.023951744679739 +2024-06-06 04:15:00+00:00,10.050727292206126 +2024-06-06 04:30:00+00:00,10.550699362199502 +2024-06-06 04:45:00+00:00,11.052178802816533 +2024-06-06 05:00:00+00:00,11.48034443786714 +2024-06-06 05:15:00+00:00,10.619808121685814 +2024-06-06 05:30:00+00:00,10.055360065590111 +2024-06-06 05:45:00+00:00,10.667428087309629 +2024-06-06 06:00:00+00:00,10.026197888804887 +2024-06-06 06:15:00+00:00,9.365501333133757 +2024-06-06 06:30:00+00:00,9.373825175279391 +2024-06-06 06:45:00+00:00,9.043560934103336 +2024-06-06 07:00:00+00:00,7.701522772303884 +2024-06-06 07:15:00+00:00,8.06455507158677 +2024-06-06 07:30:00+00:00,7.77253531617568 +2024-06-06 07:45:00+00:00,7.4153267167038335 +2024-06-06 08:00:00+00:00,6.569427773528682 +2024-06-06 08:15:00+00:00,6.588035517234034 +2024-06-06 08:30:00+00:00,7.062811606657205 +2024-06-06 08:45:00+00:00,2.7401571754531457 +2024-06-06 09:00:00+00:00,1.9042095171053823 +2024-06-06 09:15:00+00:00,0.9918480630978841 +2024-06-06 09:30:00+00:00,0.9717267070560354 +2024-06-06 09:45:00+00:00,0.5713887465722887 +2024-06-06 10:00:00+00:00,0.23328811501654 +2024-06-06 10:15:00+00:00,0.22979097817822036 +2024-06-06 10:30:00+00:00,0.2262828704182398 +2024-06-06 10:45:00+00:00,0.06176530072641362 +2024-06-06 11:00:00+00:00,0.5121173407753796 +2024-06-06 11:15:00+00:00,0.0 +2024-06-06 11:30:00+00:00,0.0 +2024-06-06 11:45:00+00:00,0.0 +2024-06-06 12:00:00+00:00,0.3043496597733306 +2024-06-06 12:15:00+00:00,0.0 +2024-06-06 12:30:00+00:00,0.25858337749383753 +2024-06-06 12:45:00+00:00,0.06176530072641362 +2024-06-06 13:00:00+00:00,0.5378648576614966 +2024-06-06 13:15:00+00:00,2.0984378082402166 +2024-06-06 13:30:00+00:00,1.2991259447687549 +2024-06-06 13:45:00+00:00,2.574234152701475 +2024-06-06 14:00:00+00:00,2.8804116727954976 +2024-06-06 14:15:00+00:00,5.676207705719594 +2024-06-06 14:30:00+00:00,4.136014313851263 +2024-06-06 14:45:00+00:00,3.417996798532188 +2024-06-06 15:00:00+00:00,3.271509207091426 +2024-06-06 15:15:00+00:00,2.088035388550663 +2024-06-06 15:30:00+00:00,1.310921214475982 +2024-06-06 15:45:00+00:00,0.4532207535072468 +2024-06-06 16:00:00+00:00,0.0 +2024-06-07 03:00:00+00:00,3.2145320198917107 +2024-06-07 03:15:00+00:00,4.831506493854109 +2024-06-07 03:30:00+00:00,5.331719847935086 +2024-06-07 03:45:00+00:00,6.098606337609025 +2024-06-07 04:00:00+00:00,7.169862372327362 +2024-06-07 04:15:00+00:00,8.246155068286322 +2024-06-07 04:30:00+00:00,8.800756860798101 +2024-06-07 04:45:00+00:00,9.28938781665396 +2024-06-07 05:00:00+00:00,9.570688257021626 +2024-06-07 05:15:00+00:00,8.949990194801323 +2024-06-07 05:30:00+00:00,8.203032922483535 +2024-06-07 05:45:00+00:00,8.001979109404395 +2024-06-07 06:00:00+00:00,7.56699438242333 +2024-06-07 06:15:00+00:00,7.342525729611001 +2024-06-07 06:30:00+00:00,6.721913387646721 +2024-06-07 06:45:00+00:00,6.208932823033441 +2024-06-07 07:00:00+00:00,5.686152189805204 +2024-06-07 07:15:00+00:00,5.586181560888387 +2024-06-07 07:30:00+00:00,4.914115476566639 +2024-06-07 07:45:00+00:00,4.480854808612036 +2024-06-07 08:00:00+00:00,4.285107247383327 +2024-06-07 08:15:00+00:00,4.304023995645419 +2024-06-07 08:30:00+00:00,3.987646442210915 +2024-06-07 08:45:00+00:00,4.038436796226746 +2024-06-07 09:00:00+00:00,3.099900364281531 +2024-06-07 09:15:00+00:00,1.7759227752192208 +2024-06-07 09:30:00+00:00,0.9039559960061321 +2024-06-07 09:45:00+00:00,1.4386885151391842 +2024-06-07 10:00:00+00:00,1.0095218109705666 +2024-06-07 10:15:00+00:00,1.1979932937177415 +2024-06-07 10:30:00+00:00,0.6421731751394919 +2024-06-07 10:45:00+00:00,0.4205951634404945 +2024-06-07 11:00:00+00:00,0.5547977183129715 +2024-06-07 11:15:00+00:00,0.9656496443874589 +2024-06-07 11:30:00+00:00,0.8113849073025166 +2024-06-07 11:45:00+00:00,1.1613180870990285 +2024-06-07 12:00:00+00:00,1.9620683097121332 +2024-06-07 12:15:00+00:00,1.7018652912836751 +2024-06-07 12:30:00+00:00,3.0747811373325034 +2024-06-07 12:45:00+00:00,1.9759196937547125 +2024-06-07 13:00:00+00:00,3.602511450050336 +2024-06-07 13:15:00+00:00,3.9252960815319096 +2024-06-07 13:30:00+00:00,3.518909994707498 +2024-06-07 13:45:00+00:00,4.782590521155979 +2024-06-07 14:00:00+00:00,4.604864438601153 +2024-06-07 14:15:00+00:00,4.82850006566407 +2024-06-07 14:30:00+00:00,4.2191482695000255 +2024-06-07 14:45:00+00:00,3.254942712704609 +2024-06-07 15:00:00+00:00,2.429729489184281 +2024-06-07 15:15:00+00:00,1.7275267187736731 +2024-06-07 15:30:00+00:00,0.44024805324575 +2024-06-07 15:45:00+00:00,0.0 +2024-06-07 16:00:00+00:00,0.0 +2024-06-08 03:00:00+00:00,2.2079376396800114 +2024-06-08 03:15:00+00:00,4.20843561082598 +2024-06-08 03:30:00+00:00,5.091709802663834 +2024-06-08 03:45:00+00:00,6.664776498745911 +2024-06-08 04:00:00+00:00,7.662742796928627 +2024-06-08 04:15:00+00:00,8.580475878311935 +2024-06-08 04:30:00+00:00,8.999466951795116 +2024-06-08 04:45:00+00:00,9.598788313256408 +2024-06-08 05:00:00+00:00,9.805383625984089 +2024-06-08 05:15:00+00:00,9.582731201690104 +2024-06-08 05:30:00+00:00,8.945142442147239 +2024-06-08 05:45:00+00:00,9.225946041947312 +2024-06-08 06:00:00+00:00,8.170963721830839 +2024-06-08 06:15:00+00:00,8.166286696757993 +2024-06-08 06:30:00+00:00,7.09373496318401 +2024-06-08 06:45:00+00:00,7.162169013115742 +2024-06-08 07:00:00+00:00,6.691731600774254 +2024-06-08 07:15:00+00:00,5.4013979831132675 +2024-06-08 07:30:00+00:00,4.759688405703162 +2024-06-08 07:45:00+00:00,5.378624488869006 +2024-06-08 08:00:00+00:00,4.518405865191687 +2024-06-08 08:15:00+00:00,4.297183312649589 +2024-06-08 08:30:00+00:00,3.3450897437190505 +2024-06-08 08:45:00+00:00,2.2640040041488194 +2024-06-08 09:00:00+00:00,1.2167222366631658 +2024-06-08 09:15:00+00:00,0.9217014992765087 +2024-06-08 09:30:00+00:00,0.3629190429569644 +2024-06-08 09:45:00+00:00,0.23504408110633723 +2024-06-08 10:00:00+00:00,0.10651011819304212 +2024-06-08 10:15:00+00:00,0.0 +2024-06-08 10:30:00+00:00,0.0 +2024-06-08 10:45:00+00:00,0.0 +2024-06-08 11:00:00+00:00,0.0 +2024-06-08 11:15:00+00:00,0.0019181614463084085 +2024-06-08 11:30:00+00:00,0.009642213918069409 +2024-06-08 11:45:00+00:00,0.0 +2024-06-08 12:00:00+00:00,0.0 +2024-06-08 12:15:00+00:00,0.0 +2024-06-08 12:30:00+00:00,0.3254220086957931 +2024-06-08 12:45:00+00:00,0.8982746406273949 +2024-06-08 13:00:00+00:00,0.2994408734570735 +2024-06-08 13:15:00+00:00,0.8145184845360278 +2024-06-08 13:30:00+00:00,1.6423931315481601 +2024-06-08 13:45:00+00:00,2.197028044375858 +2024-06-08 14:00:00+00:00,4.680889256586847 +2024-06-08 14:15:00+00:00,4.309192451918765 +2024-06-08 14:30:00+00:00,3.7876984631600963 +2024-06-08 14:45:00+00:00,3.3678682326722487 +2024-06-08 15:00:00+00:00,3.2245087072067973 +2024-06-08 15:15:00+00:00,2.8116566225025728 +2024-06-08 15:30:00+00:00,1.80271652331554 +2024-06-08 15:45:00+00:00,0.9767555320717209 +2024-06-08 16:00:00+00:00,0.1484154044915018 +2024-06-08 16:15:00+00:00,0.0 +2024-06-09 03:00:00+00:00,2.537021370212818 +2024-06-09 03:15:00+00:00,4.223976765595189 +2024-06-09 03:30:00+00:00,5.48633206439321 +2024-06-09 03:45:00+00:00,6.801998179460335 +2024-06-09 04:00:00+00:00,8.287197176041724 +2024-06-09 04:15:00+00:00,8.54403307413259 +2024-06-09 04:30:00+00:00,9.241316577621628 +2024-06-09 04:45:00+00:00,9.670541949050477 +2024-06-09 05:00:00+00:00,9.740858264393655 +2024-06-09 05:15:00+00:00,10.045110679896956 +2024-06-09 05:30:00+00:00,9.67160962269733 +2024-06-09 05:45:00+00:00,9.602688740667764 +2024-06-09 06:00:00+00:00,9.554870978178437 +2024-06-09 06:15:00+00:00,9.156054946271357 +2024-06-09 06:30:00+00:00,8.53634462536478 +2024-06-09 06:45:00+00:00,7.780453546106676 +2024-06-09 07:00:00+00:00,7.7705452537678825 +2024-06-09 07:15:00+00:00,7.814484598399176 +2024-06-09 07:30:00+00:00,7.116105898998185 +2024-06-09 07:45:00+00:00,7.002762314949442 +2024-06-09 08:00:00+00:00,7.227328040738669 +2024-06-09 08:15:00+00:00,6.124566920185423 +2024-06-09 08:30:00+00:00,5.272519635545701 +2024-06-09 08:45:00+00:00,3.884071302157854 +2024-06-09 09:00:00+00:00,3.335543490770322 +2024-06-09 09:15:00+00:00,3.968086184905599 +2024-06-09 09:30:00+00:00,1.1346600277219383 +2024-06-09 09:45:00+00:00,0.9512747497555463 +2024-06-09 10:00:00+00:00,0.3505032828478001 +2024-06-09 10:15:00+00:00,0.7442715323977391 +2024-06-09 10:30:00+00:00,1.2458432853559533 +2024-06-09 10:45:00+00:00,0.0 +2024-06-09 11:00:00+00:00,0.7460606113145523 +2024-06-09 11:15:00+00:00,0.0 +2024-06-09 11:30:00+00:00,1.0526942710833231 +2024-06-09 11:45:00+00:00,1.425906967886288 +2024-06-09 12:00:00+00:00,2.8341700524165145 +2024-06-09 12:15:00+00:00,3.5231586424872954 +2024-06-09 12:30:00+00:00,1.1002294225537645 +2024-06-09 12:45:00+00:00,3.1415016090809926 +2024-06-09 13:00:00+00:00,4.041328753879812 +2024-06-09 13:15:00+00:00,4.482115802894475 +2024-06-09 13:30:00+00:00,5.185075660145536 +2024-06-09 13:45:00+00:00,5.329903929141169 +2024-06-09 14:00:00+00:00,5.721974611673076 +2024-06-09 14:15:00+00:00,5.728963906996379 +2024-06-09 14:30:00+00:00,6.272375010253436 +2024-06-09 14:45:00+00:00,5.398388804875005 +2024-06-09 15:00:00+00:00,4.313943776059461 +2024-06-09 15:15:00+00:00,3.55157905869519 +2024-06-09 15:30:00+00:00,2.3601877672629303 +2024-06-09 15:45:00+00:00,1.3669117264792623 +2024-06-09 16:00:00+00:00,0.5117299211076856 +2024-06-10 03:15:00+00:00,1.7308075356541777 +2024-06-10 03:30:00+00:00,3.567573405573829 +2024-06-10 03:45:00+00:00,4.5742990237593135 +2024-06-10 04:00:00+00:00,8.896140387986911 +2024-06-10 04:15:00+00:00,9.741377063933678 +2024-06-10 04:30:00+00:00,5.5616352409668215 +2024-06-10 04:45:00+00:00,10.71474160644009 +2024-06-10 05:00:00+00:00,10.861446405661326 +2024-06-10 05:15:00+00:00,11.251876455478252 +2024-06-10 05:30:00+00:00,11.517898510534492 +2024-06-10 05:45:00+00:00,11.576974689666587 +2024-06-10 06:00:00+00:00,11.406903274812224 +2024-06-10 06:15:00+00:00,10.785923977035837 +2024-06-10 06:30:00+00:00,10.567946682986298 +2024-06-10 06:45:00+00:00,9.81548997254735 +2024-06-10 07:00:00+00:00,10.535150361123327 +2024-06-10 07:15:00+00:00,9.267991237202843 +2024-06-10 07:30:00+00:00,9.478644311507843 +2024-06-10 07:45:00+00:00,8.805487677733113 +2024-06-10 08:00:00+00:00,9.090033656948926 +2024-06-10 08:15:00+00:00,9.12825899608796 +2024-06-10 08:30:00+00:00,7.971585455754841 +2024-06-10 08:45:00+00:00,7.327232777124811 +2024-06-10 09:00:00+00:00,7.55993824893887 +2024-06-10 09:15:00+00:00,7.44243880114983 +2024-06-10 09:30:00+00:00,7.422264066240591 +2024-06-10 09:45:00+00:00,7.401361395229929 +2024-06-10 10:00:00+00:00,6.108737154310662 +2024-06-10 10:15:00+00:00,6.104303765293845 +2024-06-10 10:30:00+00:00,7.088780787582381 +2024-06-10 10:45:00+00:00,6.125240245899321 +2024-06-10 11:00:00+00:00,5.785754700003018 +2024-06-10 11:15:00+00:00,6.6716488962992475 +2024-06-10 11:30:00+00:00,6.125240245899321 +2024-06-10 11:45:00+00:00,5.2563890753554485 +2024-06-10 12:00:00+00:00,5.670348846424526 +2024-06-10 12:15:00+00:00,6.240932811139217 +2024-06-10 12:30:00+00:00,6.410740220851395 +2024-06-10 12:45:00+00:00,7.158590291294733 +2024-06-10 13:00:00+00:00,7.448296880844324 +2024-06-10 13:15:00+00:00,7.556890868096708 +2024-06-10 13:30:00+00:00,7.921664706607794 +2024-06-10 13:45:00+00:00,7.635515736230273 +2024-06-10 14:00:00+00:00,8.264344694046956 +2024-06-10 14:15:00+00:00,7.887099821447001 +2024-06-10 14:30:00+00:00,6.920213808346132 +2024-06-10 14:45:00+00:00,5.944500707364843 +2024-06-10 15:00:00+00:00,4.826630821009177 +2024-06-10 15:15:00+00:00,3.216188932872351 +2024-06-10 15:30:00+00:00,2.132237364544605 +2024-06-10 15:45:00+00:00,1.0427989003812497 +2024-06-10 16:00:00+00:00,0.12633808076023145 +2024-06-11 03:00:00+00:00,3.2584208306490043 +2024-06-11 03:15:00+00:00,5.222837825872796 +2024-06-11 03:30:00+00:00,6.065120603162924 +2024-06-11 03:45:00+00:00,7.565345730383629 +2024-06-11 04:00:00+00:00,8.96270827081536 +2024-06-11 04:15:00+00:00,9.580948642767536 +2024-06-11 04:30:00+00:00,10.207426819010907 +2024-06-11 04:45:00+00:00,9.194670327243204 +2024-06-11 05:00:00+00:00,9.21848913923077 +2024-06-11 05:15:00+00:00,8.752684294145016 +2024-06-11 05:30:00+00:00,8.006291309815625 +2024-06-11 05:45:00+00:00,8.281431342801941 +2024-06-11 06:00:00+00:00,7.878446087601358 +2024-06-11 06:15:00+00:00,7.394576002625988 +2024-06-11 06:30:00+00:00,6.955614328757507 +2024-06-11 06:45:00+00:00,6.643198721881654 +2024-06-11 07:00:00+00:00,6.6257871676047 +2024-06-11 07:15:00+00:00,6.6071855337331655 +2024-06-11 07:30:00+00:00,6.528655856763276 +2024-06-11 07:45:00+00:00,5.891972441296221 +2024-06-11 08:00:00+00:00,5.889497485494401 +2024-06-11 08:15:00+00:00,5.817840941870145 +2024-06-11 08:30:00+00:00,5.002523114716569 +2024-06-11 08:45:00+00:00,5.231945905996289 +2024-06-11 09:00:00+00:00,4.465438569530617 +2024-06-11 09:15:00+00:00,4.744825734563911 +2024-06-11 09:30:00+00:00,3.9839767908743067 +2024-06-11 09:45:00+00:00,3.943540298378914 +2024-06-11 10:00:00+00:00,2.5056168890289134 +2024-06-11 10:15:00+00:00,2.552001475550662 +2024-06-11 10:30:00+00:00,2.683784228055034 +2024-06-11 10:45:00+00:00,1.9514669756533247 +2024-06-11 11:00:00+00:00,1.7658159626646635 +2024-06-11 11:15:00+00:00,3.662699364873733 +2024-06-11 11:30:00+00:00,2.8557106876345495 +2024-06-11 11:45:00+00:00,1.7968321451200704 +2024-06-11 12:00:00+00:00,1.5739619398369116 +2024-06-11 12:15:00+00:00,1.2705720674890792 +2024-06-11 12:30:00+00:00,1.4428389376708513 +2024-06-11 12:45:00+00:00,2.596105636488978 +2024-06-11 13:00:00+00:00,3.0423738670312437 +2024-06-11 13:15:00+00:00,2.898717431827516 +2024-06-11 13:30:00+00:00,3.726854123060677 +2024-06-11 13:45:00+00:00,4.253906539976009 +2024-06-11 14:00:00+00:00,4.57840682848669 +2024-06-11 14:15:00+00:00,4.852457640130172 +2024-06-11 14:30:00+00:00,4.485233561621141 +2024-06-11 14:45:00+00:00,3.399741210700582 +2024-06-11 15:00:00+00:00,2.642045065942625 +2024-06-11 15:15:00+00:00,2.0658998482789612 +2024-06-11 15:30:00+00:00,0.9402935515835333 +2024-06-11 15:45:00+00:00,0.6664328070836503 +2024-06-11 16:00:00+00:00,0.3298673562605694 +2024-06-11 16:15:00+00:00,0.0 +2024-06-12 03:00:00+00:00,2.3266616406845113 +2024-06-12 03:15:00+00:00,4.108267315403558 +2024-06-12 03:30:00+00:00,6.769778617279041 +2024-06-12 03:45:00+00:00,9.440533406166217 +2024-06-12 04:00:00+00:00,12.973365350170372 +2024-06-12 04:15:00+00:00,16.665242170666662 +2024-06-12 04:30:00+00:00,15.858105805653565 +2024-06-12 04:45:00+00:00,14.41112179778813 +2024-06-12 05:00:00+00:00,10.604987487346119 +2024-06-12 05:15:00+00:00,9.393040577150632 +2024-06-12 05:30:00+00:00,9.384902262453338 +2024-06-12 05:45:00+00:00,8.192682071097675 +2024-06-12 06:00:00+00:00,7.574513434336972 +2024-06-12 06:15:00+00:00,7.715437558180194 +2024-06-12 06:30:00+00:00,7.072120083919758 +2024-06-12 06:45:00+00:00,6.8357369101120184 +2024-06-12 07:00:00+00:00,5.779113632670112 +2024-06-12 07:15:00+00:00,5.545522191701005 +2024-06-12 07:30:00+00:00,6.319674960376734 +2024-06-12 07:45:00+00:00,5.398769863206448 +2024-06-12 08:00:00+00:00,4.725380336541848 +2024-06-12 08:15:00+00:00,5.185217973763306 +2024-06-12 08:30:00+00:00,3.4700219904404275 +2024-06-12 08:45:00+00:00,3.507238982315333 +2024-06-12 09:00:00+00:00,2.335339468404933 +2024-06-12 09:15:00+00:00,2.2282879447114308 +2024-06-12 09:30:00+00:00,0.7378313679158368 +2024-06-12 09:45:00+00:00,0.4014431803266971 +2024-06-12 10:00:00+00:00,0.6655161962507754 +2024-06-12 10:15:00+00:00,0.2645000514666065 +2024-06-12 10:30:00+00:00,0.0 +2024-06-12 10:45:00+00:00,0.0 +2024-06-12 11:00:00+00:00,0.0 +2024-06-12 11:15:00+00:00,0.0 +2024-06-12 11:30:00+00:00,0.0 +2024-06-12 11:45:00+00:00,0.0 +2024-06-12 12:00:00+00:00,0.0 +2024-06-12 12:15:00+00:00,0.0 +2024-06-12 12:30:00+00:00,0.0 +2024-06-12 12:45:00+00:00,0.0 +2024-06-12 13:00:00+00:00,0.0 +2024-06-12 13:15:00+00:00,0.0 +2024-06-12 13:30:00+00:00,0.0 +2024-06-12 13:45:00+00:00,0.09811404863060025 +2024-06-12 14:00:00+00:00,1.8572300713618355 +2024-06-12 14:15:00+00:00,2.2574979441190366 +2024-06-12 14:30:00+00:00,2.3795193005087802 +2024-06-12 14:45:00+00:00,2.585975289876414 +2024-06-12 15:00:00+00:00,2.2210177765536527 +2024-06-12 15:15:00+00:00,1.8328457018656192 +2024-06-12 15:30:00+00:00,1.1597822228940518 +2024-06-12 15:45:00+00:00,0.6373139070860161 +2024-06-12 16:00:00+00:00,0.0 +2024-06-13 03:00:00+00:00,1.9112492614948389 +2024-06-13 03:15:00+00:00,4.072826199118629 +2024-06-13 03:30:00+00:00,5.386109970481553 +2024-06-13 03:45:00+00:00,6.4072895625503445 +2024-06-13 04:00:00+00:00,7.6899755931334335 +2024-06-13 04:15:00+00:00,8.254194855163583 +2024-06-13 04:30:00+00:00,8.831152386496303 +2024-06-13 04:45:00+00:00,9.088725533073625 +2024-06-13 05:00:00+00:00,9.490711454221689 +2024-06-13 05:15:00+00:00,9.044213732116546 +2024-06-13 05:30:00+00:00,8.1747692971759 +2024-06-13 05:45:00+00:00,7.214363246957075 +2024-06-13 06:00:00+00:00,7.144098462796808 +2024-06-13 06:15:00+00:00,6.693505223168328 +2024-06-13 06:30:00+00:00,6.114074675412585 +2024-06-13 06:45:00+00:00,4.765564274024441 +2024-06-13 07:00:00+00:00,4.364925901611823 +2024-06-13 07:15:00+00:00,5.0567400581327755 +2024-06-13 07:30:00+00:00,3.8361870751667295 +2024-06-13 07:45:00+00:00,2.565877206031315 +2024-06-13 08:00:00+00:00,2.540228891655963 +2024-06-13 08:15:00+00:00,2.658265047671006 +2024-06-13 08:30:00+00:00,1.7316238254654737 +2024-06-13 08:45:00+00:00,1.195080929866224 +2024-06-13 09:00:00+00:00,1.1489261862737936 +2024-06-13 09:15:00+00:00,0.5717967031274327 +2024-06-13 09:30:00+00:00,0.0 +2024-06-13 09:45:00+00:00,0.0 +2024-06-13 10:00:00+00:00,0.0 +2024-06-13 10:15:00+00:00,0.0 +2024-06-13 10:30:00+00:00,0.0 +2024-06-13 10:45:00+00:00,0.0 +2024-06-13 11:00:00+00:00,0.0 +2024-06-13 11:15:00+00:00,0.0 +2024-06-13 11:30:00+00:00,0.0 +2024-06-13 11:45:00+00:00,0.0 +2024-06-13 12:00:00+00:00,0.0 +2024-06-13 12:15:00+00:00,0.0 +2024-06-13 12:30:00+00:00,0.0 +2024-06-13 12:45:00+00:00,0.0 +2024-06-13 13:00:00+00:00,0.0 +2024-06-13 13:15:00+00:00,0.0 +2024-06-13 13:30:00+00:00,0.00800796608148202 +2024-06-13 13:45:00+00:00,0.8238582090610911 +2024-06-13 14:00:00+00:00,1.7028502091168987 +2024-06-13 14:15:00+00:00,2.872330738442016 +2024-06-13 14:30:00+00:00,2.2479917158099756 +2024-06-13 14:45:00+00:00,1.623209779317806 +2024-06-13 15:00:00+00:00,1.2250883594452198 +2024-06-13 15:15:00+00:00,0.34226678259271726 +2024-06-13 15:30:00+00:00,0.0 +2024-06-13 15:45:00+00:00,0.0 +2024-06-13 16:00:00+00:00,0.0 +2024-06-14 03:00:00+00:00,1.646218541070811 +2024-06-14 03:15:00+00:00,3.590366396375943 +2024-06-14 03:30:00+00:00,5.248820932709113 +2024-06-14 03:45:00+00:00,6.493238480127156 +2024-06-14 04:00:00+00:00,7.8581497482498985 +2024-06-14 04:15:00+00:00,8.935848959806153 +2024-06-14 04:30:00+00:00,9.16549692550372 +2024-06-14 04:45:00+00:00,8.931444177145337 +2024-06-14 05:00:00+00:00,9.356220513748115 +2024-06-14 05:15:00+00:00,8.653481906393322 +2024-06-14 05:30:00+00:00,7.60504279037985 +2024-06-14 05:45:00+00:00,6.671555953796906 +2024-06-14 06:00:00+00:00,6.661563634061784 +2024-06-14 06:15:00+00:00,5.850332066946775 +2024-06-14 06:30:00+00:00,5.440302441139995 +2024-06-14 06:45:00+00:00,5.036857516963231 +2024-06-14 07:00:00+00:00,4.2088578949195465 +2024-06-14 07:15:00+00:00,4.33886024692362 +2024-06-14 07:30:00+00:00,3.7707164194127216 +2024-06-14 07:45:00+00:00,3.0634820785558317 +2024-06-14 08:00:00+00:00,3.1095600352112753 +2024-06-14 08:15:00+00:00,2.953692708529016 +2024-06-14 08:30:00+00:00,2.8998950320168126 +2024-06-14 08:45:00+00:00,2.227040789642865 +2024-06-14 09:00:00+00:00,1.0429828408722663 +2024-06-14 09:15:00+00:00,0.720283344594232 +2024-06-14 09:30:00+00:00,0.0 +2024-06-14 09:45:00+00:00,0.0 +2024-06-14 10:00:00+00:00,0.023775780350684617 +2024-06-14 10:15:00+00:00,0.0 +2024-06-14 10:30:00+00:00,0.0 +2024-06-14 10:45:00+00:00,0.0 +2024-06-14 11:00:00+00:00,0.0 +2024-06-14 11:15:00+00:00,0.0 +2024-06-14 11:30:00+00:00,0.0 +2024-06-14 11:45:00+00:00,0.0 +2024-06-14 12:00:00+00:00,0.0 +2024-06-14 12:15:00+00:00,0.0 +2024-06-14 12:30:00+00:00,0.0 +2024-06-14 12:45:00+00:00,0.0 +2024-06-14 13:00:00+00:00,0.5742802396645432 +2024-06-14 13:15:00+00:00,1.2405162110077468 +2024-06-14 13:30:00+00:00,0.7945116498825522 +2024-06-14 13:45:00+00:00,0.7725871179949086 +2024-06-14 14:00:00+00:00,2.5433005218162865 +2024-06-14 14:15:00+00:00,2.6616820560959455 +2024-06-14 14:30:00+00:00,2.011700678137863 +2024-06-14 14:45:00+00:00,2.080430276391238 +2024-06-14 15:00:00+00:00,1.4891621056890672 +2024-06-14 15:15:00+00:00,0.9791078882292696 +2024-06-14 15:30:00+00:00,0.0762872424803902 +2024-06-14 15:45:00+00:00,0.0 +2024-06-14 16:00:00+00:00,0.0 +2024-06-15 03:00:00+00:00,1.1780727281502013 +2024-06-15 03:15:00+00:00,2.866477215160399 +2024-06-15 03:30:00+00:00,3.9052250567260702 +2024-06-15 03:45:00+00:00,5.562268057960013 +2024-06-15 04:00:00+00:00,6.556537366307317 +2024-06-15 04:15:00+00:00,7.707835002314919 +2024-06-15 04:30:00+00:00,8.629571632109522 +2024-06-15 04:45:00+00:00,8.76125922474419 +2024-06-15 05:00:00+00:00,8.500857363461307 +2024-06-15 05:15:00+00:00,7.646320404356445 +2024-06-15 05:30:00+00:00,7.082111293056003 +2024-06-15 05:45:00+00:00,5.733250529120271 +2024-06-15 06:00:00+00:00,5.611850996239281 +2024-06-15 06:15:00+00:00,5.372858390189686 +2024-06-15 06:30:00+00:00,4.598817297050443 +2024-06-15 06:45:00+00:00,4.134189654085512 +2024-06-15 07:00:00+00:00,3.7908741985244196 +2024-06-15 07:15:00+00:00,0.9000173947162522 +2024-06-15 07:30:00+00:00,0.27419923130662394 +2024-06-15 07:45:00+00:00,0.7115804552522427 +2024-06-15 08:00:00+00:00,0.03223964497263454 +2024-06-15 08:15:00+00:00,0.0 +2024-06-15 08:30:00+00:00,0.0 +2024-06-15 08:45:00+00:00,0.0 +2024-06-15 09:00:00+00:00,0.0 +2024-06-15 09:15:00+00:00,0.0 +2024-06-15 09:30:00+00:00,0.0 +2024-06-15 09:45:00+00:00,0.0 +2024-06-15 10:00:00+00:00,0.0 +2024-06-15 10:15:00+00:00,0.0 +2024-06-15 10:30:00+00:00,0.0 +2024-06-15 10:45:00+00:00,0.0 +2024-06-15 11:00:00+00:00,0.0 +2024-06-15 11:15:00+00:00,0.0 +2024-06-15 11:30:00+00:00,0.0 +2024-06-15 11:45:00+00:00,0.0 +2024-06-15 12:00:00+00:00,0.0 +2024-06-15 12:15:00+00:00,0.0 +2024-06-15 12:30:00+00:00,0.0 +2024-06-15 12:45:00+00:00,0.0 +2024-06-15 13:00:00+00:00,0.0 +2024-06-15 13:15:00+00:00,0.0 +2024-06-15 13:30:00+00:00,0.0 +2024-06-15 13:45:00+00:00,0.21688747260125574 +2024-06-15 14:00:00+00:00,0.0 +2024-06-15 14:15:00+00:00,0.5898086139736449 +2024-06-15 14:30:00+00:00,1.5045133957726042 +2024-06-15 14:45:00+00:00,2.019299754451541 +2024-06-15 15:00:00+00:00,1.6824006907126194 +2024-06-15 15:15:00+00:00,1.1553548259422342 +2024-06-15 15:30:00+00:00,0.7245861675208869 +2024-06-15 15:45:00+00:00,0.09931446695171275 +2024-06-15 16:00:00+00:00,0.0 +2024-06-16 03:00:00+00:00,1.3591332734816786 +2024-06-16 03:15:00+00:00,3.405557069973572 +2024-06-16 03:30:00+00:00,4.580061639454968 +2024-06-16 03:45:00+00:00,6.7238664371981915 +2024-06-16 04:00:00+00:00,8.382557872620305 +2024-06-16 04:15:00+00:00,9.753057271381797 +2024-06-16 04:30:00+00:00,10.252812234963072 +2024-06-16 04:45:00+00:00,11.31571912965269 +2024-06-16 05:00:00+00:00,11.947749179933764 +2024-06-16 05:15:00+00:00,12.024255290564716 +2024-06-16 05:30:00+00:00,11.881562916428894 +2024-06-16 05:45:00+00:00,11.54274425849907 +2024-06-16 06:00:00+00:00,11.258541932994076 +2024-06-16 06:15:00+00:00,10.346932927739253 +2024-06-16 06:30:00+00:00,10.03484658578676 +2024-06-16 06:45:00+00:00,9.291661412662442 +2024-06-16 07:00:00+00:00,8.490348806735819 +2024-06-16 07:15:00+00:00,9.254429280891129 +2024-06-16 07:30:00+00:00,7.998381546715514 +2024-06-16 07:45:00+00:00,8.061107708838794 +2024-06-16 08:00:00+00:00,8.142692394522694 +2024-06-16 08:15:00+00:00,8.417598744769572 +2024-06-16 08:30:00+00:00,7.612873626368215 +2024-06-16 08:45:00+00:00,6.5896819882208355 +2024-06-16 09:00:00+00:00,6.904166762213336 +2024-06-16 09:15:00+00:00,6.628058241528934 +2024-06-16 09:30:00+00:00,6.350345999177027 +2024-06-16 09:45:00+00:00,6.029077343424912 +2024-06-16 10:00:00+00:00,6.053091317292205 +2024-06-16 10:15:00+00:00,6.019064707267876 +2024-06-16 10:30:00+00:00,4.642055436875896 +2024-06-16 10:45:00+00:00,4.48765090462074 +2024-06-16 11:00:00+00:00,4.746206338810657 +2024-06-16 11:15:00+00:00,2.639251787585898 +2024-06-16 11:30:00+00:00,4.768041505007817 +2024-06-16 11:45:00+00:00,2.94743377644743 +2024-06-16 12:00:00+00:00,4.621050229610786 +2024-06-16 12:15:00+00:00,5.326142070369915 +2024-06-16 12:30:00+00:00,5.174227635840949 +2024-06-16 12:45:00+00:00,4.900264591158376 +2024-06-16 13:00:00+00:00,5.1019814630200715 +2024-06-16 13:15:00+00:00,6.291752765747683 +2024-06-16 13:30:00+00:00,7.311687313586251 +2024-06-16 13:45:00+00:00,6.77790210443157 +2024-06-16 14:00:00+00:00,7.391924153588947 +2024-06-16 14:15:00+00:00,6.912043771922359 +2024-06-16 14:30:00+00:00,6.039528231103192 +2024-06-16 14:45:00+00:00,4.995611136973666 +2024-06-16 15:00:00+00:00,4.0580332760834645 +2024-06-16 15:15:00+00:00,2.9135731994473066 +2024-06-16 15:30:00+00:00,1.7685249763498128 +2024-06-16 15:45:00+00:00,0.8155536829446612 +2024-06-16 16:00:00+00:00,0.0 +2024-06-17 03:15:00+00:00,2.61389514799321 +2024-06-17 03:30:00+00:00,3.102117693377568 +2024-06-17 03:45:00+00:00,4.182741371910831 +2024-06-17 04:00:00+00:00,6.64976927403875 +2024-06-17 04:15:00+00:00,10.115973089573199 +2024-06-17 04:30:00+00:00,10.706012987928 +2024-06-17 04:45:00+00:00,11.626770621727202 +2024-06-17 05:00:00+00:00,12.051677237619327 +2024-06-17 05:15:00+00:00,12.102383408796332 +2024-06-17 05:30:00+00:00,12.189169467720536 +2024-06-17 05:45:00+00:00,12.830366452506517 +2024-06-17 06:00:00+00:00,12.833708574298871 +2024-06-17 06:15:00+00:00,11.966810287165469 +2024-06-17 06:30:00+00:00,10.63857915306965 +2024-06-17 06:45:00+00:00,11.131104545387059 +2024-06-17 07:00:00+00:00,10.66742084888571 +2024-06-17 07:15:00+00:00,10.130939737847502 +2024-06-17 07:30:00+00:00,8.891386988612503 +2024-06-17 07:45:00+00:00,8.313115033345563 +2024-06-17 08:00:00+00:00,7.7246336555090815 +2024-06-17 08:15:00+00:00,7.066316704607003 +2024-06-17 08:30:00+00:00,7.763845355049055 +2024-06-17 08:45:00+00:00,6.562500849428973 +2024-06-17 09:00:00+00:00,6.6386231238207 +2024-06-17 09:15:00+00:00,5.601146220222916 +2024-06-17 09:30:00+00:00,2.9921670904187763 +2024-06-17 09:45:00+00:00,2.9880429511776567 +2024-06-17 10:00:00+00:00,1.560930046321718 +2024-06-17 10:15:00+00:00,2.003502648412733 +2024-06-17 10:30:00+00:00,0.8950940087868418 +2024-06-17 10:45:00+00:00,1.501315899363926 +2024-06-17 11:00:00+00:00,1.0201032197168076 +2024-06-17 11:15:00+00:00,0.6020538172443364 +2024-06-17 11:30:00+00:00,0.6222891405556268 +2024-06-17 11:45:00+00:00,0.5839054598503424 +2024-06-17 12:00:00+00:00,0.2585588457549908 +2024-06-17 12:15:00+00:00,0.23473418686952163 +2024-06-17 12:30:00+00:00,0.804007259273035 +2024-06-17 12:45:00+00:00,1.5664959547395871 +2024-06-17 13:00:00+00:00,2.578037429353587 +2024-06-17 13:15:00+00:00,3.0917886080797503 +2024-06-17 13:30:00+00:00,4.83808879644248 +2024-06-17 13:45:00+00:00,5.391401702451171 +2024-06-17 14:00:00+00:00,6.786271396070097 +2024-06-17 14:15:00+00:00,6.907160776614639 +2024-06-17 14:30:00+00:00,6.103974263648034 +2024-06-17 14:45:00+00:00,4.823859039937867 +2024-06-17 15:00:00+00:00,4.23276771315217 +2024-06-17 15:15:00+00:00,3.046209453521601 +2024-06-17 15:30:00+00:00,2.1479647497993897 +2024-06-17 15:45:00+00:00,1.1277155137799548 +2024-06-17 16:00:00+00:00,0.3478302286338384 +2024-06-18 03:15:00+00:00,2.265031775390499 +2024-06-18 03:30:00+00:00,4.50211921781308 +2024-06-18 03:45:00+00:00,6.103148461715844 +2024-06-18 04:00:00+00:00,6.443342916360392 +2024-06-18 04:15:00+00:00,7.989106802619425 +2024-06-18 04:30:00+00:00,11.662748397138444 +2024-06-18 04:45:00+00:00,12.008338763702053 +2024-06-18 05:00:00+00:00,12.339714879932565 +2024-06-18 05:15:00+00:00,12.898155899196338 +2024-06-18 05:30:00+00:00,12.673456190015665 +2024-06-18 05:45:00+00:00,13.426538092918321 +2024-06-18 06:00:00+00:00,13.472161846637007 +2024-06-18 06:15:00+00:00,12.901539170161499 +2024-06-18 06:30:00+00:00,12.735094778902164 +2024-06-18 06:45:00+00:00,12.990540662461111 +2024-06-18 07:00:00+00:00,12.1694283966692 +2024-06-18 07:15:00+00:00,11.198671351597989 +2024-06-18 07:30:00+00:00,10.811015566213173 +2024-06-18 07:45:00+00:00,11.324148744873549 +2024-06-18 08:00:00+00:00,10.162265919121108 +2024-06-18 08:15:00+00:00,9.81732446317728 +2024-06-18 08:30:00+00:00,9.261559374912395 +2024-06-18 08:45:00+00:00,9.360672202041727 +2024-06-18 09:00:00+00:00,9.016139721316117 +2024-06-18 09:15:00+00:00,8.892767267815316 +2024-06-18 09:30:00+00:00,8.768893751779833 +2024-06-18 09:45:00+00:00,7.500821244891796 +2024-06-18 10:00:00+00:00,8.239036279391753 +2024-06-18 10:15:00+00:00,7.057752258475163 +2024-06-18 10:30:00+00:00,7.541215791678649 +2024-06-18 10:45:00+00:00,8.091599576593833 +2024-06-18 11:00:00+00:00,7.544569993583944 +2024-06-18 11:15:00+00:00,6.804090097762592 +2024-06-18 11:30:00+00:00,6.7184138927874635 +2024-06-18 11:45:00+00:00,6.566424976136872 +2024-06-18 12:00:00+00:00,6.9127116419996515 +2024-06-18 12:15:00+00:00,6.449149325812638 +2024-06-18 12:30:00+00:00,7.416297765796793 +2024-06-18 12:45:00+00:00,7.431905583397611 +2024-06-18 13:00:00+00:00,7.236205093317526 +2024-06-18 13:15:00+00:00,7.668328413650338 +2024-06-18 13:30:00+00:00,8.216915330306275 +2024-06-18 13:45:00+00:00,9.16320866759132 +2024-06-18 14:00:00+00:00,9.517997939375189 +2024-06-18 14:15:00+00:00,8.13089967644979 +2024-06-18 14:30:00+00:00,7.693351789146392 +2024-06-18 14:45:00+00:00,6.414923313475483 +2024-06-18 15:00:00+00:00,5.150472615591871 +2024-06-18 15:15:00+00:00,3.6803964298355876 +2024-06-18 15:30:00+00:00,2.634931096823011 +2024-06-18 15:45:00+00:00,1.4022360678237977 +2024-06-18 16:00:00+00:00,0.4776765136604135 +2024-06-19 03:00:00+00:00,2.065334620804595 +2024-06-19 03:15:00+00:00,4.360485508798028 +2024-06-19 03:30:00+00:00,6.734362744146928 +2024-06-19 03:45:00+00:00,8.447180825984564 +2024-06-19 04:00:00+00:00,9.478602076402368 +2024-06-19 04:15:00+00:00,11.096578624884975 +2024-06-19 04:30:00+00:00,11.135722979975265 +2024-06-19 04:45:00+00:00,11.387146141155581 +2024-06-19 05:00:00+00:00,12.082124906850385 +2024-06-19 05:15:00+00:00,12.619916824224886 +2024-06-19 05:30:00+00:00,11.549260527162902 +2024-06-19 05:45:00+00:00,12.837508803968019 +2024-06-19 06:00:00+00:00,12.770119676040405 +2024-06-19 06:15:00+00:00,13.124009690944392 +2024-06-19 06:30:00+00:00,13.077199855835662 +2024-06-19 06:45:00+00:00,12.44980470000954 +2024-06-19 07:00:00+00:00,11.724306521770835 +2024-06-19 07:15:00+00:00,10.852814010621193 +2024-06-19 07:30:00+00:00,9.61923076487176 +2024-06-19 07:45:00+00:00,8.877052461439135 +2024-06-19 08:00:00+00:00,7.455833574569741 +2024-06-19 08:15:00+00:00,7.729606684321122 +2024-06-19 08:30:00+00:00,6.970473564323239 +2024-06-19 08:45:00+00:00,4.774014433189588 +2024-06-19 09:00:00+00:00,4.979457280494005 +2024-06-19 09:15:00+00:00,5.183457132699152 +2024-06-19 09:30:00+00:00,4.771330329711109 +2024-06-19 09:45:00+00:00,2.668487223711494 +2024-06-19 10:00:00+00:00,1.504268215137921 +2024-06-19 10:15:00+00:00,1.8274073215875912 +2024-06-19 10:30:00+00:00,0.5033641590448856 +2024-06-19 10:45:00+00:00,0.47985287150077394 +2024-06-19 11:00:00+00:00,0.4371346649394694 +2024-06-19 11:15:00+00:00,0.2684025240682091 +2024-06-19 11:30:00+00:00,1.131749403896436 +2024-06-19 11:45:00+00:00,0.06464858355364367 +2024-06-19 12:00:00+00:00,0.3872188830242249 +2024-06-19 12:15:00+00:00,0.09957005615465198 +2024-06-19 12:30:00+00:00,0.22059969000576274 +2024-06-19 12:45:00+00:00,0.33757676741939724 +2024-06-19 13:00:00+00:00,1.5309154014028747 +2024-06-19 13:15:00+00:00,2.1647738236089604 +2024-06-19 13:30:00+00:00,4.680889256586847 +2024-06-19 13:45:00+00:00,5.036587748103255 +2024-06-19 14:00:00+00:00,5.461327645907029 +2024-06-19 14:15:00+00:00,4.402572212047964 +2024-06-19 14:30:00+00:00,4.5052691997406535 +2024-06-19 14:45:00+00:00,3.8352815124415303 +2024-06-19 15:00:00+00:00,3.1117880916941596 +2024-06-19 15:15:00+00:00,2.293831727669651 +2024-06-19 15:30:00+00:00,1.4323185947446266 +2024-06-19 15:45:00+00:00,0.5740843457077782 +2024-06-19 16:00:00+00:00,0.0 +2024-06-20 03:15:00+00:00,2.243663369515907 +2024-06-20 03:30:00+00:00,4.2613506556255745 +2024-06-20 03:45:00+00:00,5.919409686959085 +2024-06-20 04:00:00+00:00,7.731795611239111 +2024-06-20 04:15:00+00:00,9.057953240571425 +2024-06-20 04:30:00+00:00,10.161749289890642 +2024-06-20 04:45:00+00:00,11.079147694689041 +2024-06-20 05:00:00+00:00,11.530284662913287 +2024-06-20 05:15:00+00:00,11.861262357056837 +2024-06-20 05:30:00+00:00,11.784226448949942 +2024-06-20 05:45:00+00:00,11.944393289236883 +2024-06-20 06:00:00+00:00,11.254464877500094 +2024-06-20 06:15:00+00:00,10.806674931352628 +2024-06-20 06:30:00+00:00,9.959557961354404 +2024-06-20 06:45:00+00:00,9.546803531805159 +2024-06-20 07:00:00+00:00,9.478580467240139 +2024-06-20 07:15:00+00:00,8.652918099617878 +2024-06-20 07:30:00+00:00,8.043757364308716 +2024-06-20 07:45:00+00:00,8.255305239248717 +2024-06-20 08:00:00+00:00,8.888725587977579 +2024-06-20 08:15:00+00:00,8.781956610117797 +2024-06-20 08:30:00+00:00,8.402877208006723 +2024-06-20 08:45:00+00:00,8.370638037723433 +2024-06-20 09:00:00+00:00,8.335858585712032 +2024-06-20 09:15:00+00:00,7.1429548218689245 +2024-06-20 09:30:00+00:00,5.696497735094617 +2024-06-20 09:45:00+00:00,6.283103770243679 +2024-06-20 10:00:00+00:00,6.328287420096515 +2024-06-20 10:15:00+00:00,5.371463663949671 +2024-06-20 10:30:00+00:00,5.300006336121994 +2024-06-20 10:45:00+00:00,4.636499998877832 +2024-06-20 11:00:00+00:00,5.298191441539937 +2024-06-20 11:15:00+00:00,5.2378770608898915 +2024-06-20 11:30:00+00:00,5.628304741455086 +2024-06-20 11:45:00+00:00,5.507927856863957 +2024-06-20 12:00:00+00:00,6.217121538329993 +2024-06-20 12:15:00+00:00,6.847973533007632 +2024-06-20 12:30:00+00:00,6.506767283049224 +2024-06-20 12:45:00+00:00,7.423542610820114 +2024-06-20 13:00:00+00:00,7.016919024297115 +2024-06-20 13:15:00+00:00,7.593254601765595 +2024-06-20 13:30:00+00:00,7.403343430328924 +2024-06-20 13:45:00+00:00,7.9464912723773224 +2024-06-20 14:00:00+00:00,7.582780240456246 +2024-06-20 14:15:00+00:00,6.6729971651432205 +2024-06-20 14:30:00+00:00,6.2121312264417 +2024-06-20 14:45:00+00:00,4.812075798569147 +2024-06-20 15:00:00+00:00,3.5389877383468464 +2024-06-20 15:15:00+00:00,2.619680147539844 +2024-06-20 15:30:00+00:00,1.5119084597855357 +2024-06-20 15:45:00+00:00,0.648737470693693 +2024-06-20 16:00:00+00:00,0.0 +2024-06-21 03:00:00+00:00,1.617281989014064 +2024-06-21 03:15:00+00:00,3.5537248267748804 +2024-06-21 03:30:00+00:00,5.125925047931091 +2024-06-21 03:45:00+00:00,6.565387719724 +2024-06-21 04:00:00+00:00,7.675511468892403 +2024-06-21 04:15:00+00:00,9.580097319863672 +2024-06-21 04:30:00+00:00,10.02148962577953 +2024-06-21 04:45:00+00:00,10.616674618115049 +2024-06-21 05:00:00+00:00,10.729056167229299 +2024-06-21 05:15:00+00:00,10.90492492166296 +2024-06-21 05:30:00+00:00,10.63703727060984 +2024-06-21 05:45:00+00:00,10.354832391773666 +2024-06-21 06:00:00+00:00,10.012514849405628 +2024-06-21 06:15:00+00:00,8.638091057680882 +2024-06-21 06:30:00+00:00,8.446565442804237 +2024-06-21 06:45:00+00:00,7.919330456675184 +2024-06-21 07:00:00+00:00,7.083448524463895 +2024-06-21 07:15:00+00:00,7.465321464955977 +2024-06-21 07:30:00+00:00,6.323080954575927 +2024-06-21 07:45:00+00:00,5.217458736130749 +2024-06-21 08:00:00+00:00,5.470889028479504 +2024-06-21 08:15:00+00:00,4.884894263018236 +2024-06-21 08:30:00+00:00,4.799100504036279 +2024-06-21 08:45:00+00:00,4.74886404189322 +2024-06-21 09:00:00+00:00,4.698227982638323 +2024-06-21 09:15:00+00:00,2.350261903197987 +2024-06-21 09:30:00+00:00,0.5439042682068416 +2024-06-21 09:45:00+00:00,1.015715810511904 +2024-06-21 10:00:00+00:00,0.38377639753422677 +2024-06-21 10:15:00+00:00,0.5283484764173596 +2024-06-21 10:30:00+00:00,0.5278246083069937 +2024-06-21 10:45:00+00:00,0.9081176088784244 +2024-06-21 11:00:00+00:00,0.10048667354214857 +2024-06-21 11:15:00+00:00,0.10651011819304212 +2024-06-21 11:30:00+00:00,0.0 +2024-06-21 11:45:00+00:00,0.0 +2024-06-21 12:00:00+00:00,0.0 +2024-06-21 12:15:00+00:00,0.0 +2024-06-21 12:30:00+00:00,0.0 +2024-06-21 12:45:00+00:00,0.4440321007173831 +2024-06-21 13:00:00+00:00,0.5499442752212604 +2024-06-21 13:15:00+00:00,0.07661371990673738 +2024-06-21 13:30:00+00:00,0.5022894119754548 +2024-06-21 13:45:00+00:00,1.1218792083249993 +2024-06-21 14:00:00+00:00,1.7742794525605925 +2024-06-21 14:15:00+00:00,3.780372933216847 +2024-06-21 14:30:00+00:00,3.233768571757232 +2024-06-21 14:45:00+00:00,2.044639837832059 +2024-06-21 15:00:00+00:00,2.283590528007287 +2024-06-21 15:15:00+00:00,1.5501830841759556 +2024-06-21 15:30:00+00:00,0.6728576980135568 +2024-06-21 15:45:00+00:00,0.0 +2024-06-21 16:00:00+00:00,0.0 +2024-06-22 03:00:00+00:00,1.6208120792715937 +2024-06-22 03:15:00+00:00,3.2837172403620922 +2024-06-22 03:30:00+00:00,4.708908069439407 +2024-06-22 03:45:00+00:00,6.300328779177829 +2024-06-22 04:00:00+00:00,7.460762651711197 +2024-06-22 04:15:00+00:00,8.570048339289144 +2024-06-22 04:30:00+00:00,9.77989236315825 +2024-06-22 04:45:00+00:00,10.400606599430201 +2024-06-22 05:00:00+00:00,10.98097455304649 +2024-06-22 05:15:00+00:00,11.326078210195405 +2024-06-22 05:30:00+00:00,11.65018794286511 +2024-06-22 05:45:00+00:00,11.06064431648898 +2024-06-22 06:00:00+00:00,10.519479462815331 +2024-06-22 06:15:00+00:00,10.293287651741108 +2024-06-22 06:30:00+00:00,10.252882081119303 +2024-06-22 06:45:00+00:00,9.425238629188826 +2024-06-22 07:00:00+00:00,9.15340816534484 +2024-06-22 07:15:00+00:00,9.235461789301288 +2024-06-22 07:30:00+00:00,8.823457840764894 +2024-06-22 07:45:00+00:00,8.779078696795438 +2024-06-22 08:00:00+00:00,8.40586148500718 +2024-06-22 08:15:00+00:00,8.452333085847838 +2024-06-22 08:30:00+00:00,9.247617723569382 +2024-06-22 08:45:00+00:00,8.506071312523252 +2024-06-22 09:00:00+00:00,7.716634866211735 +2024-06-22 09:15:00+00:00,7.870020271456312 +2024-06-22 09:30:00+00:00,7.308410537201459 +2024-06-22 09:45:00+00:00,6.224074570488506 +2024-06-22 10:00:00+00:00,6.10769480265548 +2024-06-22 10:15:00+00:00,5.168202649490081 +2024-06-22 10:30:00+00:00,6.311139478966373 +2024-06-22 10:45:00+00:00,6.77790210443157 +2024-06-22 11:00:00+00:00,7.012156492453435 +2024-06-22 11:15:00+00:00,6.436207376190806 +2024-06-22 11:30:00+00:00,5.903031669735514 +2024-06-22 11:45:00+00:00,6.400185495606584 +2024-06-22 12:00:00+00:00,6.916606877350116 +2024-06-22 12:15:00+00:00,6.507101951581793 +2024-06-22 12:30:00+00:00,6.6721391100616465 +2024-06-22 12:45:00+00:00,5.521192025377008 +2024-06-22 13:00:00+00:00,6.8265462753231265 +2024-06-22 13:15:00+00:00,8.290925887853437 +2024-06-22 13:30:00+00:00,8.54902720942343 +2024-06-22 13:45:00+00:00,8.15152197541226 +2024-06-22 14:00:00+00:00,9.05452388374367 +2024-06-22 14:15:00+00:00,8.162936184976115 +2024-06-22 14:30:00+00:00,7.281573397927644 +2024-06-22 14:45:00+00:00,6.375508305829892 +2024-06-22 15:00:00+00:00,5.048378452590797 +2024-06-22 15:15:00+00:00,3.8698047013166508 +2024-06-22 15:30:00+00:00,2.31737888836742 +2024-06-22 15:45:00+00:00,1.2249223832542524 +2024-06-22 16:00:00+00:00,0.22890405464677444 +2024-06-23 03:15:00+00:00,2.544999869251371 +2024-06-23 03:30:00+00:00,3.970055782066251 +2024-06-23 03:45:00+00:00,6.079472506103175 +2024-06-23 04:00:00+00:00,7.749300892643797 +2024-06-23 04:15:00+00:00,9.444284775597339 +2024-06-23 04:30:00+00:00,10.25697869465491 +2024-06-23 04:45:00+00:00,10.984853296203529 +2024-06-23 05:00:00+00:00,11.499489443829544 +2024-06-23 05:15:00+00:00,12.13817045776075 +2024-06-23 05:30:00+00:00,12.277351586022062 +2024-06-23 05:45:00+00:00,12.335811909607944 +2024-06-23 06:00:00+00:00,11.240523370238751 +2024-06-23 06:15:00+00:00,11.142746040625925 +2024-06-23 06:30:00+00:00,10.312069054735593 +2024-06-23 06:45:00+00:00,9.720646295877042 +2024-06-23 07:00:00+00:00,9.13914921987871 +2024-06-23 07:15:00+00:00,9.276075648200726 +2024-06-23 07:30:00+00:00,8.714073030162913 +2024-06-23 07:45:00+00:00,7.325814943683227 +2024-06-23 08:00:00+00:00,8.150332287401735 +2024-06-23 08:15:00+00:00,7.569141616199528 +2024-06-23 08:30:00+00:00,6.498058289119846 +2024-06-23 08:45:00+00:00,6.499465347165004 +2024-06-23 09:00:00+00:00,6.50007101410314 +2024-06-23 09:15:00+00:00,6.306684884543555 +2024-06-23 09:30:00+00:00,3.5362485006084405 +2024-06-23 09:45:00+00:00,2.037516548404157 +2024-06-23 10:00:00+00:00,3.6495816463908333 +2024-06-23 10:15:00+00:00,1.7461638892144196 +2024-06-23 10:30:00+00:00,2.587188022266953 +2024-06-23 10:45:00+00:00,1.8003621146584825 +2024-06-23 11:00:00+00:00,1.4916598054321604 +2024-06-23 11:15:00+00:00,2.8314792849386334 +2024-06-23 11:30:00+00:00,0.7666281792882201 +2024-06-23 11:45:00+00:00,0.981580027844521 +2024-06-23 12:00:00+00:00,2.9414562718207447 +2024-06-23 12:15:00+00:00,3.371063205555527 +2024-06-23 12:30:00+00:00,3.3047591144121102 +2024-06-23 12:45:00+00:00,2.631723097760876 +2024-06-23 13:00:00+00:00,3.4913452553983424 +2024-06-23 13:15:00+00:00,7.925796302713323 +2024-06-23 13:30:00+00:00,8.077515099685403 +2024-06-23 13:45:00+00:00,8.905895406150584 +2024-06-23 14:00:00+00:00,8.19593580133327 +2024-06-23 14:15:00+00:00,7.288118646565713 +2024-06-23 14:30:00+00:00,7.149804019899272 +2024-06-23 14:45:00+00:00,6.641197131689209 +2024-06-23 15:00:00+00:00,5.017240720572172 +2024-06-23 15:15:00+00:00,3.563456882994515 +2024-06-23 15:30:00+00:00,2.205498315592484 +2024-06-23 15:45:00+00:00,1.081668891037776 +2024-06-23 16:00:00+00:00,0.1843333336945392 +2024-06-24 03:00:00+00:00,1.8922081291180342 +2024-06-24 03:15:00+00:00,3.694411565562322 +2024-06-24 03:30:00+00:00,5.250552158886942 +2024-06-24 03:45:00+00:00,7.062622370533646 +2024-06-24 04:00:00+00:00,8.709805869523318 +2024-06-24 04:15:00+00:00,9.853928925379392 +2024-06-24 04:30:00+00:00,10.77298451715447 +2024-06-24 04:45:00+00:00,11.507599081197329 +2024-06-24 05:00:00+00:00,11.841034893076577 +2024-06-24 05:15:00+00:00,12.671035721055013 +2024-06-24 05:30:00+00:00,12.973766215138067 +2024-06-24 05:45:00+00:00,12.310831431204146 +2024-06-24 06:00:00+00:00,11.919808927611118 +2024-06-24 06:15:00+00:00,11.321536093164255 +2024-06-24 06:30:00+00:00,11.372277162522767 +2024-06-24 06:45:00+00:00,10.6285820662697 +2024-06-24 07:00:00+00:00,11.104573123449846 +2024-06-24 07:15:00+00:00,10.329973094228 +2024-06-24 07:30:00+00:00,10.372500689204806 +2024-06-24 07:45:00+00:00,10.201990189920863 +2024-06-24 08:00:00+00:00,9.68237578964261 +2024-06-24 08:15:00+00:00,10.156323635167853 +2024-06-24 08:30:00+00:00,10.625138964429821 +2024-06-24 08:45:00+00:00,9.56278231825458 +2024-06-24 09:00:00+00:00,9.485197664289878 +2024-06-24 09:15:00+00:00,9.457110251163927 +2024-06-24 09:30:00+00:00,9.262477877506576 +2024-06-24 09:45:00+00:00,8.006307466805659 +2024-06-24 10:00:00+00:00,7.864845188455842 +2024-06-24 10:15:00+00:00,7.393029363731804 +2024-06-24 10:30:00+00:00,8.666351127020457 +2024-06-24 10:45:00+00:00,7.879332680890403 +2024-06-24 11:00:00+00:00,8.060175055308145 +2024-06-24 11:15:00+00:00,7.933202345390292 +2024-06-24 11:30:00+00:00,7.941218731501255 +2024-06-24 11:45:00+00:00,8.031316601174883 +2024-06-24 12:00:00+00:00,8.442542056070772 +2024-06-24 12:15:00+00:00,8.768330619004892 +2024-06-24 12:30:00+00:00,8.255251359128422 +2024-06-24 12:45:00+00:00,8.708552435324822 +2024-06-24 13:00:00+00:00,9.368599991018481 +2024-06-24 13:15:00+00:00,9.829188638227855 +2024-06-24 13:30:00+00:00,10.099122165705625 +2024-06-24 13:45:00+00:00,10.178827716147214 +2024-06-24 14:00:00+00:00,10.125795842980201 +2024-06-24 14:15:00+00:00,8.837882964905747 +2024-06-24 14:30:00+00:00,7.519738854184397 +2024-06-24 14:45:00+00:00,6.556677801127927 +2024-06-24 15:00:00+00:00,4.970333045873857 +2024-06-24 15:15:00+00:00,3.6268173402255295 +2024-06-24 15:30:00+00:00,2.307278480725916 +2024-06-24 15:45:00+00:00,1.0789565474259437 +2024-06-24 16:00:00+00:00,0.10130975486411642 +2024-06-25 03:00:00+00:00,2.1793710061589486 +2024-06-25 03:15:00+00:00,4.0986994481344174 +2024-06-25 03:30:00+00:00,5.836613744569224 +2024-06-25 03:45:00+00:00,7.747503837694559 +2024-06-25 04:00:00+00:00,9.250438070046844 +2024-06-25 04:15:00+00:00,10.643469237115374 +2024-06-25 04:30:00+00:00,11.517103619768264 +2024-06-25 04:45:00+00:00,12.126507404580359 +2024-06-25 05:00:00+00:00,13.059622809616478 +2024-06-25 05:15:00+00:00,13.437440154415107 +2024-06-25 05:30:00+00:00,13.20470576030454 +2024-06-25 05:45:00+00:00,12.877841239919007 +2024-06-25 06:00:00+00:00,12.371648408520374 +2024-06-25 06:15:00+00:00,11.261577840919365 +2024-06-25 06:30:00+00:00,11.114803956577546 +2024-06-25 06:45:00+00:00,10.500115539275608 +2024-06-25 07:00:00+00:00,10.685307149894001 +2024-06-25 07:15:00+00:00,10.54986071368795 +2024-06-25 07:30:00+00:00,9.93940521727549 +2024-06-25 07:45:00+00:00,9.21948546020737 +2024-06-25 08:00:00+00:00,9.512634667464752 +2024-06-25 08:15:00+00:00,9.144104613394504 +2024-06-25 08:30:00+00:00,8.7742706483871 +2024-06-25 08:45:00+00:00,5.758712092238184 +2024-06-25 09:00:00+00:00,4.792313484026261 +2024-06-25 09:15:00+00:00,5.10421049197253 +2024-06-25 09:30:00+00:00,3.9055157318002127 +2024-06-25 09:45:00+00:00,3.6238459357998334 +2024-06-25 10:00:00+00:00,3.621029451131051 +2024-06-25 10:15:00+00:00,1.8479319945763952 +2024-06-25 10:30:00+00:00,1.8046048403144215 +2024-06-25 10:45:00+00:00,1.4291440236783777 +2024-06-25 11:00:00+00:00,0.9791237276158942 +2024-06-25 11:15:00+00:00,1.7543761667385884 +2024-06-25 11:30:00+00:00,1.2917872709814375 +2024-06-25 11:45:00+00:00,1.930105441539769 +2024-06-25 12:00:00+00:00,3.9372286211567604 +2024-06-25 12:15:00+00:00,4.37617352451608 +2024-06-25 12:30:00+00:00,4.738786384275489 +2024-06-25 12:45:00+00:00,3.379003651094662 +2024-06-25 13:00:00+00:00,8.790517665723005 +2024-06-25 13:15:00+00:00,4.780059215791585 +2024-06-25 13:30:00+00:00,4.787775946002876 +2024-06-25 13:45:00+00:00,8.987138179086703 +2024-06-25 14:00:00+00:00,9.132063261169545 +2024-06-25 14:15:00+00:00,8.328456965521152 +2024-06-25 14:30:00+00:00,7.4903849061470265 +2024-06-25 14:45:00+00:00,6.210576417888168 +2024-06-25 15:00:00+00:00,4.82914453200443 +2024-06-25 15:15:00+00:00,3.4021130416856358 +2024-06-25 15:30:00+00:00,2.2645876313290203 +2024-06-25 15:45:00+00:00,1.1295234847103826 +2024-06-25 16:00:00+00:00,0.08781148514446158 +2024-06-26 03:00:00+00:00,2.189054694401423 +2024-06-26 03:15:00+00:00,3.979098594461462 +2024-06-26 03:30:00+00:00,3.1548807003068253 +2024-06-26 03:45:00+00:00,3.885015398062293 +2024-06-26 04:00:00+00:00,6.455947022283267 +2024-06-26 04:15:00+00:00,12.528839302685656 +2024-06-26 04:30:00+00:00,13.309979677334091 +2024-06-26 04:45:00+00:00,14.148889283400338 +2024-06-26 05:00:00+00:00,14.703764331978654 +2024-06-26 05:15:00+00:00,15.456266994578362 +2024-06-26 05:30:00+00:00,15.597524680371196 +2024-06-26 05:45:00+00:00,15.900805317049732 +2024-06-26 06:00:00+00:00,16.173447947034244 +2024-06-26 06:15:00+00:00,16.878798609788856 +2024-06-26 06:30:00+00:00,16.938448304944334 +2024-06-26 06:45:00+00:00,16.94268731582084 +2024-06-26 07:00:00+00:00,17.041969574444668 +2024-06-26 07:15:00+00:00,16.79954606729879 +2024-06-26 07:30:00+00:00,15.412601464030875 +2024-06-26 07:45:00+00:00,15.354283503830748 +2024-06-26 08:00:00+00:00,15.221139800161822 +2024-06-26 08:15:00+00:00,15.073282777565623 +2024-06-26 08:30:00+00:00,15.131476838468418 +2024-06-26 08:45:00+00:00,15.214358273050319 +2024-06-26 09:00:00+00:00,13.86618088850855 +2024-06-26 09:15:00+00:00,13.62385211310863 +2024-06-26 09:30:00+00:00,13.953677766318831 +2024-06-26 09:45:00+00:00,12.704189184192064 +2024-06-26 10:00:00+00:00,13.874733915561709 +2024-06-26 10:15:00+00:00,12.526520324122615 +2024-06-26 10:30:00+00:00,11.571244544062644 +2024-06-26 10:45:00+00:00,11.368955985416257 +2024-06-26 11:00:00+00:00,10.786081710674473 +2024-06-26 11:15:00+00:00,12.474142550179494 +2024-06-26 11:30:00+00:00,11.119414963352863 +2024-06-26 11:45:00+00:00,11.916208466957965 +2024-06-26 12:00:00+00:00,11.356335503854831 +2024-06-26 12:15:00+00:00,11.744078795094437 +2024-06-26 12:30:00+00:00,12.067115910765864 +2024-06-26 12:45:00+00:00,12.821442237091173 +2024-06-26 13:00:00+00:00,12.742845100278103 +2024-06-26 13:15:00+00:00,12.780824532448179 +2024-06-26 13:30:00+00:00,13.332663038974744 +2024-06-26 13:45:00+00:00,12.92991499418488 +2024-06-26 14:00:00+00:00,11.860612266361631 +2024-06-26 14:15:00+00:00,10.682263613779805 +2024-06-26 14:30:00+00:00,9.821516169843441 +2024-06-26 14:45:00+00:00,8.189193248845102 +2024-06-26 15:00:00+00:00,6.608649492373792 +2024-06-26 15:15:00+00:00,4.783160978040764 +2024-06-26 15:30:00+00:00,3.2312833348392904 +2024-06-26 15:45:00+00:00,1.5586148641353814 +2024-06-26 16:00:00+00:00,0.35544136653368197 +2024-06-27 03:15:00+00:00,4.681105447985154 +2024-06-27 03:30:00+00:00,5.531922868156972 +2024-06-27 03:45:00+00:00,6.003025648624615 +2024-06-27 04:00:00+00:00,11.440714368664002 +2024-06-27 04:15:00+00:00,12.983883992293958 +2024-06-27 04:30:00+00:00,12.947137619241769 +2024-06-27 04:45:00+00:00,13.594220647614401 +2024-06-27 05:00:00+00:00,14.152033387188663 +2024-06-27 05:15:00+00:00,14.44021973186369 +2024-06-27 05:30:00+00:00,14.8295418392144 +2024-06-27 05:45:00+00:00,15.009477159505177 +2024-06-27 06:00:00+00:00,15.230897538111549 +2024-06-27 06:15:00+00:00,15.325857269848656 +2024-06-27 06:30:00+00:00,15.156587978244964 +2024-06-27 06:45:00+00:00,14.397961975558763 +2024-06-27 07:00:00+00:00,13.04605482142768 +2024-06-27 07:15:00+00:00,13.464076925792721 +2024-06-27 07:30:00+00:00,12.891894897464935 +2024-06-27 07:45:00+00:00,12.472020093052997 +2024-06-27 08:00:00+00:00,12.041737891228607 +2024-06-27 08:15:00+00:00,10.905931623490373 +2024-06-27 08:30:00+00:00,11.299317687059856 +2024-06-27 08:45:00+00:00,11.20612354192437 +2024-06-27 09:00:00+00:00,9.091355669696597 +2024-06-27 09:15:00+00:00,5.74342570526455 +2024-06-27 09:30:00+00:00,4.872098012844533 +2024-06-27 09:45:00+00:00,4.062894416142738 +2024-06-27 10:00:00+00:00,3.1119112041824146 +2024-06-27 10:15:00+00:00,3.208113604677791 +2024-06-27 10:30:00+00:00,3.9277451899442837 +2024-06-27 10:45:00+00:00,1.7934508002295992 +2024-06-27 11:00:00+00:00,1.763676452978584 +2024-06-27 11:15:00+00:00,1.6490685185309737 +2024-06-27 11:30:00+00:00,1.5458300890403136 +2024-06-27 11:45:00+00:00,0.9502488902485942 +2024-06-27 12:00:00+00:00,1.1985383301342003 +2024-06-27 12:15:00+00:00,1.5028310851656979 +2024-06-27 12:30:00+00:00,2.736312348298347 +2024-06-27 12:45:00+00:00,1.6910193072044122 +2024-06-27 13:00:00+00:00,3.3075874649816113 +2024-06-27 13:15:00+00:00,4.390756480577766 +2024-06-27 13:30:00+00:00,4.504508523185866 +2024-06-27 13:45:00+00:00,9.136005075007121 +2024-06-27 14:00:00+00:00,8.474656039841749 +2024-06-27 14:15:00+00:00,7.499466313967552 +2024-06-27 14:30:00+00:00,6.816589035872481 +2024-06-27 14:45:00+00:00,5.704627166475724 +2024-06-27 15:00:00+00:00,4.190623946917935 +2024-06-27 15:15:00+00:00,3.0864841888710286 +2024-06-27 15:30:00+00:00,2.019094937560798 +2024-06-27 15:45:00+00:00,0.7579018909197084 +2024-06-27 16:00:00+00:00,0.3493241206756019 +2024-06-27 16:15:00+00:00,0.0 +2024-06-28 03:15:00+00:00,2.3259151081941893 +2024-06-28 03:30:00+00:00,4.051552129421765 +2024-06-28 03:45:00+00:00,5.119518703783949 +2024-06-28 04:00:00+00:00,9.321667916419377 +2024-06-28 04:15:00+00:00,16.2939335167751 +2024-06-28 04:30:00+00:00,13.735640699408187 +2024-06-28 04:45:00+00:00,21.106814859011664 +2024-06-28 05:00:00+00:00,15.76030562556302 +2024-06-28 05:15:00+00:00,14.946326407633643 +2024-06-28 05:30:00+00:00,15.286509589423568 +2024-06-28 05:45:00+00:00,15.587009870638882 +2024-06-28 06:00:00+00:00,16.00762244547648 +2024-06-28 06:15:00+00:00,16.255167095211448 +2024-06-28 06:30:00+00:00,15.873026233377976 +2024-06-28 06:45:00+00:00,15.841716553444078 +2024-06-28 07:00:00+00:00,14.962963177999047 +2024-06-28 07:15:00+00:00,14.51065276558816 +2024-06-28 07:30:00+00:00,13.568038591760786 +2024-06-28 07:45:00+00:00,13.710750173130329 +2024-06-28 08:00:00+00:00,13.123513507169376 +2024-06-28 08:15:00+00:00,12.529073663954359 +2024-06-28 08:30:00+00:00,12.473568545641193 +2024-06-28 08:45:00+00:00,12.19675672034802 +2024-06-28 09:00:00+00:00,10.78690088890115 +2024-06-28 09:15:00+00:00,10.90727080871211 +2024-06-28 09:30:00+00:00,10.717507019558814 +2024-06-28 09:45:00+00:00,10.236727453536773 +2024-06-28 10:00:00+00:00,10.06610329506477 +2024-06-28 10:15:00+00:00,9.465519013469288 +2024-06-28 10:30:00+00:00,9.433297987872171 +2024-06-28 10:45:00+00:00,8.930876916690542 +2024-06-28 11:00:00+00:00,9.195611180227498 +2024-06-28 11:15:00+00:00,9.196004486770192 +2024-06-28 11:30:00+00:00,8.106543113016576 +2024-06-28 11:45:00+00:00,8.984394655064065 +2024-06-28 12:00:00+00:00,9.224864845138523 +2024-06-28 12:15:00+00:00,8.620103298747127 +2024-06-28 12:30:00+00:00,8.689480313968183 +2024-06-28 12:45:00+00:00,9.233587003915552 +2024-06-28 13:00:00+00:00,10.378358023334858 +2024-06-28 13:15:00+00:00,9.480145536420666 +2024-06-28 13:30:00+00:00,9.893761070902563 +2024-06-28 13:45:00+00:00,9.960363245509242 +2024-06-28 14:00:00+00:00,10.309204223264768 +2024-06-28 14:15:00+00:00,8.954709626364648 +2024-06-28 14:30:00+00:00,8.510569784296361 +2024-06-28 14:45:00+00:00,7.569664804730346 +2024-06-28 15:00:00+00:00,5.635366074911258 +2024-06-28 15:15:00+00:00,4.026703629664642 +2024-06-28 15:30:00+00:00,2.481994351278632 +2024-06-28 15:45:00+00:00,1.1032573252994637 +2024-06-28 16:00:00+00:00,0.5517328286056453 +2024-06-28 16:15:00+00:00,0.0 +2024-06-29 03:15:00+00:00,2.4405898386995712 +2024-06-29 03:30:00+00:00,5.1305897244399015 +2024-06-29 03:45:00+00:00,5.710327277118548 +2024-06-29 04:00:00+00:00,7.687463011908065 +2024-06-29 04:15:00+00:00,9.196385834863992 +2024-06-29 04:30:00+00:00,13.46613779349265 +2024-06-29 04:45:00+00:00,13.926537304417804 +2024-06-29 05:00:00+00:00,14.277326960622803 +2024-06-29 05:15:00+00:00,14.868829540830262 +2024-06-29 05:30:00+00:00,15.379392853007538 +2024-06-29 05:45:00+00:00,15.513931783767154 +2024-06-29 06:00:00+00:00,15.807873270694156 +2024-06-29 06:15:00+00:00,16.165047738057332 +2024-06-29 06:30:00+00:00,15.864588999673773 +2024-06-29 06:45:00+00:00,14.764383158853201 +2024-06-29 07:00:00+00:00,13.979743360801885 +2024-06-29 07:15:00+00:00,13.738810429786108 +2024-06-29 07:30:00+00:00,13.053089643792465 +2024-06-29 07:45:00+00:00,12.122584641074354 +2024-06-29 08:00:00+00:00,11.49191432830029 +2024-06-29 08:15:00+00:00,10.83997140196942 +2024-06-29 08:30:00+00:00,10.64253481964489 +2024-06-29 08:45:00+00:00,10.501810655878126 +2024-06-29 09:00:00+00:00,10.589579751852607 +2024-06-29 09:15:00+00:00,5.376608257052322 +2024-06-29 09:30:00+00:00,4.228563137832878 +2024-06-29 09:45:00+00:00,4.451568020401268 +2024-06-29 10:00:00+00:00,4.5313579377194975 +2024-06-29 10:15:00+00:00,3.393225302752251 +2024-06-29 10:30:00+00:00,1.8310578807581313 +2024-06-29 10:45:00+00:00,1.397942377667591 +2024-06-29 11:00:00+00:00,1.7476734907640321 +2024-06-29 11:15:00+00:00,3.6519791411754814 +2024-06-29 11:30:00+00:00,3.511875266605919 +2024-06-29 11:45:00+00:00,1.878181860029464 +2024-06-29 12:00:00+00:00,1.492608551432857 +2024-06-29 12:15:00+00:00,1.7985415105349656 +2024-06-29 12:30:00+00:00,3.9044382488078386 +2024-06-29 12:45:00+00:00,4.781806620433636 +2024-06-29 13:00:00+00:00,4.6628974736923645 +2024-06-29 13:15:00+00:00,5.015183362727221 +2024-06-29 13:30:00+00:00,4.688789562808767 +2024-06-29 13:45:00+00:00,4.827201805402291 +2024-06-29 14:00:00+00:00,8.271738507366491 +2024-06-29 14:15:00+00:00,7.548769022913659 +2024-06-29 14:30:00+00:00,7.149853084116131 +2024-06-29 14:45:00+00:00,7.032536442545458 +2024-06-29 15:00:00+00:00,5.214295047819812 +2024-06-29 15:15:00+00:00,4.125845635145031 +2024-06-29 15:30:00+00:00,2.4799194602456742 +2024-06-29 15:45:00+00:00,1.4848187825940595 +2024-06-29 16:00:00+00:00,1.043259574957951 +2024-06-29 16:15:00+00:00,0.5724909246663823 +2024-06-30 03:15:00+00:00,3.4752147507876234 +2024-06-30 03:30:00+00:00,5.910667371614892 +2024-06-30 03:45:00+00:00,7.9755512892883305 +2024-06-30 04:00:00+00:00,10.161456242662856 +2024-06-30 04:15:00+00:00,9.250778662094065 +2024-06-30 04:30:00+00:00,15.34593758427018 +2024-06-30 04:45:00+00:00,13.678909698192454 +2024-06-30 05:00:00+00:00,14.578356134681258 +2024-06-30 05:15:00+00:00,15.166700312081502 +2024-06-30 05:30:00+00:00,15.674722510105122 +2024-06-30 05:45:00+00:00,15.796196691150021 +2024-06-30 06:00:00+00:00,15.669959076901296 +2024-06-30 06:15:00+00:00,16.257152466791286 +2024-06-30 06:30:00+00:00,16.13539729068786 +2024-06-30 06:45:00+00:00,15.370009650166633 +2024-06-30 07:00:00+00:00,15.43650633815475 +2024-06-30 07:15:00+00:00,14.1453189145337 +2024-06-30 07:30:00+00:00,14.59890605362683 +2024-06-30 07:45:00+00:00,14.025625963317642 +2024-06-30 08:00:00+00:00,14.136499373739955 +2024-06-30 08:15:00+00:00,14.246438957296437 +2024-06-30 08:30:00+00:00,13.45738665376846 +2024-06-30 08:45:00+00:00,13.469560177325173 +2024-06-30 09:00:00+00:00,13.561427335519443 +2024-06-30 09:15:00+00:00,13.623586867201455 +2024-06-30 09:30:00+00:00,12.391079336663006 +2024-06-30 09:45:00+00:00,12.92998891361108 +2024-06-30 10:00:00+00:00,11.114433934076605 +2024-06-30 10:15:00+00:00,11.62305411757796 +2024-06-30 10:30:00+00:00,9.87226474431428 +2024-06-30 10:45:00+00:00,10.076798183182975 +2024-06-30 11:00:00+00:00,11.276735972282431 +2024-06-30 11:15:00+00:00,11.439937477065598 +2024-06-30 11:30:00+00:00,11.186600674661559 +2024-06-30 11:45:00+00:00,10.329780381316152 +2024-06-30 12:00:00+00:00,11.945365718097497 +2024-06-30 12:15:00+00:00,9.971400690787583 +2024-06-30 12:30:00+00:00,10.457632754829056 +2024-06-30 12:45:00+00:00,10.772265631441392 +2024-06-30 13:00:00+00:00,11.122278075871764 +2024-06-30 13:15:00+00:00,11.312478316880407 +2024-06-30 13:30:00+00:00,12.547821041812604 +2024-06-30 13:45:00+00:00,12.299134870052878 +2024-06-30 14:00:00+00:00,11.430992181772467 +2024-06-30 14:15:00+00:00,10.542151732880708 +2024-06-30 14:30:00+00:00,8.964105821747882 +2024-06-30 14:45:00+00:00,7.918155641269313 +2024-06-30 15:00:00+00:00,6.392347709150098 +2024-06-30 15:15:00+00:00,4.537964953047623 +2024-06-30 15:30:00+00:00,2.898929524863643 +2024-06-30 15:45:00+00:00,1.513936724402386 +2024-06-30 16:00:00+00:00,0.9416377190442631 +2024-06-30 16:15:00+00:00,0.3470336308109032 +2024-07-01 03:15:00+00:00,1.9644474358819324 +2024-07-01 03:30:00+00:00,3.473295618908748 +2024-07-01 03:45:00+00:00,8.514717775191013 +2024-07-01 04:00:00+00:00,10.000937403540421 +2024-07-01 04:15:00+00:00,11.861977903829784 +2024-07-01 04:30:00+00:00,11.082129481749138 +2024-07-01 04:45:00+00:00,6.422083245389691 +2024-07-01 05:00:00+00:00,15.304845465283305 +2024-07-01 05:15:00+00:00,15.330725607809676 +2024-07-01 05:30:00+00:00,16.305899491790903 +2024-07-01 05:45:00+00:00,16.203148024842367 +2024-07-01 06:00:00+00:00,16.310209202986993 +2024-07-01 06:15:00+00:00,16.52671474528969 +2024-07-01 06:30:00+00:00,17.177381148201484 +2024-07-01 06:45:00+00:00,16.777088580045064 +2024-07-01 07:00:00+00:00,16.593320282943406 +2024-07-01 07:15:00+00:00,15.558252028655888 +2024-07-01 07:30:00+00:00,15.4834974957563 +2024-07-01 07:45:00+00:00,15.27325270763215 +2024-07-01 08:00:00+00:00,15.061959165545352 +2024-07-01 08:15:00+00:00,14.976766639868154 +2024-07-01 08:30:00+00:00,14.369940836894006 +2024-07-01 08:45:00+00:00,13.195819826511467 +2024-07-01 09:00:00+00:00,13.6302534623712 +2024-07-01 09:15:00+00:00,11.25801314799628 +2024-07-01 09:30:00+00:00,6.428864782587347 +2024-07-01 09:45:00+00:00,11.020965875669486 +2024-07-01 10:00:00+00:00,6.205891199745462 +2024-07-01 10:15:00+00:00,5.945274695071941 +2024-07-01 10:30:00+00:00,4.7427163811477495 +2024-07-01 10:45:00+00:00,4.43641815471085 +2024-07-01 11:00:00+00:00,5.264917201579722 +2024-07-01 11:15:00+00:00,6.933743770976789 +2024-07-01 11:30:00+00:00,5.334371658085125 +2024-07-01 11:45:00+00:00,4.3291210287358215 +2024-07-01 12:00:00+00:00,4.349104664966617 +2024-07-01 12:15:00+00:00,11.925434514413425 +2024-07-01 12:30:00+00:00,6.0698655250932285 +2024-07-01 12:45:00+00:00,5.570453625594862 +2024-07-01 13:00:00+00:00,6.231478267814781 +2024-07-01 13:15:00+00:00,11.385125419509816 +2024-07-01 13:30:00+00:00,12.241909466750634 +2024-07-01 13:45:00+00:00,11.948867111081698 +2024-07-01 14:00:00+00:00,10.517959309234257 +2024-07-01 14:15:00+00:00,9.881505927586595 +2024-07-01 14:30:00+00:00,9.205951070725863 +2024-07-01 14:45:00+00:00,6.899729832858439 +2024-07-01 15:00:00+00:00,6.032797508250029 +2024-07-01 15:15:00+00:00,4.433112659428997 +2024-07-01 15:30:00+00:00,2.8278405400378563 +2024-07-01 15:45:00+00:00,2.2379613130001816 +2024-07-01 16:00:00+00:00,1.5831373248275507 +2024-07-01 16:15:00+00:00,0.31871342268847047 +2024-07-02 03:00:00+00:00,1.6767607364016426 +2024-07-02 03:15:00+00:00,3.515079179644971 +2024-07-02 03:30:00+00:00,5.33254982441296 +2024-07-02 03:45:00+00:00,4.1893358362667446 +2024-07-02 04:00:00+00:00,4.43233371760701 +2024-07-02 04:15:00+00:00,11.714342366606843 +2024-07-02 04:30:00+00:00,10.803029202926895 +2024-07-02 04:45:00+00:00,10.293159314216089 +2024-07-02 05:00:00+00:00,10.634926980090365 +2024-07-02 05:15:00+00:00,17.365782332578835 +2024-07-02 05:30:00+00:00,16.018976545904785 +2024-07-02 05:45:00+00:00,17.461532238264375 +2024-07-02 06:00:00+00:00,12.383407842714245 +2024-07-02 06:15:00+00:00,16.959906005662525 +2024-07-02 06:30:00+00:00,17.664804982548592 +2024-07-02 06:45:00+00:00,17.725356833620353 +2024-07-02 07:00:00+00:00,17.84600028037423 +2024-07-02 07:15:00+00:00,17.524363383498365 +2024-07-02 07:30:00+00:00,17.686051620245557 +2024-07-02 07:45:00+00:00,17.518715391786433 +2024-07-02 08:00:00+00:00,17.348521315188616 +2024-07-02 08:15:00+00:00,16.174140401341937 +2024-07-02 08:30:00+00:00,16.062142995277885 +2024-07-02 08:45:00+00:00,14.87660784017224 +2024-07-02 09:00:00+00:00,16.166385957293556 +2024-07-02 09:15:00+00:00,14.91882851910929 +2024-07-02 09:30:00+00:00,14.635330231578275 +2024-07-02 09:45:00+00:00,13.691594678336724 +2024-07-02 10:00:00+00:00,13.315691010830848 +2024-07-02 10:15:00+00:00,14.455802890737875 +2024-07-02 10:30:00+00:00,12.284938771195616 +2024-07-02 10:45:00+00:00,13.152023502512652 +2024-07-02 11:00:00+00:00,12.815560545786093 +2024-07-02 11:15:00+00:00,13.443529876668334 +2024-07-02 11:30:00+00:00,13.058175880897489 +2024-07-02 11:45:00+00:00,13.371910468583842 +2024-07-02 12:00:00+00:00,13.067511577924844 +2024-07-02 12:15:00+00:00,13.162105965150847 +2024-07-02 12:30:00+00:00,13.545684262799977 +2024-07-02 12:45:00+00:00,12.173433609795087 +2024-07-02 13:00:00+00:00,13.673772798110619 +2024-07-02 13:15:00+00:00,13.76122013485153 +2024-07-02 13:30:00+00:00,13.807093229869269 +2024-07-02 13:45:00+00:00,12.750886615354837 +2024-07-02 14:00:00+00:00,11.931842954024159 +2024-07-02 14:15:00+00:00,10.862290190213159 +2024-07-02 14:30:00+00:00,9.378139197779701 +2024-07-02 14:45:00+00:00,7.968846453784735 +2024-07-02 15:00:00+00:00,6.291119727431964 +2024-07-02 15:15:00+00:00,4.489580346993505 +2024-07-02 15:30:00+00:00,2.970306273054571 +2024-07-02 15:45:00+00:00,2.239898861725417 +2024-07-02 16:00:00+00:00,1.489464148568108 +2024-07-02 16:15:00+00:00,0.2922731674909176 +2024-07-03 03:00:00+00:00,1.8728010026572803 +2024-07-03 03:15:00+00:00,4.020922655853421 +2024-07-03 03:30:00+00:00,6.693429598937206 +2024-07-03 03:45:00+00:00,8.199570464716 +2024-07-03 04:00:00+00:00,9.6417296731319 +2024-07-03 04:15:00+00:00,11.478990354642468 +2024-07-03 04:30:00+00:00,12.614308776322256 +2024-07-03 04:45:00+00:00,13.442000865906474 +2024-07-03 05:00:00+00:00,14.163083444669997 +2024-07-03 05:15:00+00:00,14.43278358140055 +2024-07-03 05:30:00+00:00,14.930698028083519 +2024-07-03 05:45:00+00:00,15.496419802285118 +2024-07-03 06:00:00+00:00,15.890864923847369 +2024-07-03 06:15:00+00:00,14.372006552812843 +2024-07-03 06:30:00+00:00,14.358095946480336 +2024-07-03 06:45:00+00:00,13.497310978895559 +2024-07-03 07:00:00+00:00,13.654596870014762 +2024-07-03 07:15:00+00:00,13.62828227359697 +2024-07-03 07:30:00+00:00,12.966642816613719 +2024-07-03 07:45:00+00:00,12.671927755138276 +2024-07-03 08:00:00+00:00,12.374616496918492 +2024-07-03 08:15:00+00:00,11.239409499198185 +2024-07-03 08:30:00+00:00,11.269370371656848 +2024-07-03 08:45:00+00:00,6.6777252628209585 +2024-07-03 09:00:00+00:00,10.536229941237952 +2024-07-03 09:15:00+00:00,6.232044128090477 +2024-07-03 09:30:00+00:00,5.79852805956281 +2024-07-03 09:45:00+00:00,2.434593702248005 +2024-07-03 10:00:00+00:00,4.392093458142901 +2024-07-03 10:15:00+00:00,2.266605223769167 +2024-07-03 10:30:00+00:00,1.7452176594070838 +2024-07-03 10:45:00+00:00,4.23957231326529 +2024-07-03 11:00:00+00:00,2.617777170469771 +2024-07-03 11:15:00+00:00,2.6120545664620956 +2024-07-03 11:30:00+00:00,2.389586733987789 +2024-07-03 11:45:00+00:00,1.8011858427213194 +2024-07-03 12:00:00+00:00,4.461141735939432 +2024-07-03 12:15:00+00:00,2.3275478157182548 +2024-07-03 12:30:00+00:00,2.6104667681221505 +2024-07-03 12:45:00+00:00,1.9561767759615518 +2024-07-03 13:00:00+00:00,4.974673632128111 +2024-07-03 13:15:00+00:00,4.134766590038496 +2024-07-03 13:30:00+00:00,5.384916421667995 +2024-07-03 13:45:00+00:00,5.495488237191535 +2024-07-03 14:00:00+00:00,9.05900675002361 +2024-07-03 14:15:00+00:00,8.149613425368578 +2024-07-03 14:30:00+00:00,7.080186882708222 +2024-07-03 14:45:00+00:00,5.709811601380451 +2024-07-03 15:00:00+00:00,4.8081005410039985 +2024-07-03 15:15:00+00:00,3.498079505672511 +2024-07-03 15:30:00+00:00,2.0986664534915604 +2024-07-03 15:45:00+00:00,0.8781592418576831 +2024-07-03 16:00:00+00:00,0.4046672535090925 +2024-07-03 16:15:00+00:00,0.0 +2024-07-04 03:00:00+00:00,2.8821087042344424 +2024-07-04 03:15:00+00:00,4.586213293331298 +2024-07-04 03:30:00+00:00,6.371484198671116 +2024-07-04 03:45:00+00:00,8.23211562368768 +2024-07-04 04:00:00+00:00,9.079797988249362 +2024-07-04 04:15:00+00:00,9.835549044316602 +2024-07-04 04:30:00+00:00,11.172922450205162 +2024-07-04 04:45:00+00:00,12.234433125790263 +2024-07-04 05:00:00+00:00,12.998290783659897 +2024-07-04 05:15:00+00:00,13.82627235074548 +2024-07-04 05:30:00+00:00,14.497011073030686 +2024-07-04 05:45:00+00:00,14.752145599448804 +2024-07-04 06:00:00+00:00,14.408570405377965 +2024-07-04 06:15:00+00:00,14.077725793313027 +2024-07-04 06:30:00+00:00,14.04819682596036 +2024-07-04 06:45:00+00:00,12.551604365969663 +2024-07-04 07:00:00+00:00,12.525613575126206 +2024-07-04 07:15:00+00:00,12.3742434994445 +2024-07-04 07:30:00+00:00,10.987623958477595 +2024-07-04 07:45:00+00:00,11.505967749246508 +2024-07-04 08:00:00+00:00,11.404667521663114 +2024-07-04 08:15:00+00:00,12.340550455257912 +2024-07-04 08:30:00+00:00,11.482627924146577 +2024-07-04 08:45:00+00:00,10.674560305192948 +2024-07-04 09:00:00+00:00,6.494899437568934 +2024-07-04 09:15:00+00:00,6.333966167919222 +2024-07-04 09:30:00+00:00,5.968319673852477 +2024-07-04 09:45:00+00:00,14.661066365609921 +2024-07-04 10:00:00+00:00,14.94491442579555 +2024-07-04 10:15:00+00:00,14.84742547244214 +2024-07-04 10:30:00+00:00,14.686247219438746 +2024-07-04 10:45:00+00:00,14.533797359807371 +2024-07-04 11:00:00+00:00,13.801486080628761 +2024-07-04 11:15:00+00:00,14.136508643387867 +2024-07-04 11:30:00+00:00,14.314364703908419 +2024-07-04 11:45:00+00:00,13.862991343273903 +2024-07-04 12:00:00+00:00,13.470672350623108 +2024-07-04 12:15:00+00:00,13.070405909626686 +2024-07-04 12:30:00+00:00,13.41331177586332 +2024-07-04 12:45:00+00:00,13.360313081643099 +2024-07-04 13:00:00+00:00,13.541998619333413 +2024-07-04 13:15:00+00:00,13.192571672763332 +2024-07-04 13:30:00+00:00,11.794339657886646 +2024-07-04 13:45:00+00:00,12.084337296270522 +2024-07-04 14:00:00+00:00,10.585301148035667 +2024-07-04 14:15:00+00:00,9.467183741932054 +2024-07-04 14:30:00+00:00,8.527323386069524 +2024-07-04 14:45:00+00:00,6.830530754038019 +2024-07-04 15:00:00+00:00,5.288172196205396 +2024-07-04 15:15:00+00:00,4.147703084428324 +2024-07-04 15:30:00+00:00,2.515051643339026 +2024-07-04 15:45:00+00:00,1.226891177083037 +2024-07-04 16:00:00+00:00,0.4100058360682697 +2024-07-05 03:00:00+00:00,2.1254117164920885 +2024-07-05 03:15:00+00:00,3.885155518285996 +2024-07-05 03:30:00+00:00,5.670898775138655 +2024-07-05 03:45:00+00:00,6.845191326333152 +2024-07-05 04:00:00+00:00,8.639300263276768 +2024-07-05 04:15:00+00:00,9.239298618614043 +2024-07-05 04:30:00+00:00,9.958502954308642 +2024-07-05 04:45:00+00:00,10.994522995808858 +2024-07-05 05:00:00+00:00,11.901332803002676 +2024-07-05 05:15:00+00:00,12.975036239015138 +2024-07-05 05:30:00+00:00,13.394349616080788 +2024-07-05 05:45:00+00:00,13.542580555442967 +2024-07-05 06:00:00+00:00,14.132163107434735 +2024-07-05 06:15:00+00:00,14.089844788700203 +2024-07-05 06:30:00+00:00,14.225480868930832 +2024-07-05 06:45:00+00:00,13.799674070143952 +2024-07-05 07:00:00+00:00,13.065666210475092 +2024-07-05 07:15:00+00:00,13.398642225002513 +2024-07-05 07:30:00+00:00,11.884066876398798 +2024-07-05 07:45:00+00:00,12.012485484321925 +2024-07-05 08:00:00+00:00,11.59087560364307 +2024-07-05 08:15:00+00:00,11.899906109141206 +2024-07-05 08:30:00+00:00,10.745089917542352 +2024-07-05 08:45:00+00:00,10.513613513097717 +2024-07-05 09:00:00+00:00,10.151548061444306 +2024-07-05 09:15:00+00:00,8.358224443879237 +2024-07-05 09:30:00+00:00,8.875431332575744 +2024-07-05 09:45:00+00:00,9.429456294737946 +2024-07-05 10:00:00+00:00,5.376198419937933 +2024-07-05 10:15:00+00:00,8.576817384950825 +2024-07-05 10:30:00+00:00,8.870335042503154 +2024-07-05 10:45:00+00:00,9.289351653854542 +2024-07-05 11:00:00+00:00,4.4535210184010765 +2024-07-05 11:15:00+00:00,4.999731118885396 +2024-07-05 11:30:00+00:00,5.505496935921984 +2024-07-05 11:45:00+00:00,4.036754110071197 +2024-07-05 12:00:00+00:00,8.960579732350881 +2024-07-05 12:15:00+00:00,5.412111365885021 +2024-07-05 12:30:00+00:00,4.971160488265946 +2024-07-05 12:45:00+00:00,9.045122421133872 +2024-07-05 13:00:00+00:00,5.491452410870807 +2024-07-05 13:15:00+00:00,11.008416382200119 +2024-07-05 13:30:00+00:00,9.944722180809926 +2024-07-05 13:45:00+00:00,11.991358045673865 +2024-07-05 14:00:00+00:00,11.37949246427291 +2024-07-05 14:15:00+00:00,10.765236009522122 +2024-07-05 14:30:00+00:00,9.379819321321026 +2024-07-05 14:45:00+00:00,8.07841414835492 +2024-07-05 15:00:00+00:00,6.867125625248483 +2024-07-05 15:15:00+00:00,5.153993287310124 +2024-07-05 15:30:00+00:00,3.7445624950185508 +2024-07-05 15:45:00+00:00,2.3376488485461406 +2024-07-05 16:00:00+00:00,1.1235145093243124 +2024-07-05 16:15:00+00:00,0.12094819645900357 +2024-07-06 03:00:00+00:00,2.272533364208554 +2024-07-06 03:15:00+00:00,4.383386314694784 +2024-07-06 03:30:00+00:00,4.6743881712662105 +2024-07-06 03:45:00+00:00,8.495646207122357 +2024-07-06 04:00:00+00:00,3.5328329727882695 +2024-07-06 04:15:00+00:00,4.806163473967559 +2024-07-06 04:30:00+00:00,5.965175653840751 +2024-07-06 04:45:00+00:00,12.515409570303177 +2024-07-06 05:00:00+00:00,6.049740252582808 +2024-07-06 05:15:00+00:00,15.787521800980901 +2024-07-06 05:30:00+00:00,16.75636563729025 +2024-07-06 05:45:00+00:00,14.831353966836955 +2024-07-06 06:00:00+00:00,15.851295767547494 +2024-07-06 06:15:00+00:00,16.849185811989017 +2024-07-06 06:30:00+00:00,16.799650653270074 +2024-07-06 06:45:00+00:00,16.65069563016307 +2024-07-06 07:00:00+00:00,16.68523659824242 +2024-07-06 07:15:00+00:00,11.397967477944055 +2024-07-06 07:30:00+00:00,16.40446072643814 +2024-07-06 07:45:00+00:00,16.895425933561395 +2024-07-06 08:00:00+00:00,16.62836807022332 +2024-07-06 08:15:00+00:00,16.545304788364263 +2024-07-06 08:30:00+00:00,16.134741284679556 +2024-07-06 08:45:00+00:00,16.231486432452577 +2024-07-06 09:00:00+00:00,16.300219889883667 +2024-07-06 09:15:00+00:00,17.025747268152145 +2024-07-06 09:30:00+00:00,16.191444095877387 +2024-07-06 09:45:00+00:00,16.3959141285005 +2024-07-06 10:00:00+00:00,16.56040823150536 +2024-07-06 10:15:00+00:00,16.54996116767161 +2024-07-06 10:30:00+00:00,16.702803476931262 +2024-07-06 10:45:00+00:00,16.13115786799959 +2024-07-06 11:00:00+00:00,16.489854195098545 +2024-07-06 11:15:00+00:00,16.113101253346876 +2024-07-06 11:30:00+00:00,16.19182678856497 +2024-07-06 11:45:00+00:00,16.07774835383141 +2024-07-06 12:00:00+00:00,16.17303639482828 +2024-07-06 12:15:00+00:00,16.26095300383032 +2024-07-06 12:30:00+00:00,15.852172907752252 +2024-07-06 12:45:00+00:00,15.58267787151274 +2024-07-06 13:00:00+00:00,15.415242145773057 +2024-07-06 13:15:00+00:00,15.159811439915917 +2024-07-06 13:30:00+00:00,15.04331956262288 +2024-07-06 13:45:00+00:00,14.145312695984101 +2024-07-06 14:00:00+00:00,13.700220402432063 +2024-07-06 14:15:00+00:00,12.71662488710322 +2024-07-06 14:30:00+00:00,11.605387498874892 +2024-07-06 14:45:00+00:00,10.124273043834547 +2024-07-06 15:00:00+00:00,8.414856655056928 +2024-07-06 15:15:00+00:00,6.533698639173966 +2024-07-06 15:30:00+00:00,4.640331245897764 +2024-07-06 15:45:00+00:00,2.857941480412782 +2024-07-06 16:00:00+00:00,1.3195030713421767 +2024-07-07 03:00:00+00:00,2.5608347644243254 +2024-07-07 03:15:00+00:00,7.128308866895766 +2024-07-07 03:30:00+00:00,9.869833060780836 +2024-07-07 03:45:00+00:00,6.312308613130387 +2024-07-07 04:00:00+00:00,11.77513111569592 +2024-07-07 04:15:00+00:00,12.107108088180011 +2024-07-07 04:30:00+00:00,12.352978218521006 +2024-07-07 04:45:00+00:00,5.425085629076759 +2024-07-07 05:00:00+00:00,15.548817819202771 +2024-07-07 05:15:00+00:00,15.263203757365453 +2024-07-07 05:30:00+00:00,15.78414834442652 +2024-07-07 05:45:00+00:00,16.495465476353367 +2024-07-07 06:00:00+00:00,16.737681415103836 +2024-07-07 06:15:00+00:00,16.056785269345347 +2024-07-07 06:30:00+00:00,16.22892947855176 +2024-07-07 06:45:00+00:00,15.400549716025546 +2024-07-07 07:00:00+00:00,15.994677302320326 +2024-07-07 07:15:00+00:00,16.06067800379298 +2024-07-07 07:30:00+00:00,16.404325393454826 +2024-07-07 07:45:00+00:00,16.698860678244724 +2024-07-07 08:00:00+00:00,16.942339859545093 +2024-07-07 08:15:00+00:00,16.54211082531554 +2024-07-07 08:30:00+00:00,16.021809595698603 +2024-07-07 08:45:00+00:00,16.976968071240343 +2024-07-07 09:00:00+00:00,17.16172186625371 +2024-07-07 09:15:00+00:00,16.626671482412643 +2024-07-07 09:30:00+00:00,15.211118263141138 +2024-07-07 09:45:00+00:00,15.430644022234446 +2024-07-07 10:00:00+00:00,14.496415717892022 +2024-07-07 10:15:00+00:00,14.746416896066858 +2024-07-07 10:30:00+00:00,13.771911141591223 +2024-07-07 10:45:00+00:00,13.587607990813474 +2024-07-07 11:00:00+00:00,13.701813876807766 +2024-07-07 11:15:00+00:00,11.866755393014103 +2024-07-07 11:30:00+00:00,12.510093990937591 +2024-07-07 11:45:00+00:00,12.108250492119579 +2024-07-07 12:00:00+00:00,11.964585975043473 +2024-07-07 12:15:00+00:00,11.820279710105005 +2024-07-07 12:30:00+00:00,13.070824220509593 +2024-07-07 12:45:00+00:00,11.905641329747946 +2024-07-07 13:00:00+00:00,11.957142994965643 +2024-07-07 13:15:00+00:00,13.033692994864822 +2024-07-07 13:30:00+00:00,5.394240336994939 +2024-07-07 13:45:00+00:00,12.720783265288185 +2024-07-07 14:00:00+00:00,12.01810352728809 +2024-07-07 14:15:00+00:00,10.975213758396407 +2024-07-07 14:30:00+00:00,10.108121051845425 +2024-07-07 14:45:00+00:00,8.808456865498805 +2024-07-07 15:00:00+00:00,7.134163010077833 +2024-07-07 15:15:00+00:00,5.447334540264927 +2024-07-07 15:30:00+00:00,3.6765040828859323 +2024-07-07 15:45:00+00:00,2.060934534435813 +2024-07-07 16:00:00+00:00,0.7500159846823498 +2024-07-08 03:15:00+00:00,4.095363250396863 +2024-07-08 03:30:00+00:00,3.812647580190301 +2024-07-08 03:45:00+00:00,9.68897867623903 +2024-07-08 04:00:00+00:00,8.470333659004822 +2024-07-08 04:15:00+00:00,7.137941870589507 +2024-07-08 04:30:00+00:00,8.521660348173619 +2024-07-08 04:45:00+00:00,14.715745976373455 +2024-07-08 05:00:00+00:00,9.40233365810965 +2024-07-08 05:15:00+00:00,10.185416987660547 +2024-07-08 05:30:00+00:00,13.484657504693178 +2024-07-08 05:45:00+00:00,13.657853404443248 +2024-07-08 06:00:00+00:00,17.472547883850886 +2024-07-08 06:15:00+00:00,15.661076160149738 +2024-07-08 06:30:00+00:00,17.0945254519402 +2024-07-08 06:45:00+00:00,17.204639037059373 +2024-07-08 07:00:00+00:00,17.3362145035309 +2024-07-08 07:15:00+00:00,17.124880570861094 +2024-07-08 07:30:00+00:00,16.985509016442286 +2024-07-08 07:45:00+00:00,17.122745399810626 +2024-07-08 08:00:00+00:00,16.598942681421423 +2024-07-08 08:15:00+00:00,16.68340531095499 +2024-07-08 08:30:00+00:00,16.873570489778444 +2024-07-08 08:45:00+00:00,17.38657260240193 +2024-07-08 09:00:00+00:00,16.828125591850565 +2024-07-08 09:15:00+00:00,16.980871246457152 +2024-07-08 09:30:00+00:00,16.918401557573826 +2024-07-08 09:45:00+00:00,16.853828170506265 +2024-07-08 10:00:00+00:00,16.927933954150355 +2024-07-08 10:15:00+00:00,15.873361735262984 +2024-07-08 10:30:00+00:00,16.255906602076056 +2024-07-08 10:45:00+00:00,16.64252092677751 +2024-07-08 11:00:00+00:00,16.180333806732655 +2024-07-08 11:15:00+00:00,16.41726478411257 +2024-07-08 11:30:00+00:00,16.28859772616425 +2024-07-08 11:45:00+00:00,16.36088271126221 +2024-07-08 12:00:00+00:00,16.236042357411907 +2024-07-08 12:15:00+00:00,15.15593949339011 +2024-07-08 12:30:00+00:00,16.008608959987672 +2024-07-08 12:45:00+00:00,15.433355022013867 +2024-07-08 13:00:00+00:00,14.960593135902771 +2024-07-08 13:15:00+00:00,15.18974635635711 +2024-07-08 13:30:00+00:00,14.643480689308282 +2024-07-08 13:45:00+00:00,13.816534304115754 +2024-07-08 14:00:00+00:00,13.21501517160842 +2024-07-08 14:15:00+00:00,11.929054624011705 +2024-07-08 14:30:00+00:00,10.95014076113185 +2024-07-08 14:45:00+00:00,9.077382751845715 +2024-07-08 15:00:00+00:00,7.932790650218586 +2024-07-08 15:15:00+00:00,5.734192282180682 +2024-07-08 15:30:00+00:00,3.833572159459785 +2024-07-08 15:45:00+00:00,2.237267540071622 +2024-07-08 16:00:00+00:00,0.6467916733866361 +2024-07-09 03:00:00+00:00,2.215773039096675 +2024-07-09 03:15:00+00:00,4.1725684683880715 +2024-07-09 03:30:00+00:00,6.297497021481472 +2024-07-09 03:45:00+00:00,8.241776315327911 +2024-07-09 04:00:00+00:00,9.380595951077627 +2024-07-09 04:15:00+00:00,10.965600289681056 +2024-07-09 04:30:00+00:00,12.724206742861666 +2024-07-09 04:45:00+00:00,13.57731069391802 +2024-07-09 05:00:00+00:00,15.134317468378468 +2024-07-09 05:15:00+00:00,15.529684662560927 +2024-07-09 05:30:00+00:00,15.595546700260789 +2024-07-09 05:45:00+00:00,15.268158929015584 +2024-07-09 06:00:00+00:00,15.915916911239083 +2024-07-09 06:15:00+00:00,16.018608097009476 +2024-07-09 06:30:00+00:00,16.72957721325373 +2024-07-09 06:45:00+00:00,16.6676841199915 +2024-07-09 07:00:00+00:00,16.29640311742669 +2024-07-09 07:15:00+00:00,16.206599839700914 +2024-07-09 07:30:00+00:00,16.378464453033843 +2024-07-09 07:45:00+00:00,15.421965348906111 +2024-07-09 08:00:00+00:00,14.41875822768691 +2024-07-09 08:15:00+00:00,14.17214918558927 +2024-07-09 08:30:00+00:00,14.30480065255049 +2024-07-09 08:45:00+00:00,15.18439081933246 +2024-07-09 09:00:00+00:00,12.972892176134348 +2024-07-09 09:15:00+00:00,12.019943363771855 +2024-07-09 09:30:00+00:00,7.107517759878216 +2024-07-09 09:45:00+00:00,12.181205200763081 +2024-07-09 10:00:00+00:00,7.355651956992956 +2024-07-09 10:15:00+00:00,12.642748409178616 +2024-07-09 10:30:00+00:00,7.33356298148528 +2024-07-09 10:45:00+00:00,11.676111133599067 +2024-07-09 11:00:00+00:00,11.951009734718617 +2024-07-09 11:15:00+00:00,11.362968864099383 +2024-07-09 11:30:00+00:00,5.113995222435731 +2024-07-09 11:45:00+00:00,5.050964262908954 +2024-07-09 12:00:00+00:00,4.737891642669965 +2024-07-09 12:15:00+00:00,4.421660290147603 +2024-07-09 12:30:00+00:00,5.940632162495028 +2024-07-09 12:45:00+00:00,6.123767972692518 +2024-07-09 13:00:00+00:00,4.8129329183579035 +2024-07-09 13:15:00+00:00,5.001035370216518 +2024-07-09 13:30:00+00:00,4.6743332269425215 +2024-07-09 13:45:00+00:00,4.661364367912672 +2024-07-09 14:00:00+00:00,5.376009820010893 +2024-07-09 14:15:00+00:00,5.686835429152355 +2024-07-09 14:30:00+00:00,7.674074300261746 +2024-07-09 14:45:00+00:00,6.074517760578029 +2024-07-09 15:00:00+00:00,5.243599686070867 +2024-07-09 15:15:00+00:00,3.7604200223752957 +2024-07-09 15:30:00+00:00,2.4060323363290075 +2024-07-09 15:45:00+00:00,1.1408853407852007 +2024-07-09 16:00:00+00:00,0.0988555054370901 +2024-07-10 03:00:00+00:00,1.9457671736206916 +2024-07-10 03:15:00+00:00,3.746925778431839 +2024-07-10 03:30:00+00:00,5.796215658808068 +2024-07-10 03:45:00+00:00,8.0370054149804 +2024-07-10 04:00:00+00:00,9.015135678409035 +2024-07-10 04:15:00+00:00,9.887718667462682 +2024-07-10 04:30:00+00:00,11.850116089006512 +2024-07-10 04:45:00+00:00,12.696500940368693 +2024-07-10 05:00:00+00:00,13.67433550478088 +2024-07-10 05:15:00+00:00,14.149573683631338 +2024-07-10 05:30:00+00:00,14.778839700160509 +2024-07-10 05:45:00+00:00,15.191167820833234 +2024-07-10 06:00:00+00:00,15.673191084628067 +2024-07-10 06:15:00+00:00,15.855422874797418 +2024-07-10 06:30:00+00:00,16.03025947740946 +2024-07-10 06:45:00+00:00,16.465599729265367 +2024-07-10 07:00:00+00:00,16.445650818420212 +2024-07-10 07:15:00+00:00,16.645479786606007 +2024-07-10 07:30:00+00:00,15.777190993626487 +2024-07-10 07:45:00+00:00,15.661741688415491 +2024-07-10 08:00:00+00:00,15.875002241448321 +2024-07-10 08:15:00+00:00,15.410599092984691 +2024-07-10 08:30:00+00:00,15.810220050788656 +2024-07-10 08:45:00+00:00,14.646671405366314 +2024-07-10 09:00:00+00:00,15.009613792494925 +2024-07-10 09:15:00+00:00,15.556658947012163 +2024-07-10 09:30:00+00:00,15.908916112866699 +2024-07-10 09:45:00+00:00,14.405550071354083 +2024-07-10 10:00:00+00:00,15.011939279818748 +2024-07-10 10:15:00+00:00,14.659490434750264 +2024-07-10 10:30:00+00:00,14.696861519497162 +2024-07-10 10:45:00+00:00,14.585470736717285 +2024-07-10 11:00:00+00:00,14.638288547437517 +2024-07-10 11:15:00+00:00,13.992580784223026 +2024-07-10 11:30:00+00:00,14.561367884979456 +2024-07-10 11:45:00+00:00,14.917627086170885 +2024-07-10 12:00:00+00:00,15.270517045712255 +2024-07-10 12:15:00+00:00,13.942047822527122 +2024-07-10 12:30:00+00:00,14.00511651823041 +2024-07-10 12:45:00+00:00,14.282831648301899 +2024-07-10 13:00:00+00:00,14.519828762824538 +2024-07-10 13:15:00+00:00,14.003872250561681 +2024-07-10 13:30:00+00:00,13.812093358565798 +2024-07-10 13:45:00+00:00,12.95705000752481 +2024-07-10 14:00:00+00:00,11.571921382344115 +2024-07-10 14:15:00+00:00,10.654366494366728 +2024-07-10 14:30:00+00:00,8.905531087344626 +2024-07-10 14:45:00+00:00,7.327296809110626 +2024-07-10 15:00:00+00:00,5.3960661025054435 +2024-07-10 15:15:00+00:00,4.050985969258944 +2024-07-10 15:30:00+00:00,2.4758634122908885 +2024-07-10 15:45:00+00:00,1.1579037016616296 +2024-07-10 16:00:00+00:00,0.0 +2024-07-11 03:00:00+00:00,1.7488764975849702 +2024-07-11 03:15:00+00:00,3.7410102380036214 +2024-07-11 03:30:00+00:00,4.740105015371028 +2024-07-11 03:45:00+00:00,5.62957591279414 +2024-07-11 04:00:00+00:00,7.477243609891484 +2024-07-11 04:15:00+00:00,9.454168594271458 +2024-07-11 04:30:00+00:00,11.59962255074617 +2024-07-11 04:45:00+00:00,13.191344203306814 +2024-07-11 05:00:00+00:00,14.201889706607925 +2024-07-11 05:15:00+00:00,14.92048821522836 +2024-07-11 05:30:00+00:00,14.999413147238148 +2024-07-11 05:45:00+00:00,15.322380613767798 +2024-07-11 06:00:00+00:00,15.82274594812993 +2024-07-11 06:15:00+00:00,14.736354363892572 +2024-07-11 06:30:00+00:00,14.66402120288376 +2024-07-11 06:45:00+00:00,14.02808739308814 +2024-07-11 07:00:00+00:00,13.74962832045922 +2024-07-11 07:15:00+00:00,13.201703757982234 +2024-07-11 07:30:00+00:00,11.61730335689456 +2024-07-11 07:45:00+00:00,12.59650260455097 +2024-07-11 08:00:00+00:00,12.325278559923923 +2024-07-11 08:15:00+00:00,12.089930385429481 +2024-07-11 08:30:00+00:00,12.353875475893755 +2024-07-11 08:45:00+00:00,11.933751882901865 +2024-07-11 09:00:00+00:00,6.1254635412480845 +2024-07-11 09:15:00+00:00,6.722622747117861 +2024-07-11 09:30:00+00:00,5.807228497124079 +2024-07-11 09:45:00+00:00,2.8830274523659343 +2024-07-11 10:00:00+00:00,5.1636183904094715 +2024-07-11 10:15:00+00:00,5.888449433276916 +2024-07-11 10:30:00+00:00,4.650409230733272 +2024-07-11 10:45:00+00:00,5.558497611467004 +2024-07-11 11:00:00+00:00,4.757414009659291 +2024-07-11 11:15:00+00:00,2.8157376625181287 +2024-07-11 11:30:00+00:00,2.5620600950191417 +2024-07-11 11:45:00+00:00,2.6567514419350715 +2024-07-11 12:00:00+00:00,2.7403537027066047 +2024-07-11 12:15:00+00:00,2.699066322392939 +2024-07-11 12:30:00+00:00,2.2183653014184017 +2024-07-11 12:45:00+00:00,4.98910550068795 +2024-07-11 13:00:00+00:00,2.7642943909069806 +2024-07-11 13:15:00+00:00,1.9846280855503482 +2024-07-11 13:30:00+00:00,2.5837216462830974 +2024-07-11 13:45:00+00:00,4.342152948807387 +2024-07-11 14:00:00+00:00,3.920620862274712 +2024-07-11 14:15:00+00:00,5.109546614442538 +2024-07-11 14:30:00+00:00,4.9552837225980095 +2024-07-11 14:45:00+00:00,5.7211968431533915 +2024-07-11 15:00:00+00:00,4.427114285407228 +2024-07-11 15:15:00+00:00,2.8350118140982237 +2024-07-11 15:30:00+00:00,1.7311959394109806 +2024-07-11 15:45:00+00:00,0.5822241875366725 +2024-07-11 16:00:00+00:00,0.0 +2024-07-12 03:00:00+00:00,2.200445092149871 +2024-07-12 03:15:00+00:00,3.15662352629571 +2024-07-12 03:30:00+00:00,4.057056695369884 +2024-07-12 03:45:00+00:00,5.88888713882408 +2024-07-12 04:00:00+00:00,8.152559254010995 +2024-07-12 04:15:00+00:00,10.106377753493705 +2024-07-12 04:30:00+00:00,11.568400504682623 +2024-07-12 04:45:00+00:00,12.761203770959138 +2024-07-12 05:00:00+00:00,13.721153768318892 +2024-07-12 05:15:00+00:00,14.744808395789937 +2024-07-12 05:30:00+00:00,15.202751972676237 +2024-07-12 05:45:00+00:00,15.706848321230602 +2024-07-12 06:00:00+00:00,16.197553900629735 +2024-07-12 06:15:00+00:00,16.786515295712377 +2024-07-12 06:30:00+00:00,17.03647943929213 +2024-07-12 06:45:00+00:00,16.685097208144146 +2024-07-12 07:00:00+00:00,16.500433351239877 +2024-07-12 07:15:00+00:00,16.72234298666974 +2024-07-12 07:30:00+00:00,16.13574610405086 +2024-07-12 07:45:00+00:00,16.111332870637952 +2024-07-12 08:00:00+00:00,16.380516468604316 +2024-07-12 08:15:00+00:00,16.689359977795867 +2024-07-12 08:30:00+00:00,16.596352553380957 +2024-07-12 08:45:00+00:00,16.320364157720846 +2024-07-12 09:00:00+00:00,16.154730312074108 +2024-07-12 09:15:00+00:00,15.048977865006698 +2024-07-12 09:30:00+00:00,15.40969983516245 +2024-07-12 09:45:00+00:00,14.44578598222608 +2024-07-12 10:00:00+00:00,15.419361620678632 +2024-07-12 10:15:00+00:00,15.284176537168847 +2024-07-12 10:30:00+00:00,15.084808500601739 +2024-07-12 10:45:00+00:00,15.727512812069003 +2024-07-12 11:00:00+00:00,15.469357242570604 +2024-07-12 11:15:00+00:00,15.021107862380166 +2024-07-12 11:30:00+00:00,14.569699611904452 +2024-07-12 11:45:00+00:00,15.754306200089324 +2024-07-12 12:00:00+00:00,15.610858332184192 +2024-07-12 12:15:00+00:00,15.663154136813612 +2024-07-12 12:30:00+00:00,15.718708735762466 +2024-07-12 12:45:00+00:00,14.970933631253136 +2024-07-12 13:00:00+00:00,14.670131885976422 +2024-07-12 13:15:00+00:00,14.808541717007834 +2024-07-12 13:30:00+00:00,14.707956545649695 +2024-07-12 13:45:00+00:00,13.137260811024746 +2024-07-12 14:00:00+00:00,11.901175318270337 +2024-07-12 14:15:00+00:00,10.982480327359001 +2024-07-12 14:30:00+00:00,9.013821182937699 +2024-07-12 14:45:00+00:00,7.854804941670768 +2024-07-12 15:00:00+00:00,5.948379365060786 +2024-07-12 15:15:00+00:00,3.8979110876795184 +2024-07-12 15:30:00+00:00,2.4128605040037128 +2024-07-12 15:45:00+00:00,1.041815338784239 +2024-07-12 16:00:00+00:00,0.0 +2024-07-13 03:00:00+00:00,2.0213715905741534 +2024-07-13 03:15:00+00:00,2.8205109494728235 +2024-07-13 03:30:00+00:00,3.461102343233331 +2024-07-13 03:45:00+00:00,5.3487065737130495 +2024-07-13 04:00:00+00:00,7.251041756356169 +2024-07-13 04:15:00+00:00,9.360745437285578 +2024-07-13 04:30:00+00:00,12.438457589180512 +2024-07-13 04:45:00+00:00,13.068801547968144 +2024-07-13 05:00:00+00:00,13.920971049130717 +2024-07-13 05:15:00+00:00,15.256572946707855 +2024-07-13 05:30:00+00:00,16.626370865235593 +2024-07-13 05:45:00+00:00,16.390713167493825 +2024-07-13 06:00:00+00:00,16.676240000746 +2024-07-13 06:15:00+00:00,16.63759666761469 +2024-07-13 06:30:00+00:00,17.313590274762955 +2024-07-13 06:45:00+00:00,17.202689865031207 +2024-07-13 07:00:00+00:00,17.157792843035544 +2024-07-13 07:15:00+00:00,16.894381359413618 +2024-07-13 07:30:00+00:00,17.280338911461808 +2024-07-13 07:45:00+00:00,15.649623872390787 +2024-07-13 08:00:00+00:00,16.028038100634973 +2024-07-13 08:15:00+00:00,13.869746235408273 +2024-07-13 08:30:00+00:00,13.647993776524167 +2024-07-13 08:45:00+00:00,13.16920281510102 +2024-07-13 09:00:00+00:00,13.733201103566568 +2024-07-13 09:15:00+00:00,13.092384209999008 +2024-07-13 09:30:00+00:00,10.775478074832991 +2024-07-13 09:45:00+00:00,12.242238896321881 +2024-07-13 10:00:00+00:00,12.037834406237215 +2024-07-13 10:15:00+00:00,11.249932330561169 +2024-07-13 10:30:00+00:00,6.794117826206473 +2024-07-13 10:45:00+00:00,6.710798831718103 +2024-07-13 11:00:00+00:00,10.740815369664526 +2024-07-13 11:15:00+00:00,11.058861265561776 +2024-07-13 11:30:00+00:00,6.428210805055846 +2024-07-13 11:45:00+00:00,10.475919753220033 +2024-07-13 12:00:00+00:00,6.584280602513969 +2024-07-13 12:15:00+00:00,4.921888765976872 +2024-07-13 12:30:00+00:00,10.630531242462602 +2024-07-13 12:45:00+00:00,11.281071997508008 +2024-07-13 13:00:00+00:00,12.18646176797388 +2024-07-13 13:15:00+00:00,6.215994049223951 +2024-07-13 13:30:00+00:00,10.64463621670951 +2024-07-13 13:45:00+00:00,11.635245259403096 +2024-07-13 14:00:00+00:00,10.329833451266317 +2024-07-13 14:15:00+00:00,8.955011121104844 +2024-07-13 14:30:00+00:00,7.854164978794577 +2024-07-13 14:45:00+00:00,6.808636743707404 +2024-07-13 15:00:00+00:00,5.41239108364705 +2024-07-13 15:15:00+00:00,4.061338657593949 +2024-07-13 15:30:00+00:00,2.41328675035147 +2024-07-13 15:45:00+00:00,1.2027693077176929 +2024-07-13 16:00:00+00:00,0.1949205131089573 +2024-07-14 03:00:00+00:00,1.5858200015106514 +2024-07-14 03:15:00+00:00,2.5302012941037217 +2024-07-14 03:30:00+00:00,3.40568860654035 +2024-07-14 03:45:00+00:00,4.9453165625305076 +2024-07-14 04:00:00+00:00,6.861606453607413 +2024-07-14 04:15:00+00:00,9.143079494604734 +2024-07-14 04:30:00+00:00,11.292129783608958 +2024-07-14 04:45:00+00:00,13.006057672548248 +2024-07-14 05:00:00+00:00,14.056240253060036 +2024-07-14 05:15:00+00:00,14.9897688455982 +2024-07-14 05:30:00+00:00,15.637499855854996 +2024-07-14 05:45:00+00:00,15.982459155159491 +2024-07-14 06:00:00+00:00,15.88085711716129 +2024-07-14 06:15:00+00:00,16.503968583301916 +2024-07-14 06:30:00+00:00,16.54749646720376 +2024-07-14 06:45:00+00:00,16.420175314667954 +2024-07-14 07:00:00+00:00,16.774411104558496 +2024-07-14 07:15:00+00:00,16.364430384249925 +2024-07-14 07:30:00+00:00,16.704336008670307 +2024-07-14 07:45:00+00:00,16.03473207507088 +2024-07-14 08:00:00+00:00,16.28554994493714 +2024-07-14 08:15:00+00:00,16.456234549110413 +2024-07-14 08:30:00+00:00,16.745966380308474 +2024-07-14 08:45:00+00:00,16.618631255169138 +2024-07-14 09:00:00+00:00,16.49870912672499 +2024-07-14 09:15:00+00:00,16.414987419006053 +2024-07-14 09:30:00+00:00,16.719422129632658 +2024-07-14 09:45:00+00:00,16.03093464750629 +2024-07-14 10:00:00+00:00,16.22142967529961 +2024-07-14 10:15:00+00:00,16.1211964135473 +2024-07-14 10:30:00+00:00,15.783056856850502 +2024-07-14 10:45:00+00:00,16.151051018125 +2024-07-14 11:00:00+00:00,16.54214684965731 +2024-07-14 11:15:00+00:00,16.929199197692032 +2024-07-14 11:30:00+00:00,16.58707550477751 +2024-07-14 11:45:00+00:00,16.88087307188418 +2024-07-14 12:00:00+00:00,16.954291081447376 +2024-07-14 12:15:00+00:00,17.112457268750767 +2024-07-14 12:30:00+00:00,16.758378844971542 +2024-07-14 12:45:00+00:00,16.316053501877345 +2024-07-14 13:00:00+00:00,15.90044213706081 +2024-07-14 13:15:00+00:00,15.332036871804274 +2024-07-14 13:30:00+00:00,15.205215906241724 +2024-07-14 13:45:00+00:00,14.35516727528665 +2024-07-14 14:00:00+00:00,13.419602506431014 +2024-07-14 14:15:00+00:00,12.574509958877197 +2024-07-14 14:30:00+00:00,11.26588094146343 +2024-07-14 14:45:00+00:00,9.471544902110988 +2024-07-14 15:00:00+00:00,7.386222590819811 +2024-07-14 15:15:00+00:00,5.711579657483302 +2024-07-14 15:30:00+00:00,3.880917346776031 +2024-07-14 15:45:00+00:00,2.0555719119394267 +2024-07-14 16:00:00+00:00,0.7913978925580116 +2024-07-15 03:30:00+00:00,3.071812471158177 +2024-07-15 03:45:00+00:00,7.493913066117297 +2024-07-15 04:00:00+00:00,7.809645721453217 +2024-07-15 04:15:00+00:00,9.769765768792436 +2024-07-15 04:30:00+00:00,4.439701788194711 +2024-07-15 04:45:00+00:00,14.566860947801977 +2024-07-15 05:00:00+00:00,15.854392887296022 +2024-07-15 05:15:00+00:00,10.398137225741284 +2024-07-15 05:30:00+00:00,14.351475706170936 +2024-07-15 05:45:00+00:00,13.452718977920856 +2024-07-15 06:00:00+00:00,13.447304811063523 +2024-07-15 06:15:00+00:00,12.049830502225737 +2024-07-15 06:30:00+00:00,17.962777049773006 +2024-07-15 06:45:00+00:00,17.531851201114677 +2024-07-15 07:00:00+00:00,17.341437044354052 +2024-07-15 07:15:00+00:00,18.087414417068537 +2024-07-15 07:30:00+00:00,18.297326638832526 +2024-07-15 07:45:00+00:00,17.62800989069347 +2024-07-15 08:00:00+00:00,18.290615219944467 +2024-07-15 08:15:00+00:00,18.148546506301678 +2024-07-15 08:30:00+00:00,18.879783680520237 +2024-07-15 08:45:00+00:00,18.58512434594876 +2024-07-15 09:00:00+00:00,18.33430876476497 +2024-07-15 09:15:00+00:00,16.326268811522027 +2024-07-15 09:30:00+00:00,15.512320509588877 +2024-07-15 09:45:00+00:00,15.629169806594351 +2024-07-15 10:00:00+00:00,16.663959775641224 +2024-07-15 10:15:00+00:00,15.437981835342972 +2024-07-15 10:30:00+00:00,15.353402225676202 +2024-07-15 10:45:00+00:00,15.664248317168557 +2024-07-15 11:00:00+00:00,15.971383201039094 +2024-07-15 11:15:00+00:00,15.548278941599897 +2024-07-15 11:30:00+00:00,15.143805081316511 +2024-07-15 11:45:00+00:00,15.893774320472584 +2024-07-15 12:00:00+00:00,13.893005245279783 +2024-07-15 12:15:00+00:00,15.200388319458835 +2024-07-15 12:30:00+00:00,15.006575154979519 +2024-07-15 12:45:00+00:00,7.7992111942725755 +2024-07-15 13:00:00+00:00,14.359002685424258 +2024-07-15 13:15:00+00:00,7.990236532034375 +2024-07-15 13:30:00+00:00,14.834094139721586 +2024-07-15 13:45:00+00:00,13.4561353541001 +2024-07-15 14:00:00+00:00,11.523357978299222 +2024-07-15 14:15:00+00:00,10.874412016793183 +2024-07-15 14:30:00+00:00,9.515457967328615 +2024-07-15 14:45:00+00:00,7.9533924556087925 +2024-07-15 15:00:00+00:00,6.5190537988010915 +2024-07-15 15:15:00+00:00,4.41784839079804 +2024-07-15 15:30:00+00:00,2.986394538184136 +2024-07-15 15:45:00+00:00,1.4347580226773327 +2024-07-15 16:00:00+00:00,0.25881220197868315 +2024-07-16 03:15:00+00:00,1.8878707170611144 +2024-07-16 03:30:00+00:00,3.8537848735526032 +2024-07-16 03:45:00+00:00,5.936578424266383 +2024-07-16 04:00:00+00:00,8.004995436140915 +2024-07-16 04:15:00+00:00,9.902932407499456 +2024-07-16 04:30:00+00:00,11.393358223114035 +2024-07-16 04:45:00+00:00,12.847854327605722 +2024-07-16 05:00:00+00:00,14.600920805898982 +2024-07-16 05:15:00+00:00,15.297286249070185 +2024-07-16 05:30:00+00:00,16.369016426460153 +2024-07-16 05:45:00+00:00,16.853481204995795 +2024-07-16 06:00:00+00:00,17.45035026472406 +2024-07-16 06:15:00+00:00,17.423352301906426 +2024-07-16 06:30:00+00:00,17.49740220219237 +2024-07-16 06:45:00+00:00,17.749046540416412 +2024-07-16 07:00:00+00:00,17.53846335201813 +2024-07-16 07:15:00+00:00,16.708282607879546 +2024-07-16 07:30:00+00:00,17.262844593884697 +2024-07-16 07:45:00+00:00,16.24693989526248 +2024-07-16 08:00:00+00:00,17.022469836510613 +2024-07-16 08:15:00+00:00,16.692436678010154 +2024-07-16 08:30:00+00:00,15.237282490279565 +2024-07-16 08:45:00+00:00,15.803924273169565 +2024-07-16 09:00:00+00:00,14.472540318940506 +2024-07-16 09:15:00+00:00,13.447948077053482 +2024-07-16 09:30:00+00:00,7.944491893956613 +2024-07-16 09:45:00+00:00,6.730865677290147 +2024-07-16 10:00:00+00:00,6.237120942682583 +2024-07-16 10:15:00+00:00,7.500018572282748 +2024-07-16 10:30:00+00:00,5.235889504643613 +2024-07-16 10:45:00+00:00,5.453614451182789 +2024-07-16 11:00:00+00:00,5.66859898438322 +2024-07-16 11:15:00+00:00,5.934171442007339 +2024-07-16 11:30:00+00:00,5.846051989788494 +2024-07-16 11:45:00+00:00,2.9316231008582685 +2024-07-16 12:00:00+00:00,6.550546722938492 +2024-07-16 12:15:00+00:00,5.156481026179078 +2024-07-16 12:30:00+00:00,5.181495331525162 +2024-07-16 12:45:00+00:00,5.221500152933135 +2024-07-16 13:00:00+00:00,3.0990755826787066 +2024-07-16 13:15:00+00:00,4.9914145163563965 +2024-07-16 13:30:00+00:00,6.020425799005532 +2024-07-16 13:45:00+00:00,6.399324784285036 +2024-07-16 14:00:00+00:00,10.401743280368004 +2024-07-16 14:15:00+00:00,9.41964264379578 +2024-07-16 14:30:00+00:00,7.419615086751885 +2024-07-16 14:45:00+00:00,6.006592826363536 +2024-07-16 15:00:00+00:00,5.00465381649167 +2024-07-16 15:15:00+00:00,3.3725100437239477 +2024-07-16 15:30:00+00:00,2.1946015042775486 +2024-07-16 15:45:00+00:00,0.9244546673436373 +2024-07-16 16:00:00+00:00,0.0 +2024-07-17 03:30:00+00:00,3.3914200402560994 +2024-07-17 03:45:00+00:00,6.240588211973631 +2024-07-17 04:00:00+00:00,8.137116204349326 +2024-07-17 04:15:00+00:00,10.347732974676985 +2024-07-17 04:30:00+00:00,12.306741918671477 +2024-07-17 04:45:00+00:00,14.251336854013363 +2024-07-17 05:00:00+00:00,15.291954502135644 +2024-07-17 05:15:00+00:00,15.989675664708399 +2024-07-17 05:30:00+00:00,16.59594534956665 +2024-07-17 05:45:00+00:00,16.0444711146515 +2024-07-17 06:00:00+00:00,16.769808513529135 +2024-07-17 06:15:00+00:00,16.68334492914649 +2024-07-17 06:30:00+00:00,16.990450165442606 +2024-07-17 06:45:00+00:00,17.705084520866645 +2024-07-17 07:00:00+00:00,17.512960608653408 +2024-07-17 07:15:00+00:00,17.905639746180682 +2024-07-17 07:30:00+00:00,17.62604440140055 +2024-07-17 07:45:00+00:00,17.62032749079092 +2024-07-17 08:00:00+00:00,17.91413133055167 +2024-07-17 08:15:00+00:00,17.858831633470633 +2024-07-17 08:30:00+00:00,17.59322682657215 +2024-07-17 08:45:00+00:00,17.98430359833168 +2024-07-17 09:00:00+00:00,18.02868507286187 +2024-07-17 09:15:00+00:00,16.895632186680253 +2024-07-17 09:30:00+00:00,17.353100851230646 +2024-07-17 09:45:00+00:00,17.059342965718006 +2024-07-17 10:00:00+00:00,17.33024727840728 +2024-07-17 10:15:00+00:00,17.176678886759245 +2024-07-17 10:30:00+00:00,16.739760528524794 +2024-07-17 10:45:00+00:00,16.715437113862656 +2024-07-17 11:00:00+00:00,16.728446432908168 +2024-07-17 11:15:00+00:00,16.739760528524794 +2024-07-17 11:30:00+00:00,16.83762442016183 +2024-07-17 11:45:00+00:00,16.814246145593287 +2024-07-17 12:00:00+00:00,17.22635221995706 +2024-07-17 12:15:00+00:00,16.33886132344807 +2024-07-17 12:30:00+00:00,16.177312805416435 +2024-07-17 12:45:00+00:00,16.584641164655388 +2024-07-17 13:00:00+00:00,16.11031357780336 +2024-07-17 13:15:00+00:00,15.269181774895006 +2024-07-17 13:30:00+00:00,14.415329074103015 +2024-07-17 13:45:00+00:00,12.985241333940376 +2024-07-17 14:00:00+00:00,12.13003638603357 +2024-07-17 14:15:00+00:00,10.843757433748829 +2024-07-17 14:30:00+00:00,9.577442034235235 +2024-07-17 14:45:00+00:00,8.288291161153253 +2024-07-17 15:00:00+00:00,6.36064209989991 +2024-07-17 15:15:00+00:00,4.6012276932366865 +2024-07-17 15:30:00+00:00,2.928624920311016 +2024-07-17 15:45:00+00:00,1.4207329215404931 +2024-07-17 16:00:00+00:00,0.14724495118573544 +2024-07-18 03:30:00+00:00,3.7211609055752097 +2024-07-18 03:45:00+00:00,5.779438818348962 +2024-07-18 04:00:00+00:00,7.424855275035061 +2024-07-18 04:15:00+00:00,14.268871210050328 +2024-07-18 04:30:00+00:00,12.953416376253582 +2024-07-18 04:45:00+00:00,13.81104635748866 +2024-07-18 05:00:00+00:00,15.024892625373809 +2024-07-18 05:15:00+00:00,16.29578364704898 +2024-07-18 05:30:00+00:00,16.72569388449525 +2024-07-18 05:45:00+00:00,17.038596734767314 +2024-07-18 06:00:00+00:00,16.921160474599077 +2024-07-18 06:15:00+00:00,17.404344533262538 +2024-07-18 06:30:00+00:00,17.036115331229396 +2024-07-18 06:45:00+00:00,17.01611268470894 +2024-07-18 07:00:00+00:00,16.83088491567161 +2024-07-18 07:15:00+00:00,17.4687380341083 +2024-07-18 07:30:00+00:00,17.68989033187757 +2024-07-18 07:45:00+00:00,17.89121211424892 +2024-07-18 08:00:00+00:00,18.436657196237167 +2024-07-18 08:15:00+00:00,19.05297553201058 +2024-07-18 08:30:00+00:00,18.047102306605453 +2024-07-18 08:45:00+00:00,16.88831259547862 +2024-07-18 09:00:00+00:00,16.17354165833436 +2024-07-18 09:15:00+00:00,15.97528456020741 +2024-07-18 09:30:00+00:00,14.874927206249364 +2024-07-18 09:45:00+00:00,14.515554132545136 +2024-07-18 10:00:00+00:00,14.017915123503089 +2024-07-18 10:15:00+00:00,14.791572237250282 +2024-07-18 10:30:00+00:00,8.435409159835924 +2024-07-18 10:45:00+00:00,13.835682063480078 +2024-07-18 11:00:00+00:00,13.753076612880824 +2024-07-18 11:15:00+00:00,8.27713094363357 +2024-07-18 11:30:00+00:00,14.199466571710733 +2024-07-18 11:45:00+00:00,13.789041986719669 +2024-07-18 12:00:00+00:00,14.056210387031278 +2024-07-18 12:15:00+00:00,14.639154167188273 +2024-07-18 12:30:00+00:00,15.187615989233535 +2024-07-18 12:45:00+00:00,14.206598507273199 +2024-07-18 13:00:00+00:00,14.609125342265187 +2024-07-18 13:15:00+00:00,14.886140353744915 +2024-07-18 13:30:00+00:00,14.163368383708708 +2024-07-18 13:45:00+00:00,12.988707608845905 +2024-07-18 14:00:00+00:00,12.190877117919873 +2024-07-18 14:15:00+00:00,10.692513265672918 +2024-07-18 14:30:00+00:00,9.540707664695097 +2024-07-18 14:45:00+00:00,7.861320243066436 +2024-07-18 15:00:00+00:00,6.23413661572844 +2024-07-18 15:15:00+00:00,4.465711257972992 +2024-07-18 15:30:00+00:00,2.889254438433886 +2024-07-18 15:45:00+00:00,1.4666438175847982 +2024-07-18 16:00:00+00:00,0.21107534382786253 +2024-07-19 03:30:00+00:00,3.3075861926018826 +2024-07-19 03:45:00+00:00,5.456262870712272 +2024-07-19 04:00:00+00:00,7.6737841714644865 +2024-07-19 04:15:00+00:00,9.541134348196092 +2024-07-19 04:30:00+00:00,11.527191928422338 +2024-07-19 04:45:00+00:00,13.446029729326883 +2024-07-19 05:00:00+00:00,14.925264223973636 +2024-07-19 05:15:00+00:00,15.879097945619625 +2024-07-19 05:30:00+00:00,16.788467871971484 +2024-07-19 05:45:00+00:00,16.725347988615596 +2024-07-19 06:00:00+00:00,17.308701308647166 +2024-07-19 06:15:00+00:00,17.264306727849036 +2024-07-19 06:30:00+00:00,17.53917918327401 +2024-07-19 06:45:00+00:00,17.82310698420525 +2024-07-19 07:00:00+00:00,17.171804471703638 +2024-07-19 07:15:00+00:00,17.368462602695967 +2024-07-19 07:30:00+00:00,17.694632883690222 +2024-07-19 07:45:00+00:00,18.054903216885933 +2024-07-19 08:00:00+00:00,17.531043242587707 +2024-07-19 08:15:00+00:00,17.783580271035696 +2024-07-19 08:30:00+00:00,17.244905308572214 +2024-07-19 08:45:00+00:00,17.727747870172198 +2024-07-19 09:00:00+00:00,17.85124005575751 +2024-07-19 09:15:00+00:00,17.78594705243693 +2024-07-19 09:30:00+00:00,18.602532724697575 +2024-07-19 09:45:00+00:00,18.65475824133918 +2024-07-19 10:00:00+00:00,18.587821061265586 +2024-07-19 10:15:00+00:00,18.633617377558245 +2024-07-19 10:30:00+00:00,18.689234932781808 +2024-07-19 10:45:00+00:00,18.508326014497484 +2024-07-19 11:00:00+00:00,18.178631822854886 +2024-07-19 11:15:00+00:00,17.839818598919464 +2024-07-19 11:30:00+00:00,18.059787186302543 +2024-07-19 11:45:00+00:00,18.162413041044434 +2024-07-19 12:00:00+00:00,18.058509046101516 +2024-07-19 12:15:00+00:00,18.01925512234709 +2024-07-19 12:30:00+00:00,17.33357825158517 +2024-07-19 12:45:00+00:00,17.724998767966717 +2024-07-19 13:00:00+00:00,16.452588345882162 +2024-07-19 13:15:00+00:00,15.913630495673829 +2024-07-19 13:30:00+00:00,15.039209012679768 +2024-07-19 13:45:00+00:00,14.149190382037192 +2024-07-19 14:00:00+00:00,13.284210128443494 +2024-07-19 14:15:00+00:00,12.042472258447923 +2024-07-19 14:30:00+00:00,10.425769473498509 +2024-07-19 14:45:00+00:00,8.776267211755252 +2024-07-19 15:00:00+00:00,6.992722069618605 +2024-07-19 15:15:00+00:00,5.003392635535798 +2024-07-19 15:30:00+00:00,3.202286388733219 +2024-07-19 15:45:00+00:00,1.5921850270406073 +2024-07-19 16:00:00+00:00,0.24640603611799694 +2024-07-20 03:15:00+00:00,1.5099196886750894 +2024-07-20 03:30:00+00:00,3.5853646987300314 +2024-07-20 03:45:00+00:00,5.264813015492545 +2024-07-20 04:00:00+00:00,7.357597375473023 +2024-07-20 04:15:00+00:00,9.951024108437608 +2024-07-20 04:30:00+00:00,12.143460242121133 +2024-07-20 04:45:00+00:00,13.982305911409846 +2024-07-20 05:00:00+00:00,15.294956399322206 +2024-07-20 05:15:00+00:00,16.291245252377653 +2024-07-20 05:30:00+00:00,17.0245927837949 +2024-07-20 05:45:00+00:00,17.648297429887595 +2024-07-20 06:00:00+00:00,17.57790048910386 +2024-07-20 06:15:00+00:00,17.685074827799856 +2024-07-20 06:30:00+00:00,17.51913328165142 +2024-07-20 06:45:00+00:00,17.50911427512586 +2024-07-20 07:00:00+00:00,17.837943191068995 +2024-07-20 07:15:00+00:00,17.661071975743592 +2024-07-20 07:30:00+00:00,18.019897912034715 +2024-07-20 07:45:00+00:00,17.967292425564782 +2024-07-20 08:00:00+00:00,17.652362264661114 +2024-07-20 08:15:00+00:00,18.504110095061417 +2024-07-20 08:30:00+00:00,18.21016856710015 +2024-07-20 08:45:00+00:00,18.566461727180837 +2024-07-20 09:00:00+00:00,17.922414753899574 +2024-07-20 09:15:00+00:00,18.279566086432794 +2024-07-20 09:30:00+00:00,18.520867321091657 +2024-07-20 09:45:00+00:00,17.98405225615362 +2024-07-20 10:00:00+00:00,18.33365209633764 +2024-07-20 10:15:00+00:00,18.681061801761086 +2024-07-20 10:30:00+00:00,17.564806225639135 +2024-07-20 10:45:00+00:00,18.58328643517325 +2024-07-20 11:00:00+00:00,18.261933126601406 +2024-07-20 11:15:00+00:00,18.02870404591296 +2024-07-20 11:30:00+00:00,18.07110000875075 +2024-07-20 11:45:00+00:00,17.88232003227658 +2024-07-20 12:00:00+00:00,17.846822069057403 +2024-07-20 12:15:00+00:00,17.643514397100986 +2024-07-20 12:30:00+00:00,17.235670138273584 +2024-07-20 12:45:00+00:00,16.940297972121957 +2024-07-20 13:00:00+00:00,16.606026990668287 +2024-07-20 13:15:00+00:00,16.26694487970265 +2024-07-20 13:30:00+00:00,15.048618060090632 +2024-07-20 13:45:00+00:00,14.48020364921108 +2024-07-20 14:00:00+00:00,13.506939245285592 +2024-07-20 14:15:00+00:00,11.362711992053729 +2024-07-20 14:30:00+00:00,9.864019476833416 +2024-07-20 14:45:00+00:00,7.94797745960187 +2024-07-20 15:00:00+00:00,6.17312388625624 +2024-07-20 15:15:00+00:00,4.440676626133192 +2024-07-20 15:30:00+00:00,2.450578377380224 +2024-07-20 15:45:00+00:00,1.150567711371488 +2024-07-20 16:00:00+00:00,0.0 +2024-07-21 03:30:00+00:00,3.134155647691644 +2024-07-21 03:45:00+00:00,5.085333106229829 +2024-07-21 04:00:00+00:00,6.908009709619044 +2024-07-21 04:15:00+00:00,8.972944415777258 +2024-07-21 04:30:00+00:00,10.725977832347366 +2024-07-21 04:45:00+00:00,12.321576257155733 +2024-07-21 05:00:00+00:00,13.597552443355934 +2024-07-21 05:15:00+00:00,14.422823438581513 +2024-07-21 05:30:00+00:00,15.008336856215442 +2024-07-21 05:45:00+00:00,15.60265257829107 +2024-07-21 06:00:00+00:00,15.746020141546952 +2024-07-21 06:15:00+00:00,15.999135776471675 +2024-07-21 06:30:00+00:00,15.826252296127155 +2024-07-21 06:45:00+00:00,16.0711526120532 +2024-07-21 07:00:00+00:00,16.495002676672442 +2024-07-21 07:15:00+00:00,16.577523543538828 +2024-07-21 07:30:00+00:00,16.770881753946803 +2024-07-21 07:45:00+00:00,16.716801010930606 +2024-07-21 08:00:00+00:00,16.565346855122442 +2024-07-21 08:15:00+00:00,17.58620622304094 +2024-07-21 08:30:00+00:00,16.634265296358826 +2024-07-21 08:45:00+00:00,16.960395670471065 +2024-07-21 09:00:00+00:00,16.41087476782597 +2024-07-21 09:15:00+00:00,14.470473750999249 +2024-07-21 09:30:00+00:00,14.995705488918007 +2024-07-21 09:45:00+00:00,15.085457902762236 +2024-07-21 10:00:00+00:00,14.408686798007476 +2024-07-21 10:15:00+00:00,13.71008028824483 +2024-07-21 10:30:00+00:00,12.761309298265811 +2024-07-21 10:45:00+00:00,12.714933280693693 +2024-07-21 11:00:00+00:00,13.031728768512494 +2024-07-21 11:15:00+00:00,7.314948553042358 +2024-07-21 11:30:00+00:00,12.64295971419784 +2024-07-21 11:45:00+00:00,6.595633211904046 +2024-07-21 12:00:00+00:00,7.18132525448592 +2024-07-21 12:15:00+00:00,6.038513700352997 +2024-07-21 12:30:00+00:00,12.23781247668568 +2024-07-21 12:45:00+00:00,5.673609278936999 +2024-07-21 13:00:00+00:00,7.02517434582928 +2024-07-21 13:15:00+00:00,12.81317685142678 +2024-07-21 13:30:00+00:00,11.279258377044723 +2024-07-21 13:45:00+00:00,10.129919774209263 +2024-07-21 14:00:00+00:00,9.751994423364907 +2024-07-21 14:15:00+00:00,8.288704592682762 +2024-07-21 14:30:00+00:00,7.212614209619257 +2024-07-21 14:45:00+00:00,5.82226988392258 +2024-07-21 15:00:00+00:00,4.308143129273343 +2024-07-21 15:15:00+00:00,3.0789774591672776 +2024-07-21 15:30:00+00:00,1.713000406467338 +2024-07-21 15:45:00+00:00,0.5129347691004582 +2024-07-21 16:00:00+00:00,0.0 +2024-07-22 03:30:00+00:00,3.410555751920074 +2024-07-22 03:45:00+00:00,5.408020930400871 +2024-07-22 04:00:00+00:00,7.351181006220464 +2024-07-22 04:15:00+00:00,9.304294710677596 +2024-07-22 04:30:00+00:00,11.179508937792422 +2024-07-22 04:45:00+00:00,12.879134165834285 +2024-07-22 05:00:00+00:00,14.167121183984356 +2024-07-22 05:15:00+00:00,15.597233989683104 +2024-07-22 05:30:00+00:00,16.408942413364176 +2024-07-22 05:45:00+00:00,16.312133572474924 +2024-07-22 06:00:00+00:00,16.471260685325223 +2024-07-22 06:15:00+00:00,17.163843288018715 +2024-07-22 06:30:00+00:00,16.737056866405855 +2024-07-22 06:45:00+00:00,17.07696570027162 +2024-07-22 07:00:00+00:00,17.059844827333837 +2024-07-22 07:15:00+00:00,17.300162329523367 +2024-07-22 07:30:00+00:00,17.241827541177344 +2024-07-22 07:45:00+00:00,17.431758456597297 +2024-07-22 08:00:00+00:00,17.366124631453932 +2024-07-22 08:15:00+00:00,17.063805355567382 +2024-07-22 08:30:00+00:00,17.55306580137506 +2024-07-22 08:45:00+00:00,17.192905352111843 +2024-07-22 09:00:00+00:00,17.490199562264507 +2024-07-22 09:15:00+00:00,17.196190180026637 +2024-07-22 09:30:00+00:00,16.73785443335042 +2024-07-22 09:45:00+00:00,16.804028267147213 +2024-07-22 10:00:00+00:00,16.740524803362046 +2024-07-22 10:15:00+00:00,16.67031243275242 +2024-07-22 10:30:00+00:00,16.467594687124944 +2024-07-22 10:45:00+00:00,16.742111952204056 +2024-07-22 11:00:00+00:00,15.702842513604837 +2024-07-22 11:15:00+00:00,16.611531633534987 +2024-07-22 11:30:00+00:00,15.757923932069659 +2024-07-22 11:45:00+00:00,15.531098456200757 +2024-07-22 12:00:00+00:00,16.86381392249498 +2024-07-22 12:15:00+00:00,15.57934215915565 +2024-07-22 12:30:00+00:00,16.950738089640723 +2024-07-22 12:45:00+00:00,16.218017912581395 +2024-07-22 13:00:00+00:00,15.910735645143413 +2024-07-22 13:15:00+00:00,14.845089950410832 +2024-07-22 13:30:00+00:00,14.358515474413563 +2024-07-22 13:45:00+00:00,13.288510756070991 +2024-07-22 14:00:00+00:00,11.915886980044043 +2024-07-22 14:15:00+00:00,10.664285115033456 +2024-07-22 14:30:00+00:00,9.047888172718519 +2024-07-22 14:45:00+00:00,7.6980254440548155 +2024-07-22 15:00:00+00:00,5.629481275623662 +2024-07-22 15:15:00+00:00,3.9706141301325397 +2024-07-22 15:30:00+00:00,2.3810514436845844 +2024-07-22 15:45:00+00:00,0.9208251441975461 +2024-07-22 16:00:00+00:00,0.20414669896751292 +2024-07-23 03:30:00+00:00,3.1111293880812996 +2024-07-23 03:45:00+00:00,7.251335391536114 +2024-07-23 04:00:00+00:00,8.040075767156303 +2024-07-23 04:15:00+00:00,13.459039970111291 +2024-07-23 04:30:00+00:00,14.020444269694583 +2024-07-23 04:45:00+00:00,14.215821738745621 +2024-07-23 05:00:00+00:00,14.650401786025514 +2024-07-23 05:15:00+00:00,15.417919922723128 +2024-07-23 05:30:00+00:00,16.096153323131567 +2024-07-23 05:45:00+00:00,16.538131783216112 +2024-07-23 06:00:00+00:00,16.695151206399007 +2024-07-23 06:15:00+00:00,17.084077820420692 +2024-07-23 06:30:00+00:00,17.13287277150539 +2024-07-23 06:45:00+00:00,17.14857159411146 +2024-07-23 07:00:00+00:00,17.562432835630258 +2024-07-23 07:15:00+00:00,17.96329763505637 +2024-07-23 07:30:00+00:00,17.99278206425603 +2024-07-23 07:45:00+00:00,18.092486491720813 +2024-07-23 08:00:00+00:00,18.217555260697484 +2024-07-23 08:15:00+00:00,18.60338108085296 +2024-07-23 08:30:00+00:00,18.266193455933845 +2024-07-23 08:45:00+00:00,17.641322738798127 +2024-07-23 09:00:00+00:00,17.407353934488256 +2024-07-23 09:15:00+00:00,17.175683013154295 +2024-07-23 09:30:00+00:00,15.71059029341213 +2024-07-23 09:45:00+00:00,16.063110058163723 +2024-07-23 10:00:00+00:00,15.819209746926308 +2024-07-23 10:15:00+00:00,14.715086188316624 +2024-07-23 10:30:00+00:00,14.408883896967762 +2024-07-23 10:45:00+00:00,8.519142278762983 +2024-07-23 11:00:00+00:00,13.804178253666352 +2024-07-23 11:15:00+00:00,13.967678160530559 +2024-07-23 11:30:00+00:00,14.693036305143977 +2024-07-23 11:45:00+00:00,6.7317955236202325 +2024-07-23 12:00:00+00:00,13.97658266204838 +2024-07-23 12:15:00+00:00,7.900893043915029 +2024-07-23 12:30:00+00:00,7.235435699323638 +2024-07-23 12:45:00+00:00,7.795208977534445 +2024-07-23 13:00:00+00:00,7.556360126667599 +2024-07-23 13:15:00+00:00,6.633202744106978 +2024-07-23 13:30:00+00:00,11.928864394737477 +2024-07-23 13:45:00+00:00,11.68864825287805 +2024-07-23 14:00:00+00:00,10.94470542004141 +2024-07-23 14:15:00+00:00,9.16969555222022 +2024-07-23 14:30:00+00:00,7.825900383845978 +2024-07-23 14:45:00+00:00,6.215724905251749 +2024-07-23 15:00:00+00:00,4.442556451660902 +2024-07-23 15:15:00+00:00,3.054175921044246 +2024-07-23 15:30:00+00:00,1.4185553735263308 +2024-07-23 15:45:00+00:00,0.381598531819648 +2024-07-24 03:30:00+00:00,3.3330769833043306 +2024-07-24 03:45:00+00:00,5.603212877648327 +2024-07-24 04:00:00+00:00,7.704982939316984 +2024-07-24 04:15:00+00:00,9.95352257110355 +2024-07-24 04:30:00+00:00,11.756484378193901 +2024-07-24 04:45:00+00:00,13.904301877698575 +2024-07-24 05:00:00+00:00,15.28270213491635 +2024-07-24 05:15:00+00:00,16.80777716543344 +2024-07-24 05:30:00+00:00,17.005305916717386 +2024-07-24 05:45:00+00:00,17.312708539765076 +2024-07-24 06:00:00+00:00,18.53492542864766 +2024-07-24 06:15:00+00:00,17.897449816901144 +2024-07-24 06:30:00+00:00,17.919880224915556 +2024-07-24 06:45:00+00:00,18.226185431647977 +2024-07-24 07:00:00+00:00,18.22208927688512 +2024-07-24 07:15:00+00:00,18.839470517813876 +2024-07-24 07:30:00+00:00,18.390583529792295 +2024-07-24 07:45:00+00:00,18.559204626371717 +2024-07-24 08:00:00+00:00,17.79159598320242 +2024-07-24 08:15:00+00:00,18.82870391325301 +2024-07-24 08:30:00+00:00,18.806597668621798 +2024-07-24 08:45:00+00:00,18.783211350153227 +2024-07-24 09:00:00+00:00,19.666309533802234 +2024-07-24 09:15:00+00:00,18.739028992951635 +2024-07-24 09:30:00+00:00,19.276713487809534 +2024-07-24 09:45:00+00:00,18.99609756541442 +2024-07-24 10:00:00+00:00,18.88408855416263 +2024-07-24 10:15:00+00:00,19.66127543705304 +2024-07-24 10:30:00+00:00,19.54518073830932 +2024-07-24 10:45:00+00:00,18.77665988576896 +2024-07-24 11:00:00+00:00,18.8396442571861 +2024-07-24 11:15:00+00:00,19.24160362447785 +2024-07-24 11:30:00+00:00,18.90982334903931 +2024-07-24 11:45:00+00:00,19.18429868393473 +2024-07-24 12:00:00+00:00,18.633936018819004 +2024-07-24 12:15:00+00:00,18.371973896443883 +2024-07-24 12:30:00+00:00,18.20348577249098 +2024-07-24 12:45:00+00:00,17.905945675378604 +2024-07-24 13:00:00+00:00,17.413942067191282 +2024-07-24 13:15:00+00:00,16.506362165883996 +2024-07-24 13:30:00+00:00,15.545266484988126 +2024-07-24 13:45:00+00:00,14.784715812073838 +2024-07-24 14:00:00+00:00,12.81806029551333 +2024-07-24 14:15:00+00:00,11.620235207589632 +2024-07-24 14:30:00+00:00,9.834223213578111 +2024-07-24 14:45:00+00:00,7.781795216709936 +2024-07-24 15:00:00+00:00,6.122933655333119 +2024-07-24 15:15:00+00:00,3.902474034020017 +2024-07-24 15:30:00+00:00,2.263124528342062 +2024-07-24 15:45:00+00:00,0.8505185959750718 +2024-07-25 03:15:00+00:00,1.6958943297624713 +2024-07-25 03:30:00+00:00,3.571732577160378 +2024-07-25 03:45:00+00:00,5.732641604835863 +2024-07-25 04:00:00+00:00,8.1607424784644 +2024-07-25 04:15:00+00:00,10.576805323669708 +2024-07-25 04:30:00+00:00,12.332137741038183 +2024-07-25 04:45:00+00:00,13.884548880368786 +2024-07-25 05:00:00+00:00,15.302946152007902 +2024-07-25 05:15:00+00:00,15.92467452339818 +2024-07-25 05:30:00+00:00,16.40181566573572 +2024-07-25 05:45:00+00:00,16.91799188774959 +2024-07-25 06:00:00+00:00,17.162714334266877 +2024-07-25 06:15:00+00:00,17.800542036010558 +2024-07-25 06:30:00+00:00,18.049586640808602 +2024-07-25 06:45:00+00:00,17.677438144040927 +2024-07-25 07:00:00+00:00,17.79905021417956 +2024-07-25 07:15:00+00:00,18.78689932884598 +2024-07-25 07:30:00+00:00,18.71841400038025 +2024-07-25 07:45:00+00:00,18.766024727072224 +2024-07-25 08:00:00+00:00,18.595037189802955 +2024-07-25 08:15:00+00:00,18.89992697546827 +2024-07-25 08:30:00+00:00,19.080983255676415 +2024-07-25 08:45:00+00:00,19.26025102515271 +2024-07-25 09:00:00+00:00,18.971447276028726 +2024-07-25 09:15:00+00:00,19.746055859074545 +2024-07-25 09:30:00+00:00,19.785170362047225 +2024-07-25 09:45:00+00:00,19.71278312652112 +2024-07-25 10:00:00+00:00,19.81693531853449 +2024-07-25 10:15:00+00:00,18.39334978878819 +2024-07-25 10:30:00+00:00,18.079391905182895 +2024-07-25 10:45:00+00:00,18.216551049195743 +2024-07-25 11:00:00+00:00,18.521309467509486 +2024-07-25 11:15:00+00:00,17.758313349524908 +2024-07-25 11:30:00+00:00,17.634056743181166 +2024-07-25 11:45:00+00:00,17.268137172958518 +2024-07-25 12:00:00+00:00,17.78723363383522 +2024-07-25 12:15:00+00:00,16.942075371763398 +2024-07-25 12:30:00+00:00,16.7077705001164 +2024-07-25 12:45:00+00:00,17.03053596280044 +2024-07-25 13:00:00+00:00,16.036978879177852 +2024-07-25 13:15:00+00:00,15.149701226443758 +2024-07-25 13:30:00+00:00,13.352057204133912 +2024-07-25 13:45:00+00:00,12.585883367154548 +2024-07-25 14:00:00+00:00,10.824770986204491 +2024-07-25 14:15:00+00:00,9.680909695642944 +2024-07-25 14:30:00+00:00,8.184852141998478 +2024-07-25 14:45:00+00:00,6.356397339074199 +2024-07-25 15:00:00+00:00,4.600567129073139 +2024-07-25 15:15:00+00:00,2.9875284507766433 +2024-07-25 15:30:00+00:00,1.538107640258314 +2024-07-25 15:45:00+00:00,0.36307134628929716 +2024-07-26 03:30:00+00:00,2.896423200244314 +2024-07-26 03:45:00+00:00,5.042837416305453 +2024-07-26 04:00:00+00:00,7.473139011992425 +2024-07-26 04:15:00+00:00,9.828041208952637 +2024-07-26 04:30:00+00:00,11.938542572090766 +2024-07-26 04:45:00+00:00,14.11067407005285 +2024-07-26 05:00:00+00:00,15.403143898976454 +2024-07-26 05:15:00+00:00,16.42632470461078 +2024-07-26 05:30:00+00:00,17.47386068670991 +2024-07-26 05:45:00+00:00,18.115006061359956 +2024-07-26 06:00:00+00:00,18.826714775501213 +2024-07-26 06:15:00+00:00,18.94464704933797 +2024-07-26 06:30:00+00:00,19.360373465461823 +2024-07-26 06:45:00+00:00,18.85072545910769 +2024-07-26 07:00:00+00:00,19.299150138543965 +2024-07-26 07:15:00+00:00,20.071941528326036 +2024-07-26 07:30:00+00:00,19.901827371343067 +2024-07-26 07:45:00+00:00,19.745385923011163 +2024-07-26 08:00:00+00:00,19.5006234483081 +2024-07-26 08:15:00+00:00,19.901672737046894 +2024-07-26 08:30:00+00:00,19.78226302856112 +2024-07-26 08:45:00+00:00,19.65981672201638 +2024-07-26 09:00:00+00:00,20.436567515183118 +2024-07-26 09:15:00+00:00,20.07944708475473 +2024-07-26 09:30:00+00:00,20.404400764344903 +2024-07-26 09:45:00+00:00,20.847353154034494 +2024-07-26 10:00:00+00:00,19.724541158762875 +2024-07-26 10:15:00+00:00,20.83955084189267 +2024-07-26 10:30:00+00:00,20.63638573725919 +2024-07-26 10:45:00+00:00,19.74318559179941 +2024-07-26 11:00:00+00:00,20.221565051226282 +2024-07-26 11:15:00+00:00,19.80260611380753 +2024-07-26 11:30:00+00:00,20.154350477242218 +2024-07-26 11:45:00+00:00,19.958377583399766 +2024-07-26 12:00:00+00:00,20.167056880122956 +2024-07-26 12:15:00+00:00,18.18258590847292 +2024-07-26 12:30:00+00:00,19.494526837972593 +2024-07-26 12:45:00+00:00,18.699879091118 +2024-07-26 13:00:00+00:00,17.82796679505256 +2024-07-26 13:15:00+00:00,17.162253696911954 +2024-07-26 13:30:00+00:00,16.23777252529055 +2024-07-26 13:45:00+00:00,15.842470089249607 +2024-07-26 14:00:00+00:00,14.24812114060236 +2024-07-26 14:15:00+00:00,12.47819488219641 +2024-07-26 14:30:00+00:00,10.76607187225746 +2024-07-26 14:45:00+00:00,8.796320597391205 +2024-07-26 15:00:00+00:00,6.766957266020774 +2024-07-26 15:15:00+00:00,4.3577400863562925 +2024-07-26 15:30:00+00:00,2.5627516214984922 +2024-07-26 15:45:00+00:00,1.0497697796874992 +2024-07-27 03:45:00+00:00,2.385895957819671 +2024-07-27 04:00:00+00:00,7.57598217278991 +2024-07-27 04:15:00+00:00,9.076583795929778 +2024-07-27 04:30:00+00:00,5.317195726230699 +2024-07-27 04:45:00+00:00,7.515662082572581 +2024-07-27 05:00:00+00:00,16.991128981168075 +2024-07-27 05:15:00+00:00,10.537257721750033 +2024-07-27 05:30:00+00:00,18.58246236029656 +2024-07-27 05:45:00+00:00,10.583357697524482 +2024-07-27 06:00:00+00:00,7.549464403986235 +2024-07-27 06:15:00+00:00,12.551816314057696 +2024-07-27 06:30:00+00:00,20.463528851739905 +2024-07-27 06:45:00+00:00,20.050244198073486 +2024-07-27 07:00:00+00:00,17.92876862685653 +2024-07-27 07:15:00+00:00,20.461400069968757 +2024-07-27 07:30:00+00:00,20.737824968560766 +2024-07-27 07:45:00+00:00,20.058763847846258 +2024-07-27 08:00:00+00:00,20.001489875033457 +2024-07-27 08:15:00+00:00,20.714211797069584 +2024-07-27 08:30:00+00:00,21.419849729039335 +2024-07-27 08:45:00+00:00,20.74992785187056 +2024-07-27 09:00:00+00:00,20.927781370856803 +2024-07-27 09:15:00+00:00,21.71706885348484 +2024-07-27 09:30:00+00:00,19.292718624309675 +2024-07-27 09:45:00+00:00,20.199195578810016 +2024-07-27 10:00:00+00:00,21.417337400206225 +2024-07-27 10:15:00+00:00,21.85281356217546 +2024-07-27 10:30:00+00:00,22.304905616262495 +2024-07-27 10:45:00+00:00,22.083825459842977 +2024-07-27 11:00:00+00:00,21.94482199847118 +2024-07-27 11:15:00+00:00,21.018874434264518 +2024-07-27 11:30:00+00:00,21.233680549388207 +2024-07-27 11:45:00+00:00,20.114680629154662 +2024-07-27 12:00:00+00:00,20.819790276414725 +2024-07-27 12:15:00+00:00,20.2965262179384 +2024-07-27 12:30:00+00:00,19.93433940676103 +2024-07-27 12:45:00+00:00,19.08678956713927 +2024-07-27 13:00:00+00:00,17.827938694173664 +2024-07-27 13:15:00+00:00,17.35119579924756 +2024-07-27 13:30:00+00:00,4.769025642056454 +2024-07-27 13:45:00+00:00,14.416769854141803 +2024-07-27 14:00:00+00:00,12.760183862245679 +2024-07-27 14:15:00+00:00,10.835001716690375 +2024-07-27 14:30:00+00:00,9.363268303782274 +2024-07-27 14:45:00+00:00,7.900653008749195 +2024-07-27 15:00:00+00:00,5.94718940611742 +2024-07-27 15:15:00+00:00,4.297077102408563 +2024-07-27 15:30:00+00:00,2.580505297852503 +2024-07-27 15:45:00+00:00,1.2264129963129706 +2024-07-28 03:30:00+00:00,4.1722470141194075 +2024-07-28 03:45:00+00:00,6.660926289456545 +2024-07-28 04:00:00+00:00,6.825994282400327 +2024-07-28 04:15:00+00:00,6.746976222079989 +2024-07-28 04:30:00+00:00,8.064955465508238 +2024-07-28 04:45:00+00:00,9.712703754181206 +2024-07-28 05:00:00+00:00,11.708494513477532 +2024-07-28 05:15:00+00:00,17.437110755819766 +2024-07-28 05:30:00+00:00,19.084235488764737 +2024-07-28 05:45:00+00:00,18.9632743280187 +2024-07-28 06:00:00+00:00,19.716775481399385 +2024-07-28 06:15:00+00:00,19.894891787611577 +2024-07-28 06:30:00+00:00,19.703843343145422 +2024-07-28 06:45:00+00:00,19.99185755520995 +2024-07-28 07:00:00+00:00,20.445263623924617 +2024-07-28 07:15:00+00:00,20.52980178647518 +2024-07-28 07:30:00+00:00,20.606308209925515 +2024-07-28 07:45:00+00:00,20.53908812098951 +2024-07-28 08:00:00+00:00,20.511308703925756 +2024-07-28 08:15:00+00:00,21.077631047079038 +2024-07-28 08:30:00+00:00,20.186527614267828 +2024-07-28 08:45:00+00:00,19.909068656997313 +2024-07-28 09:00:00+00:00,21.48135695591829 +2024-07-28 09:15:00+00:00,21.422433003990207 +2024-07-28 09:30:00+00:00,21.132051576909205 +2024-07-28 09:45:00+00:00,20.55912342280715 +2024-07-28 10:00:00+00:00,21.776219052837693 +2024-07-28 10:15:00+00:00,21.636030999117047 +2024-07-28 10:30:00+00:00,20.912605396090076 +2024-07-28 10:45:00+00:00,20.486390539991202 +2024-07-28 11:00:00+00:00,20.776790021452705 +2024-07-28 11:15:00+00:00,20.664275445322506 +2024-07-28 11:30:00+00:00,20.883238856969548 +2024-07-28 11:45:00+00:00,20.711520112506225 +2024-07-28 12:00:00+00:00,20.689502747483576 +2024-07-28 12:15:00+00:00,19.92038400187674 +2024-07-28 12:30:00+00:00,19.654056744737677 +2024-07-28 12:45:00+00:00,18.903499915308903 +2024-07-28 13:00:00+00:00,18.319083277172574 +2024-07-28 13:15:00+00:00,17.3608445654485 +2024-07-28 13:30:00+00:00,16.667307075443055 +2024-07-28 13:45:00+00:00,15.047040629403439 +2024-07-28 14:00:00+00:00,13.588454670097589 +2024-07-28 14:15:00+00:00,11.848364266760145 +2024-07-28 14:30:00+00:00,9.945012005333504 +2024-07-28 14:45:00+00:00,8.8920438200527 +2024-07-28 15:00:00+00:00,7.789535323313813 +2024-07-28 15:15:00+00:00,5.628188589613953 +2024-07-28 15:30:00+00:00,3.8562015403910417 +2024-07-28 15:45:00+00:00,1.9876601820527198 +2024-07-28 16:00:00+00:00,0.629471317066159 +2024-07-29 03:30:00+00:00,2.3058995113645855 +2024-07-29 03:45:00+00:00,6.467909579167879 +2024-07-29 04:00:00+00:00,8.955947034589292 +2024-07-29 04:15:00+00:00,11.320277353958497 +2024-07-29 04:30:00+00:00,13.654209671769191 +2024-07-29 04:45:00+00:00,15.532123388063926 +2024-07-29 05:00:00+00:00,16.688421766948434 +2024-07-29 05:15:00+00:00,17.691472077433083 +2024-07-29 05:30:00+00:00,18.308696088504192 +2024-07-29 05:45:00+00:00,18.809670441482254 +2024-07-29 06:00:00+00:00,18.360826078086085 +2024-07-29 06:15:00+00:00,19.181730437386157 +2024-07-29 06:30:00+00:00,19.51063460221031 +2024-07-29 06:45:00+00:00,19.290585346904475 +2024-07-29 07:00:00+00:00,19.308684079247655 +2024-07-29 07:15:00+00:00,19.138680897222546 +2024-07-29 07:30:00+00:00,19.834268471371935 +2024-07-29 07:45:00+00:00,19.543585957120307 +2024-07-29 08:00:00+00:00,19.018338096533178 +2024-07-29 08:15:00+00:00,19.38828139019609 +2024-07-29 08:30:00+00:00,19.22513984704873 +2024-07-29 08:45:00+00:00,19.643183159049727 +2024-07-29 09:00:00+00:00,20.49291900409291 +2024-07-29 09:15:00+00:00,21.20132742695702 +2024-07-29 09:30:00+00:00,20.378437223751142 +2024-07-29 09:45:00+00:00,20.48296607193651 +2024-07-29 10:00:00+00:00,20.584733962949787 +2024-07-29 10:15:00+00:00,20.06965073275152 +2024-07-29 10:30:00+00:00,19.8824121731517 +2024-07-29 10:45:00+00:00,19.732856460140145 +2024-07-29 11:00:00+00:00,19.638944246851178 +2024-07-29 11:15:00+00:00,17.845299640166196 +2024-07-29 11:30:00+00:00,18.106189865719422 +2024-07-29 11:45:00+00:00,18.20884349742769 +2024-07-29 12:00:00+00:00,19.869117374372856 +2024-07-29 12:15:00+00:00,18.430275382023986 +2024-07-29 12:30:00+00:00,18.31331761445837 +2024-07-29 12:45:00+00:00,17.836785893471358 +2024-07-29 13:00:00+00:00,17.002299282734725 +2024-07-29 13:15:00+00:00,15.458809359044096 +2024-07-29 13:30:00+00:00,14.38709650707223 +2024-07-29 13:45:00+00:00,13.995693574403381 +2024-07-29 14:00:00+00:00,11.904830432451995 +2024-07-29 14:15:00+00:00,10.786733010336194 +2024-07-29 14:30:00+00:00,9.986272621622376 +2024-07-29 14:45:00+00:00,9.13375773618122 +2024-07-29 15:00:00+00:00,7.202320736770166 +2024-07-29 15:15:00+00:00,5.280246894154788 +2024-07-29 15:30:00+00:00,3.4528372403118075 +2024-07-29 15:45:00+00:00,1.9379387847403204 +2024-07-29 16:00:00+00:00,0.5075094231121926 +2024-07-30 03:30:00+00:00,3.715956373247141 +2024-07-30 03:45:00+00:00,6.180396722696462 +2024-07-30 04:00:00+00:00,10.60629130474198 +2024-07-30 04:15:00+00:00,13.627321167310235 +2024-07-30 04:30:00+00:00,14.254056274798439 +2024-07-30 04:45:00+00:00,15.519927525543347 +2024-07-30 05:00:00+00:00,7.015078976057071 +2024-07-30 05:15:00+00:00,17.623927093905788 +2024-07-30 05:30:00+00:00,18.146683762604333 +2024-07-30 05:45:00+00:00,18.677098340740564 +2024-07-30 06:00:00+00:00,18.887510006798827 +2024-07-30 06:15:00+00:00,19.119101027270386 +2024-07-30 06:30:00+00:00,19.33448219354461 +2024-07-30 06:45:00+00:00,19.49992196982356 +2024-07-30 07:00:00+00:00,19.503178296281376 +2024-07-30 07:15:00+00:00,20.10974572020495 +2024-07-30 07:30:00+00:00,20.628971963091423 +2024-07-30 07:45:00+00:00,20.099110728778808 +2024-07-30 08:00:00+00:00,20.25250713987659 +2024-07-30 08:15:00+00:00,19.80037437478194 +2024-07-30 08:30:00+00:00,20.390071092582215 +2024-07-30 08:45:00+00:00,20.721790976868963 +2024-07-30 09:00:00+00:00,20.81308057953823 +2024-07-30 09:15:00+00:00,20.62417109115696 +2024-07-30 09:30:00+00:00,21.323360569955657 +2024-07-30 09:45:00+00:00,20.74147928633173 +2024-07-30 10:00:00+00:00,20.404924461446626 +2024-07-30 10:15:00+00:00,21.02190787089634 +2024-07-30 10:30:00+00:00,20.644081730538947 +2024-07-30 10:45:00+00:00,20.34455996341304 +2024-07-30 11:00:00+00:00,20.74337311048566 +2024-07-30 11:15:00+00:00,20.234660781536196 +2024-07-30 11:30:00+00:00,20.69646241642337 +2024-07-30 11:45:00+00:00,20.165247243351068 +2024-07-30 12:00:00+00:00,20.491856135422566 +2024-07-30 12:15:00+00:00,19.64739990556995 +2024-07-30 12:30:00+00:00,18.559181130621315 +2024-07-30 12:45:00+00:00,18.09672156389021 +2024-07-30 13:00:00+00:00,17.561963073725696 +2024-07-30 13:15:00+00:00,16.208532666873616 +2024-07-30 13:30:00+00:00,15.570407966786147 +2024-07-30 13:45:00+00:00,13.986285411852112 +2024-07-30 14:00:00+00:00,12.494447566870468 +2024-07-30 14:15:00+00:00,11.065397220853505 +2024-07-30 14:30:00+00:00,10.025587353174345 +2024-07-30 14:45:00+00:00,8.949479740112134 +2024-07-30 15:00:00+00:00,7.19691219867325 +2024-07-30 15:15:00+00:00,5.307442462813214 +2024-07-30 15:30:00+00:00,3.22489106709157 +2024-07-30 15:45:00+00:00,1.6765065769577538 +2024-07-30 16:00:00+00:00,0.41413427951424286 +2024-07-31 03:30:00+00:00,4.254490305767065 +2024-07-31 03:45:00+00:00,6.933718576470131 +2024-07-31 04:00:00+00:00,9.34504207416058 +2024-07-31 04:15:00+00:00,11.298886663838996 +2024-07-31 04:30:00+00:00,13.73868192809286 +2024-07-31 04:45:00+00:00,14.975820167023354 +2024-07-31 05:00:00+00:00,15.524389288613992 +2024-07-31 05:15:00+00:00,16.52109496987594 +2024-07-31 05:30:00+00:00,17.57157154221676 +2024-07-31 05:45:00+00:00,18.286134174232867 +2024-07-31 06:00:00+00:00,18.286067798752747 +2024-07-31 06:15:00+00:00,18.546234925724534 +2024-07-31 06:30:00+00:00,18.81792611168 +2024-07-31 06:45:00+00:00,19.54921702010848 +2024-07-31 07:00:00+00:00,19.002666353999473 +2024-07-31 07:15:00+00:00,20.036925853761407 +2024-07-31 07:30:00+00:00,19.661415600616923 +2024-07-31 07:45:00+00:00,19.937623829852026 +2024-07-31 08:00:00+00:00,19.893963105151514 +2024-07-31 08:15:00+00:00,19.858495596693675 +2024-07-31 08:30:00+00:00,20.500104404155675 +2024-07-31 08:45:00+00:00,20.441540096844953 +2024-07-31 09:00:00+00:00,20.85742767054118 +2024-07-31 09:15:00+00:00,20.979875836140007 +2024-07-31 09:30:00+00:00,20.66927803478186 +2024-07-31 09:45:00+00:00,20.746129984925492 +2024-07-31 10:00:00+00:00,18.590663273366676 +2024-07-31 10:15:00+00:00,19.228905171802232 +2024-07-31 10:30:00+00:00,18.41024398269247 +2024-07-31 10:45:00+00:00,18.61568322951295 +2024-07-31 11:00:00+00:00,9.984806368186565 +2024-07-31 11:15:00+00:00,18.138718328460296 +2024-07-31 11:30:00+00:00,8.495791559415169 +2024-07-31 11:45:00+00:00,9.133923850121228 +2024-07-31 12:00:00+00:00,8.41355055507909 +2024-07-31 12:15:00+00:00,8.46915950640361 +2024-07-31 12:30:00+00:00,8.876268435928772 +2024-07-31 12:45:00+00:00,9.089466905160224 +2024-07-31 13:00:00+00:00,7.501944449890479 +2024-07-31 13:15:00+00:00,8.639122914115147 +2024-07-31 13:30:00+00:00,7.708968063342501 +2024-07-31 13:45:00+00:00,7.555790060924407 +2024-07-31 14:00:00+00:00,9.885228025895024 +2024-07-31 14:15:00+00:00,9.122420411435552 +2024-07-31 14:30:00+00:00,8.209872624192801 +2024-07-31 14:45:00+00:00,7.275739527862787 +2024-07-31 15:00:00+00:00,5.5331070314428095 +2024-07-31 15:15:00+00:00,4.25747026172378 +2024-07-31 15:30:00+00:00,2.5730974453255526 +2024-07-31 15:45:00+00:00,1.2116043332159467 +2024-07-31 16:00:00+00:00,0.05804762032043187 +2024-08-01 03:30:00+00:00,3.272363791707395 +2024-08-01 03:45:00+00:00,5.05529801812302 +2024-08-01 04:00:00+00:00,7.366724189118654 +2024-08-01 04:15:00+00:00,9.739906342693262 +2024-08-01 04:30:00+00:00,12.267461649025812 +2024-08-01 04:45:00+00:00,14.092698596583796 +2024-08-01 05:00:00+00:00,15.210041635973939 +2024-08-01 05:15:00+00:00,16.04029229191239 +2024-08-01 05:30:00+00:00,16.949787922608408 +2024-08-01 05:45:00+00:00,17.594097643624306 +2024-08-01 06:00:00+00:00,17.99088040366427 +2024-08-01 06:15:00+00:00,18.36850969882755 +2024-08-01 06:30:00+00:00,18.802056830258966 +2024-08-01 06:45:00+00:00,19.04977937225947 +2024-08-01 07:00:00+00:00,19.235225784414393 +2024-08-01 07:15:00+00:00,19.873739300085063 +2024-08-01 07:30:00+00:00,19.920902604550797 +2024-08-01 07:45:00+00:00,20.669565770458235 +2024-08-01 08:00:00+00:00,20.319242349819522 +2024-08-01 08:15:00+00:00,20.294969816852735 +2024-08-01 08:30:00+00:00,20.513151512949218 +2024-08-01 08:45:00+00:00,20.76666843844968 +2024-08-01 09:00:00+00:00,20.23020528699825 +2024-08-01 09:15:00+00:00,20.641663001848414 +2024-08-01 09:30:00+00:00,19.40046232545765 +2024-08-01 09:45:00+00:00,19.30797173328199 +2024-08-01 10:00:00+00:00,18.90055380395474 +2024-08-01 10:15:00+00:00,17.943943000584262 +2024-08-01 10:30:00+00:00,9.953101656798392 +2024-08-01 10:45:00+00:00,8.705218611826995 +2024-08-01 11:00:00+00:00,8.136473503177989 +2024-08-01 11:15:00+00:00,9.468476740983865 +2024-08-01 11:30:00+00:00,9.203874757643892 +2024-08-01 11:45:00+00:00,9.732963468881318 +2024-08-01 12:00:00+00:00,8.405669664915644 +2024-08-01 12:15:00+00:00,7.4697570015772605 +2024-08-01 12:30:00+00:00,8.376227561623507 +2024-08-01 12:45:00+00:00,8.198868101130707 +2024-08-01 13:00:00+00:00,8.038621667209053 +2024-08-01 13:15:00+00:00,7.652919391322168 +2024-08-01 13:30:00+00:00,7.878201671438246 +2024-08-01 13:45:00+00:00,10.98567724956502 +2024-08-01 14:00:00+00:00,10.3371330680569 +2024-08-01 14:15:00+00:00,9.671335084038637 +2024-08-01 14:30:00+00:00,9.02225036838091 +2024-08-01 14:45:00+00:00,7.124750457292391 +2024-08-01 15:00:00+00:00,5.7776697268172 +2024-08-01 15:15:00+00:00,4.05089101038957 +2024-08-01 15:30:00+00:00,2.2604893276055007 +2024-08-01 15:45:00+00:00,0.9419070601966038 +2024-08-01 16:00:00+00:00,0.0 +2024-08-02 03:30:00+00:00,4.023389082790175 +2024-08-02 03:45:00+00:00,6.345700764697519 +2024-08-02 04:00:00+00:00,8.432455642071519 +2024-08-02 04:15:00+00:00,10.38889426374073 +2024-08-02 04:30:00+00:00,12.435900618302474 +2024-08-02 04:45:00+00:00,13.987142904302344 +2024-08-02 05:00:00+00:00,15.381173518872352 +2024-08-02 05:15:00+00:00,16.574528188368213 +2024-08-02 05:30:00+00:00,17.619590326392455 +2024-08-02 05:45:00+00:00,18.034361335748 +2024-08-02 06:00:00+00:00,18.54189476547408 +2024-08-02 06:15:00+00:00,19.038277311719092 +2024-08-02 06:30:00+00:00,19.06727119688772 +2024-08-02 06:45:00+00:00,19.79589393263585 +2024-08-02 07:00:00+00:00,19.936464715404156 +2024-08-02 07:15:00+00:00,20.530719457532086 +2024-08-02 07:30:00+00:00,20.89642059616839 +2024-08-02 07:45:00+00:00,21.172991352390078 +2024-08-02 08:00:00+00:00,20.494739310086544 +2024-08-02 08:15:00+00:00,20.424539170804234 +2024-08-02 08:30:00+00:00,20.431079027299482 +2024-08-02 08:45:00+00:00,18.98368854194927 +2024-08-02 09:00:00+00:00,9.57495143564586 +2024-08-02 09:15:00+00:00,19.370541694645304 +2024-08-02 09:30:00+00:00,9.838738831608685 +2024-08-02 09:45:00+00:00,9.951948365919884 +2024-08-02 10:00:00+00:00,10.160932104333927 +2024-08-02 10:15:00+00:00,7.5176736681048215 +2024-08-02 10:30:00+00:00,5.03681315908899 +2024-08-02 10:45:00+00:00,8.070656502431614 +2024-08-02 11:00:00+00:00,8.96900945785541 +2024-08-02 11:15:00+00:00,7.796966757208569 +2024-08-02 11:30:00+00:00,3.9807518112013383 +2024-08-02 11:45:00+00:00,7.720247494721411 +2024-08-02 12:00:00+00:00,7.376459982153426 +2024-08-02 12:15:00+00:00,7.783635230532441 +2024-08-02 12:30:00+00:00,8.901364327396188 +2024-08-02 12:45:00+00:00,8.31517655906851 +2024-08-02 13:00:00+00:00,8.710297567184991 +2024-08-02 13:15:00+00:00,6.668732778193755 +2024-08-02 13:30:00+00:00,13.524041175788948 +2024-08-02 13:45:00+00:00,11.051898927690761 +2024-08-02 14:00:00+00:00,10.349129146038512 +2024-08-02 14:15:00+00:00,9.606135876772807 +2024-08-02 14:30:00+00:00,8.34713375640678 +2024-08-02 14:45:00+00:00,7.276219848042643 +2024-08-02 15:00:00+00:00,5.016490181441987 +2024-08-02 15:15:00+00:00,3.5746308223942345 +2024-08-02 15:30:00+00:00,2.2569736806310274 +2024-08-02 15:45:00+00:00,0.8124167218733953 +2024-08-03 03:45:00+00:00,5.226703330603502 +2024-08-03 04:00:00+00:00,6.630037972641053 +2024-08-03 04:15:00+00:00,10.20612582328264 +2024-08-03 04:30:00+00:00,12.251511206858929 +2024-08-03 04:45:00+00:00,14.360196018174728 +2024-08-03 05:00:00+00:00,16.121047122902908 +2024-08-03 05:15:00+00:00,17.5360239828875 +2024-08-03 05:30:00+00:00,18.52451054171683 +2024-08-03 05:45:00+00:00,18.925160950636922 +2024-08-03 06:00:00+00:00,19.265561748933184 +2024-08-03 06:15:00+00:00,19.58236545085222 +2024-08-03 06:30:00+00:00,19.38875695099603 +2024-08-03 06:45:00+00:00,18.757825514211046 +2024-08-03 07:00:00+00:00,19.699541267249383 +2024-08-03 07:15:00+00:00,20.05133789133937 +2024-08-03 07:30:00+00:00,20.66374828382797 +2024-08-03 07:45:00+00:00,20.498694326952823 +2024-08-03 08:00:00+00:00,20.644758262638224 +2024-08-03 08:15:00+00:00,20.552318189665826 +2024-08-03 08:30:00+00:00,20.82269657733722 +2024-08-03 08:45:00+00:00,21.19888571967043 +2024-08-03 09:00:00+00:00,21.66461585728808 +2024-08-03 09:15:00+00:00,21.691003698122014 +2024-08-03 09:30:00+00:00,21.922049216696546 +2024-08-03 09:45:00+00:00,20.67807631472864 +2024-08-03 10:00:00+00:00,21.287968550389813 +2024-08-03 10:15:00+00:00,21.230320374951326 +2024-08-03 10:30:00+00:00,21.196917776939223 +2024-08-03 10:45:00+00:00,20.54643281576136 +2024-08-03 11:00:00+00:00,20.95875687438776 +2024-08-03 11:15:00+00:00,20.882565817148638 +2024-08-03 11:30:00+00:00,20.284969107145717 +2024-08-03 11:45:00+00:00,19.892849681565686 +2024-08-03 12:00:00+00:00,20.205895919456978 +2024-08-03 12:15:00+00:00,19.61625669868631 +2024-08-03 12:30:00+00:00,19.03447135140308 +2024-08-03 12:45:00+00:00,17.944981002697393 +2024-08-03 13:00:00+00:00,17.369758179821225 +2024-08-03 13:15:00+00:00,15.695091305851864 +2024-08-03 13:30:00+00:00,14.495138290638918 +2024-08-03 13:45:00+00:00,13.69305411435958 +2024-08-03 14:00:00+00:00,12.83828191039732 +2024-08-03 14:15:00+00:00,11.52512934594893 +2024-08-03 14:30:00+00:00,9.554445107213997 +2024-08-03 14:45:00+00:00,7.972983264934824 +2024-08-03 15:00:00+00:00,6.198355847334894 +2024-08-03 15:15:00+00:00,4.2480859274476925 +2024-08-03 15:30:00+00:00,2.5926716468328355 +2024-08-03 15:45:00+00:00,1.048578006199294 +2024-08-04 03:30:00+00:00,3.014506575873186 +2024-08-04 03:45:00+00:00,5.195890075763327 +2024-08-04 04:00:00+00:00,7.355392528207165 +2024-08-04 04:15:00+00:00,9.643429357073192 +2024-08-04 04:30:00+00:00,11.939631710469584 +2024-08-04 04:45:00+00:00,14.12345921816956 +2024-08-04 05:00:00+00:00,15.542553846579407 +2024-08-04 05:15:00+00:00,16.583080752379427 +2024-08-04 05:30:00+00:00,17.388465721772135 +2024-08-04 05:45:00+00:00,17.641644226184823 +2024-08-04 06:00:00+00:00,17.8248274517461 +2024-08-04 06:15:00+00:00,18.453019684906142 +2024-08-04 06:30:00+00:00,18.90934107789598 +2024-08-04 06:45:00+00:00,19.04157941747902 +2024-08-04 07:00:00+00:00,19.500559393676006 +2024-08-04 07:15:00+00:00,20.124191216564988 +2024-08-04 07:30:00+00:00,20.484013273183596 +2024-08-04 07:45:00+00:00,20.33289028118101 +2024-08-04 08:00:00+00:00,20.714044986921007 +2024-08-04 08:15:00+00:00,20.991714278146965 +2024-08-04 08:30:00+00:00,21.117424578102373 +2024-08-04 08:45:00+00:00,21.42146079163109 +2024-08-04 09:00:00+00:00,22.47919618469262 +2024-08-04 09:15:00+00:00,22.095241637820862 +2024-08-04 09:30:00+00:00,21.94821517307355 +2024-08-04 09:45:00+00:00,21.951154726012724 +2024-08-04 10:00:00+00:00,21.218886086594253 +2024-08-04 10:15:00+00:00,20.47437755783668 +2024-08-04 10:30:00+00:00,20.528381850309387 +2024-08-04 10:45:00+00:00,10.478679519599808 +2024-08-04 11:00:00+00:00,19.350744491979775 +2024-08-04 11:15:00+00:00,9.742164996999529 +2024-08-04 11:30:00+00:00,9.874808318573013 +2024-08-04 11:45:00+00:00,4.966569112011746 +2024-08-04 12:00:00+00:00,19.34620044524527 +2024-08-04 12:15:00+00:00,18.85708005165619 +2024-08-04 12:30:00+00:00,9.023487624512322 +2024-08-04 12:45:00+00:00,6.965412394814704 +2024-08-04 13:00:00+00:00,7.182680075375609 +2024-08-04 13:15:00+00:00,14.791025178377296 +2024-08-04 13:30:00+00:00,9.025353123289321 +2024-08-04 13:45:00+00:00,8.415619816181712 +2024-08-04 14:00:00+00:00,8.218048304192983 +2024-08-04 14:15:00+00:00,9.497981048663057 +2024-08-04 14:30:00+00:00,7.915160426348542 +2024-08-04 14:45:00+00:00,6.978339865694963 +2024-08-04 15:00:00+00:00,5.148429323061155 +2024-08-04 15:15:00+00:00,3.4905243164346595 +2024-08-04 15:30:00+00:00,1.955301245636671 +2024-08-04 15:45:00+00:00,0.706000448661442 +2024-08-05 03:30:00+00:00,3.3317910967450852 +2024-08-05 03:45:00+00:00,3.645105456172801 +2024-08-05 04:00:00+00:00,8.573505091820394 +2024-08-05 04:15:00+00:00,10.844057998881008 +2024-08-05 04:30:00+00:00,12.944368777767279 +2024-08-05 04:45:00+00:00,14.85442817255997 +2024-08-05 05:00:00+00:00,16.253395387419832 +2024-08-05 05:15:00+00:00,16.864110285101873 +2024-08-05 05:30:00+00:00,17.334839303395682 +2024-08-05 05:45:00+00:00,17.843925611165567 +2024-08-05 06:00:00+00:00,18.362056022324225 +2024-08-05 06:15:00+00:00,18.327540899441253 +2024-08-05 06:30:00+00:00,18.358420201898163 +2024-08-05 06:45:00+00:00,19.202011503999472 +2024-08-05 07:00:00+00:00,19.068884920567434 +2024-08-05 07:15:00+00:00,19.956531190868375 +2024-08-05 07:30:00+00:00,20.651089768144534 +2024-08-05 07:45:00+00:00,20.528805636457708 +2024-08-05 08:00:00+00:00,19.38306656072882 +2024-08-05 08:15:00+00:00,20.440098302662683 +2024-08-05 08:30:00+00:00,20.148549869406395 +2024-08-05 08:45:00+00:00,20.864564845526743 +2024-08-05 09:00:00+00:00,20.967845356170535 +2024-08-05 09:15:00+00:00,21.17587398667073 +2024-08-05 09:30:00+00:00,21.285766829681084 +2024-08-05 09:45:00+00:00,22.071362812200107 +2024-08-05 10:00:00+00:00,21.839650328606428 +2024-08-05 10:15:00+00:00,21.287408682501297 +2024-08-05 10:30:00+00:00,20.87328919152771 +2024-08-05 10:45:00+00:00,21.49157478357935 +2024-08-05 11:00:00+00:00,21.395115092635915 +2024-08-05 11:15:00+00:00,21.421207685026335 +2024-08-05 11:30:00+00:00,21.152713990984672 +2024-08-05 11:45:00+00:00,20.882505008516127 +2024-08-05 12:00:00+00:00,20.062465316368037 +2024-08-05 12:15:00+00:00,19.698545868633943 +2024-08-05 12:30:00+00:00,19.29033092083268 +2024-08-05 12:45:00+00:00,18.58603042470014 +2024-08-05 13:00:00+00:00,17.524685378335995 +2024-08-05 13:15:00+00:00,17.11736413608333 +2024-08-05 13:30:00+00:00,16.68576739260015 +2024-08-05 13:45:00+00:00,15.299618295363626 +2024-08-05 14:00:00+00:00,13.825766742151325 +2024-08-05 14:15:00+00:00,12.267627995271816 +2024-08-05 14:30:00+00:00,10.931679186948172 +2024-08-05 14:45:00+00:00,8.776156227667876 +2024-08-05 15:00:00+00:00,7.008312874299602 +2024-08-05 15:15:00+00:00,4.992593694790514 +2024-08-05 15:30:00+00:00,3.073614717648801 +2024-08-05 15:45:00+00:00,1.4282986777981699 +2024-08-06 03:30:00+00:00,2.3188582085840044 +2024-08-06 03:45:00+00:00,4.8264459371973905 +2024-08-06 04:00:00+00:00,7.182829041917824 +2024-08-06 04:15:00+00:00,10.95948597262735 +2024-08-06 04:30:00+00:00,17.232073368059126 +2024-08-06 04:45:00+00:00,18.82607563684962 +2024-08-06 05:00:00+00:00,16.280814600831835 +2024-08-06 05:15:00+00:00,16.809355855959602 +2024-08-06 05:30:00+00:00,16.611875922656143 +2024-08-06 05:45:00+00:00,16.652412304470637 +2024-08-06 06:00:00+00:00,16.441140293715932 +2024-08-06 06:15:00+00:00,16.819343043318405 +2024-08-06 06:30:00+00:00,17.056751547433663 +2024-08-06 06:45:00+00:00,17.158824597218697 +2024-08-06 07:00:00+00:00,17.807872805156258 +2024-08-06 07:15:00+00:00,17.917473776377378 +2024-08-06 07:30:00+00:00,18.740320112685247 +2024-08-06 07:45:00+00:00,18.97374168735783 +2024-08-06 08:00:00+00:00,19.098326526057868 +2024-08-06 08:15:00+00:00,19.113670426825706 +2024-08-06 08:30:00+00:00,20.205370104628496 +2024-08-06 08:45:00+00:00,19.79014347788114 +2024-08-06 09:00:00+00:00,18.33531133881485 +2024-08-06 09:15:00+00:00,19.085548240898042 +2024-08-06 09:30:00+00:00,17.85733206950085 +2024-08-06 09:45:00+00:00,17.996439637414376 +2024-08-06 10:00:00+00:00,17.778081065692113 +2024-08-06 10:15:00+00:00,16.62384728787289 +2024-08-06 10:30:00+00:00,8.147036720368323 +2024-08-06 10:45:00+00:00,9.356304397970275 +2024-08-06 11:00:00+00:00,9.466504709465818 +2024-08-06 11:15:00+00:00,17.150751134002824 +2024-08-06 11:30:00+00:00,8.692540351856817 +2024-08-06 11:45:00+00:00,7.8992444854887705 +2024-08-06 12:00:00+00:00,4.101346872248008 +2024-08-06 12:15:00+00:00,8.082227660553542 +2024-08-06 12:30:00+00:00,8.235554133320054 +2024-08-06 12:45:00+00:00,6.959629646591193 +2024-08-06 13:00:00+00:00,7.79567235598926 +2024-08-06 13:15:00+00:00,8.199425731288617 +2024-08-06 13:30:00+00:00,13.469597812055152 +2024-08-06 13:45:00+00:00,10.974573964441905 +2024-08-06 14:00:00+00:00,11.264522381021582 +2024-08-06 14:15:00+00:00,10.184051033825584 +2024-08-06 14:30:00+00:00,8.310589474722246 +2024-08-06 14:45:00+00:00,6.9608378907071025 +2024-08-06 15:00:00+00:00,5.1759957931779965 +2024-08-06 15:15:00+00:00,3.613506677095458 +2024-08-06 15:30:00+00:00,2.2067457772158576 +2024-08-06 15:45:00+00:00,0.8635578217103452 +2024-08-07 03:30:00+00:00,3.9310616205132627 +2024-08-07 03:45:00+00:00,6.953191046363645 +2024-08-07 04:00:00+00:00,10.10261065513222 +2024-08-07 04:15:00+00:00,11.747929393103286 +2024-08-07 04:30:00+00:00,13.293781614404649 +2024-08-07 04:45:00+00:00,14.443959796085077 +2024-08-07 05:00:00+00:00,15.096646777382801 +2024-08-07 05:15:00+00:00,15.613603454591276 +2024-08-07 05:30:00+00:00,16.002507131170013 +2024-08-07 05:45:00+00:00,16.427729230746877 +2024-08-07 06:00:00+00:00,16.847950668711242 +2024-08-07 06:15:00+00:00,18.07322735867635 +2024-08-07 06:30:00+00:00,17.562650051726724 +2024-08-07 06:45:00+00:00,17.262295790896726 +2024-08-07 07:00:00+00:00,17.57814628068942 +2024-08-07 07:15:00+00:00,18.257045269417606 +2024-08-07 07:30:00+00:00,18.40621926042215 +2024-08-07 07:45:00+00:00,18.542496083570484 +2024-08-07 08:00:00+00:00,18.994414777172835 +2024-08-07 08:15:00+00:00,19.257419172341994 +2024-08-07 08:30:00+00:00,19.564722713626825 +2024-08-07 08:45:00+00:00,19.40930994598896 +2024-08-07 09:00:00+00:00,19.587633095746284 +2024-08-07 09:15:00+00:00,19.6247368726749 +2024-08-07 09:30:00+00:00,20.36924606597468 +2024-08-07 09:45:00+00:00,19.781727477223253 +2024-08-07 10:00:00+00:00,20.289208191003347 +2024-08-07 10:15:00+00:00,19.88144455794646 +2024-08-07 10:30:00+00:00,19.990365532609857 +2024-08-07 10:45:00+00:00,19.744908331608773 +2024-08-07 11:00:00+00:00,19.38875232231909 +2024-08-07 11:15:00+00:00,19.038610057937245 +2024-08-07 11:30:00+00:00,19.45629294725948 +2024-08-07 11:45:00+00:00,19.212170617358936 +2024-08-07 12:00:00+00:00,18.98256673532572 +2024-08-07 12:15:00+00:00,18.466850128997912 +2024-08-07 12:30:00+00:00,17.679351880581322 +2024-08-07 12:45:00+00:00,16.893130452554658 +2024-08-07 13:00:00+00:00,16.05566351665637 +2024-08-07 13:15:00+00:00,15.623008900755282 +2024-08-07 13:30:00+00:00,15.15428981260053 +2024-08-07 13:45:00+00:00,13.373626404371358 +2024-08-07 14:00:00+00:00,12.003354086179046 +2024-08-07 14:15:00+00:00,10.443986307479339 +2024-08-07 14:30:00+00:00,8.98313023894478 +2024-08-07 14:45:00+00:00,7.607685023685668 +2024-08-07 15:00:00+00:00,5.678051710146003 +2024-08-07 15:15:00+00:00,3.904248675616297 +2024-08-07 15:30:00+00:00,2.2510027321087565 +2024-08-07 15:45:00+00:00,0.7456052353925775 +2024-08-08 03:30:00+00:00,2.2285979860570206 +2024-08-08 03:45:00+00:00,4.859658185310048 +2024-08-08 04:00:00+00:00,5.424355559661572 +2024-08-08 04:15:00+00:00,6.641043568776331 +2024-08-08 04:30:00+00:00,14.610606348537933 +2024-08-08 04:45:00+00:00,8.884658693555718 +2024-08-08 05:00:00+00:00,16.26524878984576 +2024-08-08 05:15:00+00:00,16.489956182086267 +2024-08-08 05:30:00+00:00,17.10524029455431 +2024-08-08 05:45:00+00:00,18.212178088859858 +2024-08-08 06:00:00+00:00,18.45228096151366 +2024-08-08 06:15:00+00:00,19.098627434236676 +2024-08-08 06:30:00+00:00,18.843665259037117 +2024-08-08 06:45:00+00:00,18.60816049823767 +2024-08-08 07:00:00+00:00,19.01948204919589 +2024-08-08 07:15:00+00:00,18.748475026166833 +2024-08-08 07:30:00+00:00,18.97181246837849 +2024-08-08 07:45:00+00:00,19.667561347387416 +2024-08-08 08:00:00+00:00,19.69805022701259 +2024-08-08 08:15:00+00:00,19.34221578493858 +2024-08-08 08:30:00+00:00,19.835962465010528 +2024-08-08 08:45:00+00:00,20.28404994800759 +2024-08-08 09:00:00+00:00,21.008797934067495 +2024-08-08 09:15:00+00:00,19.70374257226536 +2024-08-08 09:30:00+00:00,20.029754670050256 +2024-08-08 09:45:00+00:00,18.764741991484073 +2024-08-08 10:00:00+00:00,18.526789790334355 +2024-08-08 10:15:00+00:00,9.367199936519057 +2024-08-08 10:30:00+00:00,9.526558650153678 +2024-08-08 10:45:00+00:00,17.96496724277918 +2024-08-08 11:00:00+00:00,9.369699771470705 +2024-08-08 11:15:00+00:00,9.320644907920432 +2024-08-08 11:30:00+00:00,9.175850413359203 +2024-08-08 11:45:00+00:00,8.316324689776021 +2024-08-08 12:00:00+00:00,7.924873334516638 +2024-08-08 12:15:00+00:00,7.873507328131156 +2024-08-08 12:30:00+00:00,16.967912184553256 +2024-08-08 12:45:00+00:00,8.66374376384586 +2024-08-08 13:00:00+00:00,8.468883829798848 +2024-08-08 13:15:00+00:00,8.258759182912453 +2024-08-08 13:30:00+00:00,8.298141880553 +2024-08-08 13:45:00+00:00,7.561867330458139 +2024-08-08 14:00:00+00:00,6.90341243525595 +2024-08-08 14:15:00+00:00,9.228140241252586 +2024-08-08 14:30:00+00:00,7.889566691701155 +2024-08-08 14:45:00+00:00,6.2953971575210375 +2024-08-08 15:00:00+00:00,4.6664802305374895 +2024-08-08 15:15:00+00:00,3.380085609581393 +2024-08-08 15:30:00+00:00,1.8519092447073753 +2024-08-08 15:45:00+00:00,0.4577487691484692 +2024-08-09 03:30:00+00:00,2.503001107052861 +2024-08-09 03:45:00+00:00,5.778800708628403 +2024-08-09 04:00:00+00:00,4.8523145720787415 +2024-08-09 04:15:00+00:00,6.451351240773594 +2024-08-09 04:30:00+00:00,14.271175714445185 +2024-08-09 04:45:00+00:00,14.395308733014152 +2024-08-09 05:00:00+00:00,15.274248116270083 +2024-08-09 05:15:00+00:00,16.053993915332295 +2024-08-09 05:30:00+00:00,16.90115326179118 +2024-08-09 05:45:00+00:00,17.628958633438174 +2024-08-09 06:00:00+00:00,18.57022393198982 +2024-08-09 06:15:00+00:00,18.59264310108577 +2024-08-09 06:30:00+00:00,19.089424246424315 +2024-08-09 06:45:00+00:00,19.08092684589173 +2024-08-09 07:00:00+00:00,19.616493967176016 +2024-08-09 07:15:00+00:00,19.35128258729462 +2024-08-09 07:30:00+00:00,20.23902565798227 +2024-08-09 07:45:00+00:00,20.58122864162984 +2024-08-09 08:00:00+00:00,19.552038265576638 +2024-08-09 08:15:00+00:00,20.11083264822862 +2024-08-09 08:30:00+00:00,20.069417577681723 +2024-08-09 08:45:00+00:00,20.347880657448435 +2024-08-09 09:00:00+00:00,20.759175513964177 +2024-08-09 09:15:00+00:00,20.99779442969943 +2024-08-09 09:30:00+00:00,20.61581138956055 +2024-08-09 09:45:00+00:00,20.851672858560793 +2024-08-09 10:00:00+00:00,20.795733205278058 +2024-08-09 10:15:00+00:00,20.9257605650295 +2024-08-09 10:30:00+00:00,20.71021616170664 +2024-08-09 10:45:00+00:00,20.19300127834362 +2024-08-09 11:00:00+00:00,20.469500616219626 +2024-08-09 11:15:00+00:00,20.180765463550117 +2024-08-09 11:30:00+00:00,20.11596863732708 +2024-08-09 11:45:00+00:00,19.892293914630013 +2024-08-09 12:00:00+00:00,19.506321233713546 +2024-08-09 12:15:00+00:00,18.72750851269248 +2024-08-09 12:30:00+00:00,18.107672846405542 +2024-08-09 12:45:00+00:00,17.20811195000942 +2024-08-09 13:00:00+00:00,16.800887407388778 +2024-08-09 13:15:00+00:00,16.352074759603532 +2024-08-09 13:30:00+00:00,15.247521300379951 +2024-08-09 13:45:00+00:00,14.162165073834705 +2024-08-09 14:00:00+00:00,12.68667839806691 +2024-08-09 14:15:00+00:00,11.272706180938824 +2024-08-09 14:30:00+00:00,9.48885886428376 +2024-08-09 14:45:00+00:00,7.582706106816404 +2024-08-09 15:00:00+00:00,5.889274070399454 +2024-08-09 15:15:00+00:00,3.900880725367851 +2024-08-09 15:30:00+00:00,2.2336762019181347 +2024-08-09 15:45:00+00:00,0.7501406961454511 +2024-08-10 03:30:00+00:00,4.060990458502287 +2024-08-10 03:45:00+00:00,2.1527589232662394 +2024-08-10 04:00:00+00:00,3.7219707731982066 +2024-08-10 04:15:00+00:00,10.521268378633854 +2024-08-10 04:30:00+00:00,12.679374414267262 +2024-08-10 04:45:00+00:00,15.145473273446528 +2024-08-10 05:00:00+00:00,15.473039970606845 +2024-08-10 05:15:00+00:00,15.735296393039306 +2024-08-10 05:30:00+00:00,17.002240608149844 +2024-08-10 05:45:00+00:00,17.652396801235895 +2024-08-10 06:00:00+00:00,17.97113588310202 +2024-08-10 06:15:00+00:00,18.33902060951981 +2024-08-10 06:30:00+00:00,18.720676939666173 +2024-08-10 06:45:00+00:00,18.95177532527218 +2024-08-10 07:00:00+00:00,19.584339725345373 +2024-08-10 07:15:00+00:00,19.555194319393166 +2024-08-10 07:30:00+00:00,19.66144624709011 +2024-08-10 07:45:00+00:00,19.78371050728628 +2024-08-10 08:00:00+00:00,19.78199466564342 +2024-08-10 08:15:00+00:00,19.430594312218865 +2024-08-10 08:30:00+00:00,19.89387727237265 +2024-08-10 08:45:00+00:00,21.04520877899709 +2024-08-10 09:00:00+00:00,20.72107650103737 +2024-08-10 09:15:00+00:00,21.259124816140986 +2024-08-10 09:30:00+00:00,21.07221797288169 +2024-08-10 09:45:00+00:00,21.14012071527982 +2024-08-10 10:00:00+00:00,21.14115591998391 +2024-08-10 10:15:00+00:00,21.154587045818776 +2024-08-10 10:30:00+00:00,20.44757419676216 +2024-08-10 10:45:00+00:00,20.70124243495559 +2024-08-10 11:00:00+00:00,18.588410313087603 +2024-08-10 11:15:00+00:00,19.391425669853312 +2024-08-10 11:30:00+00:00,20.468315625938615 +2024-08-10 11:45:00+00:00,19.70203511986822 +2024-08-10 12:00:00+00:00,19.4720212000644 +2024-08-10 12:15:00+00:00,18.403083491394753 +2024-08-10 12:30:00+00:00,18.032703134391173 +2024-08-10 12:45:00+00:00,17.20898006197155 +2024-08-10 13:00:00+00:00,16.854260552221657 +2024-08-10 13:15:00+00:00,16.464654846857055 +2024-08-10 13:30:00+00:00,15.230424882380762 +2024-08-10 13:45:00+00:00,13.395079900685971 +2024-08-10 14:00:00+00:00,12.341832035950116 +2024-08-10 14:15:00+00:00,11.026140054652966 +2024-08-10 14:30:00+00:00,8.96116298965841 +2024-08-10 14:45:00+00:00,7.621451105583805 +2024-08-10 15:00:00+00:00,5.6905692690255965 +2024-08-10 15:15:00+00:00,3.984238818440028 +2024-08-10 15:30:00+00:00,2.2678733695607045 +2024-08-10 15:45:00+00:00,0.7572963465937801 +2024-08-11 03:30:00+00:00,5.268558655198072 +2024-08-11 03:45:00+00:00,2.070442730273951 +2024-08-11 04:00:00+00:00,2.926255097655799 +2024-08-11 04:15:00+00:00,7.145028064667316 +2024-08-11 04:30:00+00:00,6.638534352198144 +2024-08-11 04:45:00+00:00,7.3487575837286485 +2024-08-11 05:00:00+00:00,8.021371214994613 +2024-08-11 05:15:00+00:00,5.957660354796726 +2024-08-11 05:30:00+00:00,8.281982926789281 +2024-08-11 05:45:00+00:00,7.117806374488788 +2024-08-11 06:00:00+00:00,7.79196110459782 +2024-08-11 06:15:00+00:00,18.946219614403272 +2024-08-11 06:30:00+00:00,18.64887924376289 +2024-08-11 06:45:00+00:00,19.8376952395132 +2024-08-11 07:00:00+00:00,19.420420277568418 +2024-08-11 07:15:00+00:00,20.95881134171669 +2024-08-11 07:30:00+00:00,15.571336889405238 +2024-08-11 07:45:00+00:00,20.42534305486316 +2024-08-11 08:00:00+00:00,21.217318038700267 +2024-08-11 08:15:00+00:00,19.534821059124294 +2024-08-11 08:30:00+00:00,20.288442137353176 +2024-08-11 08:45:00+00:00,20.6445691536467 +2024-08-11 09:00:00+00:00,20.95515851681976 +2024-08-11 09:15:00+00:00,21.174108598907164 +2024-08-11 09:30:00+00:00,22.327909370059206 +2024-08-11 09:45:00+00:00,21.305759187678944 +2024-08-11 10:00:00+00:00,21.366145680187966 +2024-08-11 10:15:00+00:00,20.775037588925322 +2024-08-11 10:30:00+00:00,21.70107596263671 +2024-08-11 10:45:00+00:00,21.64217604223862 +2024-08-11 11:00:00+00:00,21.367175222796313 +2024-08-11 11:15:00+00:00,21.29561176098518 +2024-08-11 11:30:00+00:00,21.195521894253915 +2024-08-11 11:45:00+00:00,20.810145032799348 +2024-08-11 12:00:00+00:00,20.162920316151222 +2024-08-11 12:15:00+00:00,19.48114226962885 +2024-08-11 12:30:00+00:00,19.2519741390993 +2024-08-11 12:45:00+00:00,19.00548693042647 +2024-08-11 13:00:00+00:00,18.515103008981136 +2024-08-11 13:15:00+00:00,17.063697815350807 +2024-08-11 13:30:00+00:00,16.1396777514793 +2024-08-11 13:45:00+00:00,15.036440539819809 +2024-08-11 14:00:00+00:00,13.512974419988769 +2024-08-11 14:15:00+00:00,11.763431191806728 +2024-08-11 14:30:00+00:00,10.001232686001472 +2024-08-11 14:45:00+00:00,7.902022230077405 +2024-08-11 15:00:00+00:00,5.9416230651291535 +2024-08-11 15:15:00+00:00,4.176113401669574 +2024-08-11 15:30:00+00:00,2.2770531536413965 +2024-08-11 15:45:00+00:00,0.7743931244935314 +2024-08-12 03:30:00+00:00,3.0788245414759827 +2024-08-12 03:45:00+00:00,5.403345297192038 +2024-08-12 04:00:00+00:00,7.547217962396319 +2024-08-12 04:15:00+00:00,9.55813416383883 +2024-08-12 04:30:00+00:00,10.891140666088202 +2024-08-12 04:45:00+00:00,12.08406792189545 +2024-08-12 05:00:00+00:00,13.062574127171336 +2024-08-12 05:15:00+00:00,15.635396676775073 +2024-08-12 05:30:00+00:00,17.215516274910065 +2024-08-12 05:45:00+00:00,17.748743182024395 +2024-08-12 06:00:00+00:00,18.638051000948725 +2024-08-12 06:15:00+00:00,19.359177945770416 +2024-08-12 06:30:00+00:00,19.61174831812561 +2024-08-12 06:45:00+00:00,19.79455905432664 +2024-08-12 07:00:00+00:00,19.921590366141178 +2024-08-12 07:15:00+00:00,20.045157854795146 +2024-08-12 07:30:00+00:00,19.988559422635817 +2024-08-12 07:45:00+00:00,21.17290924326914 +2024-08-12 08:00:00+00:00,21.002142761866715 +2024-08-12 08:15:00+00:00,20.54938823706996 +2024-08-12 08:30:00+00:00,21.489227305184812 +2024-08-12 08:45:00+00:00,21.404473347166807 +2024-08-12 09:00:00+00:00,22.00513378911136 +2024-08-12 09:15:00+00:00,22.720697162037588 +2024-08-12 09:30:00+00:00,22.664864793369404 +2024-08-12 09:45:00+00:00,22.092106165107285 +2024-08-12 10:00:00+00:00,22.477740355595074 +2024-08-12 10:15:00+00:00,22.892184813301213 +2024-08-12 10:30:00+00:00,22.295529635672757 +2024-08-12 10:45:00+00:00,20.81048089773758 +2024-08-12 11:00:00+00:00,21.11851340663317 +2024-08-12 11:15:00+00:00,20.376984831317866 +2024-08-12 11:30:00+00:00,20.58336743270247 +2024-08-12 11:45:00+00:00,20.98008875273779 +2024-08-12 12:00:00+00:00,9.815487981075936 +2024-08-12 12:15:00+00:00,10.49787271876834 +2024-08-12 12:30:00+00:00,19.4794029419485 +2024-08-12 12:45:00+00:00,18.988006070559152 +2024-08-12 13:00:00+00:00,17.605396528349765 +2024-08-12 13:15:00+00:00,16.403562694176205 +2024-08-12 13:30:00+00:00,15.123364967457018 +2024-08-12 13:45:00+00:00,13.300137988367032 +2024-08-12 14:00:00+00:00,11.757313088376039 +2024-08-12 14:15:00+00:00,10.537591011421716 +2024-08-12 14:30:00+00:00,8.912311211848795 +2024-08-12 14:45:00+00:00,7.2297585500121 +2024-08-12 15:00:00+00:00,5.29158031482055 +2024-08-12 15:15:00+00:00,3.4315806605474934 +2024-08-12 15:30:00+00:00,1.7785685846343966 +2024-08-12 15:45:00+00:00,0.44716038166774896 +2024-08-13 03:30:00+00:00,3.1077592468271016 +2024-08-13 03:45:00+00:00,5.644247412416846 +2024-08-13 04:00:00+00:00,8.119995251389991 +2024-08-13 04:15:00+00:00,9.391386363726836 +2024-08-13 04:30:00+00:00,10.454366460618857 +2024-08-13 04:45:00+00:00,12.562896046558846 +2024-08-13 05:00:00+00:00,14.73374233786948 +2024-08-13 05:15:00+00:00,16.294509785080436 +2024-08-13 05:30:00+00:00,17.201601611331874 +2024-08-13 05:45:00+00:00,18.406010403723304 +2024-08-13 06:00:00+00:00,18.58089587925937 +2024-08-13 06:15:00+00:00,18.17937708619575 +2024-08-13 06:30:00+00:00,18.943606453917784 +2024-08-13 06:45:00+00:00,19.138079107036607 +2024-08-13 07:00:00+00:00,19.678808730063764 +2024-08-13 07:15:00+00:00,19.659492054889924 +2024-08-13 07:30:00+00:00,20.00943992684283 +2024-08-13 07:45:00+00:00,20.380198622019808 +2024-08-13 08:00:00+00:00,20.404314520267146 +2024-08-13 08:15:00+00:00,20.120305470567708 +2024-08-13 08:30:00+00:00,20.630891376280776 +2024-08-13 08:45:00+00:00,21.130755477734013 +2024-08-13 09:00:00+00:00,21.745755575159688 +2024-08-13 09:15:00+00:00,21.24845517816472 +2024-08-13 09:30:00+00:00,21.329695293857135 +2024-08-13 09:45:00+00:00,21.971746646911633 +2024-08-13 10:00:00+00:00,22.043766904543464 +2024-08-13 10:15:00+00:00,21.614134207325748 +2024-08-13 10:30:00+00:00,21.746338949350942 +2024-08-13 10:45:00+00:00,21.590013661618347 +2024-08-13 11:00:00+00:00,20.981839940333053 +2024-08-13 11:15:00+00:00,21.19313355970674 +2024-08-13 11:30:00+00:00,20.867825820882555 +2024-08-13 11:45:00+00:00,20.116748019987135 +2024-08-13 12:00:00+00:00,20.04647025516006 +2024-08-13 12:15:00+00:00,19.963101912887883 +2024-08-13 12:30:00+00:00,19.59321855613767 +2024-08-13 12:45:00+00:00,18.600381802416596 +2024-08-13 13:00:00+00:00,17.90074347735254 +2024-08-13 13:15:00+00:00,15.502286948041549 +2024-08-13 13:30:00+00:00,14.319778891476043 +2024-08-13 13:45:00+00:00,13.697433923326113 +2024-08-13 14:00:00+00:00,12.57029062628312 +2024-08-13 14:15:00+00:00,10.541698989728719 +2024-08-13 14:30:00+00:00,8.38327111004163 +2024-08-13 14:45:00+00:00,6.417311589414339 +2024-08-13 15:00:00+00:00,4.696185849416396 +2024-08-13 15:15:00+00:00,2.955197058483269 +2024-08-13 15:30:00+00:00,1.4443615198050601 +2024-08-13 15:45:00+00:00,0.10367367825969387 +2024-08-14 03:30:00+00:00,3.020386380583052 +2024-08-14 03:45:00+00:00,5.301763629771007 +2024-08-14 04:00:00+00:00,6.562498961358509 +2024-08-14 04:15:00+00:00,7.708896589934667 +2024-08-14 04:30:00+00:00,9.53842919044885 +2024-08-14 04:45:00+00:00,11.738451239318275 +2024-08-14 05:00:00+00:00,13.543742072333503 +2024-08-14 05:15:00+00:00,14.902332573984689 +2024-08-14 05:30:00+00:00,15.974702417985053 +2024-08-14 05:45:00+00:00,16.69664855174328 +2024-08-14 06:00:00+00:00,17.530774018826765 +2024-08-14 06:15:00+00:00,17.712253162423835 +2024-08-14 06:30:00+00:00,17.839669759224925 +2024-08-14 06:45:00+00:00,18.231156876171365 +2024-08-14 07:00:00+00:00,18.16757313983849 +2024-08-14 07:15:00+00:00,19.54460044937001 +2024-08-14 07:30:00+00:00,19.084370793237518 +2024-08-14 07:45:00+00:00,19.479834930516184 +2024-08-14 08:00:00+00:00,19.693561218255653 +2024-08-14 08:15:00+00:00,19.500458174051467 +2024-08-14 08:30:00+00:00,20.343617406658446 +2024-08-14 08:45:00+00:00,20.631875602875727 +2024-08-14 09:00:00+00:00,20.179450072022686 +2024-08-14 09:15:00+00:00,20.377815242695217 +2024-08-14 09:30:00+00:00,20.280341584268534 +2024-08-14 09:45:00+00:00,19.455171607482058 +2024-08-14 10:00:00+00:00,18.395106630380837 +2024-08-14 10:15:00+00:00,19.24752335108932 +2024-08-14 10:30:00+00:00,18.4675799790219 +2024-08-14 10:45:00+00:00,19.152096911230483 +2024-08-14 11:00:00+00:00,9.475606231393042 +2024-08-14 11:15:00+00:00,9.218058009386324 +2024-08-14 11:30:00+00:00,17.48302973267683 +2024-08-14 11:45:00+00:00,17.478341162866336 +2024-08-14 12:00:00+00:00,17.46761853149605 +2024-08-14 12:15:00+00:00,9.185049518593871 +2024-08-14 12:30:00+00:00,8.204137878723614 +2024-08-14 12:45:00+00:00,8.666407145659472 +2024-08-14 13:00:00+00:00,7.622219966094244 +2024-08-14 13:15:00+00:00,13.408114300867826 +2024-08-14 13:30:00+00:00,13.070900379717614 +2024-08-14 13:45:00+00:00,11.043781244344633 +2024-08-14 14:00:00+00:00,9.834319834489776 +2024-08-14 14:15:00+00:00,8.926875343772624 +2024-08-14 14:30:00+00:00,7.590276508792588 +2024-08-14 14:45:00+00:00,5.7156149491883514 +2024-08-14 15:00:00+00:00,4.256120047080967 +2024-08-14 15:15:00+00:00,2.7862622144980476 +2024-08-14 15:30:00+00:00,1.3444503905238028 +2024-08-15 03:30:00+00:00,3.210311039033799 +2024-08-15 03:45:00+00:00,5.709213262542715 +2024-08-15 04:00:00+00:00,6.913688791969273 +2024-08-15 04:15:00+00:00,7.77747103321744 +2024-08-15 04:30:00+00:00,9.900115966480277 +2024-08-15 04:45:00+00:00,12.054709194649863 +2024-08-15 05:00:00+00:00,14.171291549748386 +2024-08-15 05:15:00+00:00,15.52308513707764 +2024-08-15 05:30:00+00:00,16.318985385985556 +2024-08-15 05:45:00+00:00,17.238399510994633 +2024-08-15 06:00:00+00:00,17.747658902383534 +2024-08-15 06:15:00+00:00,18.458867156431783 +2024-08-15 06:30:00+00:00,18.588058382407702 +2024-08-15 06:45:00+00:00,19.435280976449526 +2024-08-15 07:00:00+00:00,18.790929550422142 +2024-08-15 07:15:00+00:00,19.509231854817283 +2024-08-15 07:30:00+00:00,19.5631491429796 +2024-08-15 07:45:00+00:00,19.826569507218743 +2024-08-15 08:00:00+00:00,19.57228698196579 +2024-08-15 08:15:00+00:00,19.82141277142872 +2024-08-15 08:30:00+00:00,19.928390916761565 +2024-08-15 08:45:00+00:00,20.466046987496004 +2024-08-15 09:00:00+00:00,20.028085153290135 +2024-08-15 09:15:00+00:00,20.27259051985746 +2024-08-15 09:30:00+00:00,20.628495875208966 +2024-08-15 09:45:00+00:00,21.032810802815213 +2024-08-15 10:00:00+00:00,20.573827229172352 +2024-08-15 10:15:00+00:00,20.97034258432016 +2024-08-15 10:30:00+00:00,20.596761324865227 +2024-08-15 10:45:00+00:00,20.699784092648027 +2024-08-15 11:00:00+00:00,20.48702689128304 +2024-08-15 11:15:00+00:00,20.012145999140053 +2024-08-15 11:30:00+00:00,19.70920532097 +2024-08-15 11:45:00+00:00,19.372706779047775 +2024-08-15 12:00:00+00:00,19.02377221468146 +2024-08-15 12:15:00+00:00,18.9513424374856 +2024-08-15 12:30:00+00:00,18.203411358385225 +2024-08-15 12:45:00+00:00,17.56288515461954 +2024-08-15 13:00:00+00:00,16.730089641767734 +2024-08-15 13:15:00+00:00,15.937896728364956 +2024-08-15 13:30:00+00:00,14.83381793593015 +2024-08-15 13:45:00+00:00,13.35600390639838 +2024-08-15 14:00:00+00:00,12.343988065522092 +2024-08-15 14:15:00+00:00,10.593499768704183 +2024-08-15 14:30:00+00:00,8.536712604237735 +2024-08-15 14:45:00+00:00,6.771097860733916 +2024-08-15 15:00:00+00:00,4.852293368458566 +2024-08-15 15:15:00+00:00,3.147699856024838 +2024-08-15 15:30:00+00:00,1.4758795027682872 +2024-08-16 03:30:00+00:00,2.892325538390215 +2024-08-16 03:45:00+00:00,2.8786154906407346 +2024-08-16 04:00:00+00:00,2.8532536537314455 +2024-08-16 04:15:00+00:00,5.5846338975863326 +2024-08-16 04:30:00+00:00,6.996065374940102 +2024-08-16 04:45:00+00:00,6.137742028883601 +2024-08-16 05:00:00+00:00,8.987137420642949 +2024-08-16 05:15:00+00:00,9.913913336875076 +2024-08-16 05:30:00+00:00,5.277858383294683 +2024-08-16 05:45:00+00:00,19.287233124125564 +2024-08-16 06:00:00+00:00,18.910624642585073 +2024-08-16 06:15:00+00:00,19.485044211810525 +2024-08-16 06:30:00+00:00,20.087077124453188 +2024-08-16 06:45:00+00:00,19.925320483828088 +2024-08-16 07:00:00+00:00,19.068033967376913 +2024-08-16 07:15:00+00:00,19.162396360656345 +2024-08-16 07:30:00+00:00,19.30056050999986 +2024-08-16 07:45:00+00:00,20.599850422372835 +2024-08-16 08:00:00+00:00,20.080386857668415 +2024-08-16 08:15:00+00:00,20.372021956501793 +2024-08-16 08:30:00+00:00,20.589524428834654 +2024-08-16 08:45:00+00:00,20.4813936596873 +2024-08-16 09:00:00+00:00,20.55868869746094 +2024-08-16 09:15:00+00:00,21.2382292129959 +2024-08-16 09:30:00+00:00,21.424002686551518 +2024-08-16 09:45:00+00:00,20.993624356481345 +2024-08-16 10:00:00+00:00,20.933746362152785 +2024-08-16 10:15:00+00:00,20.718271592582408 +2024-08-16 10:30:00+00:00,21.031289683077027 +2024-08-16 10:45:00+00:00,20.002719468847932 +2024-08-16 11:00:00+00:00,20.146030026797845 +2024-08-16 11:15:00+00:00,19.321048633340787 +2024-08-16 11:30:00+00:00,19.16382174266757 +2024-08-16 11:45:00+00:00,19.006163441917767 +2024-08-16 12:00:00+00:00,19.058417358090576 +2024-08-16 12:15:00+00:00,18.567956969323305 +2024-08-16 12:30:00+00:00,17.667398271260147 +2024-08-16 12:45:00+00:00,17.17800435553797 +2024-08-16 13:00:00+00:00,15.925004787983347 +2024-08-16 13:15:00+00:00,14.606666220774008 +2024-08-16 13:30:00+00:00,13.239392593786476 +2024-08-16 13:45:00+00:00,12.285068700027612 +2024-08-16 14:00:00+00:00,11.096418830452192 +2024-08-16 14:15:00+00:00,9.443244356906531 +2024-08-16 14:30:00+00:00,7.412926240901915 +2024-08-16 14:45:00+00:00,6.200119083030585 +2024-08-16 15:00:00+00:00,4.3287209309942085 +2024-08-16 15:15:00+00:00,2.607858183226056 +2024-08-16 15:30:00+00:00,1.1350589919548466 +2024-08-17 03:30:00+00:00,1.5220649977160021 +2024-08-17 03:45:00+00:00,2.7375987123950978 +2024-08-17 04:00:00+00:00,3.4501929927231014 +2024-08-17 04:15:00+00:00,2.578444248319615 +2024-08-17 04:30:00+00:00,6.745617165452723 +2024-08-17 04:45:00+00:00,4.056019415121575 +2024-08-17 05:00:00+00:00,14.82505520601216 +2024-08-17 05:15:00+00:00,8.882489464757377 +2024-08-17 05:30:00+00:00,14.533871563471672 +2024-08-17 05:45:00+00:00,13.13243685542299 +2024-08-17 06:00:00+00:00,10.552563718252111 +2024-08-17 06:15:00+00:00,19.63518054759913 +2024-08-17 06:30:00+00:00,18.843178339002993 +2024-08-17 06:45:00+00:00,19.321953750169307 +2024-08-17 07:00:00+00:00,18.624567981106292 +2024-08-17 07:15:00+00:00,19.554914395238548 +2024-08-17 07:30:00+00:00,20.58352717422862 +2024-08-17 07:45:00+00:00,20.814702789820668 +2024-08-17 08:00:00+00:00,20.618463588201003 +2024-08-17 08:15:00+00:00,21.103689245600634 +2024-08-17 08:30:00+00:00,21.38112509151382 +2024-08-17 08:45:00+00:00,20.87760895409693 +2024-08-17 09:00:00+00:00,21.31727012902066 +2024-08-17 09:15:00+00:00,21.94428018618035 +2024-08-17 09:30:00+00:00,21.107217419248794 +2024-08-17 09:45:00+00:00,21.28844707523005 +2024-08-17 10:00:00+00:00,21.36528880362633 +2024-08-17 10:15:00+00:00,20.921375716378428 +2024-08-17 10:30:00+00:00,21.37569467148105 +2024-08-17 10:45:00+00:00,21.006234051568423 +2024-08-17 11:00:00+00:00,20.725789976053882 +2024-08-17 11:15:00+00:00,20.363141196064298 +2024-08-17 11:30:00+00:00,20.365390751294385 +2024-08-17 11:45:00+00:00,20.36282003730441 +2024-08-17 12:00:00+00:00,20.07042942505759 +2024-08-17 12:15:00+00:00,19.1481950573378 +2024-08-17 12:30:00+00:00,18.281108121791945 +2024-08-17 12:45:00+00:00,17.468012560804784 +2024-08-17 13:00:00+00:00,16.59434061985816 +2024-08-17 13:15:00+00:00,15.996171993389785 +2024-08-17 13:30:00+00:00,15.471404247802003 +2024-08-17 13:45:00+00:00,4.3061601786174935 +2024-08-17 14:00:00+00:00,11.12576962211791 +2024-08-17 14:15:00+00:00,9.736167540399665 +2024-08-17 14:30:00+00:00,7.914574556026216 +2024-08-17 14:45:00+00:00,5.909461108649973 +2024-08-17 15:00:00+00:00,4.123121508867528 +2024-08-17 15:15:00+00:00,2.461720903296487 +2024-08-17 15:30:00+00:00,0.9048388289569611 +2024-08-18 03:45:00+00:00,3.765247684478573 +2024-08-18 04:00:00+00:00,6.580893308484204 +2024-08-18 04:15:00+00:00,9.64810023889788 +2024-08-18 04:30:00+00:00,11.289707169755369 +2024-08-18 04:45:00+00:00,12.78530921084904 +2024-08-18 05:00:00+00:00,14.777238218346653 +2024-08-18 05:15:00+00:00,15.300239536106327 +2024-08-18 05:30:00+00:00,15.807714504534921 +2024-08-18 05:45:00+00:00,16.501113068436354 +2024-08-18 06:00:00+00:00,17.14511291406076 +2024-08-18 06:15:00+00:00,17.742573350069108 +2024-08-18 06:30:00+00:00,17.73557457441099 +2024-08-18 06:45:00+00:00,18.032494520518718 +2024-08-18 07:00:00+00:00,18.378719965390534 +2024-08-18 07:15:00+00:00,18.652962479016974 +2024-08-18 07:30:00+00:00,19.416176669937336 +2024-08-18 07:45:00+00:00,19.696224169555013 +2024-08-18 08:00:00+00:00,19.92629861865193 +2024-08-18 08:15:00+00:00,19.434228239121495 +2024-08-18 08:30:00+00:00,20.37998806892133 +2024-08-18 08:45:00+00:00,21.10764190034569 +2024-08-18 09:00:00+00:00,21.41098411908413 +2024-08-18 09:15:00+00:00,21.026653253650572 +2024-08-18 09:30:00+00:00,19.26144919621205 +2024-08-18 09:45:00+00:00,19.45208865469515 +2024-08-18 10:00:00+00:00,10.016068400047802 +2024-08-18 10:15:00+00:00,19.485514108440988 +2024-08-18 10:30:00+00:00,18.122049991468508 +2024-08-18 10:45:00+00:00,8.642680982517987 +2024-08-18 11:00:00+00:00,17.6951853083817 +2024-08-18 11:15:00+00:00,9.311665891127603 +2024-08-18 11:30:00+00:00,8.631276591732856 +2024-08-18 11:45:00+00:00,8.725930961914608 +2024-08-18 12:00:00+00:00,8.525515881738396 +2024-08-18 12:15:00+00:00,8.463175411949758 +2024-08-18 12:30:00+00:00,8.230532118499301 +2024-08-18 12:45:00+00:00,7.831258663395996 +2024-08-18 13:00:00+00:00,7.991891719975257 +2024-08-18 13:15:00+00:00,7.6161498224931306 +2024-08-18 13:30:00+00:00,7.31235857877124 +2024-08-18 13:45:00+00:00,10.102991018244122 +2024-08-18 14:00:00+00:00,6.245006675980831 +2024-08-18 14:15:00+00:00,5.306328290538538 +2024-08-18 14:30:00+00:00,5.661064510350293 +2024-08-18 14:45:00+00:00,4.307688693095681 +2024-08-18 15:00:00+00:00,2.94273455440357 +2024-08-18 15:15:00+00:00,1.4001086543803014 +2024-08-18 15:30:00+00:00,0.2159591778918455 +2024-08-19 03:45:00+00:00,3.2004500126124773 +2024-08-19 04:00:00+00:00,5.174043045604241 +2024-08-19 04:15:00+00:00,7.0632327712941185 +2024-08-19 04:30:00+00:00,9.49100899631114 +2024-08-19 04:45:00+00:00,11.818337673941523 +2024-08-19 05:00:00+00:00,14.629146654822833 +2024-08-19 05:15:00+00:00,15.681051923809733 +2024-08-19 05:30:00+00:00,16.736888225178948 +2024-08-19 05:45:00+00:00,17.614208369787132 +2024-08-19 06:00:00+00:00,18.23743098819677 +2024-08-19 06:15:00+00:00,18.284219987597574 +2024-08-19 06:30:00+00:00,18.770048467761853 +2024-08-19 06:45:00+00:00,18.991196405960142 +2024-08-19 07:00:00+00:00,19.746464525902034 +2024-08-19 07:15:00+00:00,19.519778811147706 +2024-08-19 07:30:00+00:00,19.656300895349624 +2024-08-19 07:45:00+00:00,19.793441199902205 +2024-08-19 08:00:00+00:00,20.16625163521084 +2024-08-19 08:15:00+00:00,20.20052167068622 +2024-08-19 08:30:00+00:00,20.207683634949483 +2024-08-19 08:45:00+00:00,20.98261914530471 +2024-08-19 09:00:00+00:00,20.6449621255879 +2024-08-19 09:15:00+00:00,20.74520437354688 +2024-08-19 09:30:00+00:00,20.80619941619243 +2024-08-19 09:45:00+00:00,20.550742417853662 +2024-08-19 10:00:00+00:00,20.759212596676196 +2024-08-19 10:15:00+00:00,21.038735069690695 +2024-08-19 10:30:00+00:00,19.524796026753243 +2024-08-19 10:45:00+00:00,19.565719482174593 +2024-08-19 11:00:00+00:00,19.333823212194662 +2024-08-19 11:15:00+00:00,19.09933970535755 +2024-08-19 11:30:00+00:00,19.426331007232022 +2024-08-19 11:45:00+00:00,19.634966600897492 +2024-08-19 12:00:00+00:00,18.358031437112068 +2024-08-19 12:15:00+00:00,17.194468310144682 +2024-08-19 12:30:00+00:00,17.11542159078824 +2024-08-19 12:45:00+00:00,16.644410605106632 +2024-08-19 13:00:00+00:00,14.744830892781774 +2024-08-19 13:15:00+00:00,13.9175135691934 +2024-08-19 13:30:00+00:00,12.435084288000512 +2024-08-19 13:45:00+00:00,11.440342677123162 +2024-08-19 14:00:00+00:00,9.286152744075558 +2024-08-19 14:15:00+00:00,7.743604443676757 +2024-08-19 14:30:00+00:00,6.1238365447098415 +2024-08-19 14:45:00+00:00,4.848170367093157 +2024-08-19 15:00:00+00:00,3.179882297806267 +2024-08-19 15:15:00+00:00,1.6344113134449592 +2024-08-19 15:30:00+00:00,0.42376971690485066 +2024-08-20 03:45:00+00:00,2.2865440505994257 +2024-08-20 04:00:00+00:00,5.217893788486266 +2024-08-20 04:15:00+00:00,4.011725474010298 +2024-08-20 04:30:00+00:00,5.253167322623526 +2024-08-20 04:45:00+00:00,9.907244933509087 +2024-08-20 05:00:00+00:00,14.479265049909683 +2024-08-20 05:15:00+00:00,15.53720492360087 +2024-08-20 05:30:00+00:00,16.793646097984716 +2024-08-20 05:45:00+00:00,17.603086258587407 +2024-08-20 06:00:00+00:00,18.421359748431986 +2024-08-20 06:15:00+00:00,18.61285545424716 +2024-08-20 06:30:00+00:00,19.32787794776624 +2024-08-20 06:45:00+00:00,19.206009568985678 +2024-08-20 07:00:00+00:00,19.520091607465268 +2024-08-20 07:15:00+00:00,19.761916280127533 +2024-08-20 07:30:00+00:00,20.977315673268674 +2024-08-20 07:45:00+00:00,21.013539069518863 +2024-08-20 08:00:00+00:00,20.167141473465744 +2024-08-20 08:15:00+00:00,20.026513687850958 +2024-08-20 08:30:00+00:00,21.126716111436426 +2024-08-20 08:45:00+00:00,20.838916741813684 +2024-08-20 09:00:00+00:00,21.54932818590872 +2024-08-20 09:15:00+00:00,22.184740989045643 +2024-08-20 09:30:00+00:00,22.197211845694504 +2024-08-20 09:45:00+00:00,21.817532463276933 +2024-08-20 10:00:00+00:00,21.998424747406567 +2024-08-20 10:15:00+00:00,21.307403368771407 +2024-08-20 10:30:00+00:00,20.301300300485075 +2024-08-20 10:45:00+00:00,18.81099308198563 +2024-08-20 11:00:00+00:00,10.225084894471127 +2024-08-20 11:15:00+00:00,9.995078747973476 +2024-08-20 11:30:00+00:00,9.323663197045065 +2024-08-20 11:45:00+00:00,8.871415936575675 +2024-08-20 12:00:00+00:00,9.041968084020285 +2024-08-20 12:15:00+00:00,9.85293175855675 +2024-08-20 12:30:00+00:00,8.898296582666283 +2024-08-20 12:45:00+00:00,9.118631301760054 +2024-08-20 13:00:00+00:00,15.06583710721542 +2024-08-20 13:15:00+00:00,14.71476343236517 +2024-08-20 13:30:00+00:00,12.575801440742435 +2024-08-20 13:45:00+00:00,11.720631830026571 +2024-08-20 14:00:00+00:00,11.143677651368124 +2024-08-20 14:15:00+00:00,8.664804451697867 +2024-08-20 14:30:00+00:00,7.250066400830076 +2024-08-20 14:45:00+00:00,5.604184728231919 +2024-08-20 15:00:00+00:00,3.7082247120082634 +2024-08-20 15:15:00+00:00,2.2517095619118153 +2024-08-20 15:30:00+00:00,0.9194423280669843 +2024-08-21 03:45:00+00:00,3.270524440245738 +2024-08-21 04:00:00+00:00,5.903788573473169 +2024-08-21 04:15:00+00:00,8.229841496088254 +2024-08-21 04:30:00+00:00,10.632998273910836 +2024-08-21 04:45:00+00:00,12.648999041392843 +2024-08-21 05:00:00+00:00,14.483536978531353 +2024-08-21 05:15:00+00:00,16.282438371381396 +2024-08-21 05:30:00+00:00,17.234647575860663 +2024-08-21 05:45:00+00:00,17.719466700673724 +2024-08-21 06:00:00+00:00,18.319304644579816 +2024-08-21 06:15:00+00:00,18.692163647667357 +2024-08-21 06:30:00+00:00,18.695883927466145 +2024-08-21 06:45:00+00:00,18.335058961809196 +2024-08-21 07:00:00+00:00,18.13215880564476 +2024-08-21 07:15:00+00:00,18.598980994556783 +2024-08-21 07:30:00+00:00,19.122348217654427 +2024-08-21 07:45:00+00:00,19.514244590122658 +2024-08-21 08:00:00+00:00,19.62070911710651 +2024-08-21 08:15:00+00:00,20.701552808151092 +2024-08-21 08:30:00+00:00,20.329345062684748 +2024-08-21 08:45:00+00:00,22.20448492161485 +2024-08-21 09:00:00+00:00,20.98103180082783 +2024-08-21 09:15:00+00:00,21.556465321663257 +2024-08-21 09:30:00+00:00,21.276554095192502 +2024-08-21 09:45:00+00:00,22.106862463252874 +2024-08-21 10:00:00+00:00,22.349562527450693 +2024-08-21 10:15:00+00:00,21.999814901900248 +2024-08-21 10:30:00+00:00,21.695389916656534 +2024-08-21 10:45:00+00:00,21.51304432901023 +2024-08-21 11:00:00+00:00,21.238137732453062 +2024-08-21 11:15:00+00:00,20.96440218588161 +2024-08-21 11:30:00+00:00,20.987409087432894 +2024-08-21 11:45:00+00:00,20.575897864029507 +2024-08-21 12:00:00+00:00,20.141050401934127 +2024-08-21 12:15:00+00:00,17.568253668155926 +2024-08-21 12:30:00+00:00,17.38111007495938 +2024-08-21 12:45:00+00:00,16.78321467556909 +2024-08-21 13:00:00+00:00,15.947074721120295 +2024-08-21 13:15:00+00:00,15.13896578745617 +2024-08-21 13:30:00+00:00,13.65957190681484 +2024-08-21 13:45:00+00:00,12.167638160508687 +2024-08-21 14:00:00+00:00,11.040376280670447 +2024-08-21 14:15:00+00:00,9.392867765713474 +2024-08-21 14:30:00+00:00,7.439134487602653 +2024-08-21 14:45:00+00:00,5.729485861285662 +2024-08-21 15:00:00+00:00,3.9252321333873237 +2024-08-21 15:15:00+00:00,2.1503073003019475 +2024-08-21 15:30:00+00:00,0.6560066498768964 +2024-08-22 03:45:00+00:00,2.7159549012821143 +2024-08-22 04:00:00+00:00,4.934743207317869 +2024-08-22 04:15:00+00:00,7.43981908639055 +2024-08-22 04:30:00+00:00,9.126881528436945 +2024-08-22 04:45:00+00:00,11.69609787779529 +2024-08-22 05:00:00+00:00,13.357592513320835 +2024-08-22 05:15:00+00:00,15.458483053015838 +2024-08-22 05:30:00+00:00,16.482652550012503 +2024-08-22 05:45:00+00:00,17.36824239376601 +2024-08-22 06:00:00+00:00,18.112942580254664 +2024-08-22 06:15:00+00:00,19.096946114887803 +2024-08-22 06:30:00+00:00,18.97540175072924 +2024-08-22 06:45:00+00:00,19.161558118398492 +2024-08-22 07:00:00+00:00,19.251889785389444 +2024-08-22 07:15:00+00:00,18.663955173748334 +2024-08-22 07:30:00+00:00,19.32632872537331 +2024-08-22 07:45:00+00:00,19.65740685572822 +2024-08-22 08:00:00+00:00,20.00649447139474 +2024-08-22 08:15:00+00:00,19.34922981310502 +2024-08-22 08:30:00+00:00,20.137215336158942 +2024-08-22 08:45:00+00:00,20.416041445246115 +2024-08-22 09:00:00+00:00,20.98890896878233 +2024-08-22 09:15:00+00:00,20.586326752606965 +2024-08-22 09:30:00+00:00,20.904257011009257 +2024-08-22 09:45:00+00:00,20.818921289584388 +2024-08-22 10:00:00+00:00,20.84265071065446 +2024-08-22 10:15:00+00:00,19.65925812784839 +2024-08-22 10:30:00+00:00,19.63667211500821 +2024-08-22 10:45:00+00:00,19.445778034902343 +2024-08-22 11:00:00+00:00,19.25276957476573 +2024-08-22 11:15:00+00:00,19.496261358415147 +2024-08-22 11:30:00+00:00,9.620795390555445 +2024-08-22 11:45:00+00:00,9.60775285633732 +2024-08-22 12:00:00+00:00,17.856338984608353 +2024-08-22 12:15:00+00:00,16.498029274526772 +2024-08-22 12:30:00+00:00,16.603904950416275 +2024-08-22 12:45:00+00:00,15.05030976991468 +2024-08-22 13:00:00+00:00,13.988051625629693 +2024-08-22 13:15:00+00:00,12.760336031596648 +2024-08-22 13:30:00+00:00,11.878165319493625 +2024-08-22 13:45:00+00:00,10.438118234958607 +2024-08-22 14:00:00+00:00,9.028914058322556 +2024-08-22 14:15:00+00:00,7.978544062519594 +2024-08-22 14:30:00+00:00,6.2548297671835815 +2024-08-22 14:45:00+00:00,4.582486518212579 +2024-08-22 15:00:00+00:00,3.1222447953550736 +2024-08-22 15:15:00+00:00,1.6539370445980903 +2024-08-22 15:30:00+00:00,0.5154217469091873 +2024-08-23 04:15:00+00:00,21.88973172304307 +2024-08-23 05:00:00+00:00,23.79219287860753 +2024-08-23 06:00:00+00:00,18.226237179608894 +2024-08-23 06:15:00+00:00,18.567520778768998 +2024-08-23 06:30:00+00:00,18.656796256917556 +2024-08-23 06:45:00+00:00,18.60827606356372 +2024-08-23 08:00:00+00:00,19.367728354734457 +2024-08-23 08:30:00+00:00,20.268308334576403 +2024-08-23 08:45:00+00:00,20.62697702175134 +2024-08-23 10:15:00+00:00,21.084075133715018 +2024-08-23 10:45:00+00:00,20.830336059382308 +2024-08-23 11:00:00+00:00,20.4415177145258 +2024-08-23 11:15:00+00:00,19.67375607954735 +2024-08-23 11:30:00+00:00,19.53525738942727 +2024-08-23 11:45:00+00:00,19.18134600454188 +2024-08-23 12:00:00+00:00,18.62202473890639 +2024-08-23 12:15:00+00:00,17.95973448080644 +2024-08-23 12:30:00+00:00,17.894040429550486 +2024-08-23 12:45:00+00:00,16.810913141872675 +2024-08-23 13:00:00+00:00,15.623486951801537 +2024-08-23 13:15:00+00:00,14.608089082836123 +2024-08-23 13:30:00+00:00,13.653495859384517 +2024-08-23 13:45:00+00:00,12.210213592089744 +2024-08-23 14:00:00+00:00,10.738039192092648 +2024-08-23 14:15:00+00:00,9.018953813928567 +2024-08-23 14:30:00+00:00,7.657344064925988 +2024-08-23 14:45:00+00:00,5.720314268336701 +2024-08-23 15:00:00+00:00,3.791094357712389 +2024-08-23 15:15:00+00:00,2.2151435746407495 +2024-08-23 15:30:00+00:00,0.7043587036198367 +2024-08-23 21:30:00+00:00,18.92136385146994 +2024-08-23 22:15:00+00:00,19.948776883783093 +2024-08-24 07:15:00+00:00,20.753061834046747 +2024-08-24 07:30:00+00:00,21.835278882101957 +2024-08-24 07:45:00+00:00,14.398506259365305 +2024-08-24 08:00:00+00:00,20.99933030673987 +2024-08-24 08:15:00+00:00,21.616098205061043 +2024-08-24 08:30:00+00:00,22.385244016376717 +2024-08-24 08:45:00+00:00,22.959712585214717 +2024-08-24 09:00:00+00:00,13.225243283740133 +2024-08-24 09:15:00+00:00,22.568892887562534 +2024-08-24 09:30:00+00:00,22.99486423422118 +2024-08-24 09:45:00+00:00,22.388805858502252 +2024-08-24 10:00:00+00:00,23.738303049051826 +2024-08-24 10:15:00+00:00,22.894030232712343 +2024-08-24 10:30:00+00:00,23.023327967172563 +2024-08-24 10:45:00+00:00,22.963985265395117 +2024-08-24 11:00:00+00:00,22.45788358728509 +2024-08-24 11:15:00+00:00,22.14888765295187 +2024-08-24 11:30:00+00:00,21.490258113602703 +2024-08-24 11:45:00+00:00,21.289562469841933 +2024-08-24 12:00:00+00:00,20.991880618439154 +2024-08-24 12:15:00+00:00,20.479748842803524 +2024-08-24 12:30:00+00:00,19.95121594264515 +2024-08-24 12:45:00+00:00,18.57278725170227 +2024-08-24 13:00:00+00:00,17.370171792934627 +2024-08-24 13:15:00+00:00,16.230661576349053 +2024-08-24 13:30:00+00:00,15.242687712156922 +2024-08-24 13:45:00+00:00,13.635082154435075 +2024-08-24 14:00:00+00:00,11.887552478279828 +2024-08-24 14:15:00+00:00,9.665797538028523 +2024-08-24 14:30:00+00:00,7.762727924952435 +2024-08-24 14:45:00+00:00,5.97922775708726 +2024-08-24 15:00:00+00:00,3.794671604794894 +2024-08-24 15:15:00+00:00,2.287240866669554 +2024-08-24 15:30:00+00:00,0.7718331561356728 +2024-08-27 09:15:00+00:00,22.451431801652795 +2024-08-27 09:30:00+00:00,22.126491678634842 +2024-08-27 09:45:00+00:00,22.206878315722072 +2024-08-27 10:00:00+00:00,20.941319660531637 +2024-08-27 10:15:00+00:00,21.833545858010996 +2024-08-27 10:30:00+00:00,22.204688195987252 +2024-08-27 11:00:00+00:00,21.32775587420928 +2024-08-27 11:15:00+00:00,12.271697625300082 +2024-08-27 11:30:00+00:00,20.60144245893304 +2024-08-27 11:45:00+00:00,19.825956353944857 +2024-08-27 12:00:00+00:00,17.918911784707767 +2024-08-27 12:15:00+00:00,18.511373869916316 +2024-08-27 12:30:00+00:00,16.668328434753327 +2024-08-27 12:45:00+00:00,16.563358551979725 +2024-08-27 13:00:00+00:00,15.297061140988005 +2024-08-27 13:15:00+00:00,13.969181411292563 +2024-08-27 15:30:00+00:00,1.0140681379069008 +2025-05-01 03:00:00+00:00,3.072631040442521 +2025-05-01 03:15:00+00:00,4.674534707488327 +2025-05-01 03:30:00+00:00,7.2995965086495875 +2025-05-01 03:45:00+00:00,9.26997587564907 +2025-05-01 04:00:00+00:00,10.54202829492018 +2025-05-01 04:15:00+00:00,12.8558805127892 +2025-05-01 04:30:00+00:00,12.115548116462811 +2025-05-01 04:45:00+00:00,15.382340755756497 +2025-05-01 05:00:00+00:00,13.579550835104836 +2025-05-01 05:15:00+00:00,18.374936886678913 +2025-05-01 05:30:00+00:00,14.802404293580164 +2025-05-01 05:45:00+00:00,18.170452018209684 +2025-05-01 06:00:00+00:00,19.08487005274195 +2025-05-01 06:15:00+00:00,18.941077736794842 +2025-05-01 06:30:00+00:00,19.41401177513197 +2025-05-01 06:45:00+00:00,19.896618324346306 +2025-05-01 07:00:00+00:00,19.879208873764757 +2025-05-01 07:15:00+00:00,20.071221031027726 +2025-05-01 07:30:00+00:00,20.94378644628384 +2025-05-01 07:45:00+00:00,21.51423280050761 +2025-05-01 08:00:00+00:00,22.225980542751792 +2025-05-01 08:15:00+00:00,24.00981605419502 +2025-05-01 08:30:00+00:00,22.419877228974016 +2025-05-01 08:45:00+00:00,25.942184233533773 +2025-05-01 09:00:00+00:00,23.479217585183136 +2025-05-01 09:15:00+00:00,28.06081033410007 +2025-05-01 09:30:00+00:00,26.558851355891765 +2025-05-01 09:45:00+00:00,25.62163340705364 +2025-05-01 10:00:00+00:00,21.071203649221694 +2025-05-01 10:15:00+00:00,25.945368712639276 +2025-05-01 10:30:00+00:00,27.89147064053188 +2025-05-01 10:45:00+00:00,30.132815437811868 +2025-05-01 11:00:00+00:00,26.784999642863138 +2025-05-01 11:15:00+00:00,25.049720418878355 +2025-05-01 11:30:00+00:00,25.395914603485092 +2025-05-01 11:45:00+00:00,27.09915404054437 +2025-05-01 12:00:00+00:00,25.53256846077372 +2025-05-01 12:15:00+00:00,24.43948472301985 +2025-05-01 12:30:00+00:00,26.703614981300667 +2025-05-01 12:45:00+00:00,23.471472090975624 +2025-05-01 13:00:00+00:00,23.025836713129472 +2025-05-01 13:15:00+00:00,17.972033105814674 +2025-05-01 13:30:00+00:00,18.30092694099131 +2025-05-01 13:45:00+00:00,21.74417376567856 +2025-05-01 14:00:00+00:00,17.830132855383283 +2025-05-01 14:15:00+00:00,17.02544229746038 +2025-05-01 14:30:00+00:00,12.385292328068733 +2025-05-01 14:45:00+00:00,8.818543659733313 +2025-05-01 15:00:00+00:00,7.120388505665247 +2025-05-01 15:15:00+00:00,4.809192195306957 +2025-05-01 15:30:00+00:00,3.41423535453605 +2025-05-01 15:45:00+00:00,2.471616360960195 +2025-05-02 03:15:00+00:00,3.6550446458474117 +2025-05-02 03:30:00+00:00,6.382028440782251 +2025-05-02 03:45:00+00:00,9.057146054404578 +2025-05-02 04:00:00+00:00,11.740138677007593 +2025-05-02 04:15:00+00:00,13.525666358571293 +2025-05-02 04:30:00+00:00,14.564262273737118 +2025-05-02 04:45:00+00:00,16.090995094163198 +2025-05-02 05:00:00+00:00,17.729973583621472 +2025-05-02 05:15:00+00:00,18.184837326321777 +2025-05-02 05:30:00+00:00,18.07185429650091 +2025-05-02 05:45:00+00:00,20.102495231360937 +2025-05-02 06:00:00+00:00,19.323208844195282 +2025-05-02 06:15:00+00:00,19.695996728368858 +2025-05-02 06:30:00+00:00,19.975306759722255 +2025-05-02 06:45:00+00:00,20.01178919364129 +2025-05-02 07:00:00+00:00,20.045212798726528 +2025-05-02 07:15:00+00:00,20.4328141261447 +2025-05-02 07:30:00+00:00,20.739390413839185 +2025-05-02 07:45:00+00:00,21.804593713272958 +2025-05-02 08:00:00+00:00,23.162452584223953 +2025-05-02 08:15:00+00:00,20.048776240525115 +2025-05-02 08:30:00+00:00,15.980112085029369 +2025-05-02 08:45:00+00:00,19.71541837775154 +2025-05-02 09:00:00+00:00,24.85945512482848 +2025-05-02 09:15:00+00:00,18.663722317354342 +2025-05-02 09:30:00+00:00,24.707025157535213 +2025-05-02 09:45:00+00:00,25.635258534229354 +2025-05-02 10:00:00+00:00,25.59188946760537 +2025-05-02 10:15:00+00:00,26.623996787387004 +2025-05-02 10:30:00+00:00,21.86570235631469 +2025-05-02 10:45:00+00:00,28.216715727457185 +2025-05-02 11:00:00+00:00,27.84463632889351 +2025-05-02 11:15:00+00:00,23.805036400745728 +2025-05-02 11:30:00+00:00,27.983303102610094 +2025-05-02 11:45:00+00:00,22.423577557252607 +2025-05-02 12:00:00+00:00,27.00417664844739 +2025-05-02 12:15:00+00:00,25.141851679423148 +2025-05-02 12:30:00+00:00,25.28116862014137 +2025-05-02 12:45:00+00:00,22.959759346078197 +2025-05-02 13:00:00+00:00,23.75561103215214 +2025-05-02 13:15:00+00:00,22.990957021613422 +2025-05-02 13:30:00+00:00,21.946555020078534 +2025-05-02 13:45:00+00:00,21.18561827120837 +2025-05-02 14:00:00+00:00,19.936943353836966 +2025-05-02 14:15:00+00:00,18.294104018029792 +2025-05-02 14:30:00+00:00,14.086665373387635 +2025-05-02 14:45:00+00:00,13.786946817879748 +2025-05-02 15:00:00+00:00,10.831541526690403 +2025-05-02 15:15:00+00:00,7.2904955064485355 +2025-05-02 15:30:00+00:00,4.05923176470368 +2025-05-02 15:45:00+00:00,1.7953786539332435 +2025-05-03 03:15:00+00:00,3.912261485492192 +2025-05-03 03:30:00+00:00,6.65934286624387 +2025-05-03 03:45:00+00:00,9.25742589587885 +2025-05-03 04:00:00+00:00,11.378365252948946 +2025-05-03 04:15:00+00:00,12.829511089200585 +2025-05-03 04:30:00+00:00,14.964539495360555 +2025-05-03 04:45:00+00:00,16.041114339788653 +2025-05-03 05:00:00+00:00,17.888651457996094 +2025-05-03 05:15:00+00:00,18.58889715122138 +2025-05-03 05:30:00+00:00,19.578375533191824 +2025-05-03 05:45:00+00:00,20.168775680415276 +2025-05-03 06:00:00+00:00,20.973738306703396 +2025-05-03 06:15:00+00:00,20.504077681645374 +2025-05-03 06:30:00+00:00,21.186622012724733 +2025-05-03 06:45:00+00:00,20.75021806617457 +2025-05-03 07:00:00+00:00,21.31377654231582 +2025-05-03 07:15:00+00:00,21.889640518237293 +2025-05-03 07:30:00+00:00,22.184702191080106 +2025-05-03 07:45:00+00:00,23.865782796368453 +2025-05-03 08:00:00+00:00,23.73373575815307 +2025-05-03 08:15:00+00:00,22.693013718192926 +2025-05-03 08:30:00+00:00,24.419386453654486 +2025-05-03 08:45:00+00:00,24.361642258322966 +2025-05-03 09:00:00+00:00,24.981587023869267 +2025-05-03 09:15:00+00:00,26.430500006342786 +2025-05-03 09:30:00+00:00,27.995166648537353 +2025-05-03 09:45:00+00:00,27.704039283867424 +2025-05-03 10:00:00+00:00,27.276433278405626 +2025-05-03 10:15:00+00:00,29.871929624184112 +2025-05-03 10:30:00+00:00,30.73777103112043 +2025-05-03 10:45:00+00:00,29.350384116925916 +2025-05-03 11:00:00+00:00,33.2077046217212 +2025-05-03 11:15:00+00:00,28.76346466590826 +2025-05-03 11:30:00+00:00,18.132402926826572 +2025-05-03 11:45:00+00:00,26.462194453688543 +2025-05-03 12:00:00+00:00,27.440018657847663 +2025-05-03 12:15:00+00:00,27.264788950599986 +2025-05-03 12:30:00+00:00,18.75567830970197 +2025-05-03 12:45:00+00:00,19.534803592412803 +2025-05-03 13:00:00+00:00,21.592123346371682 +2025-05-03 13:15:00+00:00,15.73734365376852 +2025-05-03 13:30:00+00:00,22.54425744841764 +2025-05-03 13:45:00+00:00,19.856092864764637 +2025-05-03 14:00:00+00:00,18.88652848460507 +2025-05-03 14:15:00+00:00,17.41252897615403 +2025-05-03 14:30:00+00:00,14.97207870525831 +2025-05-03 14:45:00+00:00,12.92798725115709 +2025-05-03 15:00:00+00:00,10.085442744325974 +2025-05-03 15:15:00+00:00,7.0419673379159 +2025-05-03 15:30:00+00:00,4.256695968536003 +2025-05-03 15:45:00+00:00,2.036357851736001 +2025-05-04 03:15:00+00:00,2.2983388440714703 +2025-05-04 03:30:00+00:00,7.422143762180693 +2025-05-04 03:45:00+00:00,7.591567555155167 +2025-05-04 04:00:00+00:00,9.43512130246009 +2025-05-04 04:15:00+00:00,7.273237848549565 +2025-05-04 04:30:00+00:00,5.721357457673898 +2025-05-04 04:45:00+00:00,11.978326851634018 +2025-05-04 05:00:00+00:00,17.29614600792895 +2025-05-04 05:15:00+00:00,17.119834936555485 +2025-05-04 05:30:00+00:00,16.381915173135916 +2025-05-04 05:45:00+00:00,17.303936099334862 +2025-05-04 06:00:00+00:00,17.62757195778926 +2025-05-04 06:15:00+00:00,18.276296225829114 +2025-05-04 06:30:00+00:00,18.21404843029578 +2025-05-04 06:45:00+00:00,18.49096861199776 +2025-05-04 07:00:00+00:00,17.358462749721937 +2025-05-04 07:15:00+00:00,20.877120305242354 +2025-05-04 07:30:00+00:00,20.050108476176955 +2025-05-04 07:45:00+00:00,19.24892356317192 +2025-05-04 08:00:00+00:00,14.801506657471883 +2025-05-04 08:15:00+00:00,19.957810345457133 +2025-05-04 08:30:00+00:00,19.927297709888087 +2025-05-04 08:45:00+00:00,19.854483265434595 +2025-05-04 09:00:00+00:00,22.711681546666103 +2025-05-04 09:15:00+00:00,23.453823705681213 +2025-05-04 09:30:00+00:00,19.134291342532467 +2025-05-04 09:45:00+00:00,24.73054979377343 +2025-05-04 10:00:00+00:00,19.63717941535575 +2025-05-04 10:15:00+00:00,24.012415287148603 +2025-05-04 10:30:00+00:00,23.77606056736239 +2025-05-04 10:45:00+00:00,19.301213652518854 +2025-05-04 11:00:00+00:00,23.71340538274685 +2025-05-04 11:15:00+00:00,26.185789805817176 +2025-05-04 11:30:00+00:00,19.763026420800287 +2025-05-04 11:45:00+00:00,10.838923848615915 +2025-05-04 12:00:00+00:00,4.9660367391728935 +2025-05-04 12:15:00+00:00,7.114408945009837 +2025-05-04 12:30:00+00:00,9.10930561801143 +2025-05-04 12:45:00+00:00,11.809601143390532 +2025-05-04 13:00:00+00:00,13.034189346222067 +2025-05-04 13:15:00+00:00,17.314439516277556 +2025-05-04 13:30:00+00:00,15.275824405067413 +2025-05-04 13:45:00+00:00,15.762215557412924 +2025-05-04 14:00:00+00:00,15.4436003024793 +2025-05-04 14:15:00+00:00,16.262385104502297 +2025-05-04 14:30:00+00:00,16.318493562823512 +2025-05-04 14:45:00+00:00,13.980038961138925 +2025-05-04 15:00:00+00:00,12.54196811646729 +2025-05-04 15:15:00+00:00,8.449745500518333 +2025-05-04 15:30:00+00:00,6.9740592370194525 +2025-05-04 15:45:00+00:00,4.147867207022669 +2025-05-05 03:15:00+00:00,2.8120504973859655 +2025-05-05 03:30:00+00:00,6.4190285840063375 +2025-05-05 03:45:00+00:00,9.522380897703037 +2025-05-05 04:00:00+00:00,11.807048548553418 +2025-05-05 04:15:00+00:00,9.933185734069134 +2025-05-05 04:30:00+00:00,12.810514053054542 +2025-05-05 04:45:00+00:00,11.242463721218508 +2025-05-05 05:00:00+00:00,15.694794233053262 +2025-05-05 05:15:00+00:00,13.908262600943699 +2025-05-05 05:30:00+00:00,13.478441727911786 +2025-05-05 05:45:00+00:00,17.113067355861098 +2025-05-05 06:00:00+00:00,17.406434237681367 +2025-05-05 06:15:00+00:00,16.117866027398943 +2025-05-05 06:30:00+00:00,15.837015063411332 +2025-05-05 06:45:00+00:00,15.732401579210688 +2025-05-05 07:00:00+00:00,14.138068128202157 +2025-05-05 07:15:00+00:00,17.915088143735822 +2025-05-05 07:30:00+00:00,17.11064870454074 +2025-05-05 07:45:00+00:00,16.47033424524818 +2025-05-05 08:00:00+00:00,15.162939759738002 +2025-05-05 08:15:00+00:00,20.796496272246056 +2025-05-05 08:30:00+00:00,16.93631448853808 +2025-05-05 08:45:00+00:00,15.261440059521465 +2025-05-05 09:00:00+00:00,19.483799865455016 +2025-05-05 09:15:00+00:00,18.523901832016044 +2025-05-05 09:30:00+00:00,20.977483870454126 +2025-05-05 09:45:00+00:00,21.607386696137507 +2025-05-05 10:00:00+00:00,18.1389338698371 +2025-05-05 10:15:00+00:00,20.438288230557056 +2025-05-05 10:30:00+00:00,20.978611479529576 +2025-05-05 10:45:00+00:00,21.222341361337474 +2025-05-05 11:00:00+00:00,19.80229821942282 +2025-05-05 11:15:00+00:00,21.33284608199249 +2025-05-05 11:30:00+00:00,21.259752372221197 +2025-05-05 11:45:00+00:00,23.20799631524426 +2025-05-05 12:00:00+00:00,24.524748535834636 +2025-05-05 12:15:00+00:00,21.825736587604144 +2025-05-05 12:30:00+00:00,18.529917141656576 +2025-05-05 12:45:00+00:00,15.287712060538311 +2025-05-05 13:00:00+00:00,22.24321735905843 +2025-05-05 13:15:00+00:00,21.85718844238935 +2025-05-05 13:30:00+00:00,21.161904858999424 +2025-05-05 13:45:00+00:00,17.757774783509134 +2025-05-05 14:00:00+00:00,18.229276896763263 +2025-05-05 14:15:00+00:00,17.512765513579097 +2025-05-05 14:30:00+00:00,15.840348693457406 +2025-05-05 14:45:00+00:00,13.861831135462582 +2025-05-05 15:00:00+00:00,11.148231722049013 +2025-05-05 15:15:00+00:00,7.8540875378022905 +2025-05-05 15:30:00+00:00,4.648697979620956 +2025-05-05 15:45:00+00:00,2.3125742647984353 +2025-05-06 03:15:00+00:00,5.1367533298477355 +2025-05-06 03:30:00+00:00,7.630844984679736 +2025-05-06 03:45:00+00:00,9.662268573127438 +2025-05-06 04:00:00+00:00,11.725911410807985 +2025-05-06 04:15:00+00:00,13.08543597388298 +2025-05-06 04:30:00+00:00,14.853200054793826 +2025-05-06 04:45:00+00:00,15.835596401441933 +2025-05-06 05:00:00+00:00,16.421742041286176 +2025-05-06 05:15:00+00:00,17.54341975316057 +2025-05-06 05:30:00+00:00,18.220033866759696 +2025-05-06 05:45:00+00:00,19.35728262546893 +2025-05-06 06:00:00+00:00,19.69525147228107 +2025-05-06 06:15:00+00:00,19.974041761830478 +2025-05-06 06:30:00+00:00,19.265872879102286 +2025-05-06 06:45:00+00:00,18.727813000942746 +2025-05-06 07:00:00+00:00,20.349283569283013 +2025-05-06 07:15:00+00:00,21.1539777031057 +2025-05-06 07:30:00+00:00,20.531717693006133 +2025-05-06 07:45:00+00:00,20.684078990937138 +2025-05-06 08:00:00+00:00,20.836177514678255 +2025-05-06 08:15:00+00:00,19.51724620763071 +2025-05-06 08:30:00+00:00,20.49803085358779 +2025-05-06 08:45:00+00:00,20.859814359677667 +2025-05-06 09:00:00+00:00,21.70896904831743 +2025-05-06 09:15:00+00:00,23.755439261908098 +2025-05-06 09:30:00+00:00,23.727078973962055 +2025-05-06 09:45:00+00:00,24.399171042817674 +2025-05-06 10:00:00+00:00,25.59000292143105 +2025-05-06 10:15:00+00:00,25.859474665503235 +2025-05-06 10:30:00+00:00,26.72932910597625 +2025-05-06 10:45:00+00:00,24.95469462617569 +2025-05-06 11:00:00+00:00,25.763948940139684 +2025-05-06 11:15:00+00:00,26.24520020441909 +2025-05-06 11:30:00+00:00,26.10421967714009 +2025-05-06 11:45:00+00:00,22.13313087756334 +2025-05-06 12:00:00+00:00,20.142226121981547 +2025-05-06 12:15:00+00:00,19.38321860702535 +2025-05-06 12:30:00+00:00,19.99345706749957 +2025-05-06 12:45:00+00:00,25.30077557014589 +2025-05-06 13:00:00+00:00,18.214249221748002 +2025-05-06 13:15:00+00:00,18.82871002195467 +2025-05-06 13:30:00+00:00,19.151292504597237 +2025-05-06 13:45:00+00:00,22.283263872274368 +2025-05-06 14:00:00+00:00,20.676825099666477 +2025-05-06 14:15:00+00:00,19.109156004540843 +2025-05-06 14:30:00+00:00,17.570533680982333 +2025-05-06 14:45:00+00:00,15.006036416179949 +2025-05-06 15:00:00+00:00,11.25363234286256 +2025-05-06 15:15:00+00:00,7.6634007944667815 +2025-05-06 15:30:00+00:00,4.515973073430293 +2025-05-06 15:45:00+00:00,2.0930784445892305 +2025-05-07 03:15:00+00:00,4.636598520521367 +2025-05-07 03:30:00+00:00,7.71739728032411 +2025-05-07 03:45:00+00:00,10.26998881396923 +2025-05-07 04:00:00+00:00,12.218768264683174 +2025-05-07 04:15:00+00:00,13.906999340835124 +2025-05-07 04:30:00+00:00,15.518870760360672 +2025-05-07 04:45:00+00:00,16.731573276014387 +2025-05-07 05:00:00+00:00,18.489657954515174 +2025-05-07 05:15:00+00:00,18.333665750625286 +2025-05-07 05:30:00+00:00,19.316214194248246 +2025-05-07 05:45:00+00:00,20.082018582872763 +2025-05-07 06:00:00+00:00,20.5745028142299 +2025-05-07 06:15:00+00:00,21.689117065211995 +2025-05-07 06:30:00+00:00,21.55465870011804 +2025-05-07 06:45:00+00:00,20.915813058473933 +2025-05-07 07:00:00+00:00,22.360653341793324 +2025-05-07 07:15:00+00:00,22.77853359351261 +2025-05-07 07:30:00+00:00,22.744585718104506 +2025-05-07 07:45:00+00:00,22.953790787583582 +2025-05-07 08:00:00+00:00,22.854456969389418 +2025-05-07 08:15:00+00:00,22.7546285066121 +2025-05-07 08:30:00+00:00,17.013815490947618 +2025-05-07 08:45:00+00:00,25.403187432215546 +2025-05-07 09:00:00+00:00,24.576303932284006 +2025-05-07 09:15:00+00:00,25.511428617395037 +2025-05-07 09:30:00+00:00,27.35917409538817 +2025-05-07 09:45:00+00:00,30.86190061012435 +2025-05-07 10:00:00+00:00,27.52842056888446 +2025-05-07 10:15:00+00:00,29.44118351969381 +2025-05-07 10:30:00+00:00,29.29342443543825 +2025-05-07 10:45:00+00:00,30.497922975646738 +2025-05-07 11:00:00+00:00,28.330636592677706 +2025-05-07 11:15:00+00:00,29.670262329894022 +2025-05-07 11:30:00+00:00,30.523659137726217 +2025-05-07 11:45:00+00:00,31.265863449408457 +2025-05-07 12:00:00+00:00,28.70681441915907 +2025-05-07 12:15:00+00:00,28.916858491070666 +2025-05-07 12:30:00+00:00,29.245135493093528 +2025-05-07 12:45:00+00:00,28.524820620787875 +2025-05-07 13:00:00+00:00,27.76200856766495 +2025-05-07 13:15:00+00:00,25.21769373627307 +2025-05-07 13:30:00+00:00,24.629196593767062 +2025-05-07 13:45:00+00:00,22.810463809642634 +2025-05-07 14:00:00+00:00,21.42477699634086 +2025-05-07 14:15:00+00:00,20.528362979330833 +2025-05-07 14:30:00+00:00,17.569382217721447 +2025-05-07 14:45:00+00:00,14.644823638290559 +2025-05-07 15:00:00+00:00,11.49657736136194 +2025-05-07 15:15:00+00:00,9.035969800297952 +2025-05-07 15:30:00+00:00,5.386480104791257 +2025-05-07 15:45:00+00:00,2.4463203098033794 +2025-05-08 03:15:00+00:00,5.23173554503624 +2025-05-08 03:30:00+00:00,8.224929414337511 +2025-05-08 03:45:00+00:00,10.938288392691502 +2025-05-08 04:00:00+00:00,12.961658655860186 +2025-05-08 04:15:00+00:00,14.338059641668623 +2025-05-08 04:30:00+00:00,16.507588427103578 +2025-05-08 04:45:00+00:00,17.698145609967554 +2025-05-08 05:00:00+00:00,18.40256571062663 +2025-05-08 05:15:00+00:00,19.823449026676354 +2025-05-08 05:30:00+00:00,22.036386682924682 +2025-05-08 05:45:00+00:00,22.55263867940487 +2025-05-08 06:00:00+00:00,22.999905044245644 +2025-05-08 06:15:00+00:00,22.65538479727205 +2025-05-08 06:30:00+00:00,23.049679501758614 +2025-05-08 06:45:00+00:00,24.118971119332535 +2025-05-08 07:00:00+00:00,25.513399564556167 +2025-05-08 07:15:00+00:00,25.884593723864132 +2025-05-08 07:30:00+00:00,27.797148710333246 +2025-05-08 07:45:00+00:00,25.693601120744052 +2025-05-08 08:00:00+00:00,26.405972780095272 +2025-05-08 08:15:00+00:00,27.132900020887746 +2025-05-08 08:30:00+00:00,25.636210569112805 +2025-05-08 08:45:00+00:00,25.736899320915093 +2025-05-08 09:00:00+00:00,28.73325988567787 +2025-05-08 09:15:00+00:00,28.12341418953004 +2025-05-08 09:30:00+00:00,29.6457006387321 +2025-05-08 09:45:00+00:00,29.16460071928463 +2025-05-08 10:00:00+00:00,29.656071712854008 +2025-05-08 10:15:00+00:00,29.902110389464035 +2025-05-08 10:30:00+00:00,30.97894582693047 +2025-05-08 10:45:00+00:00,30.11272512086564 +2025-05-08 11:00:00+00:00,30.96357211602868 +2025-05-08 11:15:00+00:00,30.83508984527565 +2025-05-08 11:30:00+00:00,30.529229881579496 +2025-05-08 11:45:00+00:00,30.47959146039276 +2025-05-08 12:00:00+00:00,30.46379914408658 +2025-05-08 12:15:00+00:00,29.38887809177897 +2025-05-08 12:30:00+00:00,29.470649595009796 +2025-05-08 12:45:00+00:00,28.413211450178494 +2025-05-08 13:00:00+00:00,26.0674351256824 +2025-05-08 13:15:00+00:00,26.34254592714804 +2025-05-08 13:30:00+00:00,25.407558742221692 +2025-05-08 13:45:00+00:00,24.600600856684352 +2025-05-08 14:00:00+00:00,22.63878393840573 +2025-05-08 14:15:00+00:00,20.857215062322446 +2025-05-08 14:30:00+00:00,18.303545176491845 +2025-05-08 14:45:00+00:00,15.11651151198408 +2025-05-08 15:00:00+00:00,11.332084470520439 +2025-05-08 15:15:00+00:00,7.715604686190609 +2025-05-08 15:30:00+00:00,4.4873284220157235 +2025-05-08 15:45:00+00:00,2.0563169726065693 +2025-05-09 03:15:00+00:00,2.8068801713752625 +2025-05-09 03:30:00+00:00,4.701001935007621 +2025-05-09 03:45:00+00:00,6.833072631365233 +2025-05-09 04:00:00+00:00,9.927438822557551 +2025-05-09 04:15:00+00:00,12.55210909379185 +2025-05-09 04:30:00+00:00,13.937255945617261 +2025-05-09 04:45:00+00:00,16.060936997141653 +2025-05-09 05:00:00+00:00,18.803093125153797 +2025-05-09 05:15:00+00:00,18.3608268302742 +2025-05-09 05:30:00+00:00,20.812245768247006 +2025-05-09 05:45:00+00:00,22.07593522506243 +2025-05-09 06:00:00+00:00,22.753934711536044 +2025-05-09 06:15:00+00:00,23.774527035646642 +2025-05-09 06:30:00+00:00,23.682565806897788 +2025-05-09 06:45:00+00:00,23.45326417284115 +2025-05-09 07:00:00+00:00,25.268947657445658 +2025-05-09 07:15:00+00:00,26.015392312811837 +2025-05-09 07:30:00+00:00,26.99522563086608 +2025-05-09 07:45:00+00:00,28.13578629355855 +2025-05-09 08:00:00+00:00,27.26661487227426 +2025-05-09 08:15:00+00:00,27.184080865082205 +2025-05-09 08:30:00+00:00,27.1009560819832 +2025-05-09 08:45:00+00:00,27.613327013547178 +2025-05-09 09:00:00+00:00,28.508075272005332 +2025-05-09 09:15:00+00:00,29.35327965715303 +2025-05-09 09:30:00+00:00,31.367911900448682 +2025-05-09 09:45:00+00:00,30.70866329584718 +2025-05-09 10:00:00+00:00,30.598143025405005 +2025-05-09 10:15:00+00:00,32.13990147221061 +2025-05-09 10:30:00+00:00,32.86277859981178 +2025-05-09 10:45:00+00:00,29.954266191956556 +2025-05-09 11:00:00+00:00,30.332744038192956 +2025-05-09 11:15:00+00:00,32.926252774124634 +2025-05-09 11:30:00+00:00,30.622400331396157 +2025-05-09 11:45:00+00:00,31.12252699158371 +2025-05-09 12:00:00+00:00,30.775479213735636 +2025-05-09 12:15:00+00:00,29.994721867680322 +2025-05-09 12:30:00+00:00,29.019274734868112 +2025-05-09 12:45:00+00:00,27.756626278808078 +2025-05-09 13:00:00+00:00,28.533958573597594 +2025-05-09 13:15:00+00:00,27.042501564756147 +2025-05-09 13:30:00+00:00,26.348759128309247 +2025-05-09 13:45:00+00:00,24.98675460564421 +2025-05-09 14:00:00+00:00,23.17290722772509 +2025-05-09 14:15:00+00:00,20.91738406434853 +2025-05-09 14:30:00+00:00,17.987647018794533 +2025-05-09 14:45:00+00:00,14.532501250393285 +2025-05-09 15:00:00+00:00,10.76976079981048 +2025-05-09 15:15:00+00:00,7.190238663436267 +2025-05-09 15:30:00+00:00,4.148067071792653 +2025-05-09 15:45:00+00:00,1.8847375865956841 +2025-05-10 03:15:00+00:00,4.96812119488634 +2025-05-10 03:30:00+00:00,8.014415052319823 +2025-05-10 03:45:00+00:00,11.018826189097574 +2025-05-10 04:00:00+00:00,13.424931815256313 +2025-05-10 04:15:00+00:00,15.459652300748953 +2025-05-10 04:30:00+00:00,17.677620164099885 +2025-05-10 04:45:00+00:00,18.366341041825955 +2025-05-10 05:00:00+00:00,19.337071286039784 +2025-05-10 05:15:00+00:00,21.56198689101418 +2025-05-10 05:30:00+00:00,22.734709520190624 +2025-05-10 05:45:00+00:00,22.666994905667938 +2025-05-10 06:00:00+00:00,23.129553067213745 +2025-05-10 06:15:00+00:00,24.25240820078658 +2025-05-10 06:30:00+00:00,24.47966503977441 +2025-05-10 06:45:00+00:00,25.343599106649663 +2025-05-10 07:00:00+00:00,25.274523264368717 +2025-05-10 07:15:00+00:00,25.12664260956882 +2025-05-10 07:30:00+00:00,25.56833944697799 +2025-05-10 07:45:00+00:00,25.66666030054581 +2025-05-10 08:00:00+00:00,25.925279562410953 +2025-05-10 08:15:00+00:00,26.52972850583524 +2025-05-10 08:30:00+00:00,27.144689669910598 +2025-05-10 08:45:00+00:00,28.04279288618048 +2025-05-10 09:00:00+00:00,28.91749132981732 +2025-05-10 09:15:00+00:00,29.84860060021028 +2025-05-10 09:30:00+00:00,31.903961278884665 +2025-05-10 09:45:00+00:00,30.52997498421499 +2025-05-10 10:00:00+00:00,30.095662528097254 +2025-05-10 10:15:00+00:00,31.48443776751383 +2025-05-10 10:30:00+00:00,32.06811763549982 +2025-05-10 10:45:00+00:00,31.830520644847603 +2025-05-10 11:00:00+00:00,31.675188304883584 +2025-05-10 11:15:00+00:00,33.84149963290591 +2025-05-10 11:30:00+00:00,30.998634210135886 +2025-05-10 11:45:00+00:00,28.30223965862977 +2025-05-10 12:00:00+00:00,30.337142165562234 +2025-05-10 12:15:00+00:00,31.165694363749264 +2025-05-10 12:30:00+00:00,29.008858641667477 +2025-05-10 12:45:00+00:00,27.977233936646613 +2025-05-10 13:00:00+00:00,27.389261336920953 +2025-05-10 13:15:00+00:00,25.719457625172634 +2025-05-10 13:30:00+00:00,25.269051358146562 +2025-05-10 13:45:00+00:00,23.884278957625586 +2025-05-10 14:00:00+00:00,21.590173491449406 +2025-05-10 14:15:00+00:00,18.781919260916215 +2025-05-10 14:30:00+00:00,19.79621647113051 +2025-05-10 14:45:00+00:00,15.343418077306792 +2025-05-10 15:00:00+00:00,12.227132293466589 +2025-05-10 15:15:00+00:00,6.566603475564593 +2025-05-10 15:30:00+00:00,4.602286563747233 +2025-05-10 15:45:00+00:00,2.5054485552715184 +2025-05-11 03:15:00+00:00,5.645957674521686 +2025-05-11 03:30:00+00:00,8.649667202625544 +2025-05-11 03:45:00+00:00,11.558349231376724 +2025-05-11 04:00:00+00:00,14.080268496244672 +2025-05-11 04:15:00+00:00,15.586922947848553 +2025-05-11 04:30:00+00:00,17.839740307205275 +2025-05-11 04:45:00+00:00,17.986328571700405 +2025-05-11 05:00:00+00:00,7.326532611629398 +2025-05-11 05:15:00+00:00,20.731973083570832 +2025-05-11 05:30:00+00:00,22.552170598783775 +2025-05-11 05:45:00+00:00,22.67776230142272 +2025-05-11 06:00:00+00:00,24.168707740118368 +2025-05-11 06:15:00+00:00,24.09329396724959 +2025-05-11 06:30:00+00:00,23.67853090688079 +2025-05-11 06:45:00+00:00,24.760918274937712 +2025-05-11 07:00:00+00:00,25.568889186705995 +2025-05-11 07:15:00+00:00,25.236561643813474 +2025-05-11 07:30:00+00:00,25.813618839687948 +2025-05-11 07:45:00+00:00,26.86458124632201 +2025-05-11 08:00:00+00:00,26.770809752627635 +2025-05-11 08:15:00+00:00,25.919180886694416 +2025-05-11 08:30:00+00:00,28.20408882037982 +2025-05-11 08:45:00+00:00,28.33352445008849 +2025-05-11 09:00:00+00:00,28.463362672753274 +2025-05-11 09:15:00+00:00,30.303390680685546 +2025-05-11 09:30:00+00:00,31.43398517761508 +2025-05-11 09:45:00+00:00,30.071022073163395 +2025-05-11 10:00:00+00:00,30.793509753359846 +2025-05-11 10:15:00+00:00,32.26744067077497 +2025-05-11 10:30:00+00:00,33.240038647324745 +2025-05-11 10:45:00+00:00,31.15567214423936 +2025-05-11 11:00:00+00:00,34.527632595228404 +2025-05-11 11:15:00+00:00,33.39464620810457 +2025-05-11 11:30:00+00:00,32.34697452566881 +2025-05-11 11:45:00+00:00,31.931036188140848 +2025-05-11 12:00:00+00:00,32.03595495714861 +2025-05-11 12:15:00+00:00,31.009115455361723 +2025-05-11 12:30:00+00:00,28.752404781284078 +2025-05-11 12:45:00+00:00,29.31411153855009 +2025-05-11 13:00:00+00:00,27.810764999416143 +2025-05-11 13:15:00+00:00,26.807494249014745 +2025-05-11 13:30:00+00:00,26.28870028988583 +2025-05-11 13:45:00+00:00,25.060617746178195 +2025-05-11 14:00:00+00:00,23.02961461340621 +2025-05-11 14:15:00+00:00,20.73095489043599 +2025-05-11 14:30:00+00:00,18.01278051835893 +2025-05-11 14:45:00+00:00,14.559698145706946 +2025-05-11 15:00:00+00:00,11.269193057675567 +2025-05-11 15:15:00+00:00,7.795199970446083 +2025-05-11 15:30:00+00:00,4.070508946377141 +2025-05-11 15:45:00+00:00,2.6686108393428993 +2025-05-12 03:15:00+00:00,2.8637266547256646 +2025-05-12 03:30:00+00:00,5.579241670060307 +2025-05-12 03:45:00+00:00,8.499369394858542 +2025-05-12 04:00:00+00:00,12.303453185299325 +2025-05-12 04:15:00+00:00,8.766971173352164 +2025-05-12 04:30:00+00:00,11.650328249098083 +2025-05-12 04:45:00+00:00,13.93951182871672 +2025-05-12 05:00:00+00:00,16.46166360627027 +2025-05-12 05:15:00+00:00,16.650043079669214 +2025-05-12 05:30:00+00:00,14.808742342482647 +2025-05-12 05:45:00+00:00,10.333210801843775 +2025-05-12 06:00:00+00:00,16.960322819645658 +2025-05-12 06:15:00+00:00,18.662528523312904 +2025-05-12 06:30:00+00:00,19.620394106733155 +2025-05-12 06:45:00+00:00,19.01843679483645 +2025-05-12 07:00:00+00:00,19.022803550210188 +2025-05-12 07:15:00+00:00,21.48881022848568 +2025-05-12 07:30:00+00:00,20.957368051684718 +2025-05-12 07:45:00+00:00,19.73939353886959 +2025-05-12 08:00:00+00:00,21.542950564885665 +2025-05-12 08:15:00+00:00,22.155240125393384 +2025-05-12 08:30:00+00:00,20.933966257985134 +2025-05-12 08:45:00+00:00,23.294702437720094 +2025-05-12 09:00:00+00:00,22.69599791167306 +2025-05-12 09:15:00+00:00,24.50557424542182 +2025-05-12 09:30:00+00:00,24.82074269148749 +2025-05-12 09:45:00+00:00,25.134235755295386 +2025-05-12 10:00:00+00:00,23.480157702033637 +2025-05-12 10:15:00+00:00,22.510628233333563 +2025-05-12 10:30:00+00:00,24.803307568519504 +2025-05-12 10:45:00+00:00,23.27659196480694 +2025-05-12 11:00:00+00:00,24.245940837911238 +2025-05-12 11:15:00+00:00,25.252361115801214 +2025-05-12 11:30:00+00:00,22.321517169891628 +2025-05-12 11:45:00+00:00,22.384813370395797 +2025-05-12 12:00:00+00:00,22.901754625776505 +2025-05-12 12:15:00+00:00,23.331597881036465 +2025-05-12 12:30:00+00:00,23.626386662559195 +2025-05-12 12:45:00+00:00,23.156300115246758 +2025-05-12 13:00:00+00:00,21.90500916017585 +2025-05-12 13:15:00+00:00,21.159415195561373 +2025-05-12 13:30:00+00:00,20.244930034773137 +2025-05-12 13:45:00+00:00,19.906030730748608 +2025-05-12 14:00:00+00:00,18.89716048139212 +2025-05-12 14:15:00+00:00,18.016925150602276 +2025-05-12 14:30:00+00:00,16.938042168787685 +2025-05-12 14:45:00+00:00,15.090982002766038 +2025-05-12 15:00:00+00:00,12.228672437528246 +2025-05-12 15:15:00+00:00,8.156360491089398 +2025-05-12 15:30:00+00:00,3.1083292061466072 +2025-05-12 15:45:00+00:00,3.9945330251038262 +2025-05-12 16:00:00+00:00,3.05657786596727 +2025-05-13 03:00:00+00:00,2.59764507319507 +2025-05-13 03:15:00+00:00,5.292946350027836 +2025-05-13 03:30:00+00:00,6.685049521849656 +2025-05-13 03:45:00+00:00,9.290141030604238 +2025-05-13 04:00:00+00:00,11.886241127641823 +2025-05-13 04:15:00+00:00,13.674501622180529 +2025-05-13 04:30:00+00:00,14.358834320658044 +2025-05-13 04:45:00+00:00,15.857055416852965 +2025-05-13 05:00:00+00:00,17.75923657407949 +2025-05-13 05:15:00+00:00,17.727896109980264 +2025-05-13 05:30:00+00:00,18.448274754252235 +2025-05-13 05:45:00+00:00,19.837927991084157 +2025-05-13 06:00:00+00:00,20.29782252946426 +2025-05-13 06:15:00+00:00,20.944305649661946 +2025-05-13 06:30:00+00:00,21.207947839417674 +2025-05-13 06:45:00+00:00,22.143441254715473 +2025-05-13 07:00:00+00:00,22.261015827637596 +2025-05-13 07:15:00+00:00,22.836416841420878 +2025-05-13 07:30:00+00:00,23.57170244007317 +2025-05-13 07:45:00+00:00,23.640861075482796 +2025-05-13 08:00:00+00:00,24.431227444244925 +2025-05-13 08:15:00+00:00,24.14526088987047 +2025-05-13 08:30:00+00:00,26.554961066712934 +2025-05-13 08:45:00+00:00,29.102416851409142 +2025-05-13 09:00:00+00:00,25.634031422665952 +2025-05-13 09:15:00+00:00,22.98047594409975 +2025-05-13 09:30:00+00:00,32.21089013857631 +2025-05-13 09:45:00+00:00,28.288053641736226 +2025-05-13 10:00:00+00:00,23.97714724844191 +2025-05-13 10:15:00+00:00,28.615056620887824 +2025-05-13 10:30:00+00:00,26.94120280952213 +2025-05-13 10:45:00+00:00,29.9824863568338 +2025-05-13 11:00:00+00:00,22.00157754979008 +2025-05-13 11:15:00+00:00,21.56067490762297 +2025-05-13 11:30:00+00:00,32.45634422831749 +2025-05-13 11:45:00+00:00,27.271615490583045 +2025-05-13 12:00:00+00:00,18.297811823297156 +2025-05-13 12:15:00+00:00,25.46579656179704 +2025-05-13 12:30:00+00:00,18.877956404413844 +2025-05-13 12:45:00+00:00,19.29621408777008 +2025-05-13 13:00:00+00:00,28.26623524057055 +2025-05-13 13:15:00+00:00,18.46317072827241 +2025-05-13 13:30:00+00:00,16.26771235761406 +2025-05-13 13:45:00+00:00,13.641654947165756 +2025-05-13 14:00:00+00:00,5.441230097142649 +2025-05-13 14:15:00+00:00,12.745639367102314 +2025-05-13 14:30:00+00:00,13.340100720673053 +2025-05-13 14:45:00+00:00,7.79516143076478 +2025-05-13 15:00:00+00:00,6.732604759622904 +2025-05-13 15:15:00+00:00,1.6561803822049306 +2025-05-13 15:30:00+00:00,6.449906896808657 +2025-05-14 03:15:00+00:00,4.5316794793437705 +2025-05-14 03:30:00+00:00,7.664781869076705 +2025-05-14 03:45:00+00:00,10.728123331397653 +2025-05-14 04:00:00+00:00,13.173411787558468 +2025-05-14 04:15:00+00:00,14.904776367333376 +2025-05-14 04:30:00+00:00,15.839600546731054 +2025-05-14 04:45:00+00:00,17.12374641103648 +2025-05-14 05:00:00+00:00,15.281181423956376 +2025-05-14 05:15:00+00:00,18.349370077833477 +2025-05-14 05:30:00+00:00,18.14705172813468 +2025-05-14 05:45:00+00:00,18.806168626084617 +2025-05-14 06:00:00+00:00,19.202873867910462 +2025-05-14 06:15:00+00:00,19.60534731651899 +2025-05-14 06:30:00+00:00,19.3044519201189 +2025-05-14 06:45:00+00:00,19.763562532704707 +2025-05-14 07:00:00+00:00,20.30279274383525 +2025-05-14 07:15:00+00:00,19.531884761209973 +2025-05-14 07:30:00+00:00,21.21622043100787 +2025-05-14 07:45:00+00:00,20.1708833957638 +2025-05-14 08:00:00+00:00,21.650741846947696 +2025-05-14 08:15:00+00:00,21.89832885613137 +2025-05-14 08:30:00+00:00,20.402453274263635 +2025-05-14 08:45:00+00:00,22.081788351108095 +2025-05-14 09:00:00+00:00,25.505776621415777 +2025-05-14 09:15:00+00:00,25.514360101479458 +2025-05-14 09:30:00+00:00,25.372324555375503 +2025-05-14 09:45:00+00:00,23.829079754383873 +2025-05-14 10:00:00+00:00,19.2277943960419 +2025-05-14 10:15:00+00:00,19.315605658458534 +2025-05-14 10:30:00+00:00,19.39517951397802 +2025-05-14 10:45:00+00:00,25.277740115483365 +2025-05-14 11:00:00+00:00,24.491212881787746 +2025-05-14 11:15:00+00:00,24.55711242686436 +2025-05-14 11:30:00+00:00,26.834260293242085 +2025-05-14 11:45:00+00:00,17.869230057586517 +2025-05-14 12:00:00+00:00,27.173008115505464 +2025-05-14 12:15:00+00:00,24.50009288312389 +2025-05-14 12:30:00+00:00,23.522015514372523 +2025-05-14 12:45:00+00:00,21.757787089632984 +2025-05-14 13:00:00+00:00,21.547576268721688 +2025-05-14 13:15:00+00:00,19.537983766556305 +2025-05-14 13:30:00+00:00,20.722701909646343 +2025-05-14 13:45:00+00:00,19.251042586743814 +2025-05-14 14:00:00+00:00,18.487992066078824 +2025-05-14 14:15:00+00:00,17.342887625212118 +2025-05-14 14:30:00+00:00,16.518184362959893 +2025-05-14 14:45:00+00:00,14.571477773932994 +2025-05-14 15:00:00+00:00,12.344738873392402 +2025-05-14 15:15:00+00:00,9.209928027982242 +2025-05-14 15:30:00+00:00,6.274128536123458 +2025-05-14 15:45:00+00:00,3.543925642881124 +2025-05-15 03:00:00+00:00,2.904692987367821 +2025-05-15 03:15:00+00:00,3.2335404653025464 +2025-05-15 03:30:00+00:00,6.688448565871415 +2025-05-15 03:45:00+00:00,7.458255989819721 +2025-05-15 04:00:00+00:00,10.243905834185739 +2025-05-15 04:15:00+00:00,12.619472526756725 +2025-05-15 04:30:00+00:00,11.915661473578709 +2025-05-15 04:45:00+00:00,12.96125265715542 +2025-05-15 05:00:00+00:00,14.47675882630018 +2025-05-15 05:15:00+00:00,10.427405959029658 +2025-05-15 05:30:00+00:00,13.930062579823698 +2025-05-15 05:45:00+00:00,17.16259985634738 +2025-05-15 06:00:00+00:00,15.863696384143473 +2025-05-15 06:15:00+00:00,18.75564235494255 +2025-05-15 06:30:00+00:00,19.440082521225303 +2025-05-15 06:45:00+00:00,17.988555077174322 +2025-05-15 07:00:00+00:00,18.12547349083786 +2025-05-15 07:15:00+00:00,18.53308935591122 +2025-05-15 07:30:00+00:00,19.31441455101806 +2025-05-15 07:45:00+00:00,18.53941853152723 +2025-05-15 08:00:00+00:00,18.44817785190461 +2025-05-15 08:15:00+00:00,18.798771382008336 +2025-05-15 08:30:00+00:00,18.298260008017493 +2025-05-15 08:45:00+00:00,20.264742862329015 +2025-05-15 09:00:00+00:00,22.86906658428145 +2025-05-15 09:15:00+00:00,24.878748374657718 +2025-05-15 09:30:00+00:00,22.411992710221135 +2025-05-15 09:45:00+00:00,24.495381908492792 +2025-05-15 10:00:00+00:00,20.039477158052602 +2025-05-15 10:15:00+00:00,25.087422382767386 +2025-05-15 10:30:00+00:00,25.625850692107477 +2025-05-15 10:45:00+00:00,26.166900155659242 +2025-05-15 11:00:00+00:00,22.809412676059182 +2025-05-15 11:15:00+00:00,21.854338080347148 +2025-05-15 11:30:00+00:00,23.82596145418455 +2025-05-15 11:45:00+00:00,22.97394900333243 +2025-05-15 12:00:00+00:00,24.95613790012169 +2025-05-15 12:15:00+00:00,23.259336253585627 +2025-05-15 12:30:00+00:00,24.47862052608183 +2025-05-15 12:45:00+00:00,23.609641439836256 +2025-05-15 13:00:00+00:00,21.153834730665825 +2025-05-15 13:15:00+00:00,20.133077788725316 +2025-05-15 13:30:00+00:00,20.240092645649263 +2025-05-15 13:45:00+00:00,18.90775965674641 +2025-05-15 14:00:00+00:00,16.68838210785318 +2025-05-15 14:15:00+00:00,16.809668642624988 +2025-05-15 14:30:00+00:00,9.642662480107001 +2025-05-15 14:45:00+00:00,16.24371035523688 +2025-05-15 15:00:00+00:00,7.507200848177808 +2025-05-15 15:15:00+00:00,8.46977173717495 +2025-05-15 15:30:00+00:00,5.440699997644368 +2025-05-15 15:45:00+00:00,3.178369461705169 +2025-05-16 03:00:00+00:00,2.8569421192112134 +2025-05-16 03:15:00+00:00,5.9199605339027705 +2025-05-16 03:30:00+00:00,8.362178432684848 +2025-05-16 03:45:00+00:00,10.193767242758753 +2025-05-16 04:00:00+00:00,12.148692485990148 +2025-05-16 04:15:00+00:00,14.286343288469023 +2025-05-16 04:30:00+00:00,15.285992589956479 +2025-05-16 04:45:00+00:00,16.369522233726542 +2025-05-16 05:00:00+00:00,17.198359656811874 +2025-05-16 05:15:00+00:00,17.426788348723964 +2025-05-16 05:30:00+00:00,17.02752681116224 +2025-05-16 05:45:00+00:00,19.34471959552747 +2025-05-16 06:00:00+00:00,19.993916581460084 +2025-05-16 06:15:00+00:00,21.268717931529395 +2025-05-16 06:30:00+00:00,21.468730954425265 +2025-05-16 06:45:00+00:00,21.697914024977624 +2025-05-16 07:00:00+00:00,21.970298953171365 +2025-05-16 07:15:00+00:00,22.980573434473378 +2025-05-16 07:30:00+00:00,23.842102190577034 +2025-05-16 07:45:00+00:00,24.488707270256395 +2025-05-16 08:00:00+00:00,24.580922351147716 +2025-05-16 08:15:00+00:00,25.255911286078693 +2025-05-16 08:30:00+00:00,27.058901861999622 +2025-05-16 08:45:00+00:00,28.65124337067371 +2025-05-16 09:00:00+00:00,27.86630814038731 +2025-05-16 09:15:00+00:00,30.747629401739204 +2025-05-16 09:30:00+00:00,32.2189274207809 +2025-05-16 09:45:00+00:00,31.556670681403062 +2025-05-16 10:00:00+00:00,32.17837793494426 +2025-05-16 10:15:00+00:00,32.87322181230908 +2025-05-16 10:30:00+00:00,32.503073871495886 +2025-05-16 10:45:00+00:00,32.135617077244184 +2025-05-16 11:00:00+00:00,33.608426307248486 +2025-05-16 11:15:00+00:00,31.747359290556226 +2025-05-16 11:30:00+00:00,32.69899328101344 +2025-05-16 11:45:00+00:00,32.67650144286688 +2025-05-16 12:00:00+00:00,30.95810717021382 +2025-05-16 12:15:00+00:00,31.16732698344912 +2025-05-16 12:30:00+00:00,30.75185844007502 +2025-05-16 12:45:00+00:00,30.092677101299998 +2025-05-16 13:00:00+00:00,28.368280000771705 +2025-05-16 13:15:00+00:00,26.908377617098218 +2025-05-16 13:30:00+00:00,26.952824985928856 +2025-05-16 13:45:00+00:00,24.02219569566473 +2025-05-16 14:00:00+00:00,22.411533234950817 +2025-05-16 14:15:00+00:00,21.26866971032755 +2025-05-16 14:30:00+00:00,18.577938120556794 +2025-05-16 14:45:00+00:00,14.66483973286026 +2025-05-16 15:00:00+00:00,12.203514804142516 +2025-05-16 15:15:00+00:00,8.702402658066326 +2025-05-16 15:30:00+00:00,5.592539207167323 +2025-05-16 15:45:00+00:00,3.531478099949637 +2025-05-17 03:00:00+00:00,2.1421329930071975 +2025-05-17 03:15:00+00:00,3.8682125278846473 +2025-05-17 03:30:00+00:00,5.508131681635139 +2025-05-17 03:45:00+00:00,10.982697191465325 +2025-05-17 04:00:00+00:00,13.860108816771346 +2025-05-17 04:15:00+00:00,16.965172904488544 +2025-05-17 04:30:00+00:00,14.59967377633612 +2025-05-17 04:45:00+00:00,16.39090834244408 +2025-05-17 05:00:00+00:00,17.173473054085242 +2025-05-17 05:15:00+00:00,19.04656029357981 +2025-05-17 05:30:00+00:00,24.797707605675182 +2025-05-17 05:45:00+00:00,24.572123102920987 +2025-05-17 06:00:00+00:00,25.668895012499608 +2025-05-17 06:15:00+00:00,27.10424293605817 +2025-05-17 06:30:00+00:00,27.68341906667819 +2025-05-17 06:45:00+00:00,27.812007650038638 +2025-05-17 07:00:00+00:00,29.324356163959216 +2025-05-17 07:15:00+00:00,30.581565203991843 +2025-05-17 07:30:00+00:00,30.719899329014808 +2025-05-17 07:45:00+00:00,31.490723684400013 +2025-05-17 08:00:00+00:00,31.65158665531186 +2025-05-17 08:15:00+00:00,32.06574012336365 +2025-05-17 08:30:00+00:00,34.06107638445854 +2025-05-17 08:45:00+00:00,34.57440451075203 +2025-05-17 09:00:00+00:00,35.20272548744194 +2025-05-17 09:15:00+00:00,35.91109613889098 +2025-05-17 09:30:00+00:00,37.313445311185696 +2025-05-17 09:45:00+00:00,38.13270128260469 +2025-05-17 10:00:00+00:00,38.58429940396267 +2025-05-17 10:15:00+00:00,37.081663622852304 +2025-05-17 10:30:00+00:00,35.80551271695724 +2025-05-17 10:45:00+00:00,36.23747882370641 +2025-05-17 11:00:00+00:00,36.64788166437339 +2025-05-17 11:15:00+00:00,35.107728124745336 +2025-05-17 11:30:00+00:00,36.165225284076904 +2025-05-17 11:45:00+00:00,34.10090562314586 +2025-05-17 12:00:00+00:00,34.71132233432677 +2025-05-17 12:15:00+00:00,33.092022576209956 +2025-05-17 12:30:00+00:00,32.59981286343272 +2025-05-17 12:45:00+00:00,32.54511258071807 +2025-05-17 13:00:00+00:00,30.62379162113772 +2025-05-17 13:15:00+00:00,29.841458414667603 +2025-05-17 13:30:00+00:00,28.037042146498244 +2025-05-17 13:45:00+00:00,23.894807482279326 +2025-05-17 14:00:00+00:00,23.0846963889887 +2025-05-17 14:15:00+00:00,20.474140571703973 +2025-05-17 14:30:00+00:00,16.62552057010605 +2025-05-17 14:45:00+00:00,13.649073913874696 +2025-05-17 15:00:00+00:00,11.012914927877192 +2025-05-17 15:15:00+00:00,7.972446019057208 +2025-05-17 15:30:00+00:00,5.630239334842376 +2025-05-17 15:45:00+00:00,3.0117921106564287 +2025-05-17 16:00:00+00:00,0.0 +2025-05-18 03:15:00+00:00,3.72083714181015 +2025-05-18 03:30:00+00:00,6.4842247341699775 +2025-05-18 03:45:00+00:00,6.466648675456559 +2025-05-18 04:00:00+00:00,12.580758909600391 +2025-05-18 04:15:00+00:00,14.851620289220891 +2025-05-18 04:30:00+00:00,16.904417560390616 +2025-05-18 04:45:00+00:00,18.881244870896744 +2025-05-18 05:00:00+00:00,20.13919310619493 +2025-05-18 05:15:00+00:00,20.40200062306491 +2025-05-18 05:30:00+00:00,21.494804746823696 +2025-05-18 05:45:00+00:00,21.316250133124466 +2025-05-18 06:00:00+00:00,23.030965159670526 +2025-05-18 06:15:00+00:00,22.59218694415275 +2025-05-18 06:30:00+00:00,24.572151986247007 +2025-05-18 06:45:00+00:00,24.19583718817231 +2025-05-18 07:00:00+00:00,24.98286085911941 +2025-05-18 07:15:00+00:00,24.97002822511622 +2025-05-18 07:30:00+00:00,25.12902348514995 +2025-05-18 07:45:00+00:00,25.83950890080997 +2025-05-18 08:00:00+00:00,26.819973782990026 +2025-05-18 08:15:00+00:00,28.3172663137835 +2025-05-18 08:30:00+00:00,30.59152137698954 +2025-05-18 08:45:00+00:00,31.886556295324493 +2025-05-18 09:00:00+00:00,35.078394295397125 +2025-05-18 09:15:00+00:00,32.02626661688793 +2025-05-18 09:30:00+00:00,34.75620472865315 +2025-05-18 09:45:00+00:00,34.4635196782688 +2025-05-18 10:00:00+00:00,33.827375853173145 +2025-05-18 10:15:00+00:00,34.44523753397578 +2025-05-18 10:30:00+00:00,34.780838687917 +2025-05-18 10:45:00+00:00,35.583722789216445 +2025-05-18 11:00:00+00:00,35.20861143932721 +2025-05-18 11:15:00+00:00,34.99773869908748 +2025-05-18 11:30:00+00:00,34.55749600871271 +2025-05-18 11:45:00+00:00,34.119710088632615 +2025-05-18 12:00:00+00:00,32.04761826742052 +2025-05-18 12:15:00+00:00,31.360937449938252 +2025-05-18 12:30:00+00:00,30.396222854273038 +2025-05-18 12:45:00+00:00,27.068336676172457 +2025-05-18 13:00:00+00:00,26.770739019160757 +2025-05-18 13:15:00+00:00,24.796799703243657 +2025-05-18 13:30:00+00:00,23.322493160098222 +2025-05-18 13:45:00+00:00,20.950674889113618 +2025-05-18 14:00:00+00:00,15.500550113555928 +2025-05-18 14:15:00+00:00,20.42062046628259 +2025-05-18 14:30:00+00:00,16.878007504411563 +2025-05-18 14:45:00+00:00,10.489122774525182 +2025-05-18 15:00:00+00:00,12.301929219344764 +2025-05-18 15:15:00+00:00,6.822953682055192 +2025-05-18 15:30:00+00:00,5.695649948482631 +2025-05-18 15:45:00+00:00,3.2172102952531416 +2025-05-19 03:15:00+00:00,3.8743568453490256 +2025-05-19 03:30:00+00:00,7.370285358191544 +2025-05-19 03:45:00+00:00,10.205188068599904 +2025-05-19 04:00:00+00:00,9.026953087171517 +2025-05-19 04:15:00+00:00,11.949885461058036 +2025-05-19 04:30:00+00:00,13.984465255931688 +2025-05-19 04:45:00+00:00,16.324792119317827 +2025-05-19 05:00:00+00:00,17.06946157021196 +2025-05-19 05:15:00+00:00,18.683678895581807 +2025-05-19 05:30:00+00:00,18.147434087888712 +2025-05-19 05:45:00+00:00,19.656277804068896 +2025-05-19 06:00:00+00:00,20.345616754480798 +2025-05-19 06:15:00+00:00,20.321320405874953 +2025-05-19 06:30:00+00:00,21.93189942038288 +2025-05-19 06:45:00+00:00,21.01554774262842 +2025-05-19 07:00:00+00:00,21.52542479489241 +2025-05-19 07:15:00+00:00,21.207653160692082 +2025-05-19 07:30:00+00:00,22.48284162424358 +2025-05-19 07:45:00+00:00,21.741647594606437 +2025-05-19 08:00:00+00:00,22.953926821922757 +2025-05-19 08:15:00+00:00,22.82760508121038 +2025-05-19 08:30:00+00:00,24.08410217941113 +2025-05-19 08:45:00+00:00,24.389280206007427 +2025-05-19 09:00:00+00:00,26.35403367366571 +2025-05-19 09:15:00+00:00,27.477170196556497 +2025-05-19 09:30:00+00:00,27.60029800485928 +2025-05-19 09:45:00+00:00,28.71537978589786 +2025-05-19 10:00:00+00:00,30.736698418983508 +2025-05-19 10:15:00+00:00,29.640764496018217 +2025-05-19 10:30:00+00:00,28.43483920614862 +2025-05-19 10:45:00+00:00,29.087635497032153 +2025-05-19 11:00:00+00:00,29.006819743148785 +2025-05-19 11:15:00+00:00,29.057699270882402 +2025-05-19 11:30:00+00:00,28.298366276256406 +2025-05-19 11:45:00+00:00,28.096643715013258 +2025-05-19 12:00:00+00:00,27.89360039106155 +2025-05-19 12:15:00+00:00,27.738211499735907 +2025-05-19 12:30:00+00:00,27.641026777078526 +2025-05-19 12:45:00+00:00,26.469727859975414 +2025-05-19 13:00:00+00:00,25.69714376810458 +2025-05-19 13:15:00+00:00,24.58163213208734 +2025-05-19 13:30:00+00:00,24.390874897200455 +2025-05-19 13:45:00+00:00,22.49733871728073 +2025-05-19 14:00:00+00:00,21.505181782642246 +2025-05-19 14:15:00+00:00,19.824634008655185 +2025-05-19 14:30:00+00:00,17.94947623295149 +2025-05-19 14:45:00+00:00,15.759421791457083 +2025-05-19 15:00:00+00:00,12.76642634231116 +2025-05-19 15:15:00+00:00,9.799773388954888 +2025-05-19 15:30:00+00:00,6.847191203355067 +2025-05-19 15:45:00+00:00,4.12754736472527 +2025-05-19 16:00:00+00:00,1.9961875494385612 +2025-05-20 03:00:00+00:00,2.272161972706772 +2025-05-20 03:15:00+00:00,4.837806095467917 +2025-05-20 03:30:00+00:00,7.689603574061962 +2025-05-20 03:45:00+00:00,10.920763289739384 +2025-05-20 04:00:00+00:00,10.884355156717593 +2025-05-20 04:15:00+00:00,12.181273887969601 +2025-05-20 04:30:00+00:00,11.892112938567886 +2025-05-20 04:45:00+00:00,10.968962352296133 +2025-05-20 05:00:00+00:00,16.731137119472947 +2025-05-20 05:15:00+00:00,15.612579243658308 +2025-05-20 05:30:00+00:00,17.027350329098823 +2025-05-20 05:45:00+00:00,17.696037414070815 +2025-05-20 06:00:00+00:00,18.36331526375436 +2025-05-20 06:15:00+00:00,19.833723402743953 +2025-05-20 06:30:00+00:00,19.373851841651813 +2025-05-20 06:45:00+00:00,19.622597475634848 +2025-05-20 07:00:00+00:00,19.718066099327853 +2025-05-20 07:15:00+00:00,19.493819862061844 +2025-05-20 07:30:00+00:00,20.523214029344484 +2025-05-20 07:45:00+00:00,22.350485991084778 +2025-05-20 08:00:00+00:00,20.226964037415286 +2025-05-20 08:15:00+00:00,23.227834135351035 +2025-05-20 08:30:00+00:00,23.54915823807871 +2025-05-20 08:45:00+00:00,22.478181195289483 +2025-05-20 09:00:00+00:00,23.865906407911783 +2025-05-20 09:15:00+00:00,23.120585704490107 +2025-05-20 09:30:00+00:00,24.92518715562676 +2025-05-20 09:45:00+00:00,26.365657320751442 +2025-05-20 10:00:00+00:00,23.712073308820624 +2025-05-20 10:15:00+00:00,23.97885142143695 +2025-05-20 10:30:00+00:00,25.517643121088014 +2025-05-20 10:45:00+00:00,25.72749182693977 +2025-05-20 11:00:00+00:00,23.854647322856305 +2025-05-20 11:15:00+00:00,24.996913167127882 +2025-05-20 11:30:00+00:00,24.63936842258096 +2025-05-20 11:45:00+00:00,24.21711722712137 +2025-05-20 12:00:00+00:00,24.092259283620283 +2025-05-20 12:15:00+00:00,23.34272798498298 +2025-05-20 12:30:00+00:00,22.610957831915727 +2025-05-20 12:45:00+00:00,22.027486897426684 +2025-05-20 13:00:00+00:00,20.913410845736042 +2025-05-20 13:15:00+00:00,21.484537819139494 +2025-05-20 13:30:00+00:00,21.15087334872036 +2025-05-20 13:45:00+00:00,20.018820583287482 +2025-05-20 14:00:00+00:00,19.55372013099886 +2025-05-20 14:15:00+00:00,18.177838517286784 +2025-05-20 14:30:00+00:00,17.13571370710547 +2025-05-20 14:45:00+00:00,15.497150152570661 +2025-05-20 15:00:00+00:00,13.040173035528262 +2025-05-20 15:15:00+00:00,9.943315928744315 +2025-05-20 15:30:00+00:00,7.047745699981205 +2025-05-20 15:45:00+00:00,4.411446553894468 +2025-05-20 16:00:00+00:00,2.1990824117890084 +2025-05-21 03:00:00+00:00,2.5605509880869075 +2025-05-21 03:15:00+00:00,5.147866275410512 +2025-05-21 03:30:00+00:00,8.11309118136434 +2025-05-21 03:45:00+00:00,10.691926746835296 +2025-05-21 04:00:00+00:00,12.809443800929419 +2025-05-21 04:15:00+00:00,14.702912832463007 +2025-05-21 04:30:00+00:00,15.245108910413881 +2025-05-21 04:45:00+00:00,16.555437951859496 +2025-05-21 05:00:00+00:00,17.270509739267712 +2025-05-21 05:15:00+00:00,16.465112438086184 +2025-05-21 05:30:00+00:00,18.569576812525856 +2025-05-21 05:45:00+00:00,17.588815936779643 +2025-05-21 06:00:00+00:00,19.029713203938844 +2025-05-21 06:15:00+00:00,19.22796619187353 +2025-05-21 06:30:00+00:00,18.588469469635832 +2025-05-21 06:45:00+00:00,17.990240999899196 +2025-05-21 07:00:00+00:00,19.222849077698744 +2025-05-21 07:15:00+00:00,18.952591130476968 +2025-05-21 07:30:00+00:00,19.46827461633344 +2025-05-21 07:45:00+00:00,20.032747613473298 +2025-05-21 08:00:00+00:00,19.986539801182165 +2025-05-21 08:15:00+00:00,20.604536983169897 +2025-05-21 08:30:00+00:00,20.803440144045332 +2025-05-21 08:45:00+00:00,22.96678744343242 +2025-05-21 09:00:00+00:00,23.798701576867025 +2025-05-21 09:15:00+00:00,25.025008305116064 +2025-05-21 09:30:00+00:00,23.644503999740927 +2025-05-21 09:45:00+00:00,25.688561660560318 +2025-05-21 10:00:00+00:00,24.942484565523866 +2025-05-21 10:15:00+00:00,24.65619552185235 +2025-05-21 10:30:00+00:00,26.47199569504578 +2025-05-21 10:45:00+00:00,24.037954542331565 +2025-05-21 11:00:00+00:00,24.28080089510842 +2025-05-21 11:15:00+00:00,25.469766831043582 +2025-05-21 11:30:00+00:00,24.845047119853774 +2025-05-21 11:45:00+00:00,25.14483213561667 +2025-05-21 12:00:00+00:00,25.307574227610864 +2025-05-21 12:15:00+00:00,25.207718912599237 +2025-05-21 12:30:00+00:00,24.57202761018863 +2025-05-21 12:45:00+00:00,23.826180418373042 +2025-05-21 13:00:00+00:00,23.095092448991785 +2025-05-21 13:15:00+00:00,23.108494806679186 +2025-05-21 13:30:00+00:00,22.26941415457489 +2025-05-21 13:45:00+00:00,20.813682566519052 +2025-05-21 14:00:00+00:00,20.635940756147534 +2025-05-21 14:15:00+00:00,18.9732564825974 +2025-05-21 14:30:00+00:00,17.64446808927357 +2025-05-21 14:45:00+00:00,15.980755958630311 +2025-05-21 15:00:00+00:00,13.422000106212403 +2025-05-21 15:15:00+00:00,10.493740461997215 +2025-05-21 15:30:00+00:00,7.243017969949744 +2025-05-21 15:45:00+00:00,4.502182363549798 +2025-05-21 16:00:00+00:00,2.350549175804608 +2025-05-22 03:30:00+00:00,4.18976571546142 +2025-05-22 03:45:00+00:00,8.16058153948265 +2025-05-22 04:00:00+00:00,13.222273630417282 +2025-05-22 04:15:00+00:00,13.742031100450212 +2025-05-22 04:30:00+00:00,14.919285581586115 +2025-05-22 04:45:00+00:00,16.005240922324237 +2025-05-22 05:00:00+00:00,16.666333045638712 +2025-05-22 05:15:00+00:00,16.91527682100361 +2025-05-22 05:30:00+00:00,17.64020188256013 +2025-05-22 05:45:00+00:00,18.62431074197134 +2025-05-22 06:00:00+00:00,19.00483321088551 +2025-05-22 06:15:00+00:00,19.330860638548614 +2025-05-22 06:30:00+00:00,18.992267280992092 +2025-05-22 06:45:00+00:00,19.995559197514254 +2025-05-22 07:00:00+00:00,19.81694912834988 +2025-05-22 07:15:00+00:00,20.474678003247654 +2025-05-22 07:30:00+00:00,20.299585399564837 +2025-05-22 07:45:00+00:00,20.982366225687194 +2025-05-22 08:00:00+00:00,20.632749722911278 +2025-05-22 08:15:00+00:00,21.19428711186406 +2025-05-22 08:30:00+00:00,23.441754007236053 +2025-05-22 08:45:00+00:00,24.8237851343088 +2025-05-22 09:00:00+00:00,24.83373548370713 +2025-05-22 09:15:00+00:00,24.9207111553023 +2025-05-22 09:30:00+00:00,26.36734849416434 +2025-05-22 09:45:00+00:00,26.94589519761884 +2025-05-22 10:00:00+00:00,26.867552575967018 +2025-05-22 10:15:00+00:00,26.764294057629407 +2025-05-22 10:30:00+00:00,25.378194246530185 +2025-05-22 10:45:00+00:00,27.343138450781932 +2025-05-22 11:00:00+00:00,25.313855523444158 +2025-05-22 11:15:00+00:00,27.91652555609776 +2025-05-22 11:30:00+00:00,26.780053557311145 +2025-05-22 11:45:00+00:00,26.28897710965897 +2025-05-22 12:00:00+00:00,25.68719793563317 +2025-05-22 12:15:00+00:00,26.07737519154661 +2025-05-22 12:30:00+00:00,25.220361385986703 +2025-05-22 12:45:00+00:00,25.105091535944425 +2025-05-22 13:00:00+00:00,24.977513401847894 +2025-05-22 13:15:00+00:00,24.434453759681176 +2025-05-22 13:30:00+00:00,23.46302511340973 +2025-05-22 13:45:00+00:00,22.42188847516439 +2025-05-22 14:00:00+00:00,21.882132749992248 +2025-05-22 14:15:00+00:00,20.41440176683215 +2025-05-22 14:30:00+00:00,18.39371289374765 +2025-05-22 14:45:00+00:00,16.28789578717263 +2025-05-22 15:00:00+00:00,13.47309287638805 +2025-05-22 15:15:00+00:00,10.344837125572262 +2025-05-22 15:30:00+00:00,7.085081178485819 +2025-05-22 15:45:00+00:00,4.211721617861862 +2025-05-22 16:00:00+00:00,2.20807495600945 +2025-05-23 03:15:00+00:00,3.2645339637050856 +2025-05-23 03:30:00+00:00,6.79993376304272 +2025-05-23 03:45:00+00:00,11.60113931110868 +2025-05-23 04:00:00+00:00,13.98985534475085 +2025-05-23 04:15:00+00:00,11.41659634621899 +2025-05-23 04:30:00+00:00,17.3738925809263 +2025-05-23 04:45:00+00:00,18.350934434787746 +2025-05-23 05:00:00+00:00,15.899380684055767 +2025-05-23 05:15:00+00:00,17.276571665204607 +2025-05-23 05:30:00+00:00,19.125721281859274 +2025-05-23 05:45:00+00:00,19.63211536650784 +2025-05-23 06:00:00+00:00,19.317089937833675 +2025-05-23 06:15:00+00:00,19.734087018281762 +2025-05-23 06:30:00+00:00,20.394119684330583 +2025-05-23 06:45:00+00:00,20.89166559556046 +2025-05-23 07:00:00+00:00,21.41662858409173 +2025-05-23 07:15:00+00:00,20.927535875335376 +2025-05-23 07:30:00+00:00,22.28261555863669 +2025-05-23 07:45:00+00:00,22.121130861783293 +2025-05-23 08:00:00+00:00,22.00330425381161 +2025-05-23 08:15:00+00:00,22.24881811120192 +2025-05-23 08:30:00+00:00,23.453406529494835 +2025-05-23 08:45:00+00:00,24.861373895905853 +2025-05-23 09:00:00+00:00,24.099840090661978 +2025-05-23 09:15:00+00:00,26.444545419200846 +2025-05-23 09:30:00+00:00,25.857292925220847 +2025-05-23 09:45:00+00:00,25.519746479637607 +2025-05-23 10:00:00+00:00,26.445582429962972 +2025-05-23 10:15:00+00:00,26.95312974785904 +2025-05-23 10:30:00+00:00,25.42811026094266 +2025-05-23 10:45:00+00:00,27.07280974550884 +2025-05-23 11:00:00+00:00,24.781389225508455 +2025-05-23 11:15:00+00:00,25.87429740920299 +2025-05-23 11:30:00+00:00,25.56696592120783 +2025-05-23 11:45:00+00:00,25.691269797901416 +2025-05-23 12:00:00+00:00,26.029326218628746 +2025-05-23 12:15:00+00:00,25.265512673262837 +2025-05-23 12:30:00+00:00,24.714768948332534 +2025-05-23 12:45:00+00:00,25.758634156934487 +2025-05-23 13:00:00+00:00,25.46786308507094 +2025-05-23 13:15:00+00:00,25.163693922625015 +2025-05-23 13:30:00+00:00,23.80300253205987 +2025-05-23 13:45:00+00:00,23.13113405887052 +2025-05-23 14:00:00+00:00,22.24074639698853 +2025-05-23 14:15:00+00:00,21.371620177194426 +2025-05-23 14:30:00+00:00,19.26410637921364 +2025-05-23 14:45:00+00:00,17.023406980407415 +2025-05-23 15:00:00+00:00,14.210535787753557 +2025-05-23 15:15:00+00:00,10.707861875795032 +2025-05-23 15:30:00+00:00,7.232497139925748 +2025-05-23 15:45:00+00:00,4.2406290098966775 +2025-05-23 16:00:00+00:00,1.954431645570003 +2025-05-24 03:00:00+00:00,2.267539197655897 +2025-05-24 03:15:00+00:00,5.378484842371767 +2025-05-24 03:30:00+00:00,8.637761150770247 +2025-05-24 03:45:00+00:00,11.670728326941518 +2025-05-24 04:00:00+00:00,14.263457908535983 +2025-05-24 04:15:00+00:00,15.596273529607632 +2025-05-24 04:30:00+00:00,17.074410827132464 +2025-05-24 04:45:00+00:00,17.364461398097816 +2025-05-24 05:00:00+00:00,18.561177156719328 +2025-05-24 05:15:00+00:00,19.06424335667221 +2025-05-24 05:30:00+00:00,19.956529539705134 +2025-05-24 05:45:00+00:00,20.60818620169228 +2025-05-24 06:00:00+00:00,20.894456923104006 +2025-05-24 06:15:00+00:00,20.7447078893432 +2025-05-24 06:30:00+00:00,21.925364871168416 +2025-05-24 06:45:00+00:00,22.493528380460354 +2025-05-24 07:00:00+00:00,22.881224254673896 +2025-05-24 07:15:00+00:00,23.143374537438778 +2025-05-24 07:30:00+00:00,24.294825439219277 +2025-05-24 07:45:00+00:00,24.39359141100536 +2025-05-24 08:00:00+00:00,23.57119136176572 +2025-05-24 08:15:00+00:00,24.144442003942398 +2025-05-24 08:30:00+00:00,25.58232467225901 +2025-05-24 08:45:00+00:00,27.970848689928452 +2025-05-24 09:00:00+00:00,30.01654655864328 +2025-05-24 09:15:00+00:00,29.76428689608557 +2025-05-24 09:30:00+00:00,29.51073975720403 +2025-05-24 09:45:00+00:00,30.45707266916787 +2025-05-24 10:00:00+00:00,29.902746191677693 +2025-05-24 10:15:00+00:00,32.535705258172385 +2025-05-24 10:30:00+00:00,30.85478108463561 +2025-05-24 10:45:00+00:00,32.554442299664295 +2025-05-24 11:00:00+00:00,31.02583438332697 +2025-05-24 11:15:00+00:00,31.608193636571578 +2025-05-24 11:30:00+00:00,31.671968109010685 +2025-05-24 11:45:00+00:00,31.970841454174796 +2025-05-24 12:00:00+00:00,32.24756607246875 +2025-05-24 12:15:00+00:00,31.671041907800927 +2025-05-24 12:30:00+00:00,30.036048883411436 +2025-05-24 12:45:00+00:00,29.582763376144094 +2025-05-24 13:00:00+00:00,29.00247588090988 +2025-05-24 13:15:00+00:00,27.879092961785446 +2025-05-24 13:30:00+00:00,26.83212374122779 +2025-05-24 13:45:00+00:00,25.68100908358072 +2025-05-24 14:00:00+00:00,24.07722197330018 +2025-05-24 14:15:00+00:00,22.024958529882227 +2025-05-24 14:30:00+00:00,19.718242270455885 +2025-05-24 14:45:00+00:00,16.743345493103078 +2025-05-24 15:00:00+00:00,13.224243651077002 +2025-05-24 15:15:00+00:00,9.82485323655128 +2025-05-24 15:30:00+00:00,6.62005474255648 +2025-05-24 15:45:00+00:00,3.8476814127283037 +2025-05-24 16:00:00+00:00,1.6778113640692296 +2025-05-25 03:00:00+00:00,2.7230451717982165 +2025-05-25 03:15:00+00:00,5.39358805930379 +2025-05-25 03:30:00+00:00,8.482872420790336 +2025-05-25 03:45:00+00:00,11.352731514242201 +2025-05-25 04:00:00+00:00,13.257727247595051 +2025-05-25 04:15:00+00:00,15.41799248796755 +2025-05-25 04:30:00+00:00,16.480153313374423 +2025-05-25 04:45:00+00:00,17.902714564950898 +2025-05-25 05:00:00+00:00,19.472264629481177 +2025-05-25 05:15:00+00:00,21.29888368061964 +2025-05-25 05:30:00+00:00,20.80771573856721 +2025-05-25 05:45:00+00:00,22.230843744185528 +2025-05-25 06:00:00+00:00,23.7796055853535 +2025-05-25 06:15:00+00:00,25.120429467927696 +2025-05-25 06:30:00+00:00,26.785602783682815 +2025-05-25 06:45:00+00:00,26.82055364960827 +2025-05-25 07:00:00+00:00,27.530949905223498 +2025-05-25 07:15:00+00:00,28.764020434888685 +2025-05-25 07:30:00+00:00,28.983026511159668 +2025-05-25 07:45:00+00:00,29.99340440642213 +2025-05-25 08:00:00+00:00,29.650164880785827 +2025-05-25 08:15:00+00:00,31.199313769824013 +2025-05-25 08:30:00+00:00,32.719366828827816 +2025-05-25 08:45:00+00:00,34.225709756055714 +2025-05-25 09:00:00+00:00,36.15958731347316 +2025-05-25 09:15:00+00:00,34.72270556411725 +2025-05-25 09:30:00+00:00,37.22210207432544 +2025-05-25 09:45:00+00:00,34.58652294833215 +2025-05-25 10:00:00+00:00,37.911755370605086 +2025-05-25 10:15:00+00:00,37.07051050335461 +2025-05-25 10:30:00+00:00,35.696274090076095 +2025-05-25 10:45:00+00:00,35.788964679776456 +2025-05-25 11:00:00+00:00,36.68601747060548 +2025-05-25 11:15:00+00:00,37.427394677789586 +2025-05-25 11:30:00+00:00,36.55732246584701 +2025-05-25 11:45:00+00:00,35.85143735080139 +2025-05-25 12:00:00+00:00,34.66226191622182 +2025-05-25 12:15:00+00:00,34.84389656187897 +2025-05-25 12:30:00+00:00,34.95658272551397 +2025-05-25 12:45:00+00:00,33.77772193079327 +2025-05-25 13:00:00+00:00,33.019560694550115 +2025-05-25 13:15:00+00:00,31.089071623001555 +2025-05-25 13:30:00+00:00,28.85815267343025 +2025-05-25 13:45:00+00:00,26.820283282368262 +2025-05-25 14:00:00+00:00,23.81989270410315 +2025-05-25 14:15:00+00:00,21.893407273031688 +2025-05-25 14:30:00+00:00,19.148079102715393 +2025-05-25 14:45:00+00:00,16.17887999255069 +2025-05-25 15:00:00+00:00,12.789503465309329 +2025-05-25 15:15:00+00:00,9.440877549221053 +2025-05-25 15:30:00+00:00,6.380666038367444 +2025-05-25 15:45:00+00:00,3.732914049307772 +2025-05-25 16:00:00+00:00,1.5420576391330523 +2025-05-26 03:00:00+00:00,2.5539143657380587 +2025-05-26 03:15:00+00:00,5.099866292373583 +2025-05-26 03:30:00+00:00,8.097808514045138 +2025-05-26 03:45:00+00:00,11.111005305685682 +2025-05-26 04:00:00+00:00,13.799439611996048 +2025-05-26 04:15:00+00:00,15.544450003241613 +2025-05-26 04:30:00+00:00,17.500649704995826 +2025-05-26 04:45:00+00:00,19.4733188658022 +2025-05-26 05:00:00+00:00,21.42275966313046 +2025-05-26 05:15:00+00:00,22.768213821213113 +2025-05-26 05:30:00+00:00,23.73417078081729 +2025-05-26 05:45:00+00:00,25.884965917485097 +2025-05-26 06:00:00+00:00,27.119479950735556 +2025-05-26 06:15:00+00:00,27.893147508799423 +2025-05-26 06:30:00+00:00,29.290661575584693 +2025-05-26 06:45:00+00:00,29.627935128079557 +2025-05-26 07:00:00+00:00,29.562542211019576 +2025-05-26 07:15:00+00:00,30.761834711953117 +2025-05-26 07:30:00+00:00,31.921027794451657 +2025-05-26 07:45:00+00:00,31.829689810373583 +2025-05-26 08:00:00+00:00,31.78346606527593 +2025-05-26 08:15:00+00:00,30.748166424200914 +2025-05-26 08:30:00+00:00,36.105791691002516 +2025-05-26 08:45:00+00:00,34.938033544559815 +2025-05-26 09:00:00+00:00,35.42694124873505 +2025-05-26 09:15:00+00:00,36.22127750807384 +2025-05-26 09:30:00+00:00,35.32878966664268 +2025-05-26 09:45:00+00:00,35.318915444469134 +2025-05-26 10:00:00+00:00,35.826437096929915 +2025-05-26 10:15:00+00:00,36.89730807322464 +2025-05-26 10:30:00+00:00,35.695006768505756 +2025-05-26 10:45:00+00:00,36.545995020321726 +2025-05-26 11:00:00+00:00,37.64838435663374 +2025-05-26 11:15:00+00:00,37.89444646223478 +2025-05-26 11:30:00+00:00,30.283064342675694 +2025-05-26 11:45:00+00:00,22.580080041768642 +2025-05-26 12:00:00+00:00,35.271313309998256 +2025-05-26 12:15:00+00:00,35.17926712739 +2025-05-26 12:30:00+00:00,32.57496568573267 +2025-05-26 12:45:00+00:00,29.953736083108193 +2025-05-26 13:00:00+00:00,32.04868938197211 +2025-05-26 13:15:00+00:00,14.890147128315629 +2025-05-26 13:30:00+00:00,24.390064374113088 +2025-05-26 13:45:00+00:00,27.086235112079514 +2025-05-26 14:00:00+00:00,22.423369098516993 +2025-05-26 14:15:00+00:00,20.657352577361266 +2025-05-26 14:30:00+00:00,16.921503567481164 +2025-05-26 14:45:00+00:00,14.49494146995354 +2025-05-26 15:00:00+00:00,8.80667179111223 +2025-05-26 15:15:00+00:00,1.5285476349162639 +2025-05-26 15:30:00+00:00,2.0576560134097215 +2025-05-26 15:45:00+00:00,2.8057587590857658 +2025-05-26 16:00:00+00:00,1.784225638061004 +2025-05-27 03:15:00+00:00,3.1429345011903083 +2025-05-27 03:30:00+00:00,5.999695350642513 +2025-05-27 03:45:00+00:00,7.840532162459782 +2025-05-27 04:00:00+00:00,11.314346442599671 +2025-05-27 04:15:00+00:00,10.980335783294862 +2025-05-27 04:30:00+00:00,14.94460816783641 +2025-05-27 04:45:00+00:00,17.788236613637178 +2025-05-27 05:00:00+00:00,14.823410252562951 +2025-05-27 05:15:00+00:00,15.037978607084959 +2025-05-27 05:30:00+00:00,16.861216707251277 +2025-05-27 05:45:00+00:00,19.69722314196512 +2025-05-27 06:00:00+00:00,18.71708559626815 +2025-05-27 06:15:00+00:00,16.54626492455891 +2025-05-27 06:30:00+00:00,21.375194771736147 +2025-05-27 06:45:00+00:00,20.965454112206867 +2025-05-27 07:00:00+00:00,22.235802339622655 +2025-05-27 07:15:00+00:00,22.861283877326613 +2025-05-27 07:30:00+00:00,24.07211171598365 +2025-05-27 07:45:00+00:00,23.67520639859096 +2025-05-27 08:00:00+00:00,24.52843295243165 +2025-05-27 08:15:00+00:00,23.34109558110442 +2025-05-27 08:30:00+00:00,24.03921537281775 +2025-05-27 08:45:00+00:00,24.878941558856987 +2025-05-27 09:00:00+00:00,24.574156021282768 +2025-05-27 09:15:00+00:00,24.63437025203019 +2025-05-27 09:30:00+00:00,25.3305825422681 +2025-05-27 09:45:00+00:00,25.843870674570685 +2025-05-27 10:00:00+00:00,27.190298549423428 +2025-05-27 10:15:00+00:00,27.894136949570992 +2025-05-27 10:30:00+00:00,27.318135811540735 +2025-05-27 10:45:00+00:00,27.21895397406138 +2025-05-27 11:00:00+00:00,25.732533551028645 +2025-05-27 11:15:00+00:00,26.430479953476485 +2025-05-27 11:30:00+00:00,26.793691621778297 +2025-05-27 11:45:00+00:00,25.807204334840335 +2025-05-27 12:00:00+00:00,25.16642529502627 +2025-05-27 12:15:00+00:00,25.484276974119386 +2025-05-27 12:30:00+00:00,25.337977244139378 +2025-05-27 12:45:00+00:00,24.98442891391934 +2025-05-27 13:00:00+00:00,24.628629040901068 +2025-05-27 13:15:00+00:00,23.373641231540994 +2025-05-27 13:30:00+00:00,21.422145748330635 +2025-05-27 13:45:00+00:00,21.766968244615928 +2025-05-27 14:00:00+00:00,20.741268226827163 +2025-05-27 14:15:00+00:00,19.56274569971054 +2025-05-27 14:30:00+00:00,18.151378284198525 +2025-05-27 14:45:00+00:00,16.06042297797989 +2025-05-27 15:00:00+00:00,13.852148734702581 +2025-05-27 15:15:00+00:00,10.960236565704347 +2025-05-27 15:30:00+00:00,7.6089278397173725 +2025-05-27 15:45:00+00:00,4.6073416366103555 +2025-05-27 16:00:00+00:00,2.4846227256955964 +2025-05-28 03:15:00+00:00,3.1034324388893326 +2025-05-28 03:30:00+00:00,5.857676887004926 +2025-05-28 03:45:00+00:00,7.202383179992584 +2025-05-28 04:00:00+00:00,9.500962649151736 +2025-05-28 04:15:00+00:00,11.01660203479228 +2025-05-28 04:30:00+00:00,16.892972692427303 +2025-05-28 04:45:00+00:00,12.602677810715349 +2025-05-28 05:00:00+00:00,17.987673187798336 +2025-05-28 05:15:00+00:00,14.122845469035893 +2025-05-28 05:30:00+00:00,14.654694048923577 +2025-05-28 05:45:00+00:00,18.140223208077995 +2025-05-28 06:00:00+00:00,22.52698764531386 +2025-05-28 06:15:00+00:00,19.736329808088648 +2025-05-28 06:30:00+00:00,17.557113978882953 +2025-05-28 06:45:00+00:00,18.278482465529766 +2025-05-28 07:00:00+00:00,22.374119339508024 +2025-05-28 07:15:00+00:00,19.14001129726975 +2025-05-28 07:30:00+00:00,20.995874737218127 +2025-05-28 07:45:00+00:00,21.213943190159085 +2025-05-28 08:00:00+00:00,20.10611908658135 +2025-05-28 08:15:00+00:00,21.88751359076947 +2025-05-28 08:30:00+00:00,23.54865414425836 +2025-05-28 08:45:00+00:00,24.253860796705737 +2025-05-28 09:00:00+00:00,23.08591750473713 +2025-05-28 09:15:00+00:00,26.315470980176865 +2025-05-28 09:30:00+00:00,25.252071916097687 +2025-05-28 09:45:00+00:00,25.132729843402554 +2025-05-28 10:00:00+00:00,25.901411808839114 +2025-05-28 10:15:00+00:00,25.01823795733634 +2025-05-28 10:30:00+00:00,26.943435157091923 +2025-05-28 10:45:00+00:00,24.960054750060063 +2025-05-28 11:00:00+00:00,25.606932332362284 +2025-05-28 11:15:00+00:00,26.034067349189364 +2025-05-28 11:30:00+00:00,24.880387688802927 +2025-05-28 11:45:00+00:00,25.584517543061025 +2025-05-28 12:00:00+00:00,25.704592016312525 +2025-05-28 12:15:00+00:00,25.39757675872852 +2025-05-28 12:30:00+00:00,25.437190424930677 +2025-05-28 12:45:00+00:00,24.1189531066522 +2025-05-28 13:00:00+00:00,24.485871976440517 +2025-05-28 13:15:00+00:00,24.81117485615886 +2025-05-28 13:30:00+00:00,23.988256090910742 +2025-05-28 13:45:00+00:00,23.078182679168684 +2025-05-28 14:00:00+00:00,21.73253525290576 +2025-05-28 14:15:00+00:00,19.828064637419516 +2025-05-28 14:30:00+00:00,18.649236479011815 +2025-05-28 14:45:00+00:00,16.958888574886657 +2025-05-28 15:00:00+00:00,14.487313882011417 +2025-05-28 15:15:00+00:00,11.6204228774611 +2025-05-28 15:30:00+00:00,8.12055443855503 +2025-05-28 15:45:00+00:00,5.17602668106948 +2025-05-28 16:00:00+00:00,2.585520738826134 +2025-05-29 03:00:00+00:00,2.7557982692600227 +2025-05-29 03:15:00+00:00,5.702817595810476 +2025-05-29 03:30:00+00:00,8.795231089653289 +2025-05-29 03:45:00+00:00,11.928069412166053 +2025-05-29 04:00:00+00:00,14.150017460338148 +2025-05-29 04:15:00+00:00,16.414906796772698 +2025-05-29 04:30:00+00:00,16.954901240787635 +2025-05-29 04:45:00+00:00,18.815975097584957 +2025-05-29 05:00:00+00:00,18.903002070280596 +2025-05-29 05:15:00+00:00,19.79354165191677 +2025-05-29 05:30:00+00:00,20.038606672866162 +2025-05-29 05:45:00+00:00,20.45710891573824 +2025-05-29 06:00:00+00:00,21.118926066102826 +2025-05-29 06:15:00+00:00,22.114715419594432 +2025-05-29 06:30:00+00:00,21.001307426021118 +2025-05-29 06:45:00+00:00,22.7347506878209 +2025-05-29 07:00:00+00:00,24.168577747612204 +2025-05-29 07:15:00+00:00,22.754414899698393 +2025-05-29 07:30:00+00:00,23.843498198578125 +2025-05-29 07:45:00+00:00,22.820025926398987 +2025-05-29 08:00:00+00:00,22.209142843950218 +2025-05-29 08:15:00+00:00,22.50458388648395 +2025-05-29 08:30:00+00:00,23.50939203692209 +2025-05-29 08:45:00+00:00,25.809791962418394 +2025-05-29 09:00:00+00:00,26.99306149573907 +2025-05-29 09:15:00+00:00,24.852268427988733 +2025-05-29 09:30:00+00:00,26.111279011496315 +2025-05-29 09:45:00+00:00,24.632676744876353 +2025-05-29 10:00:00+00:00,25.60981097703694 +2025-05-29 10:15:00+00:00,25.21241410899527 +2025-05-29 10:30:00+00:00,25.941142161095474 +2025-05-29 10:45:00+00:00,25.824726268613944 +2025-05-29 11:00:00+00:00,26.676296500806874 +2025-05-29 11:15:00+00:00,26.97969744737493 +2025-05-29 11:30:00+00:00,26.519571433416136 +2025-05-29 11:45:00+00:00,24.64520686594099 +2025-05-29 12:00:00+00:00,25.570091133015328 +2025-05-29 12:15:00+00:00,26.470710521603362 +2025-05-29 12:30:00+00:00,25.57811638725011 +2025-05-29 12:45:00+00:00,25.465365865383532 +2025-05-29 13:00:00+00:00,25.341151307792867 +2025-05-29 13:15:00+00:00,25.04355842362886 +2025-05-29 13:30:00+00:00,23.46108529291603 +2025-05-29 13:45:00+00:00,22.989988259731717 +2025-05-29 14:00:00+00:00,21.86013000659743 +2025-05-29 14:15:00+00:00,20.766581871290974 +2025-05-29 14:30:00+00:00,19.300360457155243 +2025-05-29 14:45:00+00:00,17.238004922096525 +2025-05-29 15:00:00+00:00,14.587976181720068 +2025-05-29 15:15:00+00:00,11.148958321584592 +2025-05-29 15:30:00+00:00,7.909333736382107 +2025-05-29 15:45:00+00:00,4.763120407314099 +2025-05-29 16:00:00+00:00,2.251106706697831 +2025-05-30 03:00:00+00:00,2.5232715859989625 +2025-05-30 03:15:00+00:00,4.907803865628584 +2025-05-30 03:30:00+00:00,7.64591886378795 +2025-05-30 03:45:00+00:00,10.439929367183998 +2025-05-30 04:00:00+00:00,12.692247023727692 +2025-05-30 04:15:00+00:00,14.958998498322764 +2025-05-30 04:30:00+00:00,16.668515246056874 +2025-05-30 04:45:00+00:00,18.264111071882663 +2025-05-30 05:00:00+00:00,18.920736263151444 +2025-05-30 05:15:00+00:00,19.426414931002686 +2025-05-30 05:30:00+00:00,20.626626094097354 +2025-05-30 05:45:00+00:00,20.759511422126703 +2025-05-30 06:00:00+00:00,21.441443606438558 +2025-05-30 06:15:00+00:00,22.39181958716969 +2025-05-30 06:30:00+00:00,21.966087437500093 +2025-05-30 06:45:00+00:00,22.557515586625627 +2025-05-30 07:00:00+00:00,22.927965548307007 +2025-05-30 07:15:00+00:00,23.220255479464846 +2025-05-30 07:30:00+00:00,23.98989535217373 +2025-05-30 07:45:00+00:00,22.668464961670292 +2025-05-30 08:00:00+00:00,23.34465104072413 +2025-05-30 08:15:00+00:00,23.934425139135897 +2025-05-30 08:30:00+00:00,25.188460908668592 +2025-05-30 08:45:00+00:00,26.839364686871217 +2025-05-30 09:00:00+00:00,27.182500013984352 +2025-05-30 09:15:00+00:00,26.606698628492172 +2025-05-30 09:30:00+00:00,29.206826975755323 +2025-05-30 09:45:00+00:00,28.925154849662515 +2025-05-30 10:00:00+00:00,27.26988946233816 +2025-05-30 10:15:00+00:00,29.87581032210355 +2025-05-30 10:30:00+00:00,29.36776522116226 +2025-05-30 10:45:00+00:00,28.327640542137154 +2025-05-30 11:00:00+00:00,28.55065001727984 +2025-05-30 11:15:00+00:00,29.746097703371117 +2025-05-30 11:30:00+00:00,28.240759509022766 +2025-05-30 11:45:00+00:00,29.679604066400028 +2025-05-30 12:00:00+00:00,29.41176678539221 +2025-05-30 12:15:00+00:00,29.866299234228947 +2025-05-30 12:30:00+00:00,29.210913874751196 +2025-05-30 12:45:00+00:00,28.87885977934245 +2025-05-30 13:00:00+00:00,28.531476672728317 +2025-05-30 13:15:00+00:00,27.912915999783724 +2025-05-30 13:30:00+00:00,27.21642759011243 +2025-05-30 13:45:00+00:00,25.396957954794743 +2025-05-30 14:00:00+00:00,23.80383203732275 +2025-05-30 14:15:00+00:00,21.9837704709299 +2025-05-30 14:30:00+00:00,19.545945706877383 +2025-05-30 14:45:00+00:00,16.368096720537082 +2025-05-30 15:00:00+00:00,13.664940263077535 +2025-05-30 15:15:00+00:00,10.373529155627956 +2025-05-30 15:30:00+00:00,7.225888032273147 +2025-05-30 15:45:00+00:00,4.43563732799593 +2025-05-30 16:00:00+00:00,2.100400851379807 +2025-05-31 03:00:00+00:00,2.451365974687212 +2025-05-31 03:15:00+00:00,4.899252768359579 +2025-05-31 03:30:00+00:00,7.834576520456547 +2025-05-31 03:45:00+00:00,10.741623482261597 +2025-05-31 04:00:00+00:00,13.561594239380199 +2025-05-31 04:15:00+00:00,15.849195385902883 +2025-05-31 04:30:00+00:00,18.109162120069115 +2025-05-31 04:45:00+00:00,19.873286060222274 +2025-05-31 05:00:00+00:00,21.217510115709253 +2025-05-31 05:15:00+00:00,21.823828385999782 +2025-05-31 05:30:00+00:00,22.775528407420897 +2025-05-31 05:45:00+00:00,24.084981171887534 +2025-05-31 06:00:00+00:00,22.057258938212943 +2025-05-31 06:15:00+00:00,25.124557959169838 +2025-05-31 06:30:00+00:00,25.322095366676272 +2025-05-31 06:45:00+00:00,26.45755381128067 +2025-05-31 07:00:00+00:00,27.318906505312135 +2025-05-31 07:15:00+00:00,27.47414744637789 +2025-05-31 07:30:00+00:00,29.091062591519496 +2025-05-31 07:45:00+00:00,28.930146660721892 +2025-05-31 08:00:00+00:00,29.55134191436682 +2025-05-31 08:15:00+00:00,30.0343505878458 +2025-05-31 08:30:00+00:00,30.00494525150649 +2025-05-31 08:45:00+00:00,34.36391542246813 +2025-05-31 09:00:00+00:00,36.17162277125873 +2025-05-31 09:15:00+00:00,33.82885759750669 +2025-05-31 09:30:00+00:00,35.44697346227902 +2025-05-31 09:45:00+00:00,36.7141878355134 +2025-05-31 10:00:00+00:00,35.52486394132692 +2025-05-31 10:15:00+00:00,35.41326763853234 +2025-05-31 10:30:00+00:00,36.8179299183161 +2025-05-31 10:45:00+00:00,39.4115158293705 +2025-05-31 11:00:00+00:00,39.00617528634574 +2025-05-31 11:15:00+00:00,34.2972285927333 +2025-05-31 11:30:00+00:00,35.089079035688876 +2025-05-31 11:45:00+00:00,35.365149757703385 +2025-05-31 12:00:00+00:00,34.83679289671939 +2025-05-31 12:15:00+00:00,33.72721617411514 +2025-05-31 12:30:00+00:00,32.960238435756054 +2025-05-31 12:45:00+00:00,32.4988064666695 +2025-05-31 13:00:00+00:00,31.816389971144392 +2025-05-31 13:15:00+00:00,31.08633155278122 +2025-05-31 13:30:00+00:00,29.37551579210234 +2025-05-31 13:45:00+00:00,27.51572054625895 +2025-05-31 14:00:00+00:00,24.79212019429042 +2025-05-31 14:15:00+00:00,21.87545805444841 +2025-05-31 14:30:00+00:00,18.7500622247247 +2025-05-31 14:45:00+00:00,14.07981803495778 +2025-05-31 15:00:00+00:00,10.327439979370006 +2025-05-31 15:15:00+00:00,7.332841672018904 +2025-05-31 15:30:00+00:00,6.478814897460884 +2025-05-31 15:45:00+00:00,4.483332337144243 +2025-05-31 16:00:00+00:00,2.308356910312068 +2025-06-01 03:15:00+00:00,3.5052843274398557 +2025-06-01 03:30:00+00:00,7.222544396130627 +2025-06-01 03:45:00+00:00,10.197530799023305 +2025-06-01 04:00:00+00:00,12.895002407028167 +2025-06-01 04:15:00+00:00,15.507806180636058 +2025-06-01 04:30:00+00:00,17.40533173946019 +2025-06-01 04:45:00+00:00,18.19181594580321 +2025-06-01 05:00:00+00:00,18.925461840884704 +2025-06-01 05:15:00+00:00,21.0454458414587 +2025-06-01 05:30:00+00:00,22.396871617776007 +2025-06-01 05:45:00+00:00,22.459293011001975 +2025-06-01 06:00:00+00:00,24.519915007387553 +2025-06-01 06:15:00+00:00,23.522813588801764 +2025-06-01 06:30:00+00:00,25.381010208181177 +2025-06-01 06:45:00+00:00,26.47537642844354 +2025-06-01 07:00:00+00:00,25.096159011973683 +2025-06-01 07:15:00+00:00,26.43105070528571 +2025-06-01 07:30:00+00:00,25.853770188133552 +2025-06-01 07:45:00+00:00,26.19122458770981 +2025-06-01 08:00:00+00:00,27.8637071209521 +2025-06-01 08:15:00+00:00,25.141870268228125 +2025-06-01 08:30:00+00:00,29.047269518671765 +2025-06-01 08:45:00+00:00,27.73155149657612 +2025-06-01 09:00:00+00:00,26.779880520700424 +2025-06-01 09:15:00+00:00,30.170886102465126 +2025-06-01 09:30:00+00:00,21.929825382122687 +2025-06-01 09:45:00+00:00,26.81641134252195 +2025-06-01 10:00:00+00:00,30.51216032810384 +2025-06-01 10:15:00+00:00,21.667352233249147 +2025-06-01 10:30:00+00:00,26.90121643119956 +2025-06-01 10:45:00+00:00,29.345298965777047 +2025-06-01 11:00:00+00:00,30.30234523233408 +2025-06-01 11:15:00+00:00,28.618757021157847 +2025-06-01 11:30:00+00:00,29.174511378805047 +2025-06-01 11:45:00+00:00,28.40654096822332 +2025-06-01 12:00:00+00:00,27.948877892925818 +2025-06-01 12:15:00+00:00,17.88101213674411 +2025-06-01 12:30:00+00:00,26.52657085648421 +2025-06-01 12:45:00+00:00,27.094591163591602 +2025-06-01 13:00:00+00:00,26.280666299160814 +2025-06-01 13:15:00+00:00,25.461487680561444 +2025-06-01 13:30:00+00:00,25.328601702822446 +2025-06-01 13:45:00+00:00,23.726653107531515 +2025-06-01 14:00:00+00:00,22.840338345378402 +2025-06-01 14:15:00+00:00,20.90003117248273 +2025-06-01 14:30:00+00:00,18.735666533985665 +2025-06-01 14:45:00+00:00,16.39988254775328 +2025-06-01 15:00:00+00:00,13.562687990355899 +2025-06-01 15:15:00+00:00,10.408579639587499 +2025-06-01 15:30:00+00:00,7.4331329930025944 +2025-06-01 15:45:00+00:00,4.7847139024368595 +2025-06-01 16:00:00+00:00,2.5850012102897777 +2025-06-02 03:15:00+00:00,3.1053969841109836 +2025-06-02 03:30:00+00:00,4.238970340086543 +2025-06-02 03:45:00+00:00,9.209511680605585 +2025-06-02 04:00:00+00:00,8.61530909589602 +2025-06-02 04:15:00+00:00,13.5869892643189 +2025-06-02 04:30:00+00:00,16.92770543961693 +2025-06-02 04:45:00+00:00,19.76683306516025 +2025-06-02 05:00:00+00:00,17.61837608979624 +2025-06-02 05:15:00+00:00,18.89089561055758 +2025-06-02 05:30:00+00:00,19.4082079386805 +2025-06-02 05:45:00+00:00,19.87967263732483 +2025-06-02 06:00:00+00:00,20.92302783773903 +2025-06-02 06:15:00+00:00,20.678549288389654 +2025-06-02 06:30:00+00:00,21.02281028873076 +2025-06-02 06:45:00+00:00,21.537154380172126 +2025-06-02 07:00:00+00:00,22.253861446852888 +2025-06-02 07:15:00+00:00,22.30330372847645 +2025-06-02 07:30:00+00:00,23.39330406745982 +2025-06-02 07:45:00+00:00,22.07805268188735 +2025-06-02 08:00:00+00:00,22.901928868111312 +2025-06-02 08:15:00+00:00,22.26601708902358 +2025-06-02 08:30:00+00:00,23.64144542863571 +2025-06-02 08:45:00+00:00,25.625074988971114 +2025-06-02 09:00:00+00:00,24.43212805644837 +2025-06-02 09:15:00+00:00,25.211108914632817 +2025-06-02 09:30:00+00:00,26.62289701546224 +2025-06-02 09:45:00+00:00,23.2869163992191 +2025-06-02 10:00:00+00:00,28.596019400772008 +2025-06-02 10:15:00+00:00,29.55964375927042 +2025-06-02 10:30:00+00:00,29.681396485039503 +2025-06-02 10:45:00+00:00,27.39460663545673 +2025-06-02 11:00:00+00:00,29.496020707178392 +2025-06-02 11:15:00+00:00,29.826979763588643 +2025-06-02 11:30:00+00:00,29.283890398937498 +2025-06-02 11:45:00+00:00,27.278505578356366 +2025-06-02 12:00:00+00:00,27.626112453805916 +2025-06-02 12:15:00+00:00,26.522366681213647 +2025-06-02 12:30:00+00:00,25.586362168958683 +2025-06-02 12:45:00+00:00,24.404619639416698 +2025-06-02 13:00:00+00:00,24.59943993444908 +2025-06-02 13:15:00+00:00,23.203024847188733 +2025-06-02 13:30:00+00:00,22.766459257939808 +2025-06-02 13:45:00+00:00,22.312284668949854 +2025-06-02 14:00:00+00:00,21.76071375433267 +2025-06-02 14:15:00+00:00,20.456515961243007 +2025-06-02 14:30:00+00:00,19.320571915167026 +2025-06-02 14:45:00+00:00,17.093103664609675 +2025-06-02 15:00:00+00:00,14.581628232038472 +2025-06-02 15:15:00+00:00,11.707918488145266 +2025-06-02 15:30:00+00:00,8.652867855751822 +2025-06-02 15:45:00+00:00,5.438254256164645 +2025-06-02 16:00:00+00:00,2.8196254348063405 +2025-06-03 03:00:00+00:00,2.590015728898093 +2025-06-03 03:15:00+00:00,5.186814182468111 +2025-06-03 03:30:00+00:00,7.98598924403036 +2025-06-03 03:45:00+00:00,8.523165952009242 +2025-06-03 04:00:00+00:00,10.47417800442944 +2025-06-03 04:15:00+00:00,14.322507610783456 +2025-06-03 04:30:00+00:00,12.679286096473573 +2025-06-03 04:45:00+00:00,17.444443748740817 +2025-06-03 05:00:00+00:00,18.585827277407343 +2025-06-03 05:15:00+00:00,14.862014224089164 +2025-06-03 05:30:00+00:00,12.368327334257293 +2025-06-03 05:45:00+00:00,22.83606043239317 +2025-06-03 06:00:00+00:00,19.972506533293934 +2025-06-03 06:15:00+00:00,16.35344482766009 +2025-06-03 06:30:00+00:00,16.672479080015723 +2025-06-03 06:45:00+00:00,19.566482117970743 +2025-06-03 07:00:00+00:00,26.22797365452835 +2025-06-03 07:15:00+00:00,16.44530236795237 +2025-06-03 07:30:00+00:00,21.486287852331927 +2025-06-03 07:45:00+00:00,24.027382982029092 +2025-06-03 08:00:00+00:00,24.09604110071263 +2025-06-03 08:15:00+00:00,24.53469845722401 +2025-06-03 08:30:00+00:00,25.112460477158656 +2025-06-03 08:45:00+00:00,26.107997046679557 +2025-06-03 09:00:00+00:00,26.653547758624192 +2025-06-03 09:15:00+00:00,27.154353456483303 +2025-06-03 09:30:00+00:00,26.934178503036474 +2025-06-03 09:45:00+00:00,26.40235573168144 +2025-06-03 10:00:00+00:00,29.51793502413769 +2025-06-03 10:15:00+00:00,31.01054660513156 +2025-06-03 10:30:00+00:00,28.56921017735306 +2025-06-03 10:45:00+00:00,28.55321734987915 +2025-06-03 11:00:00+00:00,28.952740418470995 +2025-06-03 11:15:00+00:00,27.67764393005163 +2025-06-03 11:30:00+00:00,29.47463439738693 +2025-06-03 11:45:00+00:00,29.11111541233088 +2025-06-03 12:00:00+00:00,28.23731525341189 +2025-06-03 12:15:00+00:00,26.956409270183563 +2025-06-03 12:30:00+00:00,27.284795401762434 +2025-06-03 12:45:00+00:00,26.646819212588426 +2025-06-03 13:00:00+00:00,24.634815314805863 +2025-06-03 13:15:00+00:00,24.364081945253723 +2025-06-03 13:30:00+00:00,24.032244817857976 +2025-06-03 13:45:00+00:00,23.08226176707272 +2025-06-03 14:00:00+00:00,21.82355300008056 +2025-06-03 14:15:00+00:00,20.49114692186307 +2025-06-03 14:30:00+00:00,18.508098972559132 +2025-06-03 14:45:00+00:00,16.270429706245235 +2025-06-03 15:00:00+00:00,13.4771661938026 +2025-06-03 15:15:00+00:00,11.052908111614592 +2025-06-03 15:30:00+00:00,7.836579416460442 +2025-06-03 15:45:00+00:00,5.298520002374992 +2025-06-03 16:00:00+00:00,3.081566400425316 +2025-06-04 03:15:00+00:00,3.3198415833764194 +2025-06-04 03:30:00+00:00,5.24894757436645 +2025-06-04 03:45:00+00:00,11.067516898119424 +2025-06-04 04:00:00+00:00,13.466402035293505 +2025-06-04 04:15:00+00:00,15.677267907017088 +2025-06-04 04:30:00+00:00,18.365575063980668 +2025-06-04 04:45:00+00:00,13.375306504091151 +2025-06-04 05:00:00+00:00,11.418863913834668 +2025-06-04 05:15:00+00:00,19.527804045822 +2025-06-04 05:30:00+00:00,20.6378735428461 +2025-06-04 05:45:00+00:00,20.34921528709569 +2025-06-04 06:00:00+00:00,20.2255652831967 +2025-06-04 06:15:00+00:00,20.37539078958109 +2025-06-04 06:30:00+00:00,21.79890465384249 +2025-06-04 06:45:00+00:00,21.41217846296558 +2025-06-04 07:00:00+00:00,23.22969565107038 +2025-06-04 07:15:00+00:00,24.17644537078855 +2025-06-04 07:30:00+00:00,23.73652805499015 +2025-06-04 07:45:00+00:00,23.945389819290032 +2025-06-04 08:00:00+00:00,24.13208579693047 +2025-06-04 08:15:00+00:00,24.068306779655963 +2025-06-04 08:30:00+00:00,26.01210654678016 +2025-06-04 08:45:00+00:00,27.01586715382909 +2025-06-04 09:00:00+00:00,26.299295280077835 +2025-06-04 09:15:00+00:00,26.654684726757544 +2025-06-04 09:30:00+00:00,26.964640055285745 +2025-06-04 09:45:00+00:00,28.174282583005667 +2025-06-04 10:00:00+00:00,27.550581245649663 +2025-06-04 10:15:00+00:00,28.419788580789024 +2025-06-04 10:30:00+00:00,27.37939776893072 +2025-06-04 10:45:00+00:00,29.007350868592077 +2025-06-04 11:00:00+00:00,30.09703174506869 +2025-06-04 11:15:00+00:00,28.394124760349666 +2025-06-04 11:30:00+00:00,27.17102933727232 +2025-06-04 11:45:00+00:00,27.709891248439185 +2025-06-04 12:00:00+00:00,27.721662228214335 +2025-06-04 12:15:00+00:00,26.150846733235174 +2025-06-04 12:30:00+00:00,26.238236069512133 +2025-06-04 12:45:00+00:00,26.53498996684007 +2025-06-04 13:00:00+00:00,25.422644510007217 +2025-06-04 13:15:00+00:00,25.414049018280238 +2025-06-04 13:30:00+00:00,25.338071038802706 +2025-06-04 13:45:00+00:00,24.45823426450614 +2025-06-04 14:00:00+00:00,22.465927523594427 +2025-06-04 14:15:00+00:00,21.490199353733246 +2025-06-04 14:30:00+00:00,19.45353932432484 +2025-06-04 14:45:00+00:00,17.092089491459532 +2025-06-04 15:00:00+00:00,14.320825327545831 +2025-06-04 15:15:00+00:00,11.25686124310932 +2025-06-04 15:30:00+00:00,7.889672830935902 +2025-06-04 15:45:00+00:00,5.229891257689081 +2025-06-04 16:00:00+00:00,2.849135331177245 +2025-06-05 03:00:00+00:00,2.5085323951494862 +2025-06-05 03:15:00+00:00,3.6332747132521734 +2025-06-05 03:30:00+00:00,5.096763655433071 +2025-06-05 03:45:00+00:00,5.265997535845317 +2025-06-05 04:00:00+00:00,9.854478377456415 +2025-06-05 04:15:00+00:00,14.922194631042501 +2025-06-05 04:30:00+00:00,16.008550083377678 +2025-06-05 04:45:00+00:00,16.53086965808577 +2025-06-05 05:00:00+00:00,18.6961102077865 +2025-06-05 05:15:00+00:00,19.821251017428857 +2025-06-05 05:30:00+00:00,20.397472625226218 +2025-06-05 05:45:00+00:00,21.005971887930354 +2025-06-05 06:00:00+00:00,20.792850566551234 +2025-06-05 06:15:00+00:00,22.89426659628495 +2025-06-05 06:30:00+00:00,22.4006981346078 +2025-06-05 06:45:00+00:00,22.486252882215364 +2025-06-05 07:00:00+00:00,22.296914227833163 +2025-06-05 07:15:00+00:00,24.203049403358623 +2025-06-05 07:30:00+00:00,24.350045579793086 +2025-06-05 07:45:00+00:00,25.324700774251927 +2025-06-05 08:00:00+00:00,25.29672333800886 +2025-06-05 08:15:00+00:00,24.746171414885556 +2025-06-05 08:30:00+00:00,25.846598893613393 +2025-06-05 08:45:00+00:00,28.545201475998137 +2025-06-05 09:00:00+00:00,28.94753805732894 +2025-06-05 09:15:00+00:00,28.776544174420135 +2025-06-05 09:30:00+00:00,28.96520261914574 +2025-06-05 09:45:00+00:00,30.71945974393394 +2025-06-05 10:00:00+00:00,31.53593384114115 +2025-06-05 10:15:00+00:00,33.445433329466866 +2025-06-05 10:30:00+00:00,30.6387616062595 +2025-06-05 10:45:00+00:00,33.39820285684458 +2025-06-05 11:00:00+00:00,33.775814188983716 +2025-06-05 11:15:00+00:00,33.704191513450844 +2025-06-05 11:30:00+00:00,34.27709237082598 +2025-06-05 11:45:00+00:00,32.265182760003455 +2025-06-05 12:00:00+00:00,32.181112404092914 +2025-06-05 12:15:00+00:00,32.08167732140376 +2025-06-05 12:30:00+00:00,33.30032174322628 +2025-06-05 12:45:00+00:00,31.8893396945963 +2025-06-05 13:00:00+00:00,31.393067404486153 +2025-06-05 13:15:00+00:00,30.409282903700486 +2025-06-05 13:30:00+00:00,28.966363528807037 +2025-06-05 13:45:00+00:00,26.743725981170616 +2025-06-05 14:00:00+00:00,24.69069903185555 +2025-06-05 14:15:00+00:00,22.110912784406644 +2025-06-05 14:30:00+00:00,19.265568804019484 +2025-06-05 14:45:00+00:00,16.485171713701572 +2025-06-05 15:00:00+00:00,13.510686623352237 +2025-06-05 15:15:00+00:00,10.733280562518722 +2025-06-05 15:30:00+00:00,7.795312785603313 +2025-06-05 15:45:00+00:00,4.8735065941911495 +2025-06-05 16:00:00+00:00,2.460720478263025 +2025-06-06 03:15:00+00:00,3.810067691799851 +2025-06-06 03:30:00+00:00,6.552070243611121 +2025-06-06 03:45:00+00:00,9.770342356007827 +2025-06-06 04:00:00+00:00,12.921700589034593 +2025-06-06 04:15:00+00:00,15.422454174586203 +2025-06-06 04:30:00+00:00,17.52595357170325 +2025-06-06 04:45:00+00:00,18.753038075267565 +2025-06-06 05:00:00+00:00,19.614904588134493 +2025-06-06 05:15:00+00:00,21.040716971355227 +2025-06-06 05:30:00+00:00,21.999932515366496 +2025-06-06 05:45:00+00:00,23.991888368291207 +2025-06-06 06:00:00+00:00,25.107791702667694 +2025-06-06 06:15:00+00:00,25.550203418414814 +2025-06-06 06:30:00+00:00,26.24554079074756 +2025-06-06 06:45:00+00:00,26.92238295112936 +2025-06-06 07:00:00+00:00,28.358187059166553 +2025-06-06 07:15:00+00:00,28.5016509450666 +2025-06-06 07:30:00+00:00,29.896112483524416 +2025-06-06 07:45:00+00:00,30.415630354113688 +2025-06-06 08:00:00+00:00,31.71129169551334 +2025-06-06 08:15:00+00:00,33.017713754411055 +2025-06-06 08:30:00+00:00,34.91078973407734 +2025-06-06 08:45:00+00:00,35.100854140479726 +2025-06-06 09:00:00+00:00,36.11825327232349 +2025-06-06 09:15:00+00:00,39.51572222151748 +2025-06-06 09:30:00+00:00,38.36214115498727 +2025-06-06 09:45:00+00:00,38.75853174280658 +2025-06-06 10:00:00+00:00,18.576880389999044 +2025-06-06 10:15:00+00:00,18.58809585515545 +2025-06-06 10:30:00+00:00,18.411280334271925 +2025-06-06 10:45:00+00:00,18.55532839177471 +2025-06-06 11:00:00+00:00,18.38665469476771 +2025-06-06 11:15:00+00:00,18.202814430748276 +2025-06-06 11:30:00+00:00,37.60293642344445 +2025-06-06 11:45:00+00:00,37.238893562333004 +2025-06-06 12:00:00+00:00,37.27662328649543 +2025-06-06 12:15:00+00:00,35.58788620587967 +2025-06-06 12:30:00+00:00,34.45093501484642 +2025-06-06 12:45:00+00:00,33.678819112198504 +2025-06-06 13:00:00+00:00,32.20187507576164 +2025-06-06 13:15:00+00:00,30.06174536522215 +2025-06-06 13:30:00+00:00,28.15544638355507 +2025-06-06 13:45:00+00:00,26.233295741544552 +2025-06-06 14:00:00+00:00,24.42245040845911 +2025-06-06 14:15:00+00:00,22.063026696108572 +2025-06-06 14:30:00+00:00,19.510637416202382 +2025-06-06 14:45:00+00:00,16.717588564850953 +2025-06-06 15:00:00+00:00,13.671279691343207 +2025-06-06 15:15:00+00:00,10.487996210462946 +2025-06-06 15:30:00+00:00,7.345353589292447 +2025-06-06 15:45:00+00:00,4.554631422676183 +2025-06-06 16:00:00+00:00,2.3600420345172517 +2025-06-07 03:00:00+00:00,2.6757847139492403 +2025-06-07 03:15:00+00:00,5.00840147700242 +2025-06-07 03:30:00+00:00,8.032596260722078 +2025-06-07 03:45:00+00:00,10.916361030554977 +2025-06-07 04:00:00+00:00,13.44902612288311 +2025-06-07 04:15:00+00:00,15.479519694004246 +2025-06-07 04:30:00+00:00,17.789805556325398 +2025-06-07 04:45:00+00:00,20.070170169632803 +2025-06-07 05:00:00+00:00,20.92727171310479 +2025-06-07 05:15:00+00:00,21.958033668904154 +2025-06-07 05:30:00+00:00,22.983166284768085 +2025-06-07 05:45:00+00:00,24.095774230296897 +2025-06-07 06:00:00+00:00,23.96853705106394 +2025-06-07 06:15:00+00:00,26.178819571968237 +2025-06-07 06:30:00+00:00,25.797234360842715 +2025-06-07 06:45:00+00:00,26.548739060461426 +2025-06-07 07:00:00+00:00,26.673741408842094 +2025-06-07 07:15:00+00:00,27.975080049243093 +2025-06-07 07:30:00+00:00,29.00676731191882 +2025-06-07 07:45:00+00:00,28.64414102704846 +2025-06-07 08:00:00+00:00,30.142109291828813 +2025-06-07 08:15:00+00:00,27.848133618633923 +2025-06-07 08:30:00+00:00,29.217390942554236 +2025-06-07 08:45:00+00:00,28.459260037309797 +2025-06-07 09:00:00+00:00,30.596969366598806 +2025-06-07 09:15:00+00:00,32.223610541417685 +2025-06-07 09:30:00+00:00,30.252954136165474 +2025-06-07 09:45:00+00:00,31.226290805769754 +2025-06-07 10:00:00+00:00,31.278419969245196 +2025-06-07 10:15:00+00:00,32.39863901587902 +2025-06-07 10:30:00+00:00,32.31520459427642 +2025-06-07 10:45:00+00:00,31.923432480084152 +2025-06-07 11:00:00+00:00,31.534689644042707 +2025-06-07 11:15:00+00:00,30.289358715521914 +2025-06-07 11:30:00+00:00,30.775238306291993 +2025-06-07 11:45:00+00:00,30.723635497155 +2025-06-07 12:00:00+00:00,30.40764867289506 +2025-06-07 12:15:00+00:00,30.243733529182027 +2025-06-07 12:30:00+00:00,29.33822336712841 +2025-06-07 12:45:00+00:00,30.394718693571168 +2025-06-07 13:00:00+00:00,28.944223558906202 +2025-06-07 13:15:00+00:00,27.866253867178717 +2025-06-07 13:30:00+00:00,27.043945222027343 +2025-06-07 13:45:00+00:00,25.42386583260971 +2025-06-07 14:00:00+00:00,24.288672894411746 +2025-06-07 14:15:00+00:00,22.23075699961663 +2025-06-07 14:30:00+00:00,19.815566109077835 +2025-06-07 14:45:00+00:00,16.929637218716845 +2025-06-07 15:00:00+00:00,13.65017036270199 +2025-06-07 15:15:00+00:00,10.388003700507136 +2025-06-07 15:30:00+00:00,7.0498300924238855 +2025-06-07 15:45:00+00:00,4.114358939056794 +2025-06-07 16:00:00+00:00,2.00663383655342 +2025-06-08 03:00:00+00:00,2.440602928565241 +2025-06-08 03:15:00+00:00,4.6663958876614124 +2025-06-08 03:30:00+00:00,7.285599310411611 +2025-06-08 03:45:00+00:00,10.247278148184886 +2025-06-08 04:00:00+00:00,13.05683688816963 +2025-06-08 04:15:00+00:00,15.479161534841303 +2025-06-08 04:30:00+00:00,17.51028533836314 +2025-06-08 04:45:00+00:00,18.16687359429267 +2025-06-08 05:00:00+00:00,19.533219680556687 +2025-06-08 05:15:00+00:00,20.185434242611656 +2025-06-08 05:30:00+00:00,21.082660581601516 +2025-06-08 05:45:00+00:00,22.01938721677586 +2025-06-08 06:00:00+00:00,22.589832126647167 +2025-06-08 06:15:00+00:00,22.970705558059503 +2025-06-08 06:30:00+00:00,23.224841183767403 +2025-06-08 06:45:00+00:00,24.27375249371618 +2025-06-08 07:00:00+00:00,25.061392461043255 +2025-06-08 07:15:00+00:00,25.800599680818593 +2025-06-08 07:30:00+00:00,26.414805240706876 +2025-06-08 07:45:00+00:00,27.06303834132004 +2025-06-08 08:00:00+00:00,26.9554658086019 +2025-06-08 08:15:00+00:00,27.19505111757772 +2025-06-08 08:30:00+00:00,29.174903976757285 +2025-06-08 08:45:00+00:00,30.739543385829652 +2025-06-08 09:00:00+00:00,32.40793034839323 +2025-06-08 09:15:00+00:00,32.864263733336465 +2025-06-08 09:30:00+00:00,34.74316728042675 +2025-06-08 09:45:00+00:00,34.86755309952075 +2025-06-08 10:00:00+00:00,35.07977854411605 +2025-06-08 10:15:00+00:00,34.48958996073335 +2025-06-08 10:30:00+00:00,36.22180747419995 +2025-06-08 10:45:00+00:00,36.26872833453959 +2025-06-08 11:00:00+00:00,35.242534746481496 +2025-06-08 11:15:00+00:00,34.221832741842015 +2025-06-08 11:30:00+00:00,34.80231094848999 +2025-06-08 11:45:00+00:00,34.88183692633897 +2025-06-08 12:00:00+00:00,36.40157792132066 +2025-06-08 12:15:00+00:00,33.962668256162985 +2025-06-08 12:30:00+00:00,32.33557449733087 +2025-06-08 12:45:00+00:00,31.325158711787 +2025-06-08 13:00:00+00:00,31.349271127484553 +2025-06-08 13:15:00+00:00,29.609105740290648 +2025-06-08 13:30:00+00:00,27.912398125530313 +2025-06-08 13:45:00+00:00,26.209500693852906 +2025-06-08 14:00:00+00:00,24.179555742614532 +2025-06-08 14:15:00+00:00,22.132849566581765 +2025-06-08 14:30:00+00:00,19.744277529505695 +2025-06-08 14:45:00+00:00,16.828758542635168 +2025-06-08 15:00:00+00:00,13.803012809745784 +2025-06-08 15:15:00+00:00,10.624965201428049 +2025-06-08 15:30:00+00:00,7.4488892138675755 +2025-06-08 15:45:00+00:00,4.69279395148742 +2025-06-08 16:00:00+00:00,2.45443095218896 +2025-06-09 03:15:00+00:00,2.6025652291139676 +2025-06-09 03:30:00+00:00,3.5082777988279337 +2025-06-09 03:45:00+00:00,5.779168816044465 +2025-06-09 04:00:00+00:00,10.225220064048198 +2025-06-09 04:15:00+00:00,14.193885398945103 +2025-06-09 04:30:00+00:00,14.456501425095698 +2025-06-09 04:45:00+00:00,18.686727582087006 +2025-06-09 05:00:00+00:00,19.243607582608277 +2025-06-09 05:15:00+00:00,20.55075080536682 +2025-06-09 05:30:00+00:00,20.862424093338596 +2025-06-09 05:45:00+00:00,21.80787711028278 +2025-06-09 06:00:00+00:00,22.702187210053797 +2025-06-09 06:15:00+00:00,24.01437982465607 +2025-06-09 06:30:00+00:00,24.80206012384684 +2025-06-09 06:45:00+00:00,25.069232075302487 +2025-06-09 07:00:00+00:00,26.67157777773832 +2025-06-09 07:15:00+00:00,27.46960929564469 +2025-06-09 07:30:00+00:00,28.525310107287602 +2025-06-09 07:45:00+00:00,28.75351440205652 +2025-06-09 08:00:00+00:00,29.726739415768957 +2025-06-09 08:15:00+00:00,29.500849096587093 +2025-06-09 08:30:00+00:00,32.038928676588306 +2025-06-09 08:45:00+00:00,33.0041049238431 +2025-06-09 09:00:00+00:00,33.393273841650455 +2025-06-09 09:15:00+00:00,36.013071308001024 +2025-06-09 09:30:00+00:00,34.75860651297499 +2025-06-09 09:45:00+00:00,35.88987203273241 +2025-06-09 10:00:00+00:00,35.175722285611975 +2025-06-09 10:15:00+00:00,36.387410341038006 +2025-06-09 10:30:00+00:00,36.99029327484935 +2025-06-09 10:45:00+00:00,36.91740127978511 +2025-06-09 11:00:00+00:00,37.46652456663782 +2025-06-09 11:15:00+00:00,37.97230204949608 +2025-06-09 11:30:00+00:00,35.42023408240496 +2025-06-09 11:45:00+00:00,34.342027655783255 +2025-06-09 12:00:00+00:00,36.542705882358156 +2025-06-09 12:15:00+00:00,34.62805973350375 +2025-06-09 12:30:00+00:00,33.78725302298166 +2025-06-09 12:45:00+00:00,32.8004881767062 +2025-06-09 13:00:00+00:00,31.629815276797775 +2025-06-09 13:15:00+00:00,29.98075055196162 +2025-06-09 13:30:00+00:00,27.74318802188513 +2025-06-09 13:45:00+00:00,26.29691646009341 +2025-06-09 14:00:00+00:00,24.56392815563689 +2025-06-09 14:15:00+00:00,22.486254778200948 +2025-06-09 14:30:00+00:00,19.900304074263033 +2025-06-09 14:45:00+00:00,16.978477538716223 +2025-06-09 15:00:00+00:00,13.675211264187308 +2025-06-09 15:15:00+00:00,10.358820257805778 +2025-06-09 15:30:00+00:00,7.474654278293187 +2025-06-09 15:45:00+00:00,4.592549447076841 +2025-06-09 16:00:00+00:00,2.365452013624686 +2025-06-10 03:00:00+00:00,2.393595896647519 +2025-06-10 03:15:00+00:00,4.294228674492056 +2025-06-10 03:30:00+00:00,6.437971809087756 +2025-06-10 03:45:00+00:00,6.681466786916955 +2025-06-10 04:00:00+00:00,8.796111282754307 +2025-06-10 04:15:00+00:00,14.563960913324122 +2025-06-10 04:30:00+00:00,17.502175375366793 +2025-06-10 04:45:00+00:00,18.804201644672194 +2025-06-10 05:00:00+00:00,20.211367620086477 +2025-06-10 05:15:00+00:00,20.703712283233493 +2025-06-10 05:30:00+00:00,22.012686523427597 +2025-06-10 05:45:00+00:00,22.782677142478242 +2025-06-10 06:00:00+00:00,24.399337772086533 +2025-06-10 06:15:00+00:00,24.005777607470982 +2025-06-10 06:30:00+00:00,24.50768443214356 +2025-06-10 06:45:00+00:00,25.204212470413744 +2025-06-10 07:00:00+00:00,25.128443421932587 +2025-06-10 07:15:00+00:00,25.255877730814124 +2025-06-10 07:30:00+00:00,25.961435085858916 +2025-06-10 07:45:00+00:00,26.06458380092354 +2025-06-10 08:00:00+00:00,25.883328095736854 +2025-06-10 08:15:00+00:00,26.876927990520905 +2025-06-10 08:30:00+00:00,28.11585978018225 +2025-06-10 08:45:00+00:00,27.61837411190796 +2025-06-10 09:00:00+00:00,27.399411702227717 +2025-06-10 09:15:00+00:00,28.67564160195855 +2025-06-10 09:30:00+00:00,29.022213138619882 +2025-06-10 09:45:00+00:00,29.006212082057143 +2025-06-10 10:00:00+00:00,29.61211783920732 +2025-06-10 10:15:00+00:00,29.9315929046916 +2025-06-10 10:30:00+00:00,29.123954982737136 +2025-06-10 10:45:00+00:00,29.51478884817382 +2025-06-10 11:00:00+00:00,28.93745856152652 +2025-06-10 11:15:00+00:00,29.12369529937262 +2025-06-10 11:30:00+00:00,29.3046800520932 +2025-06-10 11:45:00+00:00,29.384968613078197 +2025-06-10 12:00:00+00:00,29.40239782573733 +2025-06-10 12:15:00+00:00,29.58681131421335 +2025-06-10 12:30:00+00:00,29.21847677328299 +2025-06-10 12:45:00+00:00,28.817039715109463 +2025-06-10 13:00:00+00:00,27.559206543514524 +2025-06-10 13:15:00+00:00,26.750412954651427 +2025-06-10 13:30:00+00:00,26.086807139929157 +2025-06-10 13:45:00+00:00,24.309386705514193 +2025-06-10 14:00:00+00:00,22.839567731097514 +2025-06-10 14:15:00+00:00,21.079948917898655 +2025-06-10 14:30:00+00:00,18.877073993674028 +2025-06-10 14:45:00+00:00,16.07561303774753 +2025-06-10 15:00:00+00:00,13.287903131010724 +2025-06-10 15:15:00+00:00,10.294015447479635 +2025-06-10 15:30:00+00:00,7.333345281523375 +2025-06-10 15:45:00+00:00,4.624741716347024 +2025-06-10 16:00:00+00:00,2.4670006109835985 +2025-06-11 03:15:00+00:00,1.8859515159136526 +2025-06-11 03:30:00+00:00,3.3904074832343105 +2025-06-11 03:45:00+00:00,4.875261668814852 +2025-06-11 04:00:00+00:00,7.174209319159944 +2025-06-11 04:15:00+00:00,12.000642130105964 +2025-06-11 04:30:00+00:00,14.359500109015938 +2025-06-11 04:45:00+00:00,17.66259577330225 +2025-06-11 05:00:00+00:00,19.35215897454414 +2025-06-11 05:15:00+00:00,21.54183774442643 +2025-06-11 05:30:00+00:00,21.31324516674625 +2025-06-11 05:45:00+00:00,21.802316391828008 +2025-06-11 06:00:00+00:00,23.02393622451184 +2025-06-11 06:15:00+00:00,22.608586779737898 +2025-06-11 06:30:00+00:00,23.64284293863459 +2025-06-11 06:45:00+00:00,24.381366520355243 +2025-06-11 07:00:00+00:00,24.236324585769108 +2025-06-11 07:15:00+00:00,24.6007793111973 +2025-06-11 07:30:00+00:00,26.208678294239323 +2025-06-11 07:45:00+00:00,26.223728324546208 +2025-06-11 08:00:00+00:00,27.465168221211595 +2025-06-11 08:15:00+00:00,27.51893412223894 +2025-06-11 08:30:00+00:00,28.752308007327574 +2025-06-11 08:45:00+00:00,31.46384478650758 +2025-06-11 09:00:00+00:00,32.71237850219232 +2025-06-11 09:15:00+00:00,33.38879446490171 +2025-06-11 09:30:00+00:00,34.01339376788043 +2025-06-11 09:45:00+00:00,34.43491686826852 +2025-06-11 10:00:00+00:00,35.71058372005205 +2025-06-11 10:15:00+00:00,34.82634136804152 +2025-06-11 10:30:00+00:00,36.509639155613705 +2025-06-11 10:45:00+00:00,37.14789264780082 +2025-06-11 11:00:00+00:00,36.71276159040433 +2025-06-11 11:15:00+00:00,36.273619612289885 +2025-06-11 11:30:00+00:00,35.835934051718866 +2025-06-11 11:45:00+00:00,34.95857090837692 +2025-06-11 12:00:00+00:00,34.992268414036126 +2025-06-11 12:15:00+00:00,35.44334214483155 +2025-06-11 12:30:00+00:00,33.66924678841472 +2025-06-11 12:45:00+00:00,32.98629783945918 +2025-06-11 13:00:00+00:00,32.448012965583246 +2025-06-11 13:15:00+00:00,30.84684562552067 +2025-06-11 13:30:00+00:00,29.08811459101025 +2025-06-11 13:45:00+00:00,27.461284199242748 +2025-06-11 14:00:00+00:00,25.162634663934266 +2025-06-11 14:15:00+00:00,22.50927532858035 +2025-06-11 14:30:00+00:00,19.801294048618807 +2025-06-11 14:45:00+00:00,16.744852417565816 +2025-06-11 15:00:00+00:00,13.60906848494549 +2025-06-11 15:15:00+00:00,10.418669076830616 +2025-06-11 15:30:00+00:00,7.245326200815256 +2025-06-11 15:45:00+00:00,4.323305489290492 +2025-06-11 16:00:00+00:00,2.0785998462170743 +2025-06-12 03:00:00+00:00,2.8826657495251276 +2025-06-12 03:15:00+00:00,5.30377303706789 +2025-06-12 03:30:00+00:00,8.381895425917854 +2025-06-12 03:45:00+00:00,11.365412096268896 +2025-06-12 04:00:00+00:00,14.105075162591126 +2025-06-12 04:15:00+00:00,16.511002374592163 +2025-06-12 04:30:00+00:00,18.704722543174547 +2025-06-12 04:45:00+00:00,20.703481932320113 +2025-06-12 05:00:00+00:00,22.237833301500828 +2025-06-12 05:15:00+00:00,24.104040190101113 +2025-06-12 05:30:00+00:00,25.011343330678894 +2025-06-12 05:45:00+00:00,27.196246910867572 +2025-06-12 06:00:00+00:00,28.780948493178713 +2025-06-12 06:15:00+00:00,30.09582855548595 +2025-06-12 06:30:00+00:00,31.27773859426985 +2025-06-12 06:45:00+00:00,33.494597447201635 +2025-06-12 07:00:00+00:00,34.11413906999905 +2025-06-12 07:15:00+00:00,35.098853859386544 +2025-06-12 07:30:00+00:00,36.00094372532734 +2025-06-12 07:45:00+00:00,34.46413429297478 +2025-06-12 08:00:00+00:00,36.06605440850771 +2025-06-12 08:15:00+00:00,35.95270761780415 +2025-06-12 08:30:00+00:00,38.461235656610576 +2025-06-12 08:45:00+00:00,38.11534090760083 +2025-06-12 09:00:00+00:00,18.63753983259675 +2025-06-12 09:15:00+00:00,39.57389806151456 +2025-06-12 09:30:00+00:00,39.675753766308326 +2025-06-12 09:45:00+00:00,18.52335433493058 +2025-06-12 10:00:00+00:00,17.60032838817376 +2025-06-12 10:15:00+00:00,17.645176955507914 +2025-06-12 10:30:00+00:00,16.602576091924448 +2025-06-12 10:45:00+00:00,18.464654577504525 +2025-06-12 11:00:00+00:00,17.368592768485218 +2025-06-12 11:15:00+00:00,17.75173469357623 +2025-06-12 11:30:00+00:00,18.084741537351988 +2025-06-12 11:45:00+00:00,17.245899836616474 +2025-06-12 12:00:00+00:00,17.370121673904574 +2025-06-12 12:15:00+00:00,36.67648091732707 +2025-06-12 12:30:00+00:00,18.02641133546778 +2025-06-12 12:45:00+00:00,17.063373208096117 +2025-06-12 13:00:00+00:00,17.8363680778616 +2025-06-12 13:15:00+00:00,17.522935474862862 +2025-06-12 13:30:00+00:00,30.22805975935597 +2025-06-12 13:45:00+00:00,27.499722039934 +2025-06-12 14:00:00+00:00,24.59878233359012 +2025-06-12 14:15:00+00:00,22.235430916548903 +2025-06-12 14:30:00+00:00,19.36220364567032 +2025-06-12 14:45:00+00:00,16.275176136932753 +2025-06-12 15:00:00+00:00,13.260856947699736 +2025-06-12 15:15:00+00:00,9.86310366651716 +2025-06-12 15:30:00+00:00,6.67394691251394 +2025-06-12 15:45:00+00:00,4.125723977079551 +2025-06-12 16:00:00+00:00,1.924445475551323 +2025-06-13 03:00:00+00:00,2.9659472669436533 +2025-06-13 03:15:00+00:00,5.4211045866527945 +2025-06-13 03:30:00+00:00,8.319873191562259 +2025-06-13 03:45:00+00:00,11.50261791722844 +2025-06-13 04:00:00+00:00,14.349214487058664 +2025-06-13 04:15:00+00:00,16.758059621178102 +2025-06-13 04:30:00+00:00,18.987613469881133 +2025-06-13 04:45:00+00:00,19.762167343431674 +2025-06-13 05:00:00+00:00,21.852335826068124 +2025-06-13 05:15:00+00:00,22.372527579080387 +2025-06-13 05:30:00+00:00,25.104406007440705 +2025-06-13 05:45:00+00:00,25.094551750985765 +2025-06-13 06:00:00+00:00,26.512209052688164 +2025-06-13 06:15:00+00:00,28.226162435179248 +2025-06-13 06:30:00+00:00,28.115084953625303 +2025-06-13 06:45:00+00:00,27.495889139678134 +2025-06-13 07:00:00+00:00,29.05432993583292 +2025-06-13 07:15:00+00:00,29.218579681664437 +2025-06-13 07:30:00+00:00,29.90568578188454 +2025-06-13 07:45:00+00:00,30.592615310196006 +2025-06-13 08:00:00+00:00,31.10436551977041 +2025-06-13 08:15:00+00:00,29.713728430402448 +2025-06-13 08:30:00+00:00,30.994880141107117 +2025-06-13 08:45:00+00:00,33.05971176263061 +2025-06-13 09:00:00+00:00,32.73873528132463 +2025-06-13 09:15:00+00:00,32.865088732056336 +2025-06-13 09:30:00+00:00,32.88818074580025 +2025-06-13 09:45:00+00:00,32.21983089937012 +2025-06-13 10:00:00+00:00,32.600144003936244 +2025-06-13 10:15:00+00:00,33.13087828870606 +2025-06-13 10:30:00+00:00,32.22550270814904 +2025-06-13 10:45:00+00:00,33.30395010156254 +2025-06-13 11:00:00+00:00,32.14564015593116 +2025-06-13 11:15:00+00:00,32.226908188747196 +2025-06-13 11:30:00+00:00,32.303112220177454 +2025-06-13 11:45:00+00:00,31.771225026407826 +2025-06-13 12:00:00+00:00,32.621164894547825 +2025-06-13 12:15:00+00:00,32.01165292247939 +2025-06-13 12:30:00+00:00,31.82374912257882 +2025-06-13 12:45:00+00:00,30.324498354197857 +2025-06-13 13:00:00+00:00,30.545846079323255 +2025-06-13 13:15:00+00:00,28.92063128241637 +2025-06-13 13:30:00+00:00,27.76859512871174 +2025-06-13 13:45:00+00:00,26.32105522588459 +2025-06-13 14:00:00+00:00,24.486956234313016 +2025-06-13 14:15:00+00:00,22.085038678548916 +2025-06-13 14:30:00+00:00,19.616726545950947 +2025-06-13 14:45:00+00:00,17.1180668951781 +2025-06-13 15:00:00+00:00,14.083882616798656 +2025-06-13 15:15:00+00:00,10.91334687995687 +2025-06-13 15:30:00+00:00,7.8754800760389525 +2025-06-13 15:45:00+00:00,4.749884578780411 +2025-06-13 16:00:00+00:00,2.3515309579622334 +2025-06-14 03:00:00+00:00,2.6666046666387544 +2025-06-14 03:15:00+00:00,5.129113479910886 +2025-06-14 03:30:00+00:00,8.077567073772034 +2025-06-14 03:45:00+00:00,11.05724330902404 +2025-06-14 04:00:00+00:00,13.797647701164795 +2025-06-14 04:15:00+00:00,16.03697264461013 +2025-06-14 04:30:00+00:00,17.789697856461213 +2025-06-14 04:45:00+00:00,19.74866735785169 +2025-06-14 05:00:00+00:00,20.11692030403102 +2025-06-14 05:15:00+00:00,20.955602613188912 +2025-06-14 05:30:00+00:00,21.73031046921334 +2025-06-14 05:45:00+00:00,22.21699858719628 +2025-06-14 06:00:00+00:00,23.538084749925027 +2025-06-14 06:15:00+00:00,25.480283229587176 +2025-06-14 06:30:00+00:00,25.62235247942961 +2025-06-14 06:45:00+00:00,27.011850930820184 +2025-06-14 07:00:00+00:00,27.594030942007176 +2025-06-14 07:15:00+00:00,29.31916381960466 +2025-06-14 07:30:00+00:00,29.025878803839536 +2025-06-14 07:45:00+00:00,30.216402928603085 +2025-06-14 08:00:00+00:00,29.792108767651726 +2025-06-14 08:15:00+00:00,31.326278419748164 +2025-06-14 08:30:00+00:00,33.360803741754815 +2025-06-14 08:45:00+00:00,33.63487473385928 +2025-06-14 09:00:00+00:00,34.37308558717997 +2025-06-14 09:15:00+00:00,35.51269548316887 +2025-06-14 09:30:00+00:00,36.42194211246616 +2025-06-14 09:45:00+00:00,37.93536992859117 +2025-06-14 10:00:00+00:00,37.969545829535626 +2025-06-14 10:15:00+00:00,39.22428454037875 +2025-06-14 10:30:00+00:00,38.889439204453964 +2025-06-14 10:45:00+00:00,38.723261888302495 +2025-06-14 11:00:00+00:00,38.05145912829559 +2025-06-14 11:15:00+00:00,38.283012453956765 +2025-06-14 11:30:00+00:00,37.915924605267435 +2025-06-14 11:45:00+00:00,37.54397918474171 +2025-06-14 12:00:00+00:00,18.317133249654155 +2025-06-14 12:15:00+00:00,35.94481102235945 +2025-06-14 12:30:00+00:00,34.6869467067324 +2025-06-14 12:45:00+00:00,33.47846606926112 +2025-06-14 13:00:00+00:00,32.16296701608016 +2025-06-14 13:15:00+00:00,30.51173411181967 +2025-06-14 13:30:00+00:00,28.742715963362635 +2025-06-14 13:45:00+00:00,26.747292923186038 +2025-06-14 14:00:00+00:00,24.706102259067652 +2025-06-14 14:15:00+00:00,22.03441435017962 +2025-06-14 14:30:00+00:00,19.368641785602442 +2025-06-14 14:45:00+00:00,16.417900285309603 +2025-06-14 15:00:00+00:00,13.628585335243955 +2025-06-14 15:15:00+00:00,10.622666752465122 +2025-06-14 15:30:00+00:00,7.669508516194446 +2025-06-14 15:45:00+00:00,4.649467742844383 +2025-06-14 16:00:00+00:00,2.377734864291665 +2025-06-15 03:15:00+00:00,2.7228457734207088 +2025-06-15 03:30:00+00:00,5.023502340288043 +2025-06-15 03:45:00+00:00,7.432969306940324 +2025-06-15 04:00:00+00:00,9.103826713121505 +2025-06-15 04:15:00+00:00,11.368784727566865 +2025-06-15 04:30:00+00:00,17.321637431254548 +2025-06-15 04:45:00+00:00,19.57336248219262 +2025-06-15 05:00:00+00:00,20.331974805063737 +2025-06-15 05:15:00+00:00,21.621870663034752 +2025-06-15 05:30:00+00:00,22.063705407286555 +2025-06-15 05:45:00+00:00,24.141004989819677 +2025-06-15 06:00:00+00:00,24.273317630059324 +2025-06-15 06:15:00+00:00,25.758146930943052 +2025-06-15 06:30:00+00:00,26.648521554802045 +2025-06-15 06:45:00+00:00,26.638151242522564 +2025-06-15 07:00:00+00:00,28.242273447058697 +2025-06-15 07:15:00+00:00,29.70991877470232 +2025-06-15 07:30:00+00:00,31.00432884961753 +2025-06-15 07:45:00+00:00,30.722019680583728 +2025-06-15 08:00:00+00:00,32.41514431213684 +2025-06-15 08:15:00+00:00,30.917006444809566 +2025-06-15 08:30:00+00:00,34.20997218081801 +2025-06-15 08:45:00+00:00,33.3499116735238 +2025-06-15 09:00:00+00:00,33.683650223908394 +2025-06-15 09:15:00+00:00,35.562223756918996 +2025-06-15 09:30:00+00:00,37.37614140470018 +2025-06-15 09:45:00+00:00,36.143374182703944 +2025-06-15 10:00:00+00:00,35.271582024317624 +2025-06-15 10:15:00+00:00,35.158095873635844 +2025-06-15 10:30:00+00:00,36.52857104556358 +2025-06-15 10:45:00+00:00,34.7144222323879 +2025-06-15 11:00:00+00:00,35.700558240010594 +2025-06-15 11:15:00+00:00,34.712987524470094 +2025-06-15 11:30:00+00:00,34.67583399286017 +2025-06-15 11:45:00+00:00,34.81429854992273 +2025-06-15 12:00:00+00:00,34.91174590526536 +2025-06-15 12:15:00+00:00,32.916933941041925 +2025-06-15 12:30:00+00:00,32.86485073366624 +2025-06-15 12:45:00+00:00,31.745578467107418 +2025-06-15 13:00:00+00:00,30.338394691846993 +2025-06-15 13:15:00+00:00,29.131577352414023 +2025-06-15 13:30:00+00:00,28.010302955071555 +2025-06-15 13:45:00+00:00,26.63548620978325 +2025-06-15 14:00:00+00:00,24.965600905136288 +2025-06-15 14:15:00+00:00,22.8317985154442 +2025-06-15 14:30:00+00:00,20.357183731948542 +2025-06-15 14:45:00+00:00,17.810809551072943 +2025-06-15 15:00:00+00:00,14.707203966017417 +2025-06-15 15:15:00+00:00,11.14595943970494 +2025-06-15 15:30:00+00:00,8.110512174825224 +2025-06-15 15:45:00+00:00,5.088619491090444 +2025-06-15 16:00:00+00:00,2.603546466541148 +2025-06-16 03:00:00+00:00,2.3449173684475437 +2025-06-16 03:15:00+00:00,6.17755159429865 +2025-06-16 03:30:00+00:00,8.490869712326951 +2025-06-16 03:45:00+00:00,10.692041706618124 +2025-06-16 04:00:00+00:00,11.60578011753801 +2025-06-16 04:15:00+00:00,12.47692755109923 +2025-06-16 04:30:00+00:00,13.219502034521964 +2025-06-16 04:45:00+00:00,19.881628967869382 +2025-06-16 05:00:00+00:00,20.210783538010453 +2025-06-16 05:15:00+00:00,20.873562404478164 +2025-06-16 05:30:00+00:00,21.405047029649438 +2025-06-16 05:45:00+00:00,21.141506810965108 +2025-06-16 06:00:00+00:00,22.823684575292056 +2025-06-16 06:15:00+00:00,24.0312253144172 +2025-06-16 06:30:00+00:00,23.930036935468447 +2025-06-16 06:45:00+00:00,25.30389520155441 +2025-06-16 07:00:00+00:00,25.00631541736297 +2025-06-16 07:15:00+00:00,24.50931475571359 +2025-06-16 07:30:00+00:00,24.323219572775944 +2025-06-16 07:45:00+00:00,25.771050154620703 +2025-06-16 08:00:00+00:00,24.735014787032757 +2025-06-16 08:15:00+00:00,25.844113607432252 +2025-06-16 08:30:00+00:00,27.407513411981324 +2025-06-16 08:45:00+00:00,25.810349126569584 +2025-06-16 09:00:00+00:00,26.993942470184393 +2025-06-16 09:15:00+00:00,29.481762374183006 +2025-06-16 09:30:00+00:00,29.294094915067397 +2025-06-16 09:45:00+00:00,30.551514031279353 +2025-06-16 10:00:00+00:00,29.940921175298463 +2025-06-16 10:15:00+00:00,29.057166788698428 +2025-06-16 10:30:00+00:00,27.986747312777208 +2025-06-16 10:45:00+00:00,27.645533454180782 +2025-06-16 11:00:00+00:00,28.54801927852012 +2025-06-16 11:15:00+00:00,29.545622846575178 +2025-06-16 11:30:00+00:00,28.733134465545948 +2025-06-16 11:45:00+00:00,27.934939828203657 +2025-06-16 12:00:00+00:00,27.86285154826326 +2025-06-16 12:15:00+00:00,27.699776116722422 +2025-06-16 12:30:00+00:00,28.205400654621553 +2025-06-16 12:45:00+00:00,28.233431713703492 +2025-06-16 13:00:00+00:00,28.006254639179627 +2025-06-16 13:15:00+00:00,27.553046853165768 +2025-06-16 13:30:00+00:00,26.2934121632138 +2025-06-16 13:45:00+00:00,25.451955293342067 +2025-06-16 14:00:00+00:00,23.47922053814988 +2025-06-16 14:15:00+00:00,21.66776610902244 +2025-06-16 14:30:00+00:00,19.396394986224777 +2025-06-16 14:45:00+00:00,17.272853971210147 +2025-06-16 15:00:00+00:00,14.186131462124587 +2025-06-16 15:15:00+00:00,10.867044506576942 +2025-06-16 15:30:00+00:00,7.895447219921033 +2025-06-16 15:45:00+00:00,5.192593484136013 +2025-06-16 16:00:00+00:00,2.822081236683701 +2025-06-17 03:30:00+00:00,2.887104880485639 +2025-06-17 03:45:00+00:00,5.1932943473746755 +2025-06-17 04:00:00+00:00,6.7409663335717065 +2025-06-17 04:15:00+00:00,10.538080092946519 +2025-06-17 04:30:00+00:00,12.39144219950709 +2025-06-17 04:45:00+00:00,19.143360644856763 +2025-06-17 05:00:00+00:00,18.272282986730424 +2025-06-17 05:15:00+00:00,20.106316728724195 +2025-06-17 05:30:00+00:00,19.29518006395215 +2025-06-17 05:45:00+00:00,20.044171111621246 +2025-06-17 06:00:00+00:00,19.986870167695848 +2025-06-17 06:15:00+00:00,21.56574664274694 +2025-06-17 06:30:00+00:00,21.23246564191259 +2025-06-17 06:45:00+00:00,21.374492645041546 +2025-06-17 07:00:00+00:00,22.04091355477119 +2025-06-17 07:15:00+00:00,23.320183055671077 +2025-06-17 07:30:00+00:00,22.34028425180187 +2025-06-17 07:45:00+00:00,24.21970554864249 +2025-06-17 08:00:00+00:00,23.572851160379077 +2025-06-17 08:15:00+00:00,23.57925574626627 +2025-06-17 08:30:00+00:00,23.069237615818636 +2025-06-17 08:45:00+00:00,25.758647171529827 +2025-06-17 09:00:00+00:00,25.49770557531877 +2025-06-17 09:15:00+00:00,26.54852106931952 +2025-06-17 09:30:00+00:00,27.42948454375816 +2025-06-17 09:45:00+00:00,28.40088818402997 +2025-06-17 10:00:00+00:00,27.49820088648233 +2025-06-17 10:15:00+00:00,29.333969463964937 +2025-06-17 10:30:00+00:00,29.93619411598203 +2025-06-17 10:45:00+00:00,29.7225866621858 +2025-06-17 11:00:00+00:00,29.50999428036722 +2025-06-17 11:15:00+00:00,29.78843052958055 +2025-06-17 11:30:00+00:00,29.774190690057992 +2025-06-17 11:45:00+00:00,30.744826871931647 +2025-06-17 12:00:00+00:00,31.465157839969297 +2025-06-17 12:15:00+00:00,30.71289306336716 +2025-06-17 12:30:00+00:00,30.87931508303421 +2025-06-17 12:45:00+00:00,32.017842185058406 +2025-06-17 13:00:00+00:00,29.497772731144245 +2025-06-17 13:15:00+00:00,28.211476207958444 +2025-06-17 13:30:00+00:00,27.21005301523964 +2025-06-17 13:45:00+00:00,25.61560689392019 +2025-06-17 14:00:00+00:00,23.995114268738977 +2025-06-17 14:15:00+00:00,22.003597053954003 +2025-06-17 14:30:00+00:00,19.60263659457749 +2025-06-17 14:45:00+00:00,16.78703375717831 +2025-06-17 15:00:00+00:00,13.98968747015372 +2025-06-17 15:15:00+00:00,10.932310083619189 +2025-06-17 15:30:00+00:00,7.79450640708248 +2025-06-17 15:45:00+00:00,4.8427293843024355 +2025-06-17 16:00:00+00:00,2.532667561139532 +2025-06-18 03:00:00+00:00,1.9019136530185432 +2025-06-18 03:15:00+00:00,3.778634603027111 +2025-06-18 03:30:00+00:00,4.590409564108794 +2025-06-18 03:45:00+00:00,7.800006318230259 +2025-06-18 04:00:00+00:00,9.821357987244776 +2025-06-18 04:15:00+00:00,12.721630362904481 +2025-06-18 04:30:00+00:00,18.611647108768793 +2025-06-18 04:45:00+00:00,19.65256282382113 +2025-06-18 05:00:00+00:00,19.72666095647203 +2025-06-18 05:15:00+00:00,20.435481527394458 +2025-06-18 05:30:00+00:00,20.707371738477562 +2025-06-18 05:45:00+00:00,21.4380209960704 +2025-06-18 06:00:00+00:00,22.221799650141477 +2025-06-18 06:15:00+00:00,21.966079942277503 +2025-06-18 06:30:00+00:00,22.34147375052518 +2025-06-18 06:45:00+00:00,23.44586978647595 +2025-06-18 07:00:00+00:00,23.699173339101634 +2025-06-18 07:15:00+00:00,23.8344648925662 +2025-06-18 07:30:00+00:00,22.869155074865112 +2025-06-18 07:45:00+00:00,24.931164336558 +2025-06-18 08:00:00+00:00,23.8764790408079 +2025-06-18 08:15:00+00:00,24.75751941603056 +2025-06-18 08:30:00+00:00,24.658333087644372 +2025-06-18 08:45:00+00:00,25.11880206829123 +2025-06-18 09:00:00+00:00,26.17219121113534 +2025-06-18 09:15:00+00:00,27.037821364117978 +2025-06-18 09:30:00+00:00,25.76054563027298 +2025-06-18 09:45:00+00:00,26.942995062552747 +2025-06-18 10:00:00+00:00,26.750184191733823 +2025-06-18 10:15:00+00:00,27.779766284584618 +2025-06-18 10:30:00+00:00,27.4448851589991 +2025-06-18 10:45:00+00:00,27.112965327484766 +2025-06-18 11:00:00+00:00,28.41894729152928 +2025-06-18 11:15:00+00:00,27.16690300485081 +2025-06-18 11:30:00+00:00,28.054715245607245 +2025-06-18 11:45:00+00:00,27.973861597197487 +2025-06-18 12:00:00+00:00,28.235480107933803 +2025-06-18 12:15:00+00:00,28.00192723282263 +2025-06-18 12:30:00+00:00,30.173237354152967 +2025-06-18 12:45:00+00:00,28.01816587221525 +2025-06-18 13:00:00+00:00,28.012773439404256 +2025-06-18 13:15:00+00:00,27.15970847680074 +2025-06-18 13:30:00+00:00,26.08049602881836 +2025-06-18 13:45:00+00:00,25.135051674637488 +2025-06-18 14:00:00+00:00,23.346382126085146 +2025-06-18 14:15:00+00:00,21.770221969262842 +2025-06-18 14:30:00+00:00,19.628187952350437 +2025-06-18 14:45:00+00:00,17.074033181828888 +2025-06-18 15:00:00+00:00,14.168555363705025 +2025-06-18 15:15:00+00:00,10.832418117098776 +2025-06-18 15:30:00+00:00,7.694365426579399 +2025-06-18 15:45:00+00:00,4.732701880307568 +2025-06-18 16:00:00+00:00,2.481852624139096 +2025-06-19 03:00:00+00:00,2.557840362439834 +2025-06-19 03:15:00+00:00,3.82241735004057 +2025-06-19 03:30:00+00:00,7.021249185514838 +2025-06-19 03:45:00+00:00,10.06665404565548 +2025-06-19 04:00:00+00:00,13.465215740027464 +2025-06-19 04:15:00+00:00,15.689320092644865 +2025-06-19 04:30:00+00:00,17.689898009744024 +2025-06-19 04:45:00+00:00,19.498905361562706 +2025-06-19 05:00:00+00:00,20.01799124368369 +2025-06-19 05:15:00+00:00,21.305616284375027 +2025-06-19 05:30:00+00:00,19.777043788566683 +2025-06-19 05:45:00+00:00,20.63520377018523 +2025-06-19 06:00:00+00:00,21.981452970842327 +2025-06-19 06:15:00+00:00,22.49057757665217 +2025-06-19 06:30:00+00:00,24.309395532569695 +2025-06-19 06:45:00+00:00,24.458590021381028 +2025-06-19 07:00:00+00:00,25.508871647765723 +2025-06-19 07:15:00+00:00,25.902183068111622 +2025-06-19 07:30:00+00:00,26.408466020283598 +2025-06-19 07:45:00+00:00,28.704304404760343 +2025-06-19 08:00:00+00:00,27.350222663807774 +2025-06-19 08:15:00+00:00,28.571635832840727 +2025-06-19 08:30:00+00:00,28.70638332261674 +2025-06-19 08:45:00+00:00,31.247092226906666 +2025-06-19 09:00:00+00:00,32.83303611324156 +2025-06-19 09:15:00+00:00,34.41159170108968 +2025-06-19 09:30:00+00:00,36.032055908595595 +2025-06-19 09:45:00+00:00,34.24281915628494 +2025-06-19 10:00:00+00:00,37.694633234456376 +2025-06-19 10:15:00+00:00,35.94060247725767 +2025-06-19 10:30:00+00:00,37.906460161488354 +2025-06-19 10:45:00+00:00,37.6081433258856 +2025-06-19 11:00:00+00:00,37.31056095134748 +2025-06-19 11:15:00+00:00,37.50304084578204 +2025-06-19 11:30:00+00:00,37.32889700710567 +2025-06-19 11:45:00+00:00,35.08295019327222 +2025-06-19 12:00:00+00:00,35.15998057949447 +2025-06-19 12:15:00+00:00,34.55140208169422 +2025-06-19 12:30:00+00:00,33.78861596159013 +2025-06-19 12:45:00+00:00,32.239783482670475 +2025-06-19 13:00:00+00:00,30.595791646507703 +2025-06-19 13:15:00+00:00,29.934430911780062 +2025-06-19 13:30:00+00:00,28.044112675783026 +2025-06-19 13:45:00+00:00,26.492747945304938 +2025-06-19 14:00:00+00:00,24.496997598465324 +2025-06-19 14:15:00+00:00,22.076104162907722 +2025-06-19 14:30:00+00:00,19.392248062615856 +2025-06-19 14:45:00+00:00,16.679075031012378 +2025-06-19 15:00:00+00:00,13.669990602594995 +2025-06-19 15:15:00+00:00,10.599090420061934 +2025-06-19 15:30:00+00:00,7.52452004753621 +2025-06-19 15:45:00+00:00,4.590579385124623 +2025-06-19 16:00:00+00:00,2.4417890047117106 +2025-06-20 03:15:00+00:00,3.207839420567548 +2025-06-20 03:30:00+00:00,4.939764954252969 +2025-06-20 03:45:00+00:00,9.571176358033105 +2025-06-20 04:00:00+00:00,12.180601834298779 +2025-06-20 04:15:00+00:00,15.591619094587594 +2025-06-20 04:30:00+00:00,18.424106390530845 +2025-06-20 04:45:00+00:00,20.11791524442959 +2025-06-20 05:00:00+00:00,20.09890519115751 +2025-06-20 05:15:00+00:00,20.793363899608835 +2025-06-20 05:30:00+00:00,21.748544913404963 +2025-06-20 05:45:00+00:00,22.44095436545918 +2025-06-20 06:00:00+00:00,23.085872293239458 +2025-06-20 06:15:00+00:00,23.206846438264616 +2025-06-20 06:30:00+00:00,23.71913198657581 +2025-06-20 06:45:00+00:00,23.395257581982342 +2025-06-20 07:00:00+00:00,24.393487515944923 +2025-06-20 07:15:00+00:00,24.894871661333532 +2025-06-20 07:30:00+00:00,24.964823700030855 +2025-06-20 07:45:00+00:00,25.380776394847704 +2025-06-20 08:00:00+00:00,25.709266500114676 +2025-06-20 08:15:00+00:00,24.628283632871593 +2025-06-20 08:30:00+00:00,26.409874297945137 +2025-06-20 08:45:00+00:00,27.289941521950812 +2025-06-20 09:00:00+00:00,27.113858748291243 +2025-06-20 09:15:00+00:00,27.938457191641486 +2025-06-20 09:30:00+00:00,27.39945390350659 +2025-06-20 09:45:00+00:00,27.760495637949962 +2025-06-20 10:00:00+00:00,28.286126574394416 +2025-06-20 10:15:00+00:00,27.794571153710034 +2025-06-20 10:30:00+00:00,28.09805752455211 +2025-06-20 10:45:00+00:00,28.400985760740497 +2025-06-20 11:00:00+00:00,29.156141818407388 +2025-06-20 11:15:00+00:00,29.085783803568425 +2025-06-20 11:30:00+00:00,28.769500991993205 +2025-06-20 11:45:00+00:00,28.28889511315764 +2025-06-20 12:00:00+00:00,28.329360114322636 +2025-06-20 12:15:00+00:00,28.720729373577175 +2025-06-20 12:30:00+00:00,28.266702156121323 +2025-06-20 12:45:00+00:00,27.94561329611726 +2025-06-20 13:00:00+00:00,28.361166850467292 +2025-06-20 13:15:00+00:00,26.951014457243122 +2025-06-20 13:30:00+00:00,25.782979562574223 +2025-06-20 13:45:00+00:00,25.246838613501055 +2025-06-20 14:00:00+00:00,23.953012742874634 +2025-06-20 14:15:00+00:00,21.76735901490899 +2025-06-20 14:30:00+00:00,19.885117133935466 +2025-06-20 14:45:00+00:00,17.30149076511762 +2025-06-20 15:00:00+00:00,14.19599846947266 +2025-06-20 15:15:00+00:00,11.062499141811067 +2025-06-20 15:30:00+00:00,7.805766185791172 +2025-06-20 15:45:00+00:00,4.97900286629195 +2025-06-20 16:00:00+00:00,2.5279256978851006 +2025-06-21 03:00:00+00:00,3.183973871567969 +2025-06-21 03:15:00+00:00,5.697826421800244 +2025-06-21 03:30:00+00:00,8.61342069312356 +2025-06-21 03:45:00+00:00,11.465974579471817 +2025-06-21 04:00:00+00:00,14.026719510920856 +2025-06-21 04:15:00+00:00,16.014851944606512 +2025-06-21 04:30:00+00:00,17.98556060366053 +2025-06-21 04:45:00+00:00,20.053745972158424 +2025-06-21 05:00:00+00:00,20.375065791747822 +2025-06-21 05:15:00+00:00,21.625802654514114 +2025-06-21 05:30:00+00:00,21.66706436909004 +2025-06-21 05:45:00+00:00,22.16411576889981 +2025-06-21 06:00:00+00:00,23.00649447562273 +2025-06-21 06:15:00+00:00,23.567620702721797 +2025-06-21 06:30:00+00:00,23.862666100414636 +2025-06-21 06:45:00+00:00,25.3009413443702 +2025-06-21 07:00:00+00:00,26.414883770914994 +2025-06-21 07:15:00+00:00,26.70994367679311 +2025-06-21 07:30:00+00:00,27.32257047252975 +2025-06-21 07:45:00+00:00,27.76982268710408 +2025-06-21 08:00:00+00:00,28.957438260655902 +2025-06-21 08:15:00+00:00,29.302145445850517 +2025-06-21 08:30:00+00:00,30.717839770642733 +2025-06-21 08:45:00+00:00,31.763509560736143 +2025-06-21 09:00:00+00:00,33.69944270629919 +2025-06-21 09:15:00+00:00,35.26468940910848 +2025-06-21 09:30:00+00:00,34.71774472886566 +2025-06-21 09:45:00+00:00,34.703536416874186 +2025-06-21 10:00:00+00:00,36.38036389514074 +2025-06-21 10:15:00+00:00,18.440223744698216 +2025-06-21 10:30:00+00:00,38.64579558233554 +2025-06-21 10:45:00+00:00,37.26139934273335 +2025-06-21 11:00:00+00:00,36.75378633919031 +2025-06-21 11:15:00+00:00,38.410423344306416 +2025-06-21 11:30:00+00:00,37.35481936228848 +2025-06-21 11:45:00+00:00,35.96503433138427 +2025-06-21 12:00:00+00:00,35.363291266450304 +2025-06-21 12:15:00+00:00,35.49645691113311 +2025-06-21 12:30:00+00:00,34.74892386899786 +2025-06-21 12:45:00+00:00,33.52674530040453 +2025-06-21 13:00:00+00:00,32.52546744332122 +2025-06-21 13:15:00+00:00,30.523209402995338 +2025-06-21 13:30:00+00:00,29.408290039847103 +2025-06-21 13:45:00+00:00,27.31010189367266 +2025-06-21 14:00:00+00:00,24.472717820600565 +2025-06-21 14:15:00+00:00,21.865591178117082 +2025-06-21 14:30:00+00:00,19.46713825668102 +2025-06-21 14:45:00+00:00,16.82152716815684 +2025-06-21 15:00:00+00:00,13.691918546073346 +2025-06-21 15:15:00+00:00,10.386974115233345 +2025-06-21 15:30:00+00:00,7.562915240301507 +2025-06-21 15:45:00+00:00,4.781237623984927 +2025-06-21 16:00:00+00:00,2.450314370132547 +2025-06-22 03:00:00+00:00,2.4439648362178614 +2025-06-22 03:15:00+00:00,5.306667795682249 +2025-06-22 03:30:00+00:00,4.509953246037176 +2025-06-22 03:45:00+00:00,6.565197282581284 +2025-06-22 04:00:00+00:00,8.069624508042065 +2025-06-22 04:15:00+00:00,10.541109645632236 +2025-06-22 04:30:00+00:00,12.012752608777514 +2025-06-22 04:45:00+00:00,19.715870943612806 +2025-06-22 05:00:00+00:00,20.890372290681807 +2025-06-22 05:15:00+00:00,21.879525870687967 +2025-06-22 05:30:00+00:00,22.10525425729376 +2025-06-22 05:45:00+00:00,22.191077805483427 +2025-06-22 06:00:00+00:00,22.637126378914637 +2025-06-22 06:15:00+00:00,22.318085737284964 +2025-06-22 06:30:00+00:00,23.836251833773577 +2025-06-22 06:45:00+00:00,24.17412285378622 +2025-06-22 07:00:00+00:00,24.195536626551153 +2025-06-22 07:15:00+00:00,24.05288759460175 +2025-06-22 07:30:00+00:00,24.99344383390948 +2025-06-22 07:45:00+00:00,25.722826742178377 +2025-06-22 08:00:00+00:00,26.477256437874104 +2025-06-22 08:15:00+00:00,26.160317299873984 +2025-06-22 08:30:00+00:00,27.062478625484918 +2025-06-22 08:45:00+00:00,28.93447988916987 +2025-06-22 09:00:00+00:00,28.704478720929703 +2025-06-22 09:15:00+00:00,29.80837056559184 +2025-06-22 09:30:00+00:00,27.84715474558907 +2025-06-22 09:45:00+00:00,28.38577704492878 +2025-06-22 10:00:00+00:00,29.493543151334016 +2025-06-22 10:15:00+00:00,28.691176952121 +2025-06-22 10:30:00+00:00,28.63454398633691 +2025-06-22 10:45:00+00:00,28.577884503169734 +2025-06-22 11:00:00+00:00,28.91508740618762 +2025-06-22 11:15:00+00:00,29.178115107123315 +2025-06-22 11:30:00+00:00,29.38362690178288 +2025-06-22 11:45:00+00:00,29.359646073378485 +2025-06-22 12:00:00+00:00,29.409703119836028 +2025-06-22 12:15:00+00:00,29.100845596560696 +2025-06-22 12:30:00+00:00,29.221577455885456 +2025-06-22 12:45:00+00:00,29.18601098171038 +2025-06-22 13:00:00+00:00,28.75286270968752 +2025-06-22 13:15:00+00:00,27.581158044412106 +2025-06-22 13:30:00+00:00,27.022636962992614 +2025-06-22 13:45:00+00:00,25.53661227909012 +2025-06-22 14:00:00+00:00,24.085978627553253 +2025-06-22 14:15:00+00:00,22.35917537974735 +2025-06-22 14:30:00+00:00,20.12042518100854 +2025-06-22 14:45:00+00:00,17.290357038644398 +2025-06-22 15:00:00+00:00,14.543845958049165 +2025-06-22 15:15:00+00:00,11.286314461449988 +2025-06-22 15:30:00+00:00,7.885663940452822 +2025-06-22 15:45:00+00:00,4.848855857937397 +2025-06-22 16:00:00+00:00,2.4373637564052117 +2025-06-23 03:00:00+00:00,2.4934465149356213 +2025-06-23 03:15:00+00:00,2.549950353476131 +2025-06-23 03:30:00+00:00,5.680267002327394 +2025-06-23 03:45:00+00:00,5.893201024827304 +2025-06-23 04:00:00+00:00,11.967893035717998 +2025-06-23 04:15:00+00:00,11.653965749897068 +2025-06-23 04:30:00+00:00,17.681572617718718 +2025-06-23 04:45:00+00:00,9.065144744380161 +2025-06-23 05:00:00+00:00,22.00582448967711 +2025-06-23 05:15:00+00:00,22.569219281327985 +2025-06-23 05:30:00+00:00,17.665816142807675 +2025-06-23 05:45:00+00:00,18.22892144006372 +2025-06-23 06:00:00+00:00,23.33500024501806 +2025-06-23 06:15:00+00:00,16.220173315449614 +2025-06-23 06:30:00+00:00,24.008069043645673 +2025-06-23 06:45:00+00:00,23.635631293952876 +2025-06-23 07:00:00+00:00,24.139109284781487 +2025-06-23 07:15:00+00:00,25.51087204464749 +2025-06-23 07:30:00+00:00,26.290263028856018 +2025-06-23 07:45:00+00:00,26.584755286105814 +2025-06-23 08:00:00+00:00,27.03735172195685 +2025-06-23 08:15:00+00:00,28.31380561360749 +2025-06-23 08:30:00+00:00,28.102517488487056 +2025-06-23 08:45:00+00:00,31.53978755090634 +2025-06-23 09:00:00+00:00,31.0351997024778 +2025-06-23 09:15:00+00:00,30.569362347578554 +2025-06-23 09:30:00+00:00,34.28890811626565 +2025-06-23 09:45:00+00:00,34.570115532607815 +2025-06-23 10:00:00+00:00,37.022514769478406 +2025-06-23 10:15:00+00:00,35.4163915863001 +2025-06-23 10:30:00+00:00,33.80413027757922 +2025-06-23 10:45:00+00:00,33.69381135201028 +2025-06-23 11:00:00+00:00,33.633131434863294 +2025-06-23 11:15:00+00:00,34.221458496199546 +2025-06-23 11:30:00+00:00,36.43998069923145 +2025-06-23 11:45:00+00:00,34.0133850964563 +2025-06-23 12:00:00+00:00,35.331077204169205 +2025-06-23 12:15:00+00:00,34.6830577434181 +2025-06-23 12:30:00+00:00,32.732632912534974 +2025-06-23 12:45:00+00:00,31.904515689798327 +2025-06-23 13:00:00+00:00,29.609875195777935 +2025-06-23 13:15:00+00:00,12.88127618086405 +2025-06-23 13:30:00+00:00,26.916030552105628 +2025-06-23 13:45:00+00:00,25.490046997534638 +2025-06-23 14:00:00+00:00,23.376520378428857 +2025-06-23 14:15:00+00:00,21.46395154339691 +2025-06-23 14:30:00+00:00,19.196663669505433 +2025-06-23 14:45:00+00:00,16.699713561729222 +2025-06-23 15:00:00+00:00,13.97449814404565 +2025-06-23 15:15:00+00:00,10.851112355200419 +2025-06-23 15:30:00+00:00,7.829076938538672 +2025-06-23 15:45:00+00:00,5.181582068167554 +2025-06-23 16:00:00+00:00,2.92968223699941 +2025-06-24 03:15:00+00:00,4.225637296177596 +2025-06-24 03:30:00+00:00,7.126444644014594 +2025-06-24 03:45:00+00:00,10.331661835347443 +2025-06-24 04:00:00+00:00,13.541496415685288 +2025-06-24 04:15:00+00:00,13.760134244297994 +2025-06-24 04:30:00+00:00,15.848135866644986 +2025-06-24 04:45:00+00:00,20.381913706819503 +2025-06-24 05:00:00+00:00,21.24574951593422 +2025-06-24 05:15:00+00:00,21.770021572368194 +2025-06-24 05:30:00+00:00,21.88462411702315 +2025-06-24 05:45:00+00:00,22.564083016225965 +2025-06-24 06:00:00+00:00,22.439059566182866 +2025-06-24 06:15:00+00:00,23.957502649991163 +2025-06-24 06:30:00+00:00,23.743653741156425 +2025-06-24 06:45:00+00:00,24.37698551624524 +2025-06-24 07:00:00+00:00,25.278325254818803 +2025-06-24 07:15:00+00:00,24.892548482157657 +2025-06-24 07:30:00+00:00,24.96391193047276 +2025-06-24 07:45:00+00:00,26.19661703872679 +2025-06-24 08:00:00+00:00,26.441115359832672 +2025-06-24 08:15:00+00:00,26.46965027141956 +2025-06-24 08:30:00+00:00,26.47813071968077 +2025-06-24 08:45:00+00:00,27.287339955490808 +2025-06-24 09:00:00+00:00,28.663868942339413 +2025-06-24 09:15:00+00:00,29.002410401359814 +2025-06-24 09:30:00+00:00,29.466692997627344 +2025-06-24 09:45:00+00:00,27.93670918029442 +2025-06-24 10:00:00+00:00,29.3283439025433 +2025-06-24 10:15:00+00:00,30.738829747730776 +2025-06-24 10:30:00+00:00,28.552575083559603 +2025-06-24 10:45:00+00:00,29.13048427896139 +2025-06-24 11:00:00+00:00,30.064012802707516 +2025-06-24 11:15:00+00:00,29.04137130739139 +2025-06-24 11:30:00+00:00,28.04219180999135 +2025-06-24 11:45:00+00:00,29.074987231920616 +2025-06-24 12:00:00+00:00,28.418470128061422 +2025-06-24 12:15:00+00:00,28.838466586945525 +2025-06-24 12:30:00+00:00,28.614916766629648 +2025-06-24 12:45:00+00:00,27.999723941132334 +2025-06-24 13:00:00+00:00,27.559242506638387 +2025-06-24 13:15:00+00:00,26.412851378543774 +2025-06-24 13:30:00+00:00,25.495871494728984 +2025-06-24 13:45:00+00:00,24.49136986807995 +2025-06-24 14:00:00+00:00,22.980185026608055 +2025-06-24 14:15:00+00:00,21.439000557530278 +2025-06-24 14:30:00+00:00,19.517377623102085 +2025-06-24 14:45:00+00:00,16.792235023976332 +2025-06-24 15:00:00+00:00,14.01350606818112 +2025-06-24 15:15:00+00:00,10.914498874939543 +2025-06-24 15:30:00+00:00,7.878917432273357 +2025-06-24 15:45:00+00:00,4.992487487406682 +2025-06-24 16:00:00+00:00,2.833526877922746 +2025-06-25 03:15:00+00:00,2.9804352856659126 +2025-06-25 03:30:00+00:00,4.859201591667828 +2025-06-25 03:45:00+00:00,7.0061367095526474 +2025-06-25 04:00:00+00:00,14.447932559579645 +2025-06-25 04:15:00+00:00,16.59378635480693 +2025-06-25 04:30:00+00:00,16.629902071880725 +2025-06-25 04:45:00+00:00,20.28736792734624 +2025-06-25 05:00:00+00:00,19.664801631285158 +2025-06-25 05:15:00+00:00,20.947881569563634 +2025-06-25 05:30:00+00:00,22.691641581423415 +2025-06-25 05:45:00+00:00,21.577030399219147 +2025-06-25 06:00:00+00:00,22.473453077681082 +2025-06-25 06:15:00+00:00,23.208617218307964 +2025-06-25 06:30:00+00:00,23.29854523058064 +2025-06-25 06:45:00+00:00,23.392308995240167 +2025-06-25 07:00:00+00:00,25.1295361655844 +2025-06-25 07:15:00+00:00,25.87056483337479 +2025-06-25 07:30:00+00:00,27.597231830112253 +2025-06-25 07:45:00+00:00,27.795360234517428 +2025-06-25 08:00:00+00:00,28.954411523362808 +2025-06-25 08:15:00+00:00,28.63914512299628 +2025-06-25 08:30:00+00:00,31.53554064386182 +2025-06-25 08:45:00+00:00,32.7060390112683 +2025-06-25 09:00:00+00:00,33.563897120705704 +2025-06-25 09:15:00+00:00,35.88554802454568 +2025-06-25 09:30:00+00:00,36.67787789973417 +2025-06-25 09:45:00+00:00,36.867158143596335 +2025-06-25 10:00:00+00:00,37.05641670334209 +2025-06-25 10:15:00+00:00,37.2987634105478 +2025-06-25 10:30:00+00:00,38.086447598048345 +2025-06-25 10:45:00+00:00,36.94727827607011 +2025-06-25 11:00:00+00:00,37.163259826629236 +2025-06-25 11:15:00+00:00,38.291853649426606 +2025-06-25 11:30:00+00:00,36.73826027036265 +2025-06-25 11:45:00+00:00,36.044455137930626 +2025-06-25 12:00:00+00:00,36.201665500910785 +2025-06-25 12:15:00+00:00,35.04661938959123 +2025-06-25 12:30:00+00:00,34.420654888861925 +2025-06-25 12:45:00+00:00,33.0375878690937 +2025-06-25 13:00:00+00:00,31.860019008432186 +2025-06-25 13:15:00+00:00,30.34266376751326 +2025-06-25 13:30:00+00:00,28.748491646863865 +2025-06-25 13:45:00+00:00,26.866069917876352 +2025-06-25 14:00:00+00:00,24.55637144363283 +2025-06-25 14:15:00+00:00,21.955907200028857 +2025-06-25 14:30:00+00:00,19.509002782600348 +2025-06-25 14:45:00+00:00,16.561107364869308 +2025-06-25 15:00:00+00:00,13.4424489588226 +2025-06-25 15:15:00+00:00,10.293899230519656 +2025-06-25 15:30:00+00:00,7.314630964722413 +2025-06-25 15:45:00+00:00,4.503089806747465 +2025-06-25 16:00:00+00:00,2.234789013305707 +2025-06-26 03:15:00+00:00,2.03275322165115 +2025-06-26 03:30:00+00:00,3.7547279326828433 +2025-06-26 03:45:00+00:00,6.563503680458806 +2025-06-26 04:00:00+00:00,8.886171060531746 +2025-06-26 04:15:00+00:00,12.367313144986927 +2025-06-26 04:30:00+00:00,18.220746114115734 +2025-06-26 04:45:00+00:00,19.789931618802555 +2025-06-26 05:00:00+00:00,20.964798898540316 +2025-06-26 05:15:00+00:00,21.474175931297566 +2025-06-26 05:30:00+00:00,22.145915950319466 +2025-06-26 05:45:00+00:00,22.947678558354195 +2025-06-26 06:00:00+00:00,24.138570384133917 +2025-06-26 06:15:00+00:00,25.15666170594972 +2025-06-26 06:30:00+00:00,25.7966678128436 +2025-06-26 06:45:00+00:00,25.475061433004846 +2025-06-26 07:00:00+00:00,26.175504270251107 +2025-06-26 07:15:00+00:00,27.084589641974475 +2025-06-26 07:30:00+00:00,27.58425959176354 +2025-06-26 07:45:00+00:00,26.65883100980918 +2025-06-26 08:00:00+00:00,27.190219338719842 +2025-06-26 08:15:00+00:00,27.27237374118303 +2025-06-26 08:30:00+00:00,28.387273727757076 +2025-06-26 08:45:00+00:00,29.0717488095833 +2025-06-26 09:00:00+00:00,29.25682155121278 +2025-06-26 09:15:00+00:00,29.18530634036053 +2025-06-26 09:30:00+00:00,29.85594126467292 +2025-06-26 09:45:00+00:00,29.863631983885952 +2025-06-26 10:00:00+00:00,29.871254840954823 +2025-06-26 10:15:00+00:00,30.459969062050003 +2025-06-26 10:30:00+00:00,29.53664097156135 +2025-06-26 10:45:00+00:00,28.459374001095025 +2025-06-26 11:00:00+00:00,29.928725610431883 +2025-06-26 11:15:00+00:00,29.88903672040382 +2025-06-26 11:30:00+00:00,28.738984004554744 +2025-06-26 11:45:00+00:00,29.755813096307882 +2025-06-26 12:00:00+00:00,29.42332222914736 +2025-06-26 12:15:00+00:00,29.251054858343696 +2025-06-26 12:30:00+00:00,29.658383859349026 +2025-06-26 12:45:00+00:00,28.396350509670757 +2025-06-26 13:00:00+00:00,28.10128419370026 +2025-06-26 13:15:00+00:00,28.06052071078683 +2025-06-26 13:30:00+00:00,26.49463899891483 +2025-06-26 13:45:00+00:00,25.10348730687695 +2025-06-26 14:00:00+00:00,23.548450194065822 +2025-06-26 14:15:00+00:00,21.333231712770743 +2025-06-26 14:30:00+00:00,18.955032587113255 +2025-06-26 14:45:00+00:00,16.086513633841395 +2025-06-26 15:00:00+00:00,13.008840060686193 +2025-06-26 15:15:00+00:00,10.131595821251029 +2025-06-26 15:30:00+00:00,7.12420900303848 +2025-06-26 15:45:00+00:00,4.4544958147703255 +2025-06-26 16:00:00+00:00,2.3493202755317766 +2025-06-27 03:00:00+00:00,2.5078897566064735 +2025-06-27 03:15:00+00:00,4.8589215495553635 +2025-06-27 03:30:00+00:00,7.721985932153736 +2025-06-27 03:45:00+00:00,10.641190335213187 +2025-06-27 04:00:00+00:00,13.544974873062678 +2025-06-27 04:15:00+00:00,15.86637963765036 +2025-06-27 04:30:00+00:00,18.117629330756454 +2025-06-27 04:45:00+00:00,18.751514354142078 +2025-06-27 05:00:00+00:00,20.623814565846253 +2025-06-27 05:15:00+00:00,21.7924815396626 +2025-06-27 05:30:00+00:00,23.151940010554682 +2025-06-27 05:45:00+00:00,24.467553922491682 +2025-06-27 06:00:00+00:00,25.0831356889854 +2025-06-27 06:15:00+00:00,26.32454469907765 +2025-06-27 06:30:00+00:00,27.514131329003852 +2025-06-27 06:45:00+00:00,27.712327330963696 +2025-06-27 07:00:00+00:00,29.544320963411984 +2025-06-27 07:15:00+00:00,29.574725125772716 +2025-06-27 07:30:00+00:00,30.71251324589565 +2025-06-27 07:45:00+00:00,31.870307905393386 +2025-06-27 08:00:00+00:00,31.85766502375893 +2025-06-27 08:15:00+00:00,32.55494017043758 +2025-06-27 08:30:00+00:00,32.733921373264856 +2025-06-27 08:45:00+00:00,35.338737211405686 +2025-06-27 09:00:00+00:00,36.786208540935604 +2025-06-27 09:15:00+00:00,37.20868679237778 +2025-06-27 09:30:00+00:00,38.29532862607147 +2025-06-27 09:45:00+00:00,38.46782000629552 +2025-06-27 10:00:00+00:00,38.63756507000205 +2025-06-27 10:15:00+00:00,38.46395374478513 +2025-06-27 10:30:00+00:00,17.875232648510966 +2025-06-27 10:45:00+00:00,18.39918005105558 +2025-06-27 11:00:00+00:00,18.15933969096547 +2025-06-27 11:15:00+00:00,37.97505539233234 +2025-06-27 11:30:00+00:00,18.436397829562658 +2025-06-27 11:45:00+00:00,17.872377027301212 +2025-06-27 12:00:00+00:00,17.287047896056965 +2025-06-27 12:15:00+00:00,17.25347210906077 +2025-06-27 12:30:00+00:00,18.01609144587204 +2025-06-27 12:45:00+00:00,17.596802620310683 +2025-06-27 13:00:00+00:00,32.31281883785652 +2025-06-27 13:15:00+00:00,30.41132211888646 +2025-06-27 13:30:00+00:00,28.32795621719928 +2025-06-27 13:45:00+00:00,25.636093078734046 +2025-06-27 14:00:00+00:00,23.35657617172171 +2025-06-27 14:15:00+00:00,21.335497805254985 +2025-06-27 14:30:00+00:00,18.69545821467097 +2025-06-27 14:45:00+00:00,15.891799605175446 +2025-06-27 15:00:00+00:00,12.625540325535587 +2025-06-27 15:15:00+00:00,9.671527545532992 +2025-06-27 15:30:00+00:00,6.8052303467104736 +2025-06-27 15:45:00+00:00,4.134069230952212 +2025-06-27 16:00:00+00:00,2.0920957408448952 +2025-06-28 03:00:00+00:00,2.2411987480705644 +2025-06-28 03:15:00+00:00,4.559757413970305 +2025-06-28 03:30:00+00:00,7.298224451631046 +2025-06-28 03:45:00+00:00,10.350928821566667 +2025-06-28 04:00:00+00:00,13.369276988035107 +2025-06-28 04:15:00+00:00,16.08980759673978 +2025-06-28 04:30:00+00:00,18.28063826132418 +2025-06-28 04:45:00+00:00,20.30083466740874 +2025-06-28 05:00:00+00:00,21.77267342869957 +2025-06-28 05:15:00+00:00,22.76947865283614 +2025-06-28 05:30:00+00:00,24.3752462599829 +2025-06-28 05:45:00+00:00,24.30408980375256 +2025-06-28 06:00:00+00:00,25.579320733225416 +2025-06-28 06:15:00+00:00,26.051062197164786 +2025-06-28 06:30:00+00:00,25.946610514006323 +2025-06-28 06:45:00+00:00,27.131420660531017 +2025-06-28 07:00:00+00:00,28.070709460702123 +2025-06-28 07:15:00+00:00,27.529631039761945 +2025-06-28 07:30:00+00:00,28.15943418609975 +2025-06-28 07:45:00+00:00,29.071782976188267 +2025-06-28 08:00:00+00:00,28.767790688932756 +2025-06-28 08:15:00+00:00,29.050903820474232 +2025-06-28 08:30:00+00:00,28.913237305007662 +2025-06-28 08:45:00+00:00,30.68483434125672 +2025-06-28 09:00:00+00:00,31.714769498447033 +2025-06-28 09:15:00+00:00,31.269447519710223 +2025-06-28 09:30:00+00:00,31.62602294778041 +2025-06-28 09:45:00+00:00,32.12091059659439 +2025-06-28 10:00:00+00:00,32.61580115768092 +2025-06-28 10:15:00+00:00,31.29855052691444 +2025-06-28 10:30:00+00:00,31.51795501502652 +2025-06-28 10:45:00+00:00,32.29487270503109 +2025-06-28 11:00:00+00:00,31.916601018882005 +2025-06-28 11:15:00+00:00,31.989877167748638 +2025-06-28 11:30:00+00:00,32.45839216644225 +2025-06-28 11:45:00+00:00,31.335470787393273 +2025-06-28 12:00:00+00:00,31.514329651121542 +2025-06-28 12:15:00+00:00,31.603617306880466 +2025-06-28 12:30:00+00:00,31.94533955792166 +2025-06-28 12:45:00+00:00,31.2127638289676 +2025-06-28 13:00:00+00:00,29.842628623405126 +2025-06-28 13:15:00+00:00,29.143248227047106 +2025-06-28 13:30:00+00:00,27.753262261834877 +2025-06-28 13:45:00+00:00,25.866385192966646 +2025-06-28 14:00:00+00:00,23.87956306691851 +2025-06-28 14:15:00+00:00,21.704977429911146 +2025-06-28 14:30:00+00:00,19.016578033717288 +2025-06-28 14:45:00+00:00,16.070672314146837 +2025-06-28 15:00:00+00:00,12.981550144433578 +2025-06-28 15:15:00+00:00,9.743833579747752 +2025-06-28 15:30:00+00:00,6.909517341954585 +2025-06-28 15:45:00+00:00,4.2045582679792695 +2025-06-28 16:00:00+00:00,2.062717812173024 +2025-06-29 03:00:00+00:00,2.049332221872896 +2025-06-29 03:15:00+00:00,4.584859363250938 +2025-06-29 03:30:00+00:00,7.355637838575603 +2025-06-29 03:45:00+00:00,10.273725799578894 +2025-06-29 04:00:00+00:00,13.227355401182653 +2025-06-29 04:15:00+00:00,15.814649412522972 +2025-06-29 04:30:00+00:00,17.83375847377133 +2025-06-29 04:45:00+00:00,20.21851849276463 +2025-06-29 05:00:00+00:00,22.394032495944312 +2025-06-29 05:15:00+00:00,23.834058256052007 +2025-06-29 05:30:00+00:00,25.590951947087415 +2025-06-29 05:45:00+00:00,27.477949613724746 +2025-06-29 06:00:00+00:00,29.270140494442256 +2025-06-29 06:15:00+00:00,30.306080928661594 +2025-06-29 06:30:00+00:00,31.72573618512308 +2025-06-29 06:45:00+00:00,33.231441838596034 +2025-06-29 07:00:00+00:00,33.51445641173251 +2025-06-29 07:15:00+00:00,34.95789123490926 +2025-06-29 07:30:00+00:00,36.03323080067427 +2025-06-29 07:45:00+00:00,36.16000267037845 +2025-06-29 08:00:00+00:00,36.60895044604765 +2025-06-29 08:15:00+00:00,38.07650513352145 +2025-06-29 08:30:00+00:00,38.09254895171194 +2025-06-29 08:45:00+00:00,18.498517743014002 +2025-06-29 09:00:00+00:00,18.243124398712702 +2025-06-29 09:15:00+00:00,18.172513181327925 +2025-06-29 09:30:00+00:00,16.78416846336306 +2025-06-29 09:45:00+00:00,16.353703356298485 +2025-06-29 10:00:00+00:00,15.893798096153654 +2025-06-29 10:15:00+00:00,17.18933811184466 +2025-06-29 10:30:00+00:00,15.819773503792176 +2025-06-29 10:45:00+00:00,17.089814638027622 +2025-06-29 11:00:00+00:00,16.283645257357648 +2025-06-29 11:15:00+00:00,15.921984741143714 +2025-06-29 11:30:00+00:00,16.493378468289443 +2025-06-29 11:45:00+00:00,16.25425892579672 +2025-06-29 12:00:00+00:00,16.23557541178907 +2025-06-29 12:15:00+00:00,15.559241090141574 +2025-06-29 12:30:00+00:00,16.42901610168011 +2025-06-29 12:45:00+00:00,15.318637184060057 +2025-06-29 13:00:00+00:00,16.663428134731245 +2025-06-29 13:15:00+00:00,16.167729530756553 +2025-06-29 13:30:00+00:00,15.627129053163056 +2025-06-29 13:45:00+00:00,16.24550578367143 +2025-06-29 14:00:00+00:00,15.946312214078741 +2025-06-29 14:15:00+00:00,20.84335461798234 +2025-06-29 14:30:00+00:00,18.29887877966792 +2025-06-29 14:45:00+00:00,15.1939725850449 +2025-06-29 15:00:00+00:00,12.552012741016886 +2025-06-29 15:15:00+00:00,9.515487805709995 +2025-06-29 15:30:00+00:00,6.383645367438082 +2025-06-29 15:45:00+00:00,3.7998096227642044 +2025-06-29 16:00:00+00:00,1.6751210807289194 +2025-06-30 03:00:00+00:00,1.9159453484120583 +2025-06-30 03:15:00+00:00,4.111409373819544 +2025-06-30 03:30:00+00:00,6.665650123456145 +2025-06-30 03:45:00+00:00,9.639650868608417 +2025-06-30 04:00:00+00:00,14.447346016383301 +2025-06-30 04:15:00+00:00,16.848239367820096 +2025-06-30 04:30:00+00:00,14.6176073578424 +2025-06-30 04:45:00+00:00,17.899477290229772 +2025-06-30 05:00:00+00:00,19.982445490737145 +2025-06-30 05:15:00+00:00,16.219537405450765 +2025-06-30 05:30:00+00:00,16.781736652635857 +2025-06-30 05:45:00+00:00,21.389628036478104 +2025-06-30 06:00:00+00:00,21.938101803319224 +2025-06-30 06:15:00+00:00,23.468351042783706 +2025-06-30 06:30:00+00:00,25.158406635644628 +2025-06-30 06:45:00+00:00,24.722115146174794 +2025-06-30 07:00:00+00:00,25.309774701516496 +2025-06-30 07:15:00+00:00,25.752259533338552 +2025-06-30 07:30:00+00:00,26.86177464202653 +2025-06-30 07:45:00+00:00,27.074711595310873 +2025-06-30 08:00:00+00:00,26.787723342675093 +2025-06-30 08:15:00+00:00,27.10038354251123 +2025-06-30 08:30:00+00:00,27.415686273213183 +2025-06-30 08:45:00+00:00,28.670727798869667 +2025-06-30 09:00:00+00:00,30.385129632889274 +2025-06-30 09:15:00+00:00,30.631925203180568 +2025-06-30 09:30:00+00:00,29.41365649145117 +2025-06-30 09:45:00+00:00,29.698201207496492 +2025-06-30 10:00:00+00:00,30.61419079453655 +2025-06-30 10:15:00+00:00,30.149272722339337 +2025-06-30 10:30:00+00:00,31.834539882388043 +2025-06-30 10:45:00+00:00,30.24978400315316 +2025-06-30 11:00:00+00:00,30.633207784172903 +2025-06-30 11:15:00+00:00,30.07129388275536 +2025-06-30 11:30:00+00:00,30.31606905496834 +2025-06-30 11:45:00+00:00,30.295281172628712 +2025-06-30 12:00:00+00:00,30.124555150788677 +2025-06-30 12:15:00+00:00,30.954095290862615 +2025-06-30 12:30:00+00:00,30.77989051978225 +2025-06-30 12:45:00+00:00,30.020041536661093 +2025-06-30 13:00:00+00:00,29.368276232797758 +2025-06-30 13:15:00+00:00,27.98485766779251 +2025-06-30 13:30:00+00:00,27.065891437836893 +2025-06-30 13:45:00+00:00,25.885190080099157 +2025-06-30 14:00:00+00:00,24.04422488935955 +2025-06-30 14:15:00+00:00,21.595573464977196 +2025-06-30 14:30:00+00:00,19.184934732734757 +2025-06-30 14:45:00+00:00,16.612059355811894 +2025-06-30 15:00:00+00:00,13.270228430308888 +2025-06-30 15:15:00+00:00,10.170697236846404 +2025-06-30 15:30:00+00:00,6.884662119971363 +2025-06-30 15:45:00+00:00,3.87134512877476 +2025-06-30 16:00:00+00:00,1.7297248704310184 +2025-07-01 03:00:00+00:00,3.3164570951567427 +2025-07-01 03:15:00+00:00,4.457132303708127 +2025-07-01 03:30:00+00:00,5.544374529536837 +2025-07-01 03:45:00+00:00,8.017269551000817 +2025-07-01 04:00:00+00:00,10.77619800336423 +2025-07-01 04:15:00+00:00,13.723773568430632 +2025-07-01 04:30:00+00:00,16.070156309067066 +2025-07-01 04:45:00+00:00,18.27523959295495 +2025-07-01 05:00:00+00:00,19.29517955506585 +2025-07-01 05:15:00+00:00,20.872457540670307 +2025-07-01 05:30:00+00:00,22.105649848818466 +2025-07-01 05:45:00+00:00,22.03097620502796 +2025-07-01 06:00:00+00:00,23.877895240715407 +2025-07-01 06:15:00+00:00,24.175238108176387 +2025-07-01 06:30:00+00:00,26.10724795015222 +2025-07-01 06:45:00+00:00,26.24327154465509 +2025-07-01 07:00:00+00:00,28.229715638439224 +2025-07-01 07:15:00+00:00,29.146981217383143 +2025-07-01 07:30:00+00:00,29.395572793196244 +2025-07-01 07:45:00+00:00,30.751201022388436 +2025-07-01 08:00:00+00:00,31.958584273333106 +2025-07-01 08:15:00+00:00,33.92865051376471 +2025-07-01 08:30:00+00:00,33.44093825001809 +2025-07-01 08:45:00+00:00,34.60363647975914 +2025-07-01 09:00:00+00:00,36.18901733293646 +2025-07-01 09:15:00+00:00,37.09781948160285 +2025-07-01 09:30:00+00:00,38.62441356234877 +2025-07-01 09:45:00+00:00,38.21298798774468 +2025-07-01 10:00:00+00:00,38.02607806848285 +2025-07-01 10:15:00+00:00,18.052516782929587 +2025-07-01 10:30:00+00:00,38.54259238068034 +2025-07-01 10:45:00+00:00,17.962020395727443 +2025-07-01 11:00:00+00:00,18.177573526830987 +2025-07-01 11:15:00+00:00,17.039905194356397 +2025-07-01 11:30:00+00:00,36.664200575937194 +2025-07-01 11:45:00+00:00,18.029729608363425 +2025-07-01 12:00:00+00:00,17.671091941384603 +2025-07-01 12:15:00+00:00,17.727498204356834 +2025-07-01 12:30:00+00:00,16.920246848444954 +2025-07-01 12:45:00+00:00,31.187425575926625 +2025-07-01 13:00:00+00:00,17.26963511363515 +2025-07-01 13:15:00+00:00,16.803703344722518 +2025-07-01 13:30:00+00:00,25.801534922214636 +2025-07-01 13:45:00+00:00,24.5712557780472 +2025-07-01 14:00:00+00:00,22.421974223343685 +2025-07-01 14:15:00+00:00,19.789607363154207 +2025-07-01 14:30:00+00:00,17.085170402893485 +2025-07-01 14:45:00+00:00,14.144631186639675 +2025-07-01 15:00:00+00:00,11.401203891187377 +2025-07-01 15:15:00+00:00,8.59192561590893 +2025-07-01 15:30:00+00:00,6.347996086585885 +2025-07-01 15:45:00+00:00,4.210230091313783 +2025-07-01 16:00:00+00:00,2.357294510343319 +2025-07-01 16:15:00+00:00,0.6857498950258585 +2025-07-02 03:15:00+00:00,2.931408526998012 +2025-07-02 03:30:00+00:00,5.204941143923206 +2025-07-02 03:45:00+00:00,7.790549741019632 +2025-07-02 04:00:00+00:00,10.851345898700924 +2025-07-02 04:15:00+00:00,13.952139360959892 +2025-07-02 04:30:00+00:00,16.497609800258978 +2025-07-02 04:45:00+00:00,18.357052670554793 +2025-07-02 05:00:00+00:00,20.270214630365754 +2025-07-02 05:15:00+00:00,21.681868377820773 +2025-07-02 05:30:00+00:00,22.960082228579566 +2025-07-02 05:45:00+00:00,22.81105566410105 +2025-07-02 06:00:00+00:00,24.159517409370956 +2025-07-02 06:15:00+00:00,24.262748940939595 +2025-07-02 06:30:00+00:00,25.203167724305192 +2025-07-02 06:45:00+00:00,25.540301950149672 +2025-07-02 07:00:00+00:00,25.8617216871148 +2025-07-02 07:15:00+00:00,25.430659075074278 +2025-07-02 07:30:00+00:00,25.652434024251118 +2025-07-02 07:45:00+00:00,26.141172740182817 +2025-07-02 08:00:00+00:00,25.70214627436529 +2025-07-02 08:15:00+00:00,25.616653301041246 +2025-07-02 08:30:00+00:00,26.042425764304856 +2025-07-02 08:45:00+00:00,27.806630055802323 +2025-07-02 09:00:00+00:00,27.754264460866878 +2025-07-02 09:15:00+00:00,28.07040040198733 +2025-07-02 09:30:00+00:00,27.438584207538206 +2025-07-02 09:45:00+00:00,28.988818097788965 +2025-07-02 10:00:00+00:00,28.761945156380744 +2025-07-02 10:15:00+00:00,31.128998017144042 +2025-07-02 10:30:00+00:00,29.633798492395353 +2025-07-02 10:45:00+00:00,28.911747103673523 +2025-07-02 11:00:00+00:00,28.018380435522673 +2025-07-02 11:15:00+00:00,28.465064568541216 +2025-07-02 11:30:00+00:00,27.83148137009909 +2025-07-02 11:45:00+00:00,29.235554402589234 +2025-07-02 12:00:00+00:00,27.92136003218627 +2025-07-02 12:15:00+00:00,28.90067054718192 +2025-07-02 12:30:00+00:00,27.043592200142363 +2025-07-02 12:45:00+00:00,26.642118847958756 +2025-07-02 13:00:00+00:00,26.152565251535155 +2025-07-02 13:15:00+00:00,24.82894051854329 +2025-07-02 13:30:00+00:00,24.869326672800966 +2025-07-02 13:45:00+00:00,24.753938529827224 +2025-07-02 14:00:00+00:00,23.118262731881366 +2025-07-02 14:15:00+00:00,21.45420370507915 +2025-07-02 14:30:00+00:00,19.074155909657776 +2025-07-02 14:45:00+00:00,16.423888036617033 +2025-07-02 15:00:00+00:00,13.733287185140693 +2025-07-02 15:15:00+00:00,10.850793575133164 +2025-07-02 15:30:00+00:00,7.922018972657735 +2025-07-02 15:45:00+00:00,5.043414898307192 +2025-07-02 16:00:00+00:00,2.8169695338821126 +2025-07-02 16:15:00+00:00,1.1248944728974548 +2025-07-03 03:15:00+00:00,3.2108410538109293 +2025-07-03 03:30:00+00:00,5.927887042488792 +2025-07-03 03:45:00+00:00,8.924575639411062 +2025-07-03 04:00:00+00:00,11.99695640566993 +2025-07-03 04:15:00+00:00,15.00339003604497 +2025-07-03 04:30:00+00:00,17.335838999569276 +2025-07-03 04:45:00+00:00,19.179621344510696 +2025-07-03 05:00:00+00:00,19.87436703489572 +2025-07-03 05:15:00+00:00,20.939060428931356 +2025-07-03 05:30:00+00:00,22.221550041044093 +2025-07-03 05:45:00+00:00,22.6925793811704 +2025-07-03 06:00:00+00:00,21.902780338613695 +2025-07-03 06:15:00+00:00,23.390276450288823 +2025-07-03 06:30:00+00:00,23.902991780472743 +2025-07-03 06:45:00+00:00,24.47466251924942 +2025-07-03 07:00:00+00:00,24.497825175854395 +2025-07-03 07:15:00+00:00,25.970836224713416 +2025-07-03 07:30:00+00:00,25.96374706159156 +2025-07-03 07:45:00+00:00,27.600091910121645 +2025-07-03 08:00:00+00:00,28.65637955731829 +2025-07-03 08:15:00+00:00,29.208241518595674 +2025-07-03 08:30:00+00:00,30.335133723832406 +2025-07-03 08:45:00+00:00,31.591164655761123 +2025-07-03 09:00:00+00:00,32.962278781220455 +2025-07-03 09:15:00+00:00,35.29331342416439 +2025-07-03 09:30:00+00:00,35.43506481825298 +2025-07-03 09:45:00+00:00,36.28475335217342 +2025-07-03 10:00:00+00:00,36.40773655450927 +2025-07-03 10:15:00+00:00,36.55907263956526 +2025-07-03 10:30:00+00:00,37.14172264193762 +2025-07-03 10:45:00+00:00,36.07147942363332 +2025-07-03 11:00:00+00:00,37.89380555477608 +2025-07-03 11:15:00+00:00,37.562422629400814 +2025-07-03 11:30:00+00:00,36.74204981510386 +2025-07-03 11:45:00+00:00,36.387778398634275 +2025-07-03 12:00:00+00:00,34.90600887393575 +2025-07-03 12:15:00+00:00,34.23507337215135 +2025-07-03 12:30:00+00:00,33.629354798953024 +2025-07-03 12:45:00+00:00,32.23431859413376 +2025-07-03 13:00:00+00:00,30.5615503486565 +2025-07-03 13:15:00+00:00,28.668859482402624 +2025-07-03 13:30:00+00:00,27.999915102429473 +2025-07-03 13:45:00+00:00,27.29567286951332 +2025-07-03 14:00:00+00:00,25.224893877576566 +2025-07-03 14:15:00+00:00,22.64554601162288 +2025-07-03 14:30:00+00:00,20.13639010080637 +2025-07-03 14:45:00+00:00,17.315204753823213 +2025-07-03 15:00:00+00:00,14.094512911764085 +2025-07-03 15:15:00+00:00,10.994685457167948 +2025-07-03 15:30:00+00:00,7.533021563495687 +2025-07-03 15:45:00+00:00,4.77357949431345 +2025-07-03 16:00:00+00:00,2.2818927116899363 +2025-07-04 03:15:00+00:00,2.4986927213481165 +2025-07-04 03:30:00+00:00,2.328559630667546 +2025-07-04 03:45:00+00:00,4.460203989544303 +2025-07-04 04:00:00+00:00,5.978294878641744 +2025-07-04 04:15:00+00:00,8.53793411941549 +2025-07-04 04:30:00+00:00,12.930453641046665 +2025-07-04 04:45:00+00:00,16.05557260023573 +2025-07-04 05:00:00+00:00,20.527732362323274 +2025-07-04 05:15:00+00:00,21.77840331486589 +2025-07-04 05:30:00+00:00,22.567026002865994 +2025-07-04 05:45:00+00:00,23.304999986382846 +2025-07-04 06:00:00+00:00,23.257869786614616 +2025-07-04 06:15:00+00:00,23.368913492573967 +2025-07-04 06:30:00+00:00,25.020562909311234 +2025-07-04 06:45:00+00:00,24.929024591931192 +2025-07-04 07:00:00+00:00,25.134669206102487 +2025-07-04 07:15:00+00:00,25.312524047089838 +2025-07-04 07:30:00+00:00,25.076259423964906 +2025-07-04 07:45:00+00:00,26.40579295818285 +2025-07-04 08:00:00+00:00,25.481524873816127 +2025-07-04 08:15:00+00:00,25.77345656549218 +2025-07-04 08:30:00+00:00,25.86792183149092 +2025-07-04 08:45:00+00:00,26.879422135332135 +2025-07-04 09:00:00+00:00,28.936872025921065 +2025-07-04 09:15:00+00:00,27.221921440520077 +2025-07-04 09:30:00+00:00,27.506326644929345 +2025-07-04 09:45:00+00:00,28.32257221524096 +2025-07-04 10:00:00+00:00,27.8053858711038 +2025-07-04 10:15:00+00:00,28.665704474520936 +2025-07-04 10:30:00+00:00,26.97124627264823 +2025-07-04 10:45:00+00:00,28.263924044245968 +2025-07-04 11:00:00+00:00,28.559918788712242 +2025-07-04 11:15:00+00:00,28.641604870984356 +2025-07-04 11:30:00+00:00,29.651753325047235 +2025-07-04 11:45:00+00:00,28.132718211130904 +2025-07-04 12:00:00+00:00,28.51717323530458 +2025-07-04 12:15:00+00:00,28.42256213302709 +2025-07-04 12:30:00+00:00,28.291707725778494 +2025-07-04 12:45:00+00:00,27.368325719725284 +2025-07-04 13:00:00+00:00,26.4264616010459 +2025-07-04 13:15:00+00:00,26.45102668538874 +2025-07-04 13:30:00+00:00,25.275543404517343 +2025-07-04 13:45:00+00:00,24.462705533846638 +2025-07-04 14:00:00+00:00,23.627739001758922 +2025-07-04 14:15:00+00:00,22.371343559556365 +2025-07-04 14:30:00+00:00,20.462347726569753 +2025-07-04 14:45:00+00:00,17.926457117270306 +2025-07-04 15:00:00+00:00,14.917670713331084 +2025-07-04 15:15:00+00:00,11.443656737866398 +2025-07-04 15:30:00+00:00,8.491160639302178 +2025-07-04 15:45:00+00:00,5.587287671698618 +2025-07-04 16:00:00+00:00,3.0150429172411455 +2025-07-05 03:30:00+00:00,3.4376465910970913 +2025-07-05 03:45:00+00:00,6.3636471596519675 +2025-07-05 04:00:00+00:00,12.008547576561051 +2025-07-05 04:15:00+00:00,6.88794333655806 +2025-07-05 04:30:00+00:00,11.236419320398442 +2025-07-05 04:45:00+00:00,18.310969302075016 +2025-07-05 05:00:00+00:00,20.670545235420196 +2025-07-05 05:15:00+00:00,21.314558526746257 +2025-07-05 05:30:00+00:00,22.863874065381502 +2025-07-05 05:45:00+00:00,23.176005261270326 +2025-07-05 06:00:00+00:00,22.435156375297293 +2025-07-05 06:15:00+00:00,23.669109934678314 +2025-07-05 06:30:00+00:00,23.635926765834245 +2025-07-05 06:45:00+00:00,22.571779886792804 +2025-07-05 07:00:00+00:00,23.622092902609936 +2025-07-05 07:15:00+00:00,23.76253312722628 +2025-07-05 07:30:00+00:00,25.25147984678969 +2025-07-05 07:45:00+00:00,24.957108176161494 +2025-07-05 08:00:00+00:00,26.0630175498571 +2025-07-05 08:15:00+00:00,26.913017706097172 +2025-07-05 08:30:00+00:00,28.0196587638602 +2025-07-05 08:45:00+00:00,29.369558147163023 +2025-07-05 09:00:00+00:00,31.451279543010735 +2025-07-05 09:15:00+00:00,32.01297095898544 +2025-07-05 09:30:00+00:00,32.77252093760247 +2025-07-05 09:45:00+00:00,33.90124545542179 +2025-07-05 10:00:00+00:00,36.46356731039087 +2025-07-05 10:15:00+00:00,35.888813437017944 +2025-07-05 10:30:00+00:00,36.76978043335696 +2025-07-05 10:45:00+00:00,36.96082779799288 +2025-07-05 11:00:00+00:00,35.52612735412966 +2025-07-05 11:15:00+00:00,34.768647519076865 +2025-07-05 11:30:00+00:00,35.63659132566239 +2025-07-05 11:45:00+00:00,34.2184008298796 +2025-07-05 12:00:00+00:00,33.174820820184394 +2025-07-05 12:15:00+00:00,33.773874734181675 +2025-07-05 12:30:00+00:00,32.76854646493281 +2025-07-05 12:45:00+00:00,31.65736659115809 +2025-07-05 13:00:00+00:00,29.998708142798293 +2025-07-05 13:15:00+00:00,28.682456069541406 +2025-07-05 13:30:00+00:00,27.305634699509692 +2025-07-05 13:45:00+00:00,26.37011847923603 +2025-07-05 14:00:00+00:00,25.3908874817161 +2025-07-05 14:15:00+00:00,23.267839999892928 +2025-07-05 14:30:00+00:00,20.979466994545678 +2025-07-05 14:45:00+00:00,18.116088326100858 +2025-07-05 15:00:00+00:00,15.085603554577435 +2025-07-05 15:15:00+00:00,12.01816716694027 +2025-07-05 15:30:00+00:00,8.58310034996045 +2025-07-05 15:45:00+00:00,5.676363560023834 +2025-07-05 16:00:00+00:00,2.9755483908857285 +2025-07-06 03:15:00+00:00,3.387488770691409 +2025-07-06 03:30:00+00:00,5.750614343540872 +2025-07-06 03:45:00+00:00,4.874524843128151 +2025-07-06 04:00:00+00:00,7.103078975392629 +2025-07-06 04:15:00+00:00,10.253012552442465 +2025-07-06 04:30:00+00:00,16.629628292621465 +2025-07-06 04:45:00+00:00,19.510131439421702 +2025-07-06 05:00:00+00:00,19.518441973843615 +2025-07-06 05:15:00+00:00,21.965415524617345 +2025-07-06 05:30:00+00:00,22.738915719292365 +2025-07-06 05:45:00+00:00,22.252228041166653 +2025-07-06 06:00:00+00:00,24.130612239226576 +2025-07-06 06:15:00+00:00,23.534941357576074 +2025-07-06 06:30:00+00:00,24.250462405362715 +2025-07-06 06:45:00+00:00,24.595295382162057 +2025-07-06 07:00:00+00:00,24.379712472921856 +2025-07-06 07:15:00+00:00,24.919735811004376 +2025-07-06 07:30:00+00:00,25.411908579842745 +2025-07-06 07:45:00+00:00,26.46974995097393 +2025-07-06 08:00:00+00:00,25.63204759501404 +2025-07-06 08:15:00+00:00,25.42542966184006 +2025-07-06 08:30:00+00:00,27.260423938990456 +2025-07-06 08:45:00+00:00,26.513243123917476 +2025-07-06 09:00:00+00:00,27.85924024843003 +2025-07-06 09:15:00+00:00,28.13916658513158 +2025-07-06 09:30:00+00:00,28.050296036004372 +2025-07-06 09:45:00+00:00,28.221995235375488 +2025-07-06 10:00:00+00:00,29.11891459276619 +2025-07-06 10:15:00+00:00,29.276177193897738 +2025-07-06 10:30:00+00:00,28.981887583690348 +2025-07-06 10:45:00+00:00,28.69646673046615 +2025-07-06 11:00:00+00:00,29.742986777103617 +2025-07-06 11:15:00+00:00,28.663037556112624 +2025-07-06 11:30:00+00:00,29.70041130835144 +2025-07-06 11:45:00+00:00,29.148279422693605 +2025-07-06 12:00:00+00:00,27.9889316847091 +2025-07-06 12:15:00+00:00,27.988211768752393 +2025-07-06 12:30:00+00:00,28.870979137868815 +2025-07-06 12:45:00+00:00,28.49145741438533 +2025-07-06 13:00:00+00:00,27.511701373287647 +2025-07-06 13:15:00+00:00,26.211791006297517 +2025-07-06 13:30:00+00:00,25.03773882577284 +2025-07-06 13:45:00+00:00,24.491038619093718 +2025-07-06 14:00:00+00:00,23.862601262121878 +2025-07-06 14:15:00+00:00,22.38041262379035 +2025-07-06 14:30:00+00:00,20.412239297530718 +2025-07-06 14:45:00+00:00,18.156762196293773 +2025-07-06 15:00:00+00:00,15.203000956101157 +2025-07-06 15:15:00+00:00,11.985832717200825 +2025-07-06 15:30:00+00:00,8.547275735715406 +2025-07-06 15:45:00+00:00,5.460173217769956 +2025-07-06 16:00:00+00:00,2.880642534120814 +2025-07-07 03:15:00+00:00,2.163195930123913 +2025-07-07 03:30:00+00:00,4.785391360120196 +2025-07-07 03:45:00+00:00,9.977301129846543 +2025-07-07 04:00:00+00:00,11.888284975860932 +2025-07-07 04:15:00+00:00,13.880481244297378 +2025-07-07 04:30:00+00:00,16.792104522122305 +2025-07-07 04:45:00+00:00,18.624559681651004 +2025-07-07 05:00:00+00:00,20.208767824477867 +2025-07-07 05:15:00+00:00,21.534155522319733 +2025-07-07 05:30:00+00:00,22.523193626795855 +2025-07-07 05:45:00+00:00,22.805409630566434 +2025-07-07 06:00:00+00:00,24.169467992464995 +2025-07-07 06:15:00+00:00,25.19523718215868 +2025-07-07 06:30:00+00:00,25.737699597987312 +2025-07-07 06:45:00+00:00,25.452351291811073 +2025-07-07 07:00:00+00:00,26.855283983003126 +2025-07-07 07:15:00+00:00,27.29104560830695 +2025-07-07 07:30:00+00:00,29.19597866233705 +2025-07-07 07:45:00+00:00,31.31543398517551 +2025-07-07 08:00:00+00:00,30.850441287529787 +2025-07-07 08:15:00+00:00,31.755840544411978 +2025-07-07 08:30:00+00:00,32.70326920164566 +2025-07-07 08:45:00+00:00,33.55225870209384 +2025-07-07 09:00:00+00:00,34.09948323847344 +2025-07-07 09:15:00+00:00,35.17573643216181 +2025-07-07 09:30:00+00:00,36.102470061139556 +2025-07-07 09:45:00+00:00,35.725524310024134 +2025-07-07 10:00:00+00:00,36.02293620722702 +2025-07-07 10:15:00+00:00,36.4330501181143 +2025-07-07 10:30:00+00:00,37.04664048371114 +2025-07-07 10:45:00+00:00,36.96221762477958 +2025-07-07 11:00:00+00:00,35.98570524583709 +2025-07-07 11:15:00+00:00,38.07427537861976 +2025-07-07 11:30:00+00:00,37.16913495846786 +2025-07-07 11:45:00+00:00,18.107876355384594 +2025-07-07 12:00:00+00:00,17.903057241087257 +2025-07-07 12:15:00+00:00,34.99395579835554 +2025-07-07 12:30:00+00:00,34.16284206030363 +2025-07-07 12:45:00+00:00,31.990328025025484 +2025-07-07 13:00:00+00:00,31.597934587224934 +2025-07-07 13:15:00+00:00,31.124684682487214 +2025-07-07 13:30:00+00:00,29.695450647182973 +2025-07-07 13:45:00+00:00,27.71833306722814 +2025-07-07 14:00:00+00:00,25.51210951792596 +2025-07-07 14:15:00+00:00,23.03060377084762 +2025-07-07 14:30:00+00:00,20.467334924663476 +2025-07-07 14:45:00+00:00,17.453424987632324 +2025-07-07 15:00:00+00:00,14.334980119478102 +2025-07-07 15:15:00+00:00,11.151416216433004 +2025-07-07 15:30:00+00:00,7.851396493252013 +2025-07-07 15:45:00+00:00,4.885246264364651 +2025-07-07 16:00:00+00:00,2.4491323814762276 +2025-07-08 03:15:00+00:00,2.249595631816666 +2025-07-08 03:30:00+00:00,5.737729997440608 +2025-07-08 03:45:00+00:00,4.247743372834723 +2025-07-08 04:00:00+00:00,8.564256605574144 +2025-07-08 04:15:00+00:00,18.457473369307706 +2025-07-08 04:30:00+00:00,17.90582893982739 +2025-07-08 04:45:00+00:00,19.640594636422286 +2025-07-08 05:00:00+00:00,21.027282603590262 +2025-07-08 05:15:00+00:00,22.649361768097947 +2025-07-08 05:30:00+00:00,23.51088600163085 +2025-07-08 05:45:00+00:00,24.821804442690674 +2025-07-08 06:00:00+00:00,24.483156922844145 +2025-07-08 06:15:00+00:00,25.80892548485547 +2025-07-08 06:30:00+00:00,26.25826958980392 +2025-07-08 06:45:00+00:00,26.40155459287879 +2025-07-08 07:00:00+00:00,26.273908489569234 +2025-07-08 07:15:00+00:00,25.99253705747683 +2025-07-08 07:30:00+00:00,27.862885834132705 +2025-07-08 07:45:00+00:00,28.804625657157313 +2025-07-08 08:00:00+00:00,27.85403385950671 +2025-07-08 08:15:00+00:00,27.791812423307643 +2025-07-08 08:30:00+00:00,29.4239288667309 +2025-07-08 08:45:00+00:00,29.30891282565948 +2025-07-08 09:00:00+00:00,31.427376310865753 +2025-07-08 09:15:00+00:00,30.53557876546909 +2025-07-08 09:30:00+00:00,30.619391555254122 +2025-07-08 09:45:00+00:00,29.84627800008852 +2025-07-08 10:00:00+00:00,30.801983940401882 +2025-07-08 10:15:00+00:00,31.508423415474557 +2025-07-08 10:30:00+00:00,30.9287090139113 +2025-07-08 10:45:00+00:00,32.16563329819564 +2025-07-08 11:00:00+00:00,31.04067989264251 +2025-07-08 11:15:00+00:00,30.589310132579815 +2025-07-08 11:30:00+00:00,29.763730677257804 +2025-07-08 11:45:00+00:00,30.914502640807125 +2025-07-08 12:00:00+00:00,29.149854463376165 +2025-07-08 12:15:00+00:00,29.303067408714917 +2025-07-08 12:30:00+00:00,29.43509894406975 +2025-07-08 12:45:00+00:00,28.87726581699594 +2025-07-08 13:00:00+00:00,29.155855292008855 +2025-07-08 13:15:00+00:00,28.377668802011236 +2025-07-08 13:30:00+00:00,27.412600858869606 +2025-07-08 13:45:00+00:00,26.10259734947624 +2025-07-08 14:00:00+00:00,24.51242223321871 +2025-07-08 14:15:00+00:00,22.685122529869847 +2025-07-08 14:30:00+00:00,20.43283825884583 +2025-07-08 14:45:00+00:00,17.852144700058716 +2025-07-08 15:00:00+00:00,14.711866120840826 +2025-07-08 15:15:00+00:00,11.488452912761062 +2025-07-08 15:30:00+00:00,8.046451416896028 +2025-07-08 15:45:00+00:00,4.843491165581719 +2025-07-08 16:00:00+00:00,2.372019509494667 +2025-07-09 03:30:00+00:00,4.273326080631643 +2025-07-09 03:45:00+00:00,5.175256190447106 +2025-07-09 04:00:00+00:00,7.3572119758331915 +2025-07-09 04:15:00+00:00,13.73954868446358 +2025-07-09 04:30:00+00:00,15.610605706599483 +2025-07-09 04:45:00+00:00,13.59934804949494 +2025-07-09 05:00:00+00:00,19.6268520203439 +2025-07-09 05:15:00+00:00,19.913506797296986 +2025-07-09 05:30:00+00:00,21.233400792462007 +2025-07-09 05:45:00+00:00,21.563342381892546 +2025-07-09 06:00:00+00:00,23.09146623798163 +2025-07-09 06:15:00+00:00,22.53862153550146 +2025-07-09 06:30:00+00:00,23.567845383978536 +2025-07-09 06:45:00+00:00,24.18344264741401 +2025-07-09 07:00:00+00:00,24.583037706068072 +2025-07-09 07:15:00+00:00,25.003245233306615 +2025-07-09 07:30:00+00:00,25.677329590838816 +2025-07-09 07:45:00+00:00,26.82907078253981 +2025-07-09 08:00:00+00:00,28.43474369789191 +2025-07-09 08:15:00+00:00,28.60533769930581 +2025-07-09 08:30:00+00:00,29.900842833403676 +2025-07-09 08:45:00+00:00,32.3226034269512 +2025-07-09 09:00:00+00:00,34.67823672231684 +2025-07-09 09:15:00+00:00,35.54289468834684 +2025-07-09 09:30:00+00:00,35.87875303856425 +2025-07-09 09:45:00+00:00,35.94773687957957 +2025-07-09 10:00:00+00:00,37.87359317212935 +2025-07-09 10:15:00+00:00,37.059683216055156 +2025-07-09 10:30:00+00:00,37.047526477734536 +2025-07-09 10:45:00+00:00,37.24398677035014 +2025-07-09 11:00:00+00:00,36.9112112729656 +2025-07-09 11:15:00+00:00,36.3975709280738 +2025-07-09 11:30:00+00:00,37.01123600628741 +2025-07-09 11:45:00+00:00,36.13169490419669 +2025-07-09 12:00:00+00:00,35.25107846228547 +2025-07-09 12:15:00+00:00,34.317810691178565 +2025-07-09 12:30:00+00:00,34.735419887869256 +2025-07-09 12:45:00+00:00,33.80589573242229 +2025-07-09 13:00:00+00:00,31.722799014610764 +2025-07-09 13:15:00+00:00,30.537411550439153 +2025-07-09 13:30:00+00:00,28.274163056742093 +2025-07-09 13:45:00+00:00,27.09462101258617 +2025-07-09 14:00:00+00:00,24.80244876860808 +2025-07-09 14:15:00+00:00,22.4451867684434 +2025-07-09 14:30:00+00:00,20.01213381815171 +2025-07-09 14:45:00+00:00,17.083547551517754 +2025-07-09 15:00:00+00:00,14.185831275367262 +2025-07-09 15:15:00+00:00,10.828081070063519 +2025-07-09 15:30:00+00:00,7.59773969685931 +2025-07-09 15:45:00+00:00,4.757155373841835 +2025-07-09 16:00:00+00:00,2.26906956249577 +2025-07-10 03:15:00+00:00,3.761167789535105 +2025-07-10 03:30:00+00:00,6.44536876831071 +2025-07-10 03:45:00+00:00,9.602054430334814 +2025-07-10 04:00:00+00:00,12.607180811176724 +2025-07-10 04:15:00+00:00,15.52536384517775 +2025-07-10 04:30:00+00:00,17.756070997564905 +2025-07-10 04:45:00+00:00,20.12482479212203 +2025-07-10 05:00:00+00:00,21.1000944020346 +2025-07-10 05:15:00+00:00,22.568859856564885 +2025-07-10 05:30:00+00:00,23.55992387222691 +2025-07-10 05:45:00+00:00,24.16737920334757 +2025-07-10 06:00:00+00:00,25.85308334893646 +2025-07-10 06:15:00+00:00,26.266185757994265 +2025-07-10 06:30:00+00:00,25.8344985733117 +2025-07-10 06:45:00+00:00,26.460606200605437 +2025-07-10 07:00:00+00:00,26.77310902164907 +2025-07-10 07:15:00+00:00,28.538200029228324 +2025-07-10 07:30:00+00:00,27.748852614852705 +2025-07-10 07:45:00+00:00,28.230662606693176 +2025-07-10 08:00:00+00:00,28.457697108800666 +2025-07-10 08:15:00+00:00,29.00422052509308 +2025-07-10 08:30:00+00:00,29.25358873998181 +2025-07-10 08:45:00+00:00,30.12471115926578 +2025-07-10 09:00:00+00:00,30.28542030186329 +2025-07-10 09:15:00+00:00,29.99581098846911 +2025-07-10 09:30:00+00:00,30.861364340851317 +2025-07-10 09:45:00+00:00,31.18403816157959 +2025-07-10 10:00:00+00:00,30.507481236167255 +2025-07-10 10:15:00+00:00,31.123468560104616 +2025-07-10 10:30:00+00:00,30.796973975649568 +2025-07-10 10:45:00+00:00,31.684856584342537 +2025-07-10 11:00:00+00:00,29.849888283828243 +2025-07-10 11:15:00+00:00,29.72946345534902 +2025-07-10 11:30:00+00:00,28.853346458540976 +2025-07-10 11:45:00+00:00,29.300949987426275 +2025-07-10 12:00:00+00:00,29.733608419881595 +2025-07-10 12:15:00+00:00,29.69498102537086 +2025-07-10 12:30:00+00:00,28.364510673753735 +2025-07-10 12:45:00+00:00,29.376664196874998 +2025-07-10 13:00:00+00:00,29.014351964183096 +2025-07-10 13:15:00+00:00,27.692826620664434 +2025-07-10 13:30:00+00:00,26.60722689447511 +2025-07-10 13:45:00+00:00,25.29587509360132 +2025-07-10 14:00:00+00:00,23.85105641739605 +2025-07-10 14:15:00+00:00,21.797896374867697 +2025-07-10 14:30:00+00:00,19.509217845238247 +2025-07-10 14:45:00+00:00,16.836021709924175 +2025-07-10 15:00:00+00:00,13.916067756686555 +2025-07-10 15:15:00+00:00,10.727282590065814 +2025-07-10 15:30:00+00:00,7.539211093890953 +2025-07-10 15:45:00+00:00,4.619727551347801 +2025-07-10 16:00:00+00:00,2.2255143257542995 +2025-07-11 03:15:00+00:00,2.2888721564099184 +2025-07-11 03:30:00+00:00,2.303942466086765 +2025-07-11 03:45:00+00:00,4.179238239893345 +2025-07-11 04:00:00+00:00,6.65853172257014 +2025-07-11 04:15:00+00:00,8.263554062568222 +2025-07-11 04:30:00+00:00,10.869001315204152 +2025-07-11 04:45:00+00:00,13.014999008784635 +2025-07-11 05:00:00+00:00,20.883959046938216 +2025-07-11 05:15:00+00:00,20.92268040778566 +2025-07-11 05:30:00+00:00,22.406442537652676 +2025-07-11 05:45:00+00:00,23.167485502165807 +2025-07-11 06:00:00+00:00,24.419605393871052 +2025-07-11 06:15:00+00:00,24.460934063479552 +2025-07-11 06:30:00+00:00,24.25688809386463 +2025-07-11 06:45:00+00:00,25.550873771903955 +2025-07-11 07:00:00+00:00,25.09500627017373 +2025-07-11 07:15:00+00:00,25.1428614030045 +2025-07-11 07:30:00+00:00,27.166402181975567 +2025-07-11 07:45:00+00:00,27.741958446663602 +2025-07-11 08:00:00+00:00,28.407276092889923 +2025-07-11 08:15:00+00:00,29.75745520126003 +2025-07-11 08:30:00+00:00,31.414452763627658 +2025-07-11 08:45:00+00:00,33.275826756486055 +2025-07-11 09:00:00+00:00,34.71397074948104 +2025-07-11 09:15:00+00:00,36.0408619832056 +2025-07-11 09:30:00+00:00,36.80701678433141 +2025-07-11 09:45:00+00:00,18.575198257869012 +2025-07-11 10:00:00+00:00,38.10044005383182 +2025-07-11 10:15:00+00:00,38.391528999882894 +2025-07-11 10:30:00+00:00,38.956040972615405 +2025-07-11 10:45:00+00:00,18.386144593329487 +2025-07-11 11:00:00+00:00,38.48587306211203 +2025-07-11 11:15:00+00:00,37.89134025684856 +2025-07-11 11:30:00+00:00,17.783844304533503 +2025-07-11 11:45:00+00:00,17.51205894957022 +2025-07-11 12:00:00+00:00,17.6675652163088 +2025-07-11 12:15:00+00:00,17.805893877579248 +2025-07-11 12:30:00+00:00,17.87813379815916 +2025-07-11 12:45:00+00:00,17.873321130995315 +2025-07-11 13:00:00+00:00,32.05802772728597 +2025-07-11 13:15:00+00:00,30.643371611548577 +2025-07-11 13:30:00+00:00,28.739222286793947 +2025-07-11 13:45:00+00:00,26.736902259703296 +2025-07-11 14:00:00+00:00,24.64941408401218 +2025-07-11 14:15:00+00:00,21.633779946544344 +2025-07-11 14:30:00+00:00,18.621997060259854 +2025-07-11 14:45:00+00:00,15.80112106174774 +2025-07-11 15:00:00+00:00,12.383246634345763 +2025-07-11 15:15:00+00:00,9.611115012705062 +2025-07-11 15:30:00+00:00,6.812369661998991 +2025-07-11 15:45:00+00:00,4.3220322393054715 +2025-07-11 16:00:00+00:00,2.0307292133452384 +2025-07-12 03:15:00+00:00,2.1773318376292723 +2025-07-12 03:30:00+00:00,3.0989020700990872 +2025-07-12 03:45:00+00:00,4.4636497399724036 +2025-07-12 04:00:00+00:00,11.474682192295369 +2025-07-12 04:15:00+00:00,15.077305211609058 +2025-07-12 04:30:00+00:00,17.74789158827349 +2025-07-12 04:45:00+00:00,20.20747018874419 +2025-07-12 05:00:00+00:00,18.300813418046484 +2025-07-12 05:15:00+00:00,20.701812857458197 +2025-07-12 05:30:00+00:00,22.968181580993377 +2025-07-12 05:45:00+00:00,22.880445896052564 +2025-07-12 06:00:00+00:00,23.698874011702674 +2025-07-12 06:15:00+00:00,24.470104158654948 +2025-07-12 06:30:00+00:00,25.438938468168924 +2025-07-12 06:45:00+00:00,25.77902755026117 +2025-07-12 07:00:00+00:00,25.49987755139241 +2025-07-12 07:15:00+00:00,25.8877217904554 +2025-07-12 07:30:00+00:00,26.107844782795762 +2025-07-12 07:45:00+00:00,26.28008875612467 +2025-07-12 08:00:00+00:00,27.137807508541158 +2025-07-12 08:15:00+00:00,27.874477323303744 +2025-07-12 08:30:00+00:00,28.21736845189379 +2025-07-12 08:45:00+00:00,28.78994945689823 +2025-07-12 09:00:00+00:00,28.993578974385258 +2025-07-12 09:15:00+00:00,29.540788267089216 +2025-07-12 09:30:00+00:00,31.45393619543858 +2025-07-12 09:45:00+00:00,29.791368832353566 +2025-07-12 10:00:00+00:00,29.76252016964342 +2025-07-12 10:15:00+00:00,30.688494458053945 +2025-07-12 10:30:00+00:00,30.555237612307764 +2025-07-12 10:45:00+00:00,29.575472433522496 +2025-07-12 11:00:00+00:00,30.059836760217024 +2025-07-12 11:15:00+00:00,29.95622673094168 +2025-07-12 11:30:00+00:00,30.30249959621771 +2025-07-12 11:45:00+00:00,30.20088736055149 +2025-07-12 12:00:00+00:00,30.404285742705795 +2025-07-12 12:15:00+00:00,30.61245197372539 +2025-07-12 12:30:00+00:00,30.780501076910006 +2025-07-12 12:45:00+00:00,30.565085779979846 +2025-07-12 13:00:00+00:00,29.79676619815193 +2025-07-12 13:15:00+00:00,28.217660238030373 +2025-07-12 13:30:00+00:00,27.191700376779718 +2025-07-12 13:45:00+00:00,25.854512699007273 +2025-07-12 14:00:00+00:00,23.814961068199278 +2025-07-12 14:15:00+00:00,21.66197748734185 +2025-07-12 14:30:00+00:00,18.939791128093646 +2025-07-12 14:45:00+00:00,16.283634772687183 +2025-07-12 15:00:00+00:00,13.638285533423293 +2025-07-12 15:15:00+00:00,10.250258196306607 +2025-07-12 15:30:00+00:00,6.985182758629926 +2025-07-12 15:45:00+00:00,3.942151389455862 +2025-07-12 16:00:00+00:00,2.0267613894528416 +2025-07-13 03:30:00+00:00,5.002346308966198 +2025-07-13 03:45:00+00:00,7.710954382322372 +2025-07-13 04:00:00+00:00,11.616632130537818 +2025-07-13 04:15:00+00:00,16.373700749644964 +2025-07-13 04:30:00+00:00,18.76906588390935 +2025-07-13 04:45:00+00:00,18.85432866104866 +2025-07-13 05:00:00+00:00,19.814830425621565 +2025-07-13 05:15:00+00:00,21.507392607440693 +2025-07-13 05:30:00+00:00,21.86305164817628 +2025-07-13 05:45:00+00:00,23.01028349584749 +2025-07-13 06:00:00+00:00,22.777180213335647 +2025-07-13 06:15:00+00:00,23.427015444418597 +2025-07-13 06:30:00+00:00,23.380003133940946 +2025-07-13 06:45:00+00:00,23.944319802573375 +2025-07-13 07:00:00+00:00,24.01045530864953 +2025-07-13 07:15:00+00:00,25.256710877916184 +2025-07-13 07:30:00+00:00,24.20566589147601 +2025-07-13 07:45:00+00:00,25.411908579842745 +2025-07-13 08:00:00+00:00,25.789867522692372 +2025-07-13 08:15:00+00:00,25.209602763218918 +2025-07-13 08:30:00+00:00,27.28695672851905 +2025-07-13 08:45:00+00:00,26.442914199464187 +2025-07-13 09:00:00+00:00,28.607324458329074 +2025-07-13 09:15:00+00:00,27.606404926910994 +2025-07-13 09:30:00+00:00,28.72470121888061 +2025-07-13 09:45:00+00:00,27.978326670318253 +2025-07-13 10:00:00+00:00,27.72475698353725 +2025-07-13 10:15:00+00:00,30.953880330257242 +2025-07-13 10:30:00+00:00,28.983905687210218 +2025-07-13 10:45:00+00:00,29.082888094786853 +2025-07-13 11:00:00+00:00,29.925177200089728 +2025-07-13 11:15:00+00:00,29.50061375007152 +2025-07-13 11:30:00+00:00,29.008213037128026 +2025-07-13 11:45:00+00:00,28.847162632227263 +2025-07-13 12:00:00+00:00,28.9529262763957 +2025-07-13 12:15:00+00:00,29.099659487640892 +2025-07-13 12:30:00+00:00,29.216835854792222 +2025-07-13 12:45:00+00:00,28.495183466216304 +2025-07-13 13:00:00+00:00,28.348521196535827 +2025-07-13 13:15:00+00:00,27.916000121441648 +2025-07-13 13:30:00+00:00,27.086908902362826 +2025-07-13 13:45:00+00:00,25.35436671582009 +2025-07-13 14:00:00+00:00,23.57269936430719 +2025-07-13 14:15:00+00:00,21.69309522694489 +2025-07-13 14:30:00+00:00,19.217326112853407 +2025-07-13 14:45:00+00:00,16.78003867418232 +2025-07-13 15:00:00+00:00,13.820257843038387 +2025-07-13 15:15:00+00:00,10.695892083166449 +2025-07-13 15:30:00+00:00,7.6458552421795245 +2025-07-13 15:45:00+00:00,4.721818884390847 +2025-07-13 16:00:00+00:00,2.4927842224731713 +2025-07-14 03:15:00+00:00,3.1822593350322173 +2025-07-14 03:30:00+00:00,5.270088238271261 +2025-07-14 03:45:00+00:00,8.278667444182833 +2025-07-14 04:00:00+00:00,6.15020855129371 +2025-07-14 04:15:00+00:00,13.349469917432927 +2025-07-14 04:30:00+00:00,17.187356545289564 +2025-07-14 04:45:00+00:00,19.142387616516167 +2025-07-14 05:00:00+00:00,20.123126999327674 +2025-07-14 05:15:00+00:00,21.66434961810488 +2025-07-14 05:30:00+00:00,22.679897307060905 +2025-07-14 05:45:00+00:00,23.0785354852161 +2025-07-14 06:00:00+00:00,22.93227141107874 +2025-07-14 06:15:00+00:00,24.08246693931946 +2025-07-14 06:30:00+00:00,24.920608917169435 +2025-07-14 06:45:00+00:00,25.058078226691897 +2025-07-14 07:00:00+00:00,25.27053841321387 +2025-07-14 07:15:00+00:00,25.86975151670672 +2025-07-14 07:30:00+00:00,26.293627122430323 +2025-07-14 07:45:00+00:00,26.492125923686576 +2025-07-14 08:00:00+00:00,26.95113050422126 +2025-07-14 08:15:00+00:00,27.479068197274177 +2025-07-14 08:30:00+00:00,28.173719165249608 +2025-07-14 08:45:00+00:00,28.428835057395872 +2025-07-14 09:00:00+00:00,28.39904646569655 +2025-07-14 09:15:00+00:00,30.276415921046066 +2025-07-14 09:30:00+00:00,29.16031279590664 +2025-07-14 09:45:00+00:00,29.497856257397068 +2025-07-14 10:00:00+00:00,30.005392715125257 +2025-07-14 10:15:00+00:00,32.13777088599922 +2025-07-14 10:30:00+00:00,32.188488378454814 +2025-07-14 10:45:00+00:00,30.704865182773307 +2025-07-14 11:00:00+00:00,29.99702183823508 +2025-07-14 11:15:00+00:00,29.97394349529216 +2025-07-14 11:30:00+00:00,30.1611202808925 +2025-07-14 11:45:00+00:00,29.255189557067414 +2025-07-14 12:00:00+00:00,29.698406457323774 +2025-07-14 12:15:00+00:00,29.553913092696924 +2025-07-14 12:30:00+00:00,29.389444567373527 +2025-07-14 12:45:00+00:00,29.361513403199954 +2025-07-14 13:00:00+00:00,28.406050194287683 +2025-07-14 13:15:00+00:00,27.12464452404568 +2025-07-14 13:30:00+00:00,26.451571892920803 +2025-07-14 13:45:00+00:00,24.710098397231977 +2025-07-14 14:00:00+00:00,23.27062224331541 +2025-07-14 14:15:00+00:00,21.43967264210845 +2025-07-14 14:30:00+00:00,19.38366298272926 +2025-07-14 14:45:00+00:00,16.682099525920414 +2025-07-14 15:00:00+00:00,13.97449814404565 +2025-07-14 15:15:00+00:00,10.8485573615269 +2025-07-14 15:30:00+00:00,7.562013674909499 +2025-07-14 15:45:00+00:00,4.677294215830855 +2025-07-14 16:00:00+00:00,2.506450850210194 +2025-07-15 03:15:00+00:00,2.942047693535211 +2025-07-15 03:30:00+00:00,5.407818699713254 +2025-07-15 03:45:00+00:00,8.410519862163735 +2025-07-15 04:00:00+00:00,11.52095357954643 +2025-07-15 04:15:00+00:00,14.451776552463457 +2025-07-15 04:30:00+00:00,16.78851997397002 +2025-07-15 04:45:00+00:00,18.39440339884526 +2025-07-15 05:00:00+00:00,19.572931471737945 +2025-07-15 05:15:00+00:00,20.830086654829806 +2025-07-15 05:30:00+00:00,22.16965886451154 +2025-07-15 05:45:00+00:00,23.24975853323297 +2025-07-15 06:00:00+00:00,24.070661514919653 +2025-07-15 06:15:00+00:00,24.99971152102193 +2025-07-15 06:30:00+00:00,25.507363394975815 +2025-07-15 06:45:00+00:00,26.599870536489057 +2025-07-15 07:00:00+00:00,27.681554818074595 +2025-07-15 07:15:00+00:00,28.377549121191304 +2025-07-15 07:30:00+00:00,29.692385864570003 +2025-07-15 07:45:00+00:00,31.9738205783719 +2025-07-15 08:00:00+00:00,31.823223632414543 +2025-07-15 08:15:00+00:00,32.027025394337265 +2025-07-15 08:30:00+00:00,33.41516964610261 +2025-07-15 08:45:00+00:00,34.42138111352653 +2025-07-15 09:00:00+00:00,36.48435855908927 +2025-07-15 09:15:00+00:00,38.049014442291124 +2025-07-15 09:30:00+00:00,37.8291351862584 +2025-07-15 09:45:00+00:00,37.37678893363147 +2025-07-15 10:00:00+00:00,38.47156418168722 +2025-07-15 10:15:00+00:00,37.740894688726875 +2025-07-15 10:30:00+00:00,38.36296994487167 +2025-07-15 10:45:00+00:00,37.71822664697791 +2025-07-15 11:00:00+00:00,38.13864007286041 +2025-07-15 11:15:00+00:00,17.451661183607428 +2025-07-15 11:30:00+00:00,18.043193019064017 +2025-07-15 11:45:00+00:00,17.28242467672484 +2025-07-15 12:00:00+00:00,35.8140762985072 +2025-07-15 12:15:00+00:00,17.90515027616209 +2025-07-15 12:30:00+00:00,17.7586219937085 +2025-07-15 12:45:00+00:00,17.603021493896996 +2025-07-15 13:00:00+00:00,32.46899286721038 +2025-07-15 13:15:00+00:00,30.909121409214304 +2025-07-15 13:30:00+00:00,28.892338891459833 +2025-07-15 13:45:00+00:00,26.76871153472918 +2025-07-15 14:00:00+00:00,23.346106633132372 +2025-07-15 14:15:00+00:00,21.128298877150172 +2025-07-15 14:30:00+00:00,18.722525613740615 +2025-07-15 14:45:00+00:00,16.133603443892433 +2025-07-15 15:00:00+00:00,13.120996229696612 +2025-07-15 15:15:00+00:00,10.505082805869996 +2025-07-15 15:30:00+00:00,7.117007581658379 +2025-07-15 15:45:00+00:00,4.318347422315628 +2025-07-15 16:00:00+00:00,2.135201022078947 +2025-07-16 03:15:00+00:00,2.481061743602277 +2025-07-16 03:30:00+00:00,4.8973766212590855 +2025-07-16 03:45:00+00:00,7.842581073479041 +2025-07-16 04:00:00+00:00,11.037767979415491 +2025-07-16 04:15:00+00:00,14.30790040233542 +2025-07-16 04:30:00+00:00,17.206862428002676 +2025-07-16 04:45:00+00:00,19.786303811446082 +2025-07-16 05:00:00+00:00,21.873445197600997 +2025-07-16 05:15:00+00:00,23.85450889484037 +2025-07-16 05:30:00+00:00,25.370950418838202 +2025-07-16 05:45:00+00:00,26.158913225386826 +2025-07-16 06:00:00+00:00,27.380509420261404 +2025-07-16 06:15:00+00:00,28.226388441090794 +2025-07-16 06:30:00+00:00,29.550172463565733 +2025-07-16 06:45:00+00:00,30.783960094236658 +2025-07-16 07:00:00+00:00,31.34734918429057 +2025-07-16 07:15:00+00:00,32.132746895251486 +2025-07-16 07:30:00+00:00,32.393620711960125 +2025-07-16 07:45:00+00:00,32.26114376372834 +2025-07-16 08:00:00+00:00,33.79655265730237 +2025-07-16 08:15:00+00:00,32.92855139821176 +2025-07-16 08:30:00+00:00,33.20295027586982 +2025-07-16 08:45:00+00:00,32.995312256589784 +2025-07-16 09:00:00+00:00,35.354097253477704 +2025-07-16 09:15:00+00:00,36.3910884652519 +2025-07-16 09:30:00+00:00,35.859840303650415 +2025-07-16 09:45:00+00:00,36.110151627515236 +2025-07-16 10:00:00+00:00,36.28677442188901 +2025-07-16 10:15:00+00:00,35.84202514694947 +2025-07-16 10:30:00+00:00,33.88801401289088 +2025-07-16 10:45:00+00:00,34.58299320027156 +2025-07-16 11:00:00+00:00,34.692964767900094 +2025-07-16 11:15:00+00:00,32.99373489262339 +2025-07-16 11:30:00+00:00,33.34297061447848 +2025-07-16 11:45:00+00:00,33.18165758561354 +2025-07-16 12:00:00+00:00,33.066371633982655 +2025-07-16 12:15:00+00:00,32.20862581591758 +2025-07-16 12:30:00+00:00,31.828287914990867 +2025-07-16 12:45:00+00:00,31.476075824484603 +2025-07-16 13:00:00+00:00,31.04057259430795 +2025-07-16 13:15:00+00:00,29.84435017913513 +2025-07-16 13:30:00+00:00,27.744315667116176 +2025-07-16 13:45:00+00:00,26.000847901123972 +2025-07-16 14:00:00+00:00,23.888287445455667 +2025-07-16 14:15:00+00:00,21.402098674877735 +2025-07-16 14:30:00+00:00,17.931570147597636 +2025-07-16 14:45:00+00:00,15.544420030004755 +2025-07-16 15:00:00+00:00,13.123821384605032 +2025-07-16 15:15:00+00:00,10.059753302002916 +2025-07-16 15:30:00+00:00,6.861834408077167 +2025-07-16 15:45:00+00:00,4.123703489770516 +2025-07-16 16:00:00+00:00,1.962498110296875 +2025-07-17 03:15:00+00:00,2.724089699873751 +2025-07-17 03:30:00+00:00,5.164345527724169 +2025-07-17 03:45:00+00:00,8.060717983110258 +2025-07-17 04:00:00+00:00,10.916937426494988 +2025-07-17 04:15:00+00:00,13.814041650182334 +2025-07-17 04:30:00+00:00,16.232331385419997 +2025-07-17 04:45:00+00:00,18.853905751830407 +2025-07-17 05:00:00+00:00,20.90081815050995 +2025-07-17 05:15:00+00:00,23.312476339530726 +2025-07-17 05:30:00+00:00,25.289101012147878 +2025-07-17 05:45:00+00:00,27.45803050381733 +2025-07-17 06:00:00+00:00,29.429156723165324 +2025-07-17 06:15:00+00:00,31.365171934226776 +2025-07-17 06:30:00+00:00,33.12148330825818 +2025-07-17 06:45:00+00:00,34.12996114578846 +2025-07-17 07:00:00+00:00,35.70451261718269 +2025-07-17 07:15:00+00:00,36.72845056287029 +2025-07-17 07:30:00+00:00,17.919544463529142 +2025-07-17 07:45:00+00:00,17.279411270753933 +2025-07-17 08:00:00+00:00,17.963289354985225 +2025-07-17 08:15:00+00:00,15.979956830588167 +2025-07-17 08:30:00+00:00,16.563349907686504 +2025-07-17 08:45:00+00:00,15.27938285036251 +2025-07-17 09:00:00+00:00,15.30746951110777 +2025-07-17 09:15:00+00:00,17.154660115795423 +2025-07-17 09:30:00+00:00,16.365697896114185 +2025-07-17 09:45:00+00:00,15.752211455716706 +2025-07-17 10:00:00+00:00,16.312125790666816 +2025-07-17 10:15:00+00:00,16.204146926638465 +2025-07-17 10:30:00+00:00,15.531385651467703 +2025-07-17 10:45:00+00:00,15.27938285036251 +2025-07-17 11:00:00+00:00,14.541193930422429 +2025-07-17 11:15:00+00:00,13.154485105029154 +2025-07-17 11:30:00+00:00,15.138509092361382 +2025-07-17 11:45:00+00:00,16.18365634739023 +2025-07-17 12:00:00+00:00,14.769718890729006 +2025-07-17 12:15:00+00:00,14.023606709763964 +2025-07-17 12:30:00+00:00,15.419654587732804 +2025-07-17 12:45:00+00:00,15.461608369379778 +2025-07-17 13:00:00+00:00,15.50350321540227 +2025-07-17 13:15:00+00:00,15.677835587574423 +2025-07-17 13:30:00+00:00,14.978123894567357 +2025-07-17 13:45:00+00:00,15.255253623551997 +2025-07-17 14:00:00+00:00,14.428743039852062 +2025-07-17 14:15:00+00:00,13.474136086327162 +2025-07-17 14:30:00+00:00,13.723336830490519 +2025-07-17 14:45:00+00:00,14.345417770759731 +2025-07-17 15:00:00+00:00,11.4293942353416 +2025-07-17 15:15:00+00:00,8.252508743298158 +2025-07-17 15:30:00+00:00,5.523477452003585 +2025-07-17 15:45:00+00:00,3.1736000056308784 +2025-07-17 16:00:00+00:00,1.1759856066248924 +2025-07-18 03:15:00+00:00,2.4293929409315225 +2025-07-18 03:30:00+00:00,4.601129625288162 +2025-07-18 03:45:00+00:00,7.467263569071455 +2025-07-18 04:00:00+00:00,10.43756399469306 +2025-07-18 04:15:00+00:00,13.574756015223514 +2025-07-18 04:30:00+00:00,16.403455863985982 +2025-07-18 04:45:00+00:00,18.965357924621195 +2025-07-18 05:00:00+00:00,21.194636100166253 +2025-07-18 05:15:00+00:00,23.23946907459908 +2025-07-18 05:30:00+00:00,25.78935120138201 +2025-07-18 05:45:00+00:00,27.093963362247255 +2025-07-18 06:00:00+00:00,28.183046163565983 +2025-07-18 06:15:00+00:00,29.55895786604922 +2025-07-18 06:30:00+00:00,30.383360496401785 +2025-07-18 06:45:00+00:00,30.33793334077101 +2025-07-18 07:00:00+00:00,31.275317269218622 +2025-07-18 07:15:00+00:00,31.902435421071857 +2025-07-18 07:30:00+00:00,33.354823758809836 +2025-07-18 07:45:00+00:00,33.773333278435615 +2025-07-18 08:00:00+00:00,34.305517341454056 +2025-07-18 08:15:00+00:00,34.496551771983896 +2025-07-18 08:30:00+00:00,35.61839263546616 +2025-07-18 08:45:00+00:00,35.41326252753104 +2025-07-18 09:00:00+00:00,35.749026872638034 +2025-07-18 09:15:00+00:00,36.284986214490786 +2025-07-18 09:30:00+00:00,35.947018270482495 +2025-07-18 09:45:00+00:00,36.451754861580305 +2025-07-18 10:00:00+00:00,36.42943070384145 +2025-07-18 10:15:00+00:00,36.283514419995825 +2025-07-18 10:30:00+00:00,36.23020257225952 +2025-07-18 10:45:00+00:00,36.140178359036966 +2025-07-18 11:00:00+00:00,36.285706389225425 +2025-07-18 11:15:00+00:00,35.114482217690025 +2025-07-18 11:30:00+00:00,34.37008401197817 +2025-07-18 11:45:00+00:00,33.47033631627435 +2025-07-18 12:00:00+00:00,33.314940219568506 +2025-07-18 12:15:00+00:00,9.361740292944845 +2025-07-18 12:30:00+00:00,23.31382344017626 +2025-07-18 12:45:00+00:00,31.136209665695514 +2025-07-18 13:00:00+00:00,30.206021721362262 +2025-07-18 13:15:00+00:00,29.031886817543523 +2025-07-18 13:30:00+00:00,27.845836566070933 +2025-07-18 13:45:00+00:00,25.916556635484334 +2025-07-18 14:00:00+00:00,24.008103159816205 +2025-07-18 14:15:00+00:00,21.589355170029048 +2025-07-18 14:30:00+00:00,18.762929796105546 +2025-07-18 14:45:00+00:00,15.859960283818213 +2025-07-18 15:00:00+00:00,12.805086686160408 +2025-07-18 15:15:00+00:00,9.457379884341693 +2025-07-18 15:30:00+00:00,6.560067078972631 +2025-07-18 15:45:00+00:00,3.984784938962463 +2025-07-18 16:00:00+00:00,1.8344764729808531 +2025-07-19 03:15:00+00:00,2.560427065841701 +2025-07-19 03:30:00+00:00,4.362273151583259 +2025-07-19 03:45:00+00:00,5.332874721954433 +2025-07-19 04:00:00+00:00,10.290528990875469 +2025-07-19 04:15:00+00:00,13.75158189162736 +2025-07-19 04:30:00+00:00,16.53740393642543 +2025-07-19 04:45:00+00:00,19.051296586617035 +2025-07-19 05:00:00+00:00,20.94000689893 +2025-07-19 05:15:00+00:00,22.302919421769765 +2025-07-19 05:30:00+00:00,23.768313328728283 +2025-07-19 05:45:00+00:00,23.77585125952272 +2025-07-19 06:00:00+00:00,25.624663962816502 +2025-07-19 06:15:00+00:00,26.147210078423317 +2025-07-19 06:30:00+00:00,27.17129931496165 +2025-07-19 06:45:00+00:00,26.831752568532124 +2025-07-19 07:00:00+00:00,27.52365298060539 +2025-07-19 07:15:00+00:00,29.18038721104753 +2025-07-19 07:30:00+00:00,30.365729983710334 +2025-07-19 07:45:00+00:00,30.378325604606964 +2025-07-19 08:00:00+00:00,31.174360383073786 +2025-07-19 08:15:00+00:00,32.68055631387028 +2025-07-19 08:30:00+00:00,35.70984792970455 +2025-07-19 08:45:00+00:00,33.89331064196483 +2025-07-19 09:00:00+00:00,35.17765147793886 +2025-07-19 09:15:00+00:00,34.75981960562829 +2025-07-19 09:30:00+00:00,35.25977766684277 +2025-07-19 09:45:00+00:00,38.21629982980553 +2025-07-19 10:00:00+00:00,35.6194974525583 +2025-07-19 10:15:00+00:00,38.723224573229786 +2025-07-19 10:30:00+00:00,38.27465407878998 +2025-07-19 10:45:00+00:00,36.84066197760368 +2025-07-19 11:00:00+00:00,37.94905372623665 +2025-07-19 11:15:00+00:00,37.46486573956504 +2025-07-19 11:30:00+00:00,36.66656063227363 +2025-07-19 11:45:00+00:00,35.7009164022031 +2025-07-19 12:00:00+00:00,34.96367056742241 +2025-07-19 12:15:00+00:00,34.71869994631999 +2025-07-19 12:30:00+00:00,33.73728547654716 +2025-07-19 12:45:00+00:00,32.73876292701516 +2025-07-19 13:00:00+00:00,31.53847676943083 +2025-07-19 13:15:00+00:00,30.209721768669738 +2025-07-19 13:30:00+00:00,28.0329128813737 +2025-07-19 13:45:00+00:00,26.494237042942444 +2025-07-19 14:00:00+00:00,24.268016680062036 +2025-07-19 14:15:00+00:00,21.995911388242266 +2025-07-19 14:30:00+00:00,19.451598827521835 +2025-07-19 14:45:00+00:00,16.433644567591557 +2025-07-19 15:00:00+00:00,13.686406939760076 +2025-07-19 15:15:00+00:00,10.394813163542054 +2025-07-19 15:30:00+00:00,7.254412360874854 +2025-07-19 15:45:00+00:00,4.330712450228212 +2025-07-19 16:00:00+00:00,1.9818107165219527 +2025-07-20 03:30:00+00:00,2.3741865290515474 +2025-07-20 03:45:00+00:00,3.6526592568148937 +2025-07-20 04:00:00+00:00,6.394246321594254 +2025-07-20 04:15:00+00:00,6.940270952993685 +2025-07-20 04:30:00+00:00,12.590426812456293 +2025-07-20 04:45:00+00:00,14.354683237494575 +2025-07-20 05:00:00+00:00,10.559315253041031 +2025-07-20 05:15:00+00:00,22.659993542525157 +2025-07-20 05:30:00+00:00,24.470716150893228 +2025-07-20 05:45:00+00:00,26.05300549992331 +2025-07-20 06:00:00+00:00,26.608923570672218 +2025-07-20 06:15:00+00:00,25.958319518091432 +2025-07-20 06:30:00+00:00,26.62805534530302 +2025-07-20 06:45:00+00:00,26.602906465650964 +2025-07-20 07:00:00+00:00,27.707575571723126 +2025-07-20 07:15:00+00:00,27.468795806825135 +2025-07-20 07:30:00+00:00,27.93571339348189 +2025-07-20 07:45:00+00:00,28.866329454743283 +2025-07-20 08:00:00+00:00,29.353922761068958 +2025-07-20 08:15:00+00:00,29.792042416987286 +2025-07-20 08:30:00+00:00,31.829683004194575 +2025-07-20 08:45:00+00:00,32.251303898503004 +2025-07-20 09:00:00+00:00,32.87106287448486 +2025-07-20 09:15:00+00:00,32.54703697542025 +2025-07-20 09:30:00+00:00,34.95700548358979 +2025-07-20 09:45:00+00:00,34.091846854261895 +2025-07-20 10:00:00+00:00,33.638069669151044 +2025-07-20 10:15:00+00:00,34.289705149739945 +2025-07-20 10:30:00+00:00,33.88237767581073 +2025-07-20 10:45:00+00:00,33.228311774069 +2025-07-20 11:00:00+00:00,33.14644651273696 +2025-07-20 11:15:00+00:00,32.7274354211685 +2025-07-20 11:30:00+00:00,30.85455757427189 +2025-07-20 11:45:00+00:00,30.930466943769993 +2025-07-20 12:00:00+00:00,30.986490044884658 +2025-07-20 12:15:00+00:00,30.945787077123708 +2025-07-20 12:30:00+00:00,30.323286238502888 +2025-07-20 12:45:00+00:00,30.06560786518661 +2025-07-20 13:00:00+00:00,29.2718362504997 +2025-07-20 13:15:00+00:00,27.431068669985713 +2025-07-20 13:30:00+00:00,26.191156327722126 +2025-07-20 13:45:00+00:00,25.03388245413497 +2025-07-20 14:00:00+00:00,23.585138426130623 +2025-07-20 14:15:00+00:00,21.46172470846713 +2025-07-20 14:30:00+00:00,19.2996010200314 +2025-07-20 14:45:00+00:00,16.52374180246823 +2025-07-20 15:00:00+00:00,13.600023552719819 +2025-07-20 15:15:00+00:00,10.426415402321522 +2025-07-20 15:30:00+00:00,7.292274959730248 +2025-07-20 15:45:00+00:00,4.422049125877429 +2025-07-20 16:00:00+00:00,2.100829986826131 +2025-07-21 03:15:00+00:00,2.2025580829038787 +2025-07-21 03:30:00+00:00,4.646399105013119 +2025-07-21 03:45:00+00:00,7.622865448928204 +2025-07-21 04:00:00+00:00,10.646962585317493 +2025-07-21 04:15:00+00:00,13.58375891149397 +2025-07-21 04:30:00+00:00,16.39600681054425 +2025-07-21 04:45:00+00:00,18.710961614809516 +2025-07-21 05:00:00+00:00,20.047517881233286 +2025-07-21 05:15:00+00:00,21.981405455582678 +2025-07-21 05:30:00+00:00,23.718619306052986 +2025-07-21 05:45:00+00:00,24.460143332215058 +2025-07-21 06:00:00+00:00,24.57758122845421 +2025-07-21 06:15:00+00:00,25.539725106215965 +2025-07-21 06:30:00+00:00,26.424459877372414 +2025-07-21 06:45:00+00:00,25.75462164714889 +2025-07-21 07:00:00+00:00,27.023873525364635 +2025-07-21 07:15:00+00:00,28.236611863424205 +2025-07-21 07:30:00+00:00,28.4824387487961 +2025-07-21 07:45:00+00:00,30.627787848619853 +2025-07-21 08:00:00+00:00,31.20122908602858 +2025-07-21 08:15:00+00:00,31.472361000472535 +2025-07-21 08:30:00+00:00,34.36595049846946 +2025-07-21 08:45:00+00:00,34.3878541126528 +2025-07-21 09:00:00+00:00,35.26911936810419 +2025-07-21 09:15:00+00:00,38.242729511166885 +2025-07-21 09:30:00+00:00,38.757306770083815 +2025-07-21 09:45:00+00:00,18.249950669021832 +2025-07-21 10:00:00+00:00,18.52361133188182 +2025-07-21 10:15:00+00:00,17.259818842584465 +2025-07-21 10:30:00+00:00,17.472155225459325 +2025-07-21 10:45:00+00:00,18.1307457048904 +2025-07-21 11:00:00+00:00,17.152395977796413 +2025-07-21 11:15:00+00:00,18.218879609114488 +2025-07-21 11:30:00+00:00,17.944346485794142 +2025-07-21 11:45:00+00:00,17.638426531994824 +2025-07-21 12:00:00+00:00,17.17041693563655 +2025-07-21 12:15:00+00:00,17.739203459301937 +2025-07-21 12:30:00+00:00,17.609033423254964 +2025-07-21 12:45:00+00:00,17.36916044909779 +2025-07-21 13:00:00+00:00,30.95131043763053 +2025-07-21 13:15:00+00:00,17.321597971051748 +2025-07-21 13:30:00+00:00,27.746941669465073 +2025-07-21 13:45:00+00:00,25.37781772650733 +2025-07-21 14:00:00+00:00,22.686938044780728 +2025-07-21 14:15:00+00:00,20.45817865210701 +2025-07-21 14:30:00+00:00,17.860412397593038 +2025-07-21 14:45:00+00:00,15.555897526246861 +2025-07-21 15:00:00+00:00,12.477219965427626 +2025-07-21 15:15:00+00:00,9.152082469432987 +2025-07-21 15:30:00+00:00,6.129734107051935 +2025-07-21 15:45:00+00:00,3.508143248523159 +2025-07-21 16:00:00+00:00,1.4828627036179858 +2025-07-22 03:15:00+00:00,1.994275204281549 +2025-07-22 03:30:00+00:00,4.126309174837974 +2025-07-22 03:45:00+00:00,6.769524257583734 +2025-07-22 04:00:00+00:00,9.789480481094479 +2025-07-22 04:15:00+00:00,12.889275528039512 +2025-07-22 04:30:00+00:00,16.07233532706993 +2025-07-22 04:45:00+00:00,18.744653983205414 +2025-07-22 05:00:00+00:00,21.073102128887133 +2025-07-22 05:15:00+00:00,23.12526718030523 +2025-07-22 05:30:00+00:00,24.17068281544863 +2025-07-22 05:45:00+00:00,25.773504208448855 +2025-07-22 06:00:00+00:00,26.905566245826652 +2025-07-22 06:15:00+00:00,27.27140538211545 +2025-07-22 06:30:00+00:00,28.96219760176168 +2025-07-22 06:45:00+00:00,28.133417598384927 +2025-07-22 07:00:00+00:00,29.85105939413082 +2025-07-22 07:15:00+00:00,30.11399857787244 +2025-07-22 07:30:00+00:00,31.026989594137643 +2025-07-22 07:45:00+00:00,31.675948451508763 +2025-07-22 08:00:00+00:00,32.54338978738442 +2025-07-22 08:15:00+00:00,33.21430097593093 +2025-07-22 08:30:00+00:00,34.13598609014791 +2025-07-22 08:45:00+00:00,34.89863157802528 +2025-07-22 09:00:00+00:00,36.06486065805879 +2025-07-22 09:15:00+00:00,37.02168952013341 +2025-07-22 09:30:00+00:00,36.961551698120076 +2025-07-22 09:45:00+00:00,38.146991809024904 +2025-07-22 10:00:00+00:00,38.17343991761219 +2025-07-22 10:15:00+00:00,18.177446900610416 +2025-07-22 10:30:00+00:00,17.866981325700237 +2025-07-22 10:45:00+00:00,17.729493553687437 +2025-07-22 11:00:00+00:00,17.443206072695773 +2025-07-22 11:15:00+00:00,17.88937836133267 +2025-07-22 11:30:00+00:00,17.915956750166792 +2025-07-22 11:45:00+00:00,17.939740899642885 +2025-07-22 12:00:00+00:00,17.423599969531065 +2025-07-22 12:15:00+00:00,17.73141026555683 +2025-07-22 12:30:00+00:00,17.9367191101228 +2025-07-22 12:45:00+00:00,17.560411326078473 +2025-07-22 13:00:00+00:00,17.004155419155413 +2025-07-22 13:15:00+00:00,17.277359758158045 +2025-07-22 13:30:00+00:00,27.385242016142954 +2025-07-22 13:45:00+00:00,25.32238008322979 +2025-07-22 14:00:00+00:00,23.138055170755806 +2025-07-22 14:15:00+00:00,20.235462882355705 +2025-07-22 14:30:00+00:00,17.788293945138204 +2025-07-22 14:45:00+00:00,15.089138625566994 +2025-07-22 15:00:00+00:00,12.092672549403305 +2025-07-22 15:15:00+00:00,8.9613267981952 +2025-07-22 15:30:00+00:00,6.103493491102903 +2025-07-22 15:45:00+00:00,3.487420718611284 +2025-07-22 16:00:00+00:00,1.478345289790741 +2025-07-23 03:30:00+00:00,3.9841344772428795 +2025-07-23 03:45:00+00:00,6.724442877037239 +2025-07-23 04:00:00+00:00,9.617701889349078 +2025-07-23 04:15:00+00:00,12.693187025665667 +2025-07-23 04:30:00+00:00,15.551472691371874 +2025-07-23 04:45:00+00:00,18.470511616703707 +2025-07-23 05:00:00+00:00,20.8149800920038 +2025-07-23 05:15:00+00:00,22.94736469827881 +2025-07-23 05:30:00+00:00,23.54568533170524 +2025-07-23 05:45:00+00:00,25.888286178263886 +2025-07-23 06:00:00+00:00,27.409501362540922 +2025-07-23 06:15:00+00:00,29.22564352236134 +2025-07-23 06:30:00+00:00,29.629627536460816 +2025-07-23 06:45:00+00:00,31.632866179930033 +2025-07-23 07:00:00+00:00,33.29595936311349 +2025-07-23 07:15:00+00:00,33.04700184565 +2025-07-23 07:30:00+00:00,34.7947444774043 +2025-07-23 07:45:00+00:00,37.14721305348685 +2025-07-23 08:00:00+00:00,37.351084658643714 +2025-07-23 08:15:00+00:00,17.648535790920583 +2025-07-23 08:30:00+00:00,17.83067728135571 +2025-07-23 08:45:00+00:00,17.37868299724686 +2025-07-23 09:00:00+00:00,16.980837785202088 +2025-07-23 09:15:00+00:00,16.53383734078212 +2025-07-23 09:30:00+00:00,16.217598257044312 +2025-07-23 09:45:00+00:00,14.13895863785407 +2025-07-23 10:00:00+00:00,16.283084290939378 +2025-07-23 10:15:00+00:00,14.6841558198032 +2025-07-23 10:30:00+00:00,14.627012102109717 +2025-07-23 10:45:00+00:00,16.3249166580549 +2025-07-23 11:00:00+00:00,14.254172696642225 +2025-07-23 11:15:00+00:00,16.414097475165153 +2025-07-23 11:30:00+00:00,14.6841558198032 +2025-07-23 11:45:00+00:00,14.48390988205627 +2025-07-23 12:00:00+00:00,14.282923514355932 +2025-07-23 12:15:00+00:00,14.769718890729006 +2025-07-23 12:30:00+00:00,14.397882272168538 +2025-07-23 12:45:00+00:00,14.512570551692038 +2025-07-23 13:00:00+00:00,16.37943602435868 +2025-07-23 13:15:00+00:00,16.751495871546744 +2025-07-23 13:30:00+00:00,27.88950690891266 +2025-07-23 13:45:00+00:00,25.61063415692779 +2025-07-23 14:00:00+00:00,23.047181850151333 +2025-07-23 14:15:00+00:00,20.306119472889634 +2025-07-23 14:30:00+00:00,17.564464825080048 +2025-07-23 14:45:00+00:00,14.40488776929565 +2025-07-23 15:00:00+00:00,11.657547248020897 +2025-07-23 15:15:00+00:00,8.687235802000966 +2025-07-23 15:30:00+00:00,5.901970560678339 +2025-07-23 15:45:00+00:00,3.363749508405514 +2025-07-23 16:00:00+00:00,1.3073971252516317 +2025-07-24 03:30:00+00:00,4.822148544498257 +2025-07-24 03:45:00+00:00,7.672002767570771 +2025-07-24 04:00:00+00:00,10.792144308866181 +2025-07-24 04:15:00+00:00,12.40795700247379 +2025-07-24 04:30:00+00:00,16.87827105334734 +2025-07-24 04:45:00+00:00,19.73414055413251 +2025-07-24 05:00:00+00:00,22.190552421387896 +2025-07-24 05:15:00+00:00,24.142641724538354 +2025-07-24 05:30:00+00:00,26.405127069888 +2025-07-24 05:45:00+00:00,27.974036549685998 +2025-07-24 06:00:00+00:00,29.18062735664347 +2025-07-24 06:15:00+00:00,30.727900668213067 +2025-07-24 06:30:00+00:00,30.66230754663085 +2025-07-24 06:45:00+00:00,32.40108959354921 +2025-07-24 07:00:00+00:00,33.987778949246824 +2025-07-24 07:15:00+00:00,34.79270151557957 +2025-07-24 07:30:00+00:00,35.35793963628659 +2025-07-24 07:45:00+00:00,36.8857774468467 +2025-07-24 08:00:00+00:00,36.35901384412572 +2025-07-24 08:15:00+00:00,36.95725610523157 +2025-07-24 08:30:00+00:00,38.239577613999074 +2025-07-24 08:45:00+00:00,18.454959913489603 +2025-07-24 09:00:00+00:00,38.12658676053397 +2025-07-24 09:15:00+00:00,17.996482785843966 +2025-07-24 09:30:00+00:00,18.353311540688935 +2025-07-24 09:45:00+00:00,18.369430322600703 +2025-07-24 10:00:00+00:00,38.41321453580826 +2025-07-24 10:15:00+00:00,18.434856391118686 +2025-07-24 10:30:00+00:00,18.346919967823542 +2025-07-24 10:45:00+00:00,18.156477309676433 +2025-07-24 11:00:00+00:00,37.361986144509785 +2025-07-24 11:15:00+00:00,18.304034198147622 +2025-07-24 11:30:00+00:00,35.58776795159089 +2025-07-24 11:45:00+00:00,35.72304032214544 +2025-07-24 12:00:00+00:00,35.808757660897435 +2025-07-24 12:15:00+00:00,34.798304213667016 +2025-07-24 12:30:00+00:00,33.12325820821889 +2025-07-24 12:45:00+00:00,32.49582706883392 +2025-07-24 13:00:00+00:00,31.103546537734648 +2025-07-24 13:15:00+00:00,29.46023343047299 +2025-07-24 13:30:00+00:00,27.458353067119685 +2025-07-24 13:45:00+00:00,25.344186644559034 +2025-07-24 14:00:00+00:00,23.16715181954577 +2025-07-24 14:15:00+00:00,20.04595319735988 +2025-07-24 14:30:00+00:00,17.469711349611593 +2025-07-24 14:45:00+00:00,14.626959001073791 +2025-07-24 15:00:00+00:00,11.530972004594505 +2025-07-24 15:15:00+00:00,8.603451743542232 +2025-07-24 15:30:00+00:00,5.823190630528194 +2025-07-24 15:45:00+00:00,3.4861947209938564 +2025-07-24 16:00:00+00:00,1.510335883846295 +2025-07-25 03:30:00+00:00,4.897754238938464 +2025-07-25 03:45:00+00:00,7.667384055744388 +2025-07-25 04:00:00+00:00,10.71963198565057 +2025-07-25 04:15:00+00:00,13.685982329053783 +2025-07-25 04:30:00+00:00,16.29584887562323 +2025-07-25 04:45:00+00:00,18.761702998976553 +2025-07-25 05:00:00+00:00,21.253760571366115 +2025-07-25 05:15:00+00:00,23.536272002067875 +2025-07-25 05:30:00+00:00,25.72669287786949 +2025-07-25 05:45:00+00:00,27.554587553806705 +2025-07-25 06:00:00+00:00,29.073747027017216 +2025-07-25 06:15:00+00:00,30.403316240737187 +2025-07-25 06:30:00+00:00,32.01982580622445 +2025-07-25 06:45:00+00:00,32.92011846513497 +2025-07-25 07:00:00+00:00,34.869319217438125 +2025-07-25 07:15:00+00:00,35.22664677995184 +2025-07-25 07:30:00+00:00,18.22298899218187 +2025-07-25 07:45:00+00:00,36.66856049802483 +2025-07-25 08:00:00+00:00,37.26184019311222 +2025-07-25 08:15:00+00:00,37.717187753476104 +2025-07-25 08:30:00+00:00,38.404454538971784 +2025-07-25 08:45:00+00:00,18.463532204607535 +2025-07-25 09:00:00+00:00,17.64014772694845 +2025-07-25 09:15:00+00:00,17.086451479127717 +2025-07-25 09:30:00+00:00,15.642684631839298 +2025-07-25 09:45:00+00:00,15.694137299190423 +2025-07-25 10:00:00+00:00,16.605489273731724 +2025-07-25 10:15:00+00:00,16.884121908012645 +2025-07-25 10:30:00+00:00,13.994753642647948 +2025-07-25 10:45:00+00:00,15.419654587732804 +2025-07-25 11:00:00+00:00,15.591063900901588 +2025-07-25 11:15:00+00:00,15.98536707417812 +2025-07-25 11:30:00+00:00,14.6841558198032 +2025-07-25 11:45:00+00:00,14.541215768944182 +2025-07-25 12:00:00+00:00,14.397882272168538 +2025-07-25 12:15:00+00:00,13.53171124904664 +2025-07-25 12:30:00+00:00,15.27938285036251 +2025-07-25 12:45:00+00:00,15.656781019943294 +2025-07-25 13:00:00+00:00,16.504436916539166 +2025-07-25 13:15:00+00:00,16.86988593955418 +2025-07-25 13:30:00+00:00,16.57447727643867 +2025-07-25 13:45:00+00:00,16.254143147975114 +2025-07-25 14:00:00+00:00,15.593422125792975 +2025-07-25 14:15:00+00:00,20.36343691846456 +2025-07-25 14:30:00+00:00,17.35968818694403 +2025-07-25 14:45:00+00:00,14.354107423682294 +2025-07-25 15:00:00+00:00,11.391491730758364 +2025-07-25 15:15:00+00:00,8.301685582856331 +2025-07-25 15:30:00+00:00,5.578140882025345 +2025-07-25 15:45:00+00:00,2.9468582150932714 +2025-07-25 16:00:00+00:00,1.0677748020899054 +2025-07-26 03:30:00+00:00,2.3998332193679532 +2025-07-26 03:45:00+00:00,3.228041633579232 +2025-07-26 04:00:00+00:00,4.864292524626395 +2025-07-26 04:15:00+00:00,8.161693228666238 +2025-07-26 04:30:00+00:00,8.256983835980735 +2025-07-26 04:45:00+00:00,18.509473888212515 +2025-07-26 05:00:00+00:00,20.664255984457256 +2025-07-26 05:15:00+00:00,23.902000674913054 +2025-07-26 05:30:00+00:00,23.617000279490867 +2025-07-26 05:45:00+00:00,26.605398642928247 +2025-07-26 06:00:00+00:00,27.98046710704661 +2025-07-26 06:15:00+00:00,29.493912577839353 +2025-07-26 06:30:00+00:00,30.48176778469864 +2025-07-26 06:45:00+00:00,30.961822647994303 +2025-07-26 07:00:00+00:00,32.82165957491646 +2025-07-26 07:15:00+00:00,33.811102909009676 +2025-07-26 07:30:00+00:00,34.33264414964089 +2025-07-26 07:45:00+00:00,35.275502169418985 +2025-07-26 08:00:00+00:00,35.392230035861544 +2025-07-26 08:15:00+00:00,35.94045875054281 +2025-07-26 08:30:00+00:00,37.2844328021772 +2025-07-26 08:45:00+00:00,38.811441298652696 +2025-07-26 09:00:00+00:00,18.319536652759822 +2025-07-26 09:15:00+00:00,39.05968285053243 +2025-07-26 09:30:00+00:00,38.76427858956518 +2025-07-26 09:45:00+00:00,38.55972360846616 +2025-07-26 10:00:00+00:00,38.7637512264938 +2025-07-26 10:15:00+00:00,18.371616697646708 +2025-07-26 10:30:00+00:00,18.077239831711132 +2025-07-26 10:45:00+00:00,38.477733438742035 +2025-07-26 11:00:00+00:00,37.61239113123325 +2025-07-26 11:15:00+00:00,37.57012124932481 +2025-07-26 11:30:00+00:00,36.98681919602028 +2025-07-26 11:45:00+00:00,35.911103033192255 +2025-07-26 12:00:00+00:00,35.778995327946824 +2025-07-26 12:15:00+00:00,35.540010782446984 +2025-07-26 12:30:00+00:00,17.89411186667378 +2025-07-26 12:45:00+00:00,33.27150971494941 +2025-07-26 13:00:00+00:00,31.88060964198043 +2025-07-26 13:15:00+00:00,29.82381658472639 +2025-07-26 13:30:00+00:00,26.889697118269368 +2025-07-26 13:45:00+00:00,25.627524116255657 +2025-07-26 14:00:00+00:00,23.48684623734556 +2025-07-26 14:15:00+00:00,21.232248988219503 +2025-07-26 14:30:00+00:00,18.29355131782454 +2025-07-26 14:45:00+00:00,15.288356850242232 +2025-07-26 15:00:00+00:00,11.920218741918156 +2025-07-26 15:15:00+00:00,8.900101450702412 +2025-07-26 15:30:00+00:00,5.8943814246930755 +2025-07-26 15:45:00+00:00,3.3156476651233886 +2025-07-26 16:00:00+00:00,1.082413590860616 +2025-07-27 03:30:00+00:00,4.798664605328492 +2025-07-27 03:45:00+00:00,7.745804421709802 +2025-07-27 04:00:00+00:00,10.80332331826372 +2025-07-27 04:15:00+00:00,13.744753149220145 +2025-07-27 04:30:00+00:00,16.456652038525874 +2025-07-27 04:45:00+00:00,18.875619640796987 +2025-07-27 05:00:00+00:00,20.933280330673167 +2025-07-27 05:15:00+00:00,23.027414820725834 +2025-07-27 05:30:00+00:00,25.15631319554411 +2025-07-27 05:45:00+00:00,27.446796353086647 +2025-07-27 06:00:00+00:00,29.66553570297755 +2025-07-27 06:15:00+00:00,31.428305058816708 +2025-07-27 06:30:00+00:00,33.656734841778444 +2025-07-27 06:45:00+00:00,34.124856346948256 +2025-07-27 07:00:00+00:00,36.0719771369993 +2025-07-27 07:15:00+00:00,17.4284105975913 +2025-07-27 07:30:00+00:00,16.187664852542625 +2025-07-27 07:45:00+00:00,15.965871263175814 +2025-07-27 08:00:00+00:00,15.670471161095328 +2025-07-27 08:15:00+00:00,15.559241090141574 +2025-07-27 08:30:00+00:00,13.386685209845824 +2025-07-27 08:45:00+00:00,13.79239208632084 +2025-07-27 09:00:00+00:00,12.602983123700326 +2025-07-27 09:15:00+00:00,13.734494379133311 +2025-07-27 09:30:00+00:00,10.262830214278171 +2025-07-27 09:45:00+00:00,11.477728435290505 +2025-07-27 10:00:00+00:00,12.42905824244783 +2025-07-27 10:15:00+00:00,11.334723455680852 +2025-07-27 10:30:00+00:00,9.986037589347175 +2025-07-27 10:45:00+00:00,13.241571397603282 +2025-07-27 11:00:00+00:00,12.545017900007291 +2025-07-27 11:15:00+00:00,11.678541954592113 +2025-07-27 11:30:00+00:00,10.54199404141299 +2025-07-27 11:45:00+00:00,11.135192028637954 +2025-07-27 12:00:00+00:00,11.735997331019554 +2025-07-27 12:15:00+00:00,9.711903161984493 +2025-07-27 12:30:00+00:00,12.284264452680988 +2025-07-27 12:45:00+00:00,9.739180826112419 +2025-07-27 13:00:00+00:00,12.573998280967794 +2025-07-27 13:15:00+00:00,13.241571397603282 +2025-07-27 13:30:00+00:00,13.908048613241586 +2025-07-27 13:45:00+00:00,15.559241090141574 +2025-07-27 14:00:00+00:00,14.095358798282977 +2025-07-27 14:15:00+00:00,13.808091801404133 +2025-07-27 14:30:00+00:00,16.096141482609717 +2025-07-27 14:45:00+00:00,12.976988430027845 +2025-07-27 15:00:00+00:00,10.135507482995655 +2025-07-27 15:15:00+00:00,7.171751179624064 +2025-07-27 15:30:00+00:00,4.651023746510054 +2025-07-27 15:45:00+00:00,2.2397929530446015 +2025-07-27 16:00:00+00:00,0.57141624370758 +2025-07-28 03:30:00+00:00,3.741659266213378 +2025-07-28 03:45:00+00:00,6.294267744795574 +2025-07-28 04:00:00+00:00,9.332195848715822 +2025-07-28 04:15:00+00:00,12.267562892831169 +2025-07-28 04:30:00+00:00,15.505332066474447 +2025-07-28 04:45:00+00:00,18.32192467239283 +2025-07-28 05:00:00+00:00,20.867633703930736 +2025-07-28 05:15:00+00:00,23.35782848120848 +2025-07-28 05:30:00+00:00,25.4605258461096 +2025-07-28 05:45:00+00:00,27.0885797738232 +2025-07-28 06:00:00+00:00,28.65208792003128 +2025-07-28 06:15:00+00:00,29.55862179790992 +2025-07-28 06:30:00+00:00,31.20562224590897 +2025-07-28 06:45:00+00:00,32.1205106922262 +2025-07-28 07:00:00+00:00,32.42302509574457 +2025-07-28 07:15:00+00:00,34.401423197675484 +2025-07-28 07:30:00+00:00,34.46325280809441 +2025-07-28 07:45:00+00:00,35.47409107282344 +2025-07-28 08:00:00+00:00,35.11654291513164 +2025-07-28 08:15:00+00:00,36.60918671776394 +2025-07-28 08:30:00+00:00,37.22421298252614 +2025-07-28 08:45:00+00:00,37.728475090539646 +2025-07-28 09:00:00+00:00,37.576541807664356 +2025-07-28 09:15:00+00:00,37.92244415453589 +2025-07-28 09:30:00+00:00,37.60293642344445 +2025-07-28 09:45:00+00:00,37.417727039433224 +2025-07-28 10:00:00+00:00,36.92019844403969 +2025-07-28 10:15:00+00:00,35.84253327551828 +2025-07-28 10:30:00+00:00,36.7112904342489 +2025-07-28 10:45:00+00:00,36.5550723548245 +2025-07-28 11:00:00+00:00,36.20919717529225 +2025-07-28 11:15:00+00:00,35.474249803947735 +2025-07-28 11:30:00+00:00,35.39524728129734 +2025-07-28 11:45:00+00:00,33.990415263831316 +2025-07-28 12:00:00+00:00,33.71151610840183 +2025-07-28 12:15:00+00:00,33.41385539899418 +2025-07-28 12:30:00+00:00,32.9167446837882 +2025-07-28 12:45:00+00:00,31.447136316851882 +2025-07-28 13:00:00+00:00,30.282826197370746 +2025-07-28 13:15:00+00:00,28.440141476992945 +2025-07-28 13:30:00+00:00,26.47754339995452 +2025-07-28 13:45:00+00:00,24.522061483774337 +2025-07-28 14:00:00+00:00,22.483191916503195 +2025-07-28 14:15:00+00:00,19.957996653944843 +2025-07-28 14:30:00+00:00,16.870122201871197 +2025-07-28 14:45:00+00:00,14.149127290309105 +2025-07-28 15:00:00+00:00,10.815898048007824 +2025-07-28 15:15:00+00:00,8.308286623931835 +2025-07-28 15:30:00+00:00,5.7997341669827325 +2025-07-28 15:45:00+00:00,3.148496827261811 +2025-07-28 16:00:00+00:00,1.3727059098536971 +2025-07-29 03:30:00+00:00,4.060589162169016 +2025-07-29 03:45:00+00:00,5.994389714834392 +2025-07-29 04:00:00+00:00,10.17117066567573 +2025-07-29 04:15:00+00:00,14.394362183543517 +2025-07-29 04:30:00+00:00,8.671193993008316 +2025-07-29 04:45:00+00:00,12.579647084416077 +2025-07-29 05:00:00+00:00,19.94648273128715 +2025-07-29 05:15:00+00:00,22.853387680037414 +2025-07-29 05:30:00+00:00,24.382273530314045 +2025-07-29 05:45:00+00:00,24.16275888841544 +2025-07-29 06:00:00+00:00,24.739699427180003 +2025-07-29 06:15:00+00:00,25.06748144092264 +2025-07-29 06:30:00+00:00,26.872531025290925 +2025-07-29 06:45:00+00:00,27.10323981727228 +2025-07-29 07:00:00+00:00,28.417831442564072 +2025-07-29 07:15:00+00:00,28.434649962799355 +2025-07-29 07:30:00+00:00,28.817003633467976 +2025-07-29 07:45:00+00:00,29.916275873473623 +2025-07-29 08:00:00+00:00,30.06726323724586 +2025-07-29 08:15:00+00:00,30.073105234435864 +2025-07-29 08:30:00+00:00,31.562020663683224 +2025-07-29 08:45:00+00:00,30.68669828158092 +2025-07-29 09:00:00+00:00,33.06014891476585 +2025-07-29 09:15:00+00:00,33.22715232187726 +2025-07-29 09:30:00+00:00,33.58180853447718 +2025-07-29 09:45:00+00:00,34.54975259756754 +2025-07-29 10:00:00+00:00,34.089598495914935 +2025-07-29 10:15:00+00:00,34.66273146332679 +2025-07-29 10:30:00+00:00,34.17093947694668 +2025-07-29 10:45:00+00:00,34.808604620223164 +2025-07-29 11:00:00+00:00,34.50296098269563 +2025-07-29 11:15:00+00:00,32.13836461187349 +2025-07-29 11:30:00+00:00,32.68384558639818 +2025-07-29 11:45:00+00:00,33.1875184264053 +2025-07-29 12:00:00+00:00,32.51506124929044 +2025-07-29 12:15:00+00:00,32.717092277818544 +2025-07-29 12:30:00+00:00,32.300218329244046 +2025-07-29 12:45:00+00:00,31.01135068845753 +2025-07-29 13:00:00+00:00,29.770555475869248 +2025-07-29 13:15:00+00:00,27.856507630846263 +2025-07-29 13:30:00+00:00,26.212497528386248 +2025-07-29 13:45:00+00:00,24.43699372197777 +2025-07-29 14:00:00+00:00,22.280805019577453 +2025-07-29 14:15:00+00:00,19.805170796844305 +2025-07-29 14:30:00+00:00,16.509986743801708 +2025-07-29 14:45:00+00:00,13.82054637514034 +2025-07-29 15:00:00+00:00,10.566849112711187 +2025-07-29 15:15:00+00:00,7.713298522925797 +2025-07-29 15:30:00+00:00,5.112016736911667 +2025-07-29 15:45:00+00:00,3.0530376836995705 +2025-07-29 16:00:00+00:00,1.216574772156484 +2025-07-30 03:30:00+00:00,3.872710788564259 +2025-07-30 03:45:00+00:00,4.609015234862609 +2025-07-30 04:00:00+00:00,6.028438232264325 +2025-07-30 04:15:00+00:00,9.259723083867643 +2025-07-30 04:30:00+00:00,11.347228842928558 +2025-07-30 04:45:00+00:00,18.251002436234632 +2025-07-30 05:00:00+00:00,10.688124421854027 +2025-07-30 05:15:00+00:00,22.16746444191322 +2025-07-30 05:30:00+00:00,23.35675433240374 +2025-07-30 05:45:00+00:00,23.563716455965817 +2025-07-30 06:00:00+00:00,21.885018402165073 +2025-07-30 06:15:00+00:00,25.581466167539226 +2025-07-30 06:30:00+00:00,26.611273400209924 +2025-07-30 06:45:00+00:00,28.176892506864462 +2025-07-30 07:00:00+00:00,26.98161115170047 +2025-07-30 07:15:00+00:00,28.608276367312374 +2025-07-30 07:30:00+00:00,29.51727415432648 +2025-07-30 07:45:00+00:00,29.625923053523586 +2025-07-30 08:00:00+00:00,31.173726827306165 +2025-07-30 08:15:00+00:00,30.92326130991178 +2025-07-30 08:30:00+00:00,31.09722872691614 +2025-07-30 08:45:00+00:00,32.76186046168836 +2025-07-30 09:00:00+00:00,34.28821373598234 +2025-07-30 09:15:00+00:00,32.3744760988595 +2025-07-30 09:30:00+00:00,33.42414005796338 +2025-07-30 09:45:00+00:00,34.91961107441881 +2025-07-30 10:00:00+00:00,36.06192170094003 +2025-07-30 10:15:00+00:00,34.95967303016545 +2025-07-30 10:30:00+00:00,34.50937744708112 +2025-07-30 10:45:00+00:00,35.09659773835796 +2025-07-30 11:00:00+00:00,36.33698534561305 +2025-07-30 11:15:00+00:00,35.62531308236628 +2025-07-30 11:30:00+00:00,35.13248455468311 +2025-07-30 11:45:00+00:00,34.64034186062811 +2025-07-30 12:00:00+00:00,34.11372052272934 +2025-07-30 12:15:00+00:00,33.594620624521255 +2025-07-30 12:30:00+00:00,32.26017176432717 +2025-07-30 12:45:00+00:00,31.770131139019984 +2025-07-30 13:00:00+00:00,30.259668711607187 +2025-07-30 13:15:00+00:00,28.512540073155122 +2025-07-30 13:30:00+00:00,26.956703780703 +2025-07-30 13:45:00+00:00,24.853489899330704 +2025-07-30 14:00:00+00:00,22.600161132925667 +2025-07-30 14:15:00+00:00,20.2767445980472 +2025-07-30 14:30:00+00:00,17.63581439236618 +2025-07-30 14:45:00+00:00,14.652198771695689 +2025-07-30 15:00:00+00:00,11.574985068019942 +2025-07-30 15:15:00+00:00,8.39336123354576 +2025-07-30 15:30:00+00:00,5.4488927705669 +2025-07-30 15:45:00+00:00,3.11718485297032 +2025-07-30 16:00:00+00:00,1.3141517602617512 +2025-07-31 03:30:00+00:00,1.9484443922261432 +2025-07-31 03:45:00+00:00,11.090399512268403 +2025-07-31 04:00:00+00:00,10.263308787188285 +2025-07-31 04:15:00+00:00,8.715836980655139 +2025-07-31 04:30:00+00:00,8.625672473608988 +2025-07-31 04:45:00+00:00,9.46688303429059 +2025-07-31 05:00:00+00:00,11.484694588427214 +2025-07-31 05:15:00+00:00,16.695302490984922 +2025-07-31 05:30:00+00:00,14.288216705192815 +2025-07-31 05:45:00+00:00,14.64366598019824 +2025-07-31 06:00:00+00:00,22.02911857242385 +2025-07-31 06:15:00+00:00,19.575562966357406 +2025-07-31 06:30:00+00:00,20.471410074328293 +2025-07-31 06:45:00+00:00,24.265946854805417 +2025-07-31 07:00:00+00:00,20.524406348469043 +2025-07-31 07:15:00+00:00,27.828366253273984 +2025-07-31 07:30:00+00:00,29.40067907682317 +2025-07-31 07:45:00+00:00,28.996598314391004 +2025-07-31 08:00:00+00:00,29.4513139979589 +2025-07-31 08:15:00+00:00,28.659355366061657 +2025-07-31 08:30:00+00:00,31.23450332705322 +2025-07-31 08:45:00+00:00,30.408341316611583 +2025-07-31 09:00:00+00:00,32.52002007487584 +2025-07-31 09:15:00+00:00,31.942367370115793 +2025-07-31 09:30:00+00:00,32.11546117062421 +2025-07-31 09:45:00+00:00,33.3858912298999 +2025-07-31 10:00:00+00:00,33.348441353286454 +2025-07-31 10:15:00+00:00,34.51090427523421 +2025-07-31 10:30:00+00:00,33.27065471291168 +2025-07-31 10:45:00+00:00,33.291640246748194 +2025-07-31 11:00:00+00:00,32.69602267310389 +2025-07-31 11:15:00+00:00,33.41863936593769 +2025-07-31 11:30:00+00:00,32.64610127550079 +2025-07-31 11:45:00+00:00,31.881348400501757 +2025-07-31 12:00:00+00:00,31.267733091303917 +2025-07-31 12:15:00+00:00,31.73029420350031 +2025-07-31 12:30:00+00:00,30.477204993106586 +2025-07-31 12:45:00+00:00,30.758396895716228 +2025-07-31 13:00:00+00:00,28.938208202198823 +2025-07-31 13:15:00+00:00,27.636756455297 +2025-07-31 13:30:00+00:00,26.237784617250682 +2025-07-31 13:45:00+00:00,24.94582784685673 +2025-07-31 14:00:00+00:00,22.890592864825596 +2025-07-31 14:15:00+00:00,20.66810635724076 +2025-07-31 14:30:00+00:00,18.00875179553723 +2025-07-31 14:45:00+00:00,14.785193675741642 +2025-07-31 15:00:00+00:00,11.680698251061974 +2025-07-31 15:15:00+00:00,8.857346563177328 +2025-07-31 15:30:00+00:00,5.7469574108853205 +2025-07-31 15:45:00+00:00,3.1508248938208183 +2025-08-01 03:30:00+00:00,3.6314974429537576 +2025-08-01 03:45:00+00:00,7.015503933541647 +2025-08-01 04:00:00+00:00,7.606720572415571 +2025-08-01 04:15:00+00:00,8.655499081517766 +2025-08-01 04:30:00+00:00,10.064019860754124 +2025-08-01 04:45:00+00:00,8.970749865333119 +2025-08-01 05:00:00+00:00,8.614232406579804 +2025-08-01 05:15:00+00:00,23.9076084688828 +2025-08-01 05:30:00+00:00,25.259075492611135 +2025-08-01 05:45:00+00:00,26.57682973740634 +2025-08-01 06:00:00+00:00,27.807980331242014 +2025-08-01 06:15:00+00:00,20.37439688111791 +2025-08-01 06:30:00+00:00,21.11623434996007 +2025-08-01 06:45:00+00:00,28.00397264111188 +2025-08-01 07:00:00+00:00,28.217116386761205 +2025-08-01 07:15:00+00:00,31.46380208477479 +2025-08-01 07:30:00+00:00,21.662115060668263 +2025-08-01 07:45:00+00:00,31.230580750716115 +2025-08-01 08:00:00+00:00,24.422029289635546 +2025-08-01 08:15:00+00:00,19.37462570438018 +2025-08-01 08:30:00+00:00,32.51296408699626 +2025-08-01 08:45:00+00:00,26.738703756563424 +2025-08-01 09:00:00+00:00,31.87703656793433 +2025-08-01 09:15:00+00:00,34.37094822230673 +2025-08-01 09:30:00+00:00,34.20046439259768 +2025-08-01 09:45:00+00:00,33.85383208406923 +2025-08-01 10:00:00+00:00,34.311766859701095 +2025-08-01 10:15:00+00:00,32.95503948655576 +2025-08-01 10:30:00+00:00,32.14958146544485 +2025-08-01 10:45:00+00:00,31.062681949334014 +2025-08-01 11:00:00+00:00,32.433024541244386 +2025-08-01 11:15:00+00:00,32.241291303317624 +2025-08-01 11:30:00+00:00,32.041803468033656 +2025-08-01 11:45:00+00:00,32.181839452364926 +2025-08-01 12:00:00+00:00,30.605967936649726 +2025-08-01 12:15:00+00:00,30.88761197163245 +2025-08-01 12:30:00+00:00,30.492805728777626 +2025-08-01 12:45:00+00:00,29.9340585872473 +2025-08-01 13:00:00+00:00,28.65334051966879 +2025-08-01 13:15:00+00:00,27.78729144945074 +2025-08-01 13:30:00+00:00,26.306207476856585 +2025-08-01 13:45:00+00:00,24.652061574388192 +2025-08-01 14:00:00+00:00,22.494034129816015 +2025-08-01 14:15:00+00:00,20.30731738224683 +2025-08-01 14:30:00+00:00,16.945806853496975 +2025-08-01 14:45:00+00:00,14.686216846914306 +2025-08-01 15:00:00+00:00,11.66965058107856 +2025-08-01 15:15:00+00:00,8.381962172218012 +2025-08-01 15:30:00+00:00,5.622605148870329 +2025-08-01 15:45:00+00:00,3.1372465045606264 +2025-08-01 16:00:00+00:00,1.188316987839607 +2025-08-02 03:30:00+00:00,2.9162471492972726 +2025-08-02 03:45:00+00:00,6.28623350112214 +2025-08-02 04:00:00+00:00,8.906798896445654 +2025-08-02 04:15:00+00:00,12.396094786037787 +2025-08-02 04:30:00+00:00,15.469153312787055 +2025-08-02 04:45:00+00:00,11.391701781772916 +2025-08-02 05:00:00+00:00,20.751232272906428 +2025-08-02 05:15:00+00:00,22.809065696854542 +2025-08-02 05:30:00+00:00,18.500752565552773 +2025-08-02 05:45:00+00:00,24.065653299391805 +2025-08-02 06:00:00+00:00,24.86056888371595 +2025-08-02 06:15:00+00:00,26.206213831630546 +2025-08-02 06:30:00+00:00,26.63287797751218 +2025-08-02 06:45:00+00:00,26.768495443129495 +2025-08-02 07:00:00+00:00,27.576714479876195 +2025-08-02 07:15:00+00:00,28.434311838919964 +2025-08-02 07:30:00+00:00,28.779091449580395 +2025-08-02 07:45:00+00:00,29.69053766463496 +2025-08-02 08:00:00+00:00,28.952206492592953 +2025-08-02 08:15:00+00:00,30.059836760217024 +2025-08-02 08:30:00+00:00,30.104703995980557 +2025-08-02 08:45:00+00:00,31.851040492744566 +2025-08-02 09:00:00+00:00,31.339937655044086 +2025-08-02 09:15:00+00:00,33.217776255248346 +2025-08-02 09:30:00+00:00,35.439555483326295 +2025-08-02 09:45:00+00:00,36.21520732043348 +2025-08-02 10:00:00+00:00,35.76974236050859 +2025-08-02 10:15:00+00:00,37.02043840695713 +2025-08-02 10:30:00+00:00,36.81808313515399 +2025-08-02 10:45:00+00:00,37.410487278732845 +2025-08-02 11:00:00+00:00,36.50133923640723 +2025-08-02 11:15:00+00:00,36.01283917192577 +2025-08-02 11:30:00+00:00,35.524683341113565 +2025-08-02 11:45:00+00:00,35.28616052372133 +2025-08-02 12:00:00+00:00,34.72383391033286 +2025-08-02 12:15:00+00:00,33.61414229760985 +2025-08-02 12:30:00+00:00,33.427073748632466 +2025-08-02 12:45:00+00:00,31.839464012601642 +2025-08-02 13:00:00+00:00,30.914733718180123 +2025-08-02 13:15:00+00:00,29.230963868529482 +2025-08-02 13:30:00+00:00,27.007848595202496 +2025-08-02 13:45:00+00:00,7.17063337342687 +2025-08-02 14:00:00+00:00,21.965847214370246 +2025-08-02 14:15:00+00:00,19.85929985128346 +2025-08-02 14:30:00+00:00,16.383178492718187 +2025-08-02 14:45:00+00:00,13.874829977651299 +2025-08-02 15:00:00+00:00,10.404715096157796 +2025-08-02 15:15:00+00:00,7.636497375471203 +2025-08-02 15:30:00+00:00,4.9401290659424735 +2025-08-02 15:45:00+00:00,2.4395247685184094 +2025-08-03 03:30:00+00:00,3.286843423737902 +2025-08-03 03:45:00+00:00,5.850875845917811 +2025-08-03 04:00:00+00:00,8.865228650006143 +2025-08-03 04:15:00+00:00,12.468821108406754 +2025-08-03 04:30:00+00:00,10.493663648331458 +2025-08-03 04:45:00+00:00,18.26296705653345 +2025-08-03 05:00:00+00:00,14.31622895517703 +2025-08-03 05:15:00+00:00,22.330202801124344 +2025-08-03 05:30:00+00:00,23.478183069096797 +2025-08-03 05:45:00+00:00,24.565597562796288 +2025-08-03 06:00:00+00:00,24.98945684630059 +2025-08-03 06:15:00+00:00,26.17223814640686 +2025-08-03 06:30:00+00:00,26.353181834241422 +2025-08-03 06:45:00+00:00,27.79933916183937 +2025-08-03 07:00:00+00:00,29.40884323966148 +2025-08-03 07:15:00+00:00,28.758625988829593 +2025-08-03 07:30:00+00:00,30.060109554698972 +2025-08-03 07:45:00+00:00,31.19581986947804 +2025-08-03 08:00:00+00:00,31.613604991665735 +2025-08-03 08:15:00+00:00,31.092927801317046 +2025-08-03 08:30:00+00:00,33.086190838629626 +2025-08-03 08:45:00+00:00,33.76028808944106 +2025-08-03 09:00:00+00:00,33.26556598002377 +2025-08-03 09:15:00+00:00,33.032357990639014 +2025-08-03 09:30:00+00:00,33.77577050449502 +2025-08-03 09:45:00+00:00,34.77490899259353 +2025-08-03 10:00:00+00:00,35.781315893517345 +2025-08-03 10:15:00+00:00,33.6174231826979 +2025-08-03 10:30:00+00:00,34.65297834881701 +2025-08-03 10:45:00+00:00,34.13189423928147 +2025-08-03 11:00:00+00:00,33.4325940238276 +2025-08-03 11:15:00+00:00,33.485738784170046 +2025-08-03 11:30:00+00:00,33.52135548281877 +2025-08-03 11:45:00+00:00,33.608719667444845 +2025-08-03 12:00:00+00:00,32.19714352111758 +2025-08-03 12:15:00+00:00,31.442400155772948 +2025-08-03 12:30:00+00:00,30.61282077419106 +2025-08-03 12:45:00+00:00,30.8243184262948 +2025-08-03 13:00:00+00:00,28.882522781292327 +2025-08-03 13:15:00+00:00,27.46387474859991 +2025-08-03 13:30:00+00:00,25.922428658036623 +2025-08-03 13:45:00+00:00,23.786984442659417 +2025-08-03 14:00:00+00:00,21.66851666246778 +2025-08-03 14:15:00+00:00,19.363569786445417 +2025-08-03 14:30:00+00:00,16.848230114284746 +2025-08-03 14:45:00+00:00,14.056136875211214 +2025-08-03 15:00:00+00:00,10.87595790058954 +2025-08-03 15:15:00+00:00,7.874199518331615 +2025-08-03 15:30:00+00:00,5.06528551098746 +2025-08-03 15:45:00+00:00,2.6860326528121576 +2025-08-04 03:30:00+00:00,3.2604183763782473 +2025-08-04 03:45:00+00:00,5.762220900211464 +2025-08-04 04:00:00+00:00,8.737169674958988 +2025-08-04 04:15:00+00:00,11.768279654109802 +2025-08-04 04:30:00+00:00,14.906046739144571 +2025-08-04 04:45:00+00:00,17.762796526646085 +2025-08-04 05:00:00+00:00,19.852430627293664 +2025-08-04 05:15:00+00:00,21.94230955014268 +2025-08-04 05:30:00+00:00,23.156951350909598 +2025-08-04 05:45:00+00:00,24.662649510035873 +2025-08-04 06:00:00+00:00,24.633966512284893 +2025-08-04 06:15:00+00:00,25.275393464104333 +2025-08-04 06:30:00+00:00,25.748979937924776 +2025-08-04 06:45:00+00:00,26.75205684142572 +2025-08-04 07:00:00+00:00,27.21515105152484 +2025-08-04 07:15:00+00:00,28.906348310001718 +2025-08-04 07:30:00+00:00,29.51948858039997 +2025-08-04 07:45:00+00:00,28.75499797189742 +2025-08-04 08:00:00+00:00,29.796660699908443 +2025-08-04 08:15:00+00:00,31.13632000703406 +2025-08-04 08:30:00+00:00,31.06768224023452 +2025-08-04 08:45:00+00:00,32.875626475828966 +2025-08-04 09:00:00+00:00,33.16214370376677 +2025-08-04 09:15:00+00:00,33.54095191011287 +2025-08-04 09:30:00+00:00,34.79433042577839 +2025-08-04 09:45:00+00:00,35.314801020914516 +2025-08-04 10:00:00+00:00,35.66895668868438 +2025-08-04 10:15:00+00:00,36.56823261163826 +2025-08-04 10:30:00+00:00,37.755656027408854 +2025-08-04 10:45:00+00:00,37.66753926273409 +2025-08-04 11:00:00+00:00,36.93331737348247 +2025-08-04 11:15:00+00:00,36.19771676455123 +2025-08-04 11:30:00+00:00,36.01905198575532 +2025-08-04 11:45:00+00:00,35.7147072112876 +2025-08-04 12:00:00+00:00,35.59324526427719 +2025-08-04 12:15:00+00:00,34.543041614016595 +2025-08-04 12:30:00+00:00,33.58472490330663 +2025-08-04 12:45:00+00:00,17.742373526844485 +2025-08-04 13:00:00+00:00,31.038553793093065 +2025-08-04 13:15:00+00:00,29.2605901245369 +2025-08-04 13:30:00+00:00,27.173645725520096 +2025-08-04 13:45:00+00:00,25.03327701027729 +2025-08-04 14:00:00+00:00,22.076178743793157 +2025-08-04 14:15:00+00:00,19.31000595450901 +2025-08-04 14:30:00+00:00,16.607509686617323 +2025-08-04 14:45:00+00:00,13.534378356695827 +2025-08-04 15:00:00+00:00,10.443914042421968 +2025-08-04 15:15:00+00:00,7.549450259931042 +2025-08-04 15:30:00+00:00,4.830543644345866 +2025-08-04 15:45:00+00:00,2.529843472923724 +2025-08-05 03:30:00+00:00,2.888282358188232 +2025-08-05 03:45:00+00:00,5.620973241464345 +2025-08-05 04:00:00+00:00,8.193724671628104 +2025-08-05 04:15:00+00:00,11.91929626506857 +2025-08-05 04:30:00+00:00,15.203313080269147 +2025-08-05 04:45:00+00:00,18.008440325926465 +2025-08-05 05:00:00+00:00,20.312000559370382 +2025-08-05 05:15:00+00:00,21.979337810573753 +2025-08-05 05:30:00+00:00,23.180153558107953 +2025-08-05 05:45:00+00:00,25.06084646985693 +2025-08-05 06:00:00+00:00,25.035229282249805 +2025-08-05 06:15:00+00:00,26.09406955663102 +2025-08-05 06:30:00+00:00,26.74462340260435 +2025-08-05 06:45:00+00:00,27.304791333941793 +2025-08-05 07:00:00+00:00,27.19183612929359 +2025-08-05 07:15:00+00:00,29.30267105154819 +2025-08-05 07:30:00+00:00,29.426563123665897 +2025-08-05 07:45:00+00:00,29.863290261586833 +2025-08-05 08:00:00+00:00,30.067682458881215 +2025-08-05 08:15:00+00:00,32.19775668603818 +2025-08-05 08:30:00+00:00,32.07936718396798 +2025-08-05 08:45:00+00:00,32.21947550809788 +2025-08-05 09:00:00+00:00,32.92199489651706 +2025-08-05 09:15:00+00:00,32.70929186325621 +2025-08-05 09:30:00+00:00,34.02411333535675 +2025-08-05 09:45:00+00:00,35.44125555127408 +2025-08-05 10:00:00+00:00,33.44729562682597 +2025-08-05 10:15:00+00:00,34.66942438495733 +2025-08-05 10:30:00+00:00,34.278728041394594 +2025-08-05 10:45:00+00:00,32.77805669735542 +2025-08-05 11:00:00+00:00,33.87533386308227 +2025-08-05 11:15:00+00:00,34.907347357186794 +2025-08-05 11:30:00+00:00,32.33392776596383 +2025-08-05 11:45:00+00:00,32.88954798004073 +2025-08-05 12:00:00+00:00,32.210158257400636 +2025-08-05 12:15:00+00:00,32.018640492483826 +2025-08-05 12:30:00+00:00,31.45656222877725 +2025-08-05 12:45:00+00:00,30.790223965330547 +2025-08-05 13:00:00+00:00,29.411477199787186 +2025-08-05 13:15:00+00:00,28.11416159263465 +2025-08-05 13:30:00+00:00,25.883649518402414 +2025-08-05 13:45:00+00:00,24.242662086329208 +2025-08-05 14:00:00+00:00,21.459173954878146 +2025-08-05 14:15:00+00:00,19.64972574917622 +2025-08-05 14:30:00+00:00,17.214178140665013 +2025-08-05 14:45:00+00:00,13.799181625085907 +2025-08-05 15:00:00+00:00,10.957754341491157 +2025-08-05 15:15:00+00:00,7.806007359682443 +2025-08-05 15:30:00+00:00,4.904068860011169 +2025-08-05 15:45:00+00:00,2.468065867252713 +2025-08-06 03:30:00+00:00,3.232642935618226 +2025-08-06 03:45:00+00:00,5.570688046790548 +2025-08-06 04:00:00+00:00,8.98277723568296 +2025-08-06 04:15:00+00:00,12.17599887262082 +2025-08-06 04:30:00+00:00,15.164385414833017 +2025-08-06 04:45:00+00:00,17.786390399131598 +2025-08-06 05:00:00+00:00,20.402478918881673 +2025-08-06 05:15:00+00:00,21.641623089916433 +2025-08-06 05:30:00+00:00,22.37909546848439 +2025-08-06 05:45:00+00:00,23.35949396909631 +2025-08-06 06:00:00+00:00,24.138588607833558 +2025-08-06 06:15:00+00:00,25.377539386797444 +2025-08-06 06:30:00+00:00,26.785337846667417 +2025-08-06 06:45:00+00:00,26.94544586806433 +2025-08-06 07:00:00+00:00,28.0546593570681 +2025-08-06 07:15:00+00:00,28.655851186968203 +2025-08-06 07:30:00+00:00,28.632803259820946 +2025-08-06 07:45:00+00:00,30.318800826651508 +2025-08-06 08:00:00+00:00,30.04687495408326 +2025-08-06 08:15:00+00:00,29.134839170224335 +2025-08-06 08:30:00+00:00,32.0813982054643 +2025-08-06 08:45:00+00:00,33.50469214814718 +2025-08-06 09:00:00+00:00,33.170424154249076 +2025-08-06 09:15:00+00:00,34.16474305480784 +2025-08-06 09:30:00+00:00,35.40722967043099 +2025-08-06 09:45:00+00:00,34.97891707208679 +2025-08-06 10:00:00+00:00,36.141123682084576 +2025-08-06 10:15:00+00:00,36.38220812042613 +2025-08-06 10:30:00+00:00,36.05789383415922 +2025-08-06 10:45:00+00:00,36.70297298756972 +2025-08-06 11:00:00+00:00,37.29741651309445 +2025-08-06 11:15:00+00:00,36.808712990908276 +2025-08-06 11:30:00+00:00,36.27975260894758 +2025-08-06 11:45:00+00:00,35.41814297141914 +2025-08-06 12:00:00+00:00,34.49981435397815 +2025-08-06 12:15:00+00:00,33.5931294690877 +2025-08-06 12:30:00+00:00,32.28809113598982 +2025-08-06 12:45:00+00:00,31.52657313534612 +2025-08-06 13:00:00+00:00,29.829907452530886 +2025-08-06 13:15:00+00:00,27.761488268735494 +2025-08-06 13:30:00+00:00,25.663693256483857 +2025-08-06 13:45:00+00:00,23.68909922350136 +2025-08-06 14:00:00+00:00,21.052290179176765 +2025-08-06 14:15:00+00:00,18.875825270463956 +2025-08-06 14:30:00+00:00,15.808207541937017 +2025-08-06 14:45:00+00:00,12.826519255989883 +2025-08-06 15:00:00+00:00,9.762774796599114 +2025-08-06 15:15:00+00:00,7.055706194773526 +2025-08-06 15:30:00+00:00,4.425060709439933 +2025-08-06 15:45:00+00:00,2.2942204311981254 +2025-08-07 03:30:00+00:00,3.0948930223983564 +2025-08-07 03:45:00+00:00,2.975193053103961 +2025-08-07 04:00:00+00:00,11.218332738196638 +2025-08-07 04:15:00+00:00,14.885865583204808 +2025-08-07 04:30:00+00:00,10.872964304282442 +2025-08-07 04:45:00+00:00,10.02860448074777 +2025-08-07 05:00:00+00:00,23.005487994684945 +2025-08-07 05:15:00+00:00,21.088487588420794 +2025-08-07 05:30:00+00:00,15.302983835152787 +2025-08-07 05:45:00+00:00,12.948436729930958 +2025-08-07 06:00:00+00:00,23.7695339661743 +2025-08-07 06:15:00+00:00,25.839499981679904 +2025-08-07 06:30:00+00:00,26.473585102023147 +2025-08-07 06:45:00+00:00,27.803115735847907 +2025-08-07 07:00:00+00:00,27.62565239969405 +2025-08-07 07:15:00+00:00,29.896439931017238 +2025-08-07 07:30:00+00:00,31.768218050116158 +2025-08-07 07:45:00+00:00,32.60580352236745 +2025-08-07 08:00:00+00:00,32.59869323161871 +2025-08-07 08:15:00+00:00,34.22693908042669 +2025-08-07 08:30:00+00:00,33.60446605018449 +2025-08-07 08:45:00+00:00,36.1340113024989 +2025-08-07 09:00:00+00:00,36.66599019132086 +2025-08-07 09:15:00+00:00,36.49347737238544 +2025-08-07 09:30:00+00:00,37.12092652265271 +2025-08-07 09:45:00+00:00,38.320370715078795 +2025-08-07 10:00:00+00:00,18.176659001616688 +2025-08-07 10:15:00+00:00,17.554586811722864 +2025-08-07 10:30:00+00:00,18.059948384890554 +2025-08-07 10:45:00+00:00,17.981357443059895 +2025-08-07 11:00:00+00:00,17.44903652876505 +2025-08-07 11:15:00+00:00,16.82613243236555 +2025-08-07 11:30:00+00:00,17.193036472316123 +2025-08-07 11:45:00+00:00,17.10607210874851 +2025-08-07 12:00:00+00:00,17.784272938008016 +2025-08-07 12:15:00+00:00,17.330118585572663 +2025-08-07 12:30:00+00:00,32.51089155051558 +2025-08-07 12:45:00+00:00,31.0636283544327 +2025-08-07 13:00:00+00:00,29.317866692608472 +2025-08-07 13:15:00+00:00,27.776375404788883 +2025-08-07 13:30:00+00:00,25.83746709523488 +2025-08-07 13:45:00+00:00,23.63721448255859 +2025-08-07 14:00:00+00:00,21.12495661829134 +2025-08-07 14:15:00+00:00,18.458178379993498 +2025-08-07 14:30:00+00:00,15.783805761062117 +2025-08-07 14:45:00+00:00,12.797357766831873 +2025-08-07 15:00:00+00:00,9.886857601570657 +2025-08-07 15:15:00+00:00,6.897013873505237 +2025-08-07 15:30:00+00:00,4.290523040751529 +2025-08-07 15:45:00+00:00,2.2188370166395135 +2025-08-08 03:30:00+00:00,1.7575872579773146 +2025-08-08 03:45:00+00:00,3.6394485185482814 +2025-08-08 04:00:00+00:00,6.547601073859525 +2025-08-08 04:15:00+00:00,6.103667764439841 +2025-08-08 04:30:00+00:00,14.674536364399769 +2025-08-08 04:45:00+00:00,18.802824841006892 +2025-08-08 05:00:00+00:00,19.421375185317018 +2025-08-08 05:15:00+00:00,21.451237912492694 +2025-08-08 05:30:00+00:00,22.69156173274311 +2025-08-08 05:45:00+00:00,23.71736164882224 +2025-08-08 06:00:00+00:00,25.449262699001686 +2025-08-08 06:15:00+00:00,26.131374614662516 +2025-08-08 06:30:00+00:00,27.118950207717912 +2025-08-08 06:45:00+00:00,28.324188744151012 +2025-08-08 07:00:00+00:00,29.22485423546309 +2025-08-08 07:15:00+00:00,29.612387874666837 +2025-08-08 07:30:00+00:00,31.133535796973252 +2025-08-08 07:45:00+00:00,32.47111045788232 +2025-08-08 08:00:00+00:00,33.13748217297463 +2025-08-08 08:15:00+00:00,33.118841015926876 +2025-08-08 08:30:00+00:00,35.32248785187809 +2025-08-08 08:45:00+00:00,36.180834503980556 +2025-08-08 09:00:00+00:00,35.61043950077955 +2025-08-08 09:15:00+00:00,36.92957406250145 +2025-08-08 09:30:00+00:00,37.180409213083294 +2025-08-08 09:45:00+00:00,37.558741463540024 +2025-08-08 10:00:00+00:00,36.2134463022612 +2025-08-08 10:15:00+00:00,36.975034840974786 +2025-08-08 10:30:00+00:00,36.761373570761755 +2025-08-08 10:45:00+00:00,36.30773700959078 +2025-08-08 11:00:00+00:00,36.68282474272414 +2025-08-08 11:15:00+00:00,36.98681919602028 +2025-08-08 11:30:00+00:00,36.033269605204396 +2025-08-08 11:45:00+00:00,35.00996718737903 +2025-08-08 12:00:00+00:00,34.44718325636847 +2025-08-08 12:15:00+00:00,33.31059633715495 +2025-08-08 12:30:00+00:00,32.5253226196578 +2025-08-08 12:45:00+00:00,31.085405670559155 +2025-08-08 13:00:00+00:00,29.363530985161553 +2025-08-08 13:15:00+00:00,27.518000227847548 +2025-08-08 13:30:00+00:00,25.85222473709006 +2025-08-08 13:45:00+00:00,23.60140073029622 +2025-08-08 14:00:00+00:00,21.200931286499507 +2025-08-08 14:15:00+00:00,18.476878185981466 +2025-08-08 14:30:00+00:00,15.48513721993272 +2025-08-08 14:45:00+00:00,12.52975541657068 +2025-08-08 15:00:00+00:00,9.58770201658957 +2025-08-08 15:15:00+00:00,6.691430109207728 +2025-08-08 15:30:00+00:00,4.011287241508622 +2025-08-08 15:45:00+00:00,2.025967926912326 +2025-08-09 03:45:00+00:00,1.8548155015314183 +2025-08-09 04:00:00+00:00,3.2697378421616956 +2025-08-09 04:15:00+00:00,5.687003040768426 +2025-08-09 04:30:00+00:00,9.419188568344614 +2025-08-09 04:45:00+00:00,10.63032600421404 +2025-08-09 05:00:00+00:00,13.754590361096692 +2025-08-09 05:15:00+00:00,17.327944547081554 +2025-08-09 05:30:00+00:00,16.853263521625816 +2025-08-09 05:45:00+00:00,25.623762006003467 +2025-08-09 06:00:00+00:00,26.072924914023076 +2025-08-09 06:15:00+00:00,26.816461143765288 +2025-08-09 06:30:00+00:00,28.913966474425976 +2025-08-09 06:45:00+00:00,28.76395571611861 +2025-08-09 07:00:00+00:00,29.81608646722284 +2025-08-09 07:15:00+00:00,31.86705624850775 +2025-08-09 07:30:00+00:00,32.31973503945063 +2025-08-09 07:45:00+00:00,33.28840327795381 +2025-08-09 08:00:00+00:00,33.89233793444521 +2025-08-09 08:15:00+00:00,34.84918872825675 +2025-08-09 08:30:00+00:00,35.66703497184941 +2025-08-09 08:45:00+00:00,35.56159643288937 +2025-08-09 09:00:00+00:00,35.727738705673126 +2025-08-09 09:15:00+00:00,37.21411209579981 +2025-08-09 09:30:00+00:00,37.3802725233072 +2025-08-09 09:45:00+00:00,37.12334314305206 +2025-08-09 10:00:00+00:00,36.94018806445347 +2025-08-09 10:15:00+00:00,37.050608621486035 +2025-08-09 10:30:00+00:00,37.01435463688797 +2025-08-09 10:45:00+00:00,36.66006969467739 +2025-08-09 11:00:00+00:00,36.701330898935694 +2025-08-09 11:15:00+00:00,36.71583587609705 +2025-08-09 11:30:00+00:00,35.78181480326782 +2025-08-09 11:45:00+00:00,34.57557294588767 +2025-08-09 12:00:00+00:00,33.960028072784915 +2025-08-09 12:15:00+00:00,32.91537105362303 +2025-08-09 12:30:00+00:00,32.38310436332336 +2025-08-09 12:45:00+00:00,30.804107927536062 +2025-08-09 13:00:00+00:00,28.853911481350053 +2025-08-09 13:15:00+00:00,27.105667172979388 +2025-08-09 13:30:00+00:00,25.141489832142984 +2025-08-09 13:45:00+00:00,23.020062148047376 +2025-08-09 14:00:00+00:00,20.340543739262987 +2025-08-09 14:15:00+00:00,17.57543005163749 +2025-08-09 14:30:00+00:00,14.752945329581404 +2025-08-09 14:45:00+00:00,11.550996279200039 +2025-08-09 15:00:00+00:00,8.347960437064097 +2025-08-09 15:15:00+00:00,5.97217334771017 +2025-08-09 15:30:00+00:00,3.894610941545205 +2025-08-09 15:45:00+00:00,2.0056062176301586 +2025-08-10 03:30:00+00:00,2.0054409292010185 +2025-08-10 03:45:00+00:00,4.261730667383049 +2025-08-10 04:00:00+00:00,4.303373303485293 +2025-08-10 04:15:00+00:00,10.98972189112256 +2025-08-10 04:30:00+00:00,16.41010591660416 +2025-08-10 04:45:00+00:00,16.703449487873627 +2025-08-10 05:00:00+00:00,5.959286574050305 +2025-08-10 05:15:00+00:00,6.252062865862499 +2025-08-10 05:30:00+00:00,18.936291762227526 +2025-08-10 05:45:00+00:00,24.086779682819177 +2025-08-10 06:00:00+00:00,24.947337775741897 +2025-08-10 06:15:00+00:00,26.5202277562641 +2025-08-10 06:30:00+00:00,28.123681016767815 +2025-08-10 06:45:00+00:00,28.52385214500795 +2025-08-10 07:00:00+00:00,29.131072014918114 +2025-08-10 07:15:00+00:00,30.21977965502705 +2025-08-10 07:30:00+00:00,31.22067211706655 +2025-08-10 07:45:00+00:00,31.642186233426184 +2025-08-10 08:00:00+00:00,33.13178660647246 +2025-08-10 08:15:00+00:00,33.580274661749975 +2025-08-10 08:30:00+00:00,35.17052776823594 +2025-08-10 08:45:00+00:00,36.72674314027958 +2025-08-10 09:00:00+00:00,37.3133509833244 +2025-08-10 09:15:00+00:00,37.54659170268811 +2025-08-10 09:30:00+00:00,18.182634421168267 +2025-08-10 09:45:00+00:00,17.504602268293763 +2025-08-10 10:00:00+00:00,16.6555396159628 +2025-08-10 10:15:00+00:00,17.189592985096343 +2025-08-10 10:30:00+00:00,16.245665516975507 +2025-08-10 10:45:00+00:00,16.789718164321386 +2025-08-10 11:00:00+00:00,16.42670132471051 +2025-08-10 11:15:00+00:00,16.04192421981236 +2025-08-10 11:30:00+00:00,16.54537848421062 +2025-08-10 11:45:00+00:00,15.41814358927556 +2025-08-10 12:00:00+00:00,15.8102643833018 +2025-08-10 12:15:00+00:00,15.793934789934884 +2025-08-10 12:30:00+00:00,15.805552859332316 +2025-08-10 12:45:00+00:00,16.781059346817656 +2025-08-10 13:00:00+00:00,16.30041698682867 +2025-08-10 13:15:00+00:00,26.353542165070028 +2025-08-10 13:30:00+00:00,23.90888196724012 +2025-08-10 13:45:00+00:00,21.413367291557073 +2025-08-10 14:00:00+00:00,18.767861973254906 +2025-08-10 14:15:00+00:00,16.27021126158611 +2025-08-10 14:30:00+00:00,13.247335640187178 +2025-08-10 14:45:00+00:00,10.489293412296721 +2025-08-10 15:00:00+00:00,7.8084447420135366 +2025-08-10 15:15:00+00:00,5.131677068103528 +2025-08-10 15:30:00+00:00,3.0787368482653954 +2025-08-10 15:45:00+00:00,1.2044349989389644 +2025-08-11 04:00:00+00:00,5.519331951867198 +2025-08-11 04:15:00+00:00,9.667501519993444 +2025-08-11 04:30:00+00:00,11.49585742863615 +2025-08-11 04:45:00+00:00,15.987015180777568 +2025-08-11 05:00:00+00:00,8.687350259384784 +2025-08-11 05:15:00+00:00,8.284074293904549 +2025-08-11 05:30:00+00:00,16.058955667851627 +2025-08-11 05:45:00+00:00,23.646330013106354 +2025-08-11 06:00:00+00:00,25.24866982941249 +2025-08-11 06:15:00+00:00,26.710196163573073 +2025-08-11 06:30:00+00:00,28.95117170555045 +2025-08-11 06:45:00+00:00,27.854521262469653 +2025-08-11 07:00:00+00:00,29.510209437449486 +2025-08-11 07:15:00+00:00,30.388524737354984 +2025-08-11 07:30:00+00:00,31.15304969096447 +2025-08-11 07:45:00+00:00,31.34983419819235 +2025-08-11 08:00:00+00:00,32.6131942520556 +2025-08-11 08:15:00+00:00,32.62508843873345 +2025-08-11 08:30:00+00:00,33.16271725987831 +2025-08-11 08:45:00+00:00,34.83982464314719 +2025-08-11 09:00:00+00:00,31.611619195020033 +2025-08-11 09:15:00+00:00,33.20056922242468 +2025-08-11 09:30:00+00:00,37.75588624654851 +2025-08-11 09:45:00+00:00,17.50160538689177 +2025-08-11 10:00:00+00:00,18.117609825511625 +2025-08-11 10:15:00+00:00,17.82171692100982 +2025-08-11 10:30:00+00:00,17.735605580806038 +2025-08-11 10:45:00+00:00,34.57640354115872 +2025-08-11 11:00:00+00:00,28.59475900078404 +2025-08-11 11:15:00+00:00,31.857572935671925 +2025-08-11 11:30:00+00:00,17.76992806515676 +2025-08-11 11:45:00+00:00,17.39417739574793 +2025-08-11 12:00:00+00:00,31.710257077482158 +2025-08-11 12:15:00+00:00,27.860857214631658 +2025-08-11 12:30:00+00:00,20.330972472418477 +2025-08-11 12:45:00+00:00,17.726747990079033 +2025-08-11 13:00:00+00:00,15.400849391348192 +2025-08-11 13:15:00+00:00,21.986924807519983 +2025-08-11 13:30:00+00:00,28.516533670860436 +2025-08-11 13:45:00+00:00,17.280878004522684 +2025-08-11 14:00:00+00:00,23.89330478415594 +2025-08-11 14:15:00+00:00,19.443180748549075 +2025-08-11 14:30:00+00:00,9.218961824839065 +2025-08-11 14:45:00+00:00,11.18759330881114 +2025-08-11 15:00:00+00:00,6.790329108886536 +2025-08-11 15:15:00+00:00,4.867153808791089 +2025-08-11 15:30:00+00:00,2.860131422386494 +2025-08-11 15:45:00+00:00,0.6172349176839571 +2025-08-12 03:45:00+00:00,1.6646160647778214 +2025-08-12 04:00:00+00:00,2.413063541153781 +2025-08-12 04:15:00+00:00,4.658798166621622 +2025-08-12 04:30:00+00:00,5.899214033360856 +2025-08-12 04:45:00+00:00,8.99082497158391 +2025-08-12 05:00:00+00:00,13.38675755091117 +2025-08-12 05:15:00+00:00,19.329921293461563 +2025-08-12 05:30:00+00:00,21.4899844771531 +2025-08-12 05:45:00+00:00,23.53098092016368 +2025-08-12 06:00:00+00:00,24.895585949297843 +2025-08-12 06:15:00+00:00,26.683645447776023 +2025-08-12 06:30:00+00:00,27.55315791598894 +2025-08-12 06:45:00+00:00,29.022774609125833 +2025-08-12 07:00:00+00:00,30.515734031604133 +2025-08-12 07:15:00+00:00,31.79460540097875 +2025-08-12 07:30:00+00:00,32.06811913090153 +2025-08-12 07:45:00+00:00,33.88515794017278 +2025-08-12 08:00:00+00:00,34.49821189985676 +2025-08-12 08:15:00+00:00,35.94986038999592 +2025-08-12 08:30:00+00:00,36.74257844945348 +2025-08-12 08:45:00+00:00,17.943836151967716 +2025-08-12 09:00:00+00:00,17.62622385776964 +2025-08-12 09:15:00+00:00,16.448122399992997 +2025-08-12 09:30:00+00:00,15.605523885101837 +2025-08-12 09:45:00+00:00,13.64761750782484 +2025-08-12 10:00:00+00:00,13.212559059942125 +2025-08-12 10:15:00+00:00,12.545017900007291 +2025-08-12 10:30:00+00:00,12.081898260521532 +2025-08-12 10:45:00+00:00,11.980853887054108 +2025-08-12 11:00:00+00:00,11.879931699198442 +2025-08-12 11:15:00+00:00,10.682436563955122 +2025-08-12 11:30:00+00:00,11.334723455680852 +2025-08-12 11:45:00+00:00,10.90821292953722 +2025-08-12 12:00:00+00:00,11.391889016428728 +2025-08-12 12:15:00+00:00,10.76694644972585 +2025-08-12 12:30:00+00:00,11.621093362756291 +2025-08-12 12:45:00+00:00,11.36332035046718 +2025-08-12 13:00:00+00:00,14.6841558198032 +2025-08-12 13:15:00+00:00,14.483975658427998 +2025-08-12 13:30:00+00:00,14.032161888773656 +2025-08-12 13:45:00+00:00,14.081462651211154 +2025-08-12 14:00:00+00:00,13.066028189890746 +2025-08-12 14:15:00+00:00,14.799798270838435 +2025-08-12 14:30:00+00:00,12.413497594398171 +2025-08-12 14:45:00+00:00,9.781796178394266 +2025-08-12 15:00:00+00:00,7.338988667495544 +2025-08-12 15:15:00+00:00,5.082358075206332 +2025-08-12 15:30:00+00:00,3.116565294844104 +2025-08-12 15:45:00+00:00,1.3396769790323297 +2025-08-13 03:45:00+00:00,1.3670898422495559 +2025-08-13 04:00:00+00:00,2.1590323798512525 +2025-08-13 04:15:00+00:00,4.064789955219615 +2025-08-13 04:30:00+00:00,5.094016000827736 +2025-08-13 04:45:00+00:00,7.642240256307035 +2025-08-13 05:00:00+00:00,9.949250663870938 +2025-08-13 05:15:00+00:00,10.535431004009206 +2025-08-13 05:30:00+00:00,11.961003577859465 +2025-08-13 05:45:00+00:00,20.18176865689789 +2025-08-13 06:00:00+00:00,23.710945071636992 +2025-08-13 06:15:00+00:00,27.713958101130867 +2025-08-13 06:30:00+00:00,28.01777952393835 +2025-08-13 06:45:00+00:00,30.21626435921369 +2025-08-13 07:00:00+00:00,30.682961168009445 +2025-08-13 07:15:00+00:00,31.907998693465505 +2025-08-13 07:30:00+00:00,33.0211649231247 +2025-08-13 07:45:00+00:00,34.75496414523689 +2025-08-13 08:00:00+00:00,34.75533335931215 +2025-08-13 08:15:00+00:00,34.973407434051516 +2025-08-13 08:30:00+00:00,35.93507235526177 +2025-08-13 08:45:00+00:00,37.66620563356042 +2025-08-13 09:00:00+00:00,18.229889177644388 +2025-08-13 09:15:00+00:00,17.973638877037512 +2025-08-13 09:30:00+00:00,18.11406750828141 +2025-08-13 09:45:00+00:00,17.109605197258748 +2025-08-13 10:00:00+00:00,17.426686969928042 +2025-08-13 10:15:00+00:00,16.5712234499502 +2025-08-13 10:30:00+00:00,16.956642933115237 +2025-08-13 10:45:00+00:00,16.48174130466849 +2025-08-13 11:00:00+00:00,16.636832673640118 +2025-08-13 11:15:00+00:00,16.46352533015184 +2025-08-13 11:30:00+00:00,16.285378321660293 +2025-08-13 11:45:00+00:00,15.958568902016745 +2025-08-13 12:00:00+00:00,16.69452140567422 +2025-08-13 12:15:00+00:00,15.187916664962358 +2025-08-13 12:30:00+00:00,15.370004128735951 +2025-08-13 12:45:00+00:00,15.285390140982157 +2025-08-13 13:00:00+00:00,14.839507942499564 +2025-08-13 13:15:00+00:00,15.20578079934807 +2025-08-13 13:30:00+00:00,14.858564349437177 +2025-08-13 13:45:00+00:00,14.712041768350662 +2025-08-13 14:00:00+00:00,13.842360518793365 +2025-08-13 14:15:00+00:00,12.419420409170332 +2025-08-13 14:30:00+00:00,12.389524445814656 +2025-08-13 14:45:00+00:00,9.6620367329195 +2025-08-13 15:00:00+00:00,7.016330019691314 +2025-08-13 15:15:00+00:00,4.671572144940425 +2025-08-13 15:30:00+00:00,2.425815615064305 +2025-08-13 15:45:00+00:00,0.6598241494407557 +2025-08-14 03:45:00+00:00,2.7584843999215005 +2025-08-14 04:00:00+00:00,3.9532981194853734 +2025-08-14 04:15:00+00:00,5.867855027837884 +2025-08-14 04:30:00+00:00,10.802868837338396 +2025-08-14 04:45:00+00:00,15.9954186152391 +2025-08-14 05:00:00+00:00,17.900548493524532 +2025-08-14 05:15:00+00:00,21.352989502725766 +2025-08-14 05:30:00+00:00,23.028196420789858 +2025-08-14 05:45:00+00:00,24.845686993563035 +2025-08-14 06:00:00+00:00,26.349240415029538 +2025-08-14 06:15:00+00:00,28.173421646992594 +2025-08-14 06:30:00+00:00,29.292895591211675 +2025-08-14 06:45:00+00:00,30.651708298343063 +2025-08-14 07:00:00+00:00,31.753254477789948 +2025-08-14 07:15:00+00:00,32.59283951007065 +2025-08-14 07:30:00+00:00,34.70522739340772 +2025-08-14 07:45:00+00:00,35.74781613520811 +2025-08-14 08:00:00+00:00,36.619928730560154 +2025-08-14 08:15:00+00:00,17.427351263345034 +2025-08-14 08:30:00+00:00,37.70429791441649 +2025-08-14 08:45:00+00:00,17.207688301194636 +2025-08-14 09:00:00+00:00,17.069886822404964 +2025-08-14 09:15:00+00:00,15.58711168649286 +2025-08-14 09:30:00+00:00,15.251229199998715 +2025-08-14 09:45:00+00:00,14.052449641822328 +2025-08-14 10:00:00+00:00,12.951270942872265 +2025-08-14 10:15:00+00:00,13.676612510040263 +2025-08-14 10:30:00+00:00,12.19748125490979 +2025-08-14 10:45:00+00:00,10.851638705739067 +2025-08-14 11:00:00+00:00,10.823402427272587 +2025-08-14 11:15:00+00:00,10.79518594337096 +2025-08-14 11:30:00+00:00,10.51398785365998 +2025-08-14 11:45:00+00:00,12.602983123700326 +2025-08-14 12:00:00+00:00,11.592410566094609 +2025-08-14 12:15:00+00:00,12.081898260521532 +2025-08-14 12:30:00+00:00,12.052991448896716 +2025-08-14 12:45:00+00:00,12.4580179602615 +2025-08-14 13:00:00+00:00,12.893194023018921 +2025-08-14 13:15:00+00:00,14.798232750716036 +2025-08-14 13:30:00+00:00,14.883574520017714 +2025-08-14 13:45:00+00:00,13.729724120009717 +2025-08-14 14:00:00+00:00,13.083871757551597 +2025-08-14 14:15:00+00:00,12.135735563783774 +2025-08-14 14:30:00+00:00,10.51318098787133 +2025-08-14 14:45:00+00:00,9.504509405688996 +2025-08-14 15:00:00+00:00,6.832148585244166 +2025-08-14 15:15:00+00:00,4.588575304943165 +2025-08-14 15:30:00+00:00,2.416483855477065 +2025-08-14 15:45:00+00:00,0.748520951310542 +2025-08-15 03:30:00+00:00,2.0687255529605864 +2025-08-15 03:45:00+00:00,4.32392026423511 +2025-08-15 04:00:00+00:00,7.405981694023566 +2025-08-15 04:15:00+00:00,10.05337382307675 +2025-08-15 04:30:00+00:00,13.460393331395519 +2025-08-15 04:45:00+00:00,16.55924701977375 +2025-08-15 05:00:00+00:00,19.233042129911468 +2025-08-15 05:15:00+00:00,21.30620237941616 +2025-08-15 05:30:00+00:00,23.406075343300856 +2025-08-15 05:45:00+00:00,25.423500520154093 +2025-08-15 06:00:00+00:00,26.982636624398012 +2025-08-15 06:15:00+00:00,28.08593032537092 +2025-08-15 06:30:00+00:00,29.68728743394067 +2025-08-15 06:45:00+00:00,30.47098778182761 +2025-08-15 07:00:00+00:00,31.514851666578316 +2025-08-15 07:15:00+00:00,32.644632002085196 +2025-08-15 07:30:00+00:00,33.77803505600794 +2025-08-15 07:45:00+00:00,34.25137831192865 +2025-08-15 08:00:00+00:00,35.277900805228825 +2025-08-15 08:15:00+00:00,35.16473246448382 +2025-08-15 08:30:00+00:00,36.015106504262754 +2025-08-15 08:45:00+00:00,37.30587320997956 +2025-08-15 09:00:00+00:00,18.45610318862067 +2025-08-15 09:15:00+00:00,37.81260003794408 +2025-08-15 09:30:00+00:00,17.19202344224053 +2025-08-15 09:45:00+00:00,17.398240167432334 +2025-08-15 10:00:00+00:00,18.025812084027553 +2025-08-15 10:15:00+00:00,37.923783376995196 +2025-08-15 10:30:00+00:00,17.51788044459714 +2025-08-15 10:45:00+00:00,17.603285371139958 +2025-08-15 11:00:00+00:00,18.198883007661976 +2025-08-15 11:15:00+00:00,18.05908258661568 +2025-08-15 11:30:00+00:00,17.910863403898567 +2025-08-15 11:45:00+00:00,18.13152893026382 +2025-08-15 12:00:00+00:00,34.41288634665112 +2025-08-15 12:15:00+00:00,17.738349735766754 +2025-08-15 12:30:00+00:00,17.697413548867797 +2025-08-15 12:45:00+00:00,17.50204566743364 +2025-08-15 13:00:00+00:00,28.897161529113387 +2025-08-15 13:15:00+00:00,27.086072083762925 +2025-08-15 13:30:00+00:00,24.80209061938198 +2025-08-15 13:45:00+00:00,22.25728804290885 +2025-08-15 14:00:00+00:00,19.68951451598411 +2025-08-15 14:15:00+00:00,16.92710787643456 +2025-08-15 14:30:00+00:00,13.93172664357378 +2025-08-15 14:45:00+00:00,10.898806550653383 +2025-08-15 15:00:00+00:00,8.072383995292462 +2025-08-15 15:15:00+00:00,5.34700797581394 +2025-08-15 15:30:00+00:00,3.009150462359047 +2025-08-15 15:45:00+00:00,1.0716099124453549 +2025-08-16 03:45:00+00:00,4.326220893524538 +2025-08-16 04:00:00+00:00,4.338140165003428 +2025-08-16 04:15:00+00:00,5.729921561807522 +2025-08-16 04:30:00+00:00,6.166228465658287 +2025-08-16 04:45:00+00:00,9.738105453993091 +2025-08-16 05:00:00+00:00,19.467149868678124 +2025-08-16 05:15:00+00:00,12.518263431348736 +2025-08-16 05:30:00+00:00,22.506521724609325 +2025-08-16 05:45:00+00:00,24.190501628923577 +2025-08-16 06:00:00+00:00,24.90537823997306 +2025-08-16 06:15:00+00:00,26.24131965444103 +2025-08-16 06:30:00+00:00,27.728943570421606 +2025-08-16 06:45:00+00:00,28.294499549314217 +2025-08-16 07:00:00+00:00,29.623350983180384 +2025-08-16 07:15:00+00:00,31.0462742015684 +2025-08-16 07:30:00+00:00,31.511077147523544 +2025-08-16 07:45:00+00:00,34.1115604183321 +2025-08-16 08:00:00+00:00,34.67583481244285 +2025-08-16 08:15:00+00:00,35.41975684082878 +2025-08-16 08:30:00+00:00,36.28099282050223 +2025-08-16 08:45:00+00:00,37.289498865078 +2025-08-16 09:00:00+00:00,36.75859534070293 +2025-08-16 09:15:00+00:00,37.05628897919599 +2025-08-16 09:30:00+00:00,17.97460275079656 +2025-08-16 09:45:00+00:00,18.397855038870347 +2025-08-16 10:00:00+00:00,18.03069247582398 +2025-08-16 10:15:00+00:00,17.585279027614945 +2025-08-16 10:30:00+00:00,17.27812148400688 +2025-08-16 10:45:00+00:00,16.947011557134434 +2025-08-16 11:00:00+00:00,18.090819513027853 +2025-08-16 11:15:00+00:00,15.760696491992631 +2025-08-16 11:30:00+00:00,16.665672259528638 +2025-08-16 11:45:00+00:00,16.709742616097017 +2025-08-16 12:00:00+00:00,17.480451142906322 +2025-08-16 12:15:00+00:00,17.04749017532895 +2025-08-16 12:30:00+00:00,17.391464579757766 +2025-08-16 12:45:00+00:00,16.93966819042223 +2025-08-16 13:00:00+00:00,28.048063886604357 +2025-08-16 13:15:00+00:00,26.10469567459202 +2025-08-16 13:30:00+00:00,23.57217126164693 +2025-08-16 13:45:00+00:00,21.380508707045227 +2025-08-16 14:00:00+00:00,18.975500790904295 +2025-08-16 14:15:00+00:00,15.973841391903244 +2025-08-16 14:30:00+00:00,13.296836034250965 +2025-08-16 14:45:00+00:00,10.600396905396131 +2025-08-16 15:00:00+00:00,7.754528277505875 +2025-08-16 15:15:00+00:00,5.236519151784702 +2025-08-16 15:30:00+00:00,3.1357339414355723 +2025-08-16 15:45:00+00:00,1.2779470932704127 +2025-08-17 03:30:00+00:00,2.0558440514465763 +2025-08-17 03:45:00+00:00,3.6188813674823557 +2025-08-17 04:00:00+00:00,7.248840760478856 +2025-08-17 04:15:00+00:00,9.280584134569754 +2025-08-17 04:30:00+00:00,13.007352373307837 +2025-08-17 04:45:00+00:00,12.389161327088726 +2025-08-17 05:00:00+00:00,19.145155927434544 +2025-08-17 05:15:00+00:00,21.699912805473563 +2025-08-17 05:30:00+00:00,23.547380484234722 +2025-08-17 05:45:00+00:00,14.979848067319335 +2025-08-17 06:00:00+00:00,26.24998824181297 +2025-08-17 06:15:00+00:00,26.58859769584203 +2025-08-17 06:30:00+00:00,27.61312543854622 +2025-08-17 06:45:00+00:00,30.151744424558707 +2025-08-17 07:00:00+00:00,29.64467003730093 +2025-08-17 07:15:00+00:00,30.477943341735443 +2025-08-17 07:30:00+00:00,31.448671870994282 +2025-08-17 07:45:00+00:00,32.06594619953115 +2025-08-17 08:00:00+00:00,33.33558731286847 +2025-08-17 08:15:00+00:00,34.04050610794709 +2025-08-17 08:30:00+00:00,33.734878678382266 +2025-08-17 08:45:00+00:00,34.18703210785711 +2025-08-17 09:00:00+00:00,34.64374017678491 +2025-08-17 09:15:00+00:00,35.30567328278855 +2025-08-17 09:30:00+00:00,34.716303730479964 +2025-08-17 09:45:00+00:00,35.82429004225213 +2025-08-17 10:00:00+00:00,35.55358135722924 +2025-08-17 10:15:00+00:00,35.54392113357775 +2025-08-17 10:30:00+00:00,35.52608278116702 +2025-08-17 10:45:00+00:00,35.49810276716176 +2025-08-17 11:00:00+00:00,34.86071303857012 +2025-08-17 11:15:00+00:00,34.99844156821808 +2025-08-17 11:30:00+00:00,33.867763740740244 +2025-08-17 11:45:00+00:00,33.35222586978023 +2025-08-17 12:00:00+00:00,32.456131763892266 +2025-08-17 12:15:00+00:00,31.417208110976638 +2025-08-17 12:30:00+00:00,30.11190177983666 +2025-08-17 12:45:00+00:00,29.58964447835927 +2025-08-17 13:00:00+00:00,27.48092956101269 +2025-08-17 13:15:00+00:00,26.434597508290242 +2025-08-17 13:30:00+00:00,24.446532273431814 +2025-08-17 13:45:00+00:00,22.628916308278384 +2025-08-17 14:00:00+00:00,20.237461366008013 +2025-08-17 14:15:00+00:00,17.616462827301405 +2025-08-17 14:30:00+00:00,14.718202167278111 +2025-08-17 14:45:00+00:00,11.860017143693076 +2025-08-17 15:00:00+00:00,8.48061220325599 +2025-08-17 15:15:00+00:00,5.749054103477133 +2025-08-17 15:30:00+00:00,3.2107386245018894 +2025-08-17 15:45:00+00:00,1.2463814644148852 +2025-08-18 03:45:00+00:00,3.648667168213564 +2025-08-18 04:00:00+00:00,5.177149325304876 +2025-08-18 04:15:00+00:00,13.068035979942124 +2025-08-18 04:30:00+00:00,4.821931494581789 +2025-08-18 04:45:00+00:00,19.782622815698023 +2025-08-18 05:00:00+00:00,19.82781916006152 +2025-08-18 05:15:00+00:00,21.519683540032933 +2025-08-18 05:30:00+00:00,25.026608322304206 +2025-08-18 05:45:00+00:00,25.389166859481186 +2025-08-18 06:00:00+00:00,27.90075450380485 +2025-08-18 06:15:00+00:00,27.51781309961003 +2025-08-18 06:30:00+00:00,17.3934127974343 +2025-08-18 06:45:00+00:00,27.873771157444324 +2025-08-18 07:00:00+00:00,30.209491528544678 +2025-08-18 07:15:00+00:00,27.65403974228045 +2025-08-18 07:30:00+00:00,29.569404975711947 +2025-08-18 07:45:00+00:00,30.522602866103952 +2025-08-18 08:00:00+00:00,30.321893819993672 +2025-08-18 08:15:00+00:00,31.555671283267753 +2025-08-18 08:30:00+00:00,32.79664734944018 +2025-08-18 08:45:00+00:00,34.47002686851763 +2025-08-18 09:00:00+00:00,33.381524426946356 +2025-08-18 09:15:00+00:00,36.07029108358085 +2025-08-18 09:30:00+00:00,36.534595702958384 +2025-08-18 09:45:00+00:00,37.50685248460593 +2025-08-18 10:00:00+00:00,37.5961644730329 +2025-08-18 10:15:00+00:00,18.32458621528732 +2025-08-18 10:30:00+00:00,37.74689797865647 +2025-08-18 10:45:00+00:00,18.30060769758076 +2025-08-18 11:00:00+00:00,18.18248230109707 +2025-08-18 11:15:00+00:00,36.13252068761033 +2025-08-18 11:30:00+00:00,35.78209096230044 +2025-08-18 11:45:00+00:00,35.14458316381049 +2025-08-18 12:00:00+00:00,34.540116804526605 +2025-08-18 12:15:00+00:00,33.26901730950645 +2025-08-18 12:30:00+00:00,31.865519613123283 +2025-08-18 12:45:00+00:00,30.439292866832176 +2025-08-18 13:00:00+00:00,29.19912372687475 +2025-08-18 13:15:00+00:00,26.977683244294713 +2025-08-18 13:30:00+00:00,24.856604646268792 +2025-08-18 13:45:00+00:00,22.441571676450295 +2025-08-18 14:00:00+00:00,19.344171590180142 +2025-08-18 14:15:00+00:00,17.141732302692088 +2025-08-18 14:30:00+00:00,14.434793620177636 +2025-08-18 14:45:00+00:00,11.193366333915492 +2025-08-18 15:00:00+00:00,8.287758769849136 +2025-08-18 15:15:00+00:00,5.365983876274471 +2025-08-18 15:30:00+00:00,2.872133100021694 +2025-08-18 15:45:00+00:00,1.1517759982759652 +2025-08-19 03:30:00+00:00,2.3278199144967693 +2025-08-19 03:45:00+00:00,4.744106990120995 +2025-08-19 04:00:00+00:00,7.757993769141263 +2025-08-19 04:15:00+00:00,10.948329816287908 +2025-08-19 04:30:00+00:00,14.021407337988892 +2025-08-19 04:45:00+00:00,16.666637765487177 +2025-08-19 05:00:00+00:00,19.268548286086606 +2025-08-19 05:15:00+00:00,21.57185098927515 +2025-08-19 05:30:00+00:00,22.778397761902735 +2025-08-19 05:45:00+00:00,24.404153323120504 +2025-08-19 06:00:00+00:00,25.22133658616924 +2025-08-19 06:15:00+00:00,26.473039422582424 +2025-08-19 06:30:00+00:00,28.04326209570855 +2025-08-19 06:45:00+00:00,28.40512395247029 +2025-08-19 07:00:00+00:00,28.337084343326328 +2025-08-19 07:15:00+00:00,30.05659797102792 +2025-08-19 07:30:00+00:00,31.94016114809675 +2025-08-19 07:45:00+00:00,32.66353954539974 +2025-08-19 08:00:00+00:00,33.874627293148365 +2025-08-19 08:15:00+00:00,33.61437070937792 +2025-08-19 08:30:00+00:00,34.95567147056877 +2025-08-19 08:45:00+00:00,35.06612430411924 +2025-08-19 09:00:00+00:00,35.574312115292955 +2025-08-19 09:15:00+00:00,35.64739261612955 +2025-08-19 09:30:00+00:00,36.203152176017625 +2025-08-19 09:45:00+00:00,35.78847314669305 +2025-08-19 10:00:00+00:00,36.23885531895856 +2025-08-19 10:15:00+00:00,35.58811581022532 +2025-08-19 10:30:00+00:00,35.032297527702966 +2025-08-19 10:45:00+00:00,35.65274294218315 +2025-08-19 11:00:00+00:00,36.2189185624639 +2025-08-19 11:15:00+00:00,35.17095907774688 +2025-08-19 11:30:00+00:00,34.115676937116135 +2025-08-19 11:45:00+00:00,33.41067358314912 +2025-08-19 12:00:00+00:00,32.978185843888305 +2025-08-19 12:15:00+00:00,31.843986185642443 +2025-08-19 12:30:00+00:00,31.365377650939955 +2025-08-19 12:45:00+00:00,29.790674981626534 +2025-08-19 13:00:00+00:00,28.297773739257785 +2025-08-19 13:15:00+00:00,26.363007172578584 +2025-08-19 13:30:00+00:00,24.550887674426782 +2025-08-19 13:45:00+00:00,22.421785763092853 +2025-08-19 14:00:00+00:00,19.653738491755128 +2025-08-19 14:15:00+00:00,16.72723426155328 +2025-08-19 14:30:00+00:00,13.786789704399837 +2025-08-19 14:45:00+00:00,10.621300384271075 +2025-08-19 15:00:00+00:00,7.584451783478595 +2025-08-19 15:15:00+00:00,4.754339511704915 +2025-08-19 15:30:00+00:00,2.570727379946165 +2025-08-20 03:30:00+00:00,2.6859949667579643 +2025-08-20 03:45:00+00:00,5.192078092315567 +2025-08-20 04:00:00+00:00,7.8996954352956745 +2025-08-20 04:15:00+00:00,11.005260414027516 +2025-08-20 04:30:00+00:00,14.01889934409645 +2025-08-20 04:45:00+00:00,16.598953150031477 +2025-08-20 05:00:00+00:00,18.898802026041214 +2025-08-20 05:15:00+00:00,20.99554513158094 +2025-08-20 05:30:00+00:00,22.096013381049396 +2025-08-20 05:45:00+00:00,23.8353821189732 +2025-08-20 06:00:00+00:00,25.252150530906142 +2025-08-20 06:15:00+00:00,26.702628619979876 +2025-08-20 06:30:00+00:00,28.46252138719601 +2025-08-20 06:45:00+00:00,29.314790112544674 +2025-08-20 07:00:00+00:00,30.654961044711882 +2025-08-20 07:15:00+00:00,32.39772659240269 +2025-08-20 07:30:00+00:00,32.82042933889353 +2025-08-20 07:45:00+00:00,35.0535709384798 +2025-08-20 08:00:00+00:00,35.350377895038385 +2025-08-20 08:15:00+00:00,36.552461009766276 +2025-08-20 08:30:00+00:00,37.04426484552309 +2025-08-20 08:45:00+00:00,37.29992811024788 +2025-08-20 09:00:00+00:00,37.11922017960212 +2025-08-20 09:15:00+00:00,38.1977361821406 +2025-08-20 09:30:00+00:00,17.852657699288336 +2025-08-20 09:45:00+00:00,17.760222780693276 +2025-08-20 10:00:00+00:00,17.31128027008528 +2025-08-20 10:15:00+00:00,15.996278583123736 +2025-08-20 10:30:00+00:00,16.582994468433267 +2025-08-20 10:45:00+00:00,16.63547468777041 +2025-08-20 11:00:00+00:00,16.685170846177115 +2025-08-20 11:15:00+00:00,17.267861207856125 +2025-08-20 11:30:00+00:00,16.476499727913236 +2025-08-20 11:45:00+00:00,17.635381396351267 +2025-08-20 12:00:00+00:00,16.954834184841875 +2025-08-20 12:15:00+00:00,16.913852267945398 +2025-08-20 12:30:00+00:00,16.840517230987796 +2025-08-20 12:45:00+00:00,16.945506712036472 +2025-08-20 13:00:00+00:00,28.755533231265936 +2025-08-20 13:15:00+00:00,26.59174699971914 +2025-08-20 13:30:00+00:00,24.309463678042004 +2025-08-20 13:45:00+00:00,21.93032014863746 +2025-08-20 14:00:00+00:00,19.179031236488054 +2025-08-20 14:15:00+00:00,16.496371983231903 +2025-08-20 14:30:00+00:00,13.386722523483684 +2025-08-20 14:45:00+00:00,10.484613494715166 +2025-08-20 15:00:00+00:00,7.435208438490678 +2025-08-20 15:15:00+00:00,4.682534613314624 +2025-08-20 15:30:00+00:00,2.2870264516250214 +2025-08-21 03:30:00+00:00,2.3510763368954466 +2025-08-21 03:45:00+00:00,5.258639224633362 +2025-08-21 04:00:00+00:00,8.081768932551428 +2025-08-21 04:15:00+00:00,6.976264513822466 +2025-08-21 04:30:00+00:00,4.951385935424962 +2025-08-21 04:45:00+00:00,11.439942469590111 +2025-08-21 05:00:00+00:00,8.023673363018867 +2025-08-21 05:15:00+00:00,11.43435871139383 +2025-08-21 05:30:00+00:00,23.270879907565675 +2025-08-21 05:45:00+00:00,28.249252983636197 +2025-08-21 06:00:00+00:00,29.31998543137172 +2025-08-21 06:15:00+00:00,29.011333869136703 +2025-08-21 06:30:00+00:00,29.636716127781813 +2025-08-21 06:45:00+00:00,30.67601615344796 +2025-08-21 07:00:00+00:00,31.09084484959442 +2025-08-21 07:15:00+00:00,30.63961909996777 +2025-08-21 07:30:00+00:00,32.57043109086444 +2025-08-21 07:45:00+00:00,33.16500647505399 +2025-08-21 08:00:00+00:00,32.7793905888913 +2025-08-21 08:15:00+00:00,33.915108790276406 +2025-08-21 08:30:00+00:00,34.18156032593142 +2025-08-21 08:45:00+00:00,34.01968664810478 +2025-08-21 09:00:00+00:00,35.47053639752792 +2025-08-21 09:15:00+00:00,35.063830566239446 +2025-08-21 09:30:00+00:00,36.70067236257092 +2025-08-21 09:45:00+00:00,34.55137976454585 +2025-08-21 10:00:00+00:00,35.495980707520204 +2025-08-21 10:15:00+00:00,35.52073363205051 +2025-08-21 10:30:00+00:00,35.54192679297539 +2025-08-21 10:45:00+00:00,33.478843482285384 +2025-08-21 11:00:00+00:00,35.48173993248308 +2025-08-21 11:15:00+00:00,36.01891834218699 +2025-08-21 11:30:00+00:00,34.683064225174434 +2025-08-21 11:45:00+00:00,34.3528671504159 +2025-08-21 12:00:00+00:00,33.59881283445593 +2025-08-21 12:15:00+00:00,32.55536524902573 +2025-08-21 12:30:00+00:00,13.029332784287009 +2025-08-21 12:45:00+00:00,30.832186298740165 +2025-08-21 13:00:00+00:00,22.50903774048485 +2025-08-21 13:15:00+00:00,26.111835603053656 +2025-08-21 13:30:00+00:00,6.529128954897652 +2025-08-21 13:45:00+00:00,21.085781689500518 +2025-08-21 14:00:00+00:00,19.101591006780005 +2025-08-21 14:15:00+00:00,16.94820064486361 +2025-08-21 14:30:00+00:00,13.461135501742666 +2025-08-21 14:45:00+00:00,10.869799572724736 +2025-08-21 15:00:00+00:00,7.799925126219199 +2025-08-21 15:15:00+00:00,4.725293550027022 +2025-08-21 15:30:00+00:00,2.3483372661880324 +2025-08-22 03:45:00+00:00,3.285724244694947 +2025-08-22 04:00:00+00:00,6.195883821944968 +2025-08-22 04:15:00+00:00,8.755548696606866 +2025-08-22 04:30:00+00:00,6.784303661601668 +2025-08-22 04:45:00+00:00,16.970292740112967 +2025-08-22 05:00:00+00:00,16.755255066124363 +2025-08-22 05:15:00+00:00,22.32171380515014 +2025-08-22 05:30:00+00:00,22.935231087801363 +2025-08-22 05:45:00+00:00,24.399442606264486 +2025-08-22 06:00:00+00:00,24.408311618039715 +2025-08-22 06:15:00+00:00,25.651513672779856 +2025-08-22 06:30:00+00:00,27.18092507798474 +2025-08-22 06:45:00+00:00,28.425586972385013 +2025-08-22 07:00:00+00:00,29.154730860985392 +2025-08-22 07:15:00+00:00,30.27684298948161 +2025-08-22 07:30:00+00:00,31.819819053803435 +2025-08-22 07:45:00+00:00,32.28571414600087 +2025-08-22 08:00:00+00:00,35.726253937071455 +2025-08-22 08:15:00+00:00,34.7270314465257 +2025-08-22 08:30:00+00:00,36.56936847248876 +2025-08-22 08:45:00+00:00,36.868295754314424 +2025-08-22 09:00:00+00:00,37.16770983125796 +2025-08-22 09:15:00+00:00,18.41595176586566 +2025-08-22 09:30:00+00:00,18.452594751805407 +2025-08-22 09:45:00+00:00,17.486039532858562 +2025-08-22 10:00:00+00:00,16.136046783149432 +2025-08-22 10:15:00+00:00,16.994390815921392 +2025-08-22 10:30:00+00:00,16.961132323748636 +2025-08-22 10:45:00+00:00,16.84766070449563 +2025-08-22 11:00:00+00:00,15.64738333774221 +2025-08-22 11:15:00+00:00,16.612984196406735 +2025-08-22 11:30:00+00:00,15.58711168649286 +2025-08-22 11:45:00+00:00,15.923636921858941 +2025-08-22 12:00:00+00:00,16.696386646511645 +2025-08-22 12:15:00+00:00,16.506255528398906 +2025-08-22 12:30:00+00:00,15.334647536000316 +2025-08-22 12:45:00+00:00,16.020243405270797 +2025-08-22 13:00:00+00:00,16.74505325392046 +2025-08-22 13:15:00+00:00,16.159918893510913 +2025-08-22 13:30:00+00:00,23.25808645265117 +2025-08-22 13:45:00+00:00,21.07076601301289 +2025-08-22 14:00:00+00:00,18.722960052975345 +2025-08-22 14:15:00+00:00,15.99255775467585 +2025-08-22 14:30:00+00:00,12.6031698404224 +2025-08-22 14:45:00+00:00,9.92148594516515 +2025-08-22 15:00:00+00:00,7.064545239378514 +2025-08-22 15:15:00+00:00,4.172434841070864 +2025-08-22 15:30:00+00:00,1.921509537874439 +2025-08-23 03:45:00+00:00,2.535776681933639 +2025-08-23 04:00:00+00:00,5.807466306286175 +2025-08-23 04:15:00+00:00,5.758799346910137 +2025-08-23 04:30:00+00:00,14.661831593670037 +2025-08-23 04:45:00+00:00,17.42548788147973 +2025-08-23 05:00:00+00:00,19.30620436417877 +2025-08-23 05:15:00+00:00,21.63403163968296 +2025-08-23 05:30:00+00:00,23.62944364572437 +2025-08-23 05:45:00+00:00,25.30412188746087 +2025-08-23 06:00:00+00:00,26.069054982630814 +2025-08-23 06:15:00+00:00,27.651654350800207 +2025-08-23 06:30:00+00:00,28.871221587414695 +2025-08-23 06:45:00+00:00,31.118214011258495 +2025-08-23 07:00:00+00:00,31.61186310162939 +2025-08-23 07:15:00+00:00,33.470170298896576 +2025-08-23 07:30:00+00:00,33.26059756509423 +2025-08-23 07:45:00+00:00,34.15411840369849 +2025-08-23 08:00:00+00:00,35.334048759669784 +2025-08-23 08:15:00+00:00,35.64503689844387 +2025-08-23 08:30:00+00:00,36.21125301840399 +2025-08-23 08:45:00+00:00,36.20303446394197 +2025-08-23 09:00:00+00:00,37.66556169088342 +2025-08-23 09:15:00+00:00,36.901294687427345 +2025-08-23 09:30:00+00:00,37.08491062151278 +2025-08-23 09:45:00+00:00,37.09671273582835 +2025-08-23 10:00:00+00:00,37.107365341732404 +2025-08-23 10:15:00+00:00,38.05974658779702 +2025-08-23 10:30:00+00:00,37.76802154605274 +2025-08-23 10:45:00+00:00,37.60879788848332 +2025-08-23 11:00:00+00:00,18.222550269312094 +2025-08-23 11:15:00+00:00,36.63453276552257 +2025-08-23 11:30:00+00:00,18.11384466910184 +2025-08-23 11:45:00+00:00,35.14861091661486 +2025-08-23 12:00:00+00:00,17.70455629959863 +2025-08-23 12:15:00+00:00,32.93655228408956 +2025-08-23 12:30:00+00:00,31.27633020853157 +2025-08-23 12:45:00+00:00,29.545688891612134 +2025-08-23 13:00:00+00:00,27.74623573365108 +2025-08-23 13:15:00+00:00,25.694281227808485 +2025-08-23 13:30:00+00:00,23.717707153743692 +2025-08-23 13:45:00+00:00,21.425186401648666 +2025-08-23 14:00:00+00:00,18.97699576023504 +2025-08-23 14:15:00+00:00,16.072444390879877 +2025-08-23 14:30:00+00:00,12.883078787911602 +2025-08-23 14:45:00+00:00,9.743333784702095 +2025-08-23 15:00:00+00:00,6.661448674206163 +2025-08-23 15:15:00+00:00,4.158401351597922 +2025-08-23 15:30:00+00:00,1.7923383143992875 +2025-08-24 03:45:00+00:00,4.252114818469753 +2025-08-24 04:00:00+00:00,8.758215909386553 +2025-08-24 04:15:00+00:00,11.456030916145966 +2025-08-24 04:30:00+00:00,14.504955959106576 +2025-08-24 04:45:00+00:00,17.1202509649708 +2025-08-24 05:00:00+00:00,19.59718118358688 +2025-08-24 05:15:00+00:00,21.08542932557149 +2025-08-24 05:30:00+00:00,23.372483617213987 +2025-08-24 05:45:00+00:00,23.65903279525342 +2025-08-24 06:00:00+00:00,25.752764180800305 +2025-08-24 06:15:00+00:00,26.678227093759425 +2025-08-24 06:30:00+00:00,27.532280538340324 +2025-08-24 06:45:00+00:00,29.638198696179042 +2025-08-24 07:00:00+00:00,30.05735019968842 +2025-08-24 07:15:00+00:00,31.604388517522832 +2025-08-24 07:30:00+00:00,32.15519767401231 +2025-08-24 07:45:00+00:00,33.5928168101162 +2025-08-24 08:00:00+00:00,35.2813304500271 +2025-08-24 08:15:00+00:00,36.06969339569935 +2025-08-24 08:30:00+00:00,36.206161542766964 +2025-08-24 08:45:00+00:00,37.136288701247594 +2025-08-24 09:00:00+00:00,37.84556255760402 +2025-08-24 09:15:00+00:00,38.296159624490905 +2025-08-24 09:30:00+00:00,18.22331270963817 +2025-08-24 09:45:00+00:00,38.27957538557162 +2025-08-24 10:00:00+00:00,37.75886406462133 +2025-08-24 10:15:00+00:00,16.702279226375644 +2025-08-24 10:30:00+00:00,15.861197230752378 +2025-08-24 10:45:00+00:00,15.58711168649286 +2025-08-24 11:00:00+00:00,16.121338950157412 +2025-08-24 11:15:00+00:00,16.186293512986882 +2025-08-24 11:30:00+00:00,15.36094199865212 +2025-08-24 11:45:00+00:00,15.574136405172963 +2025-08-24 12:00:00+00:00,16.138870460721183 +2025-08-24 12:15:00+00:00,17.150267711518453 +2025-08-24 12:30:00+00:00,15.611631565444354 +2025-08-24 12:45:00+00:00,16.416645538649927 +2025-08-24 13:00:00+00:00,16.801438473625456 +2025-08-24 13:15:00+00:00,25.971763775395885 +2025-08-24 13:30:00+00:00,23.61940294302234 +2025-08-24 13:45:00+00:00,21.191391239764336 +2025-08-24 14:00:00+00:00,18.52495941674898 +2025-08-24 14:15:00+00:00,15.506357571397796 +2025-08-24 14:30:00+00:00,12.688757723277512 +2025-08-24 14:45:00+00:00,9.535481016768648 +2025-08-24 15:00:00+00:00,6.402561348600113 +2025-08-24 15:15:00+00:00,3.8946311004991556 +2025-08-24 15:30:00+00:00,1.6633745667389734 +2025-08-25 03:45:00+00:00,3.373742370649377 +2025-08-25 04:00:00+00:00,3.684934872599759 +2025-08-25 04:15:00+00:00,11.603222995193411 +2025-08-25 04:30:00+00:00,6.925804906595769 +2025-08-25 04:45:00+00:00,10.217992251107383 +2025-08-25 05:00:00+00:00,14.714127333852515 +2025-08-25 05:15:00+00:00,23.31917621383546 +2025-08-25 05:30:00+00:00,24.931751270583966 +2025-08-25 05:45:00+00:00,24.639605848982278 +2025-08-25 06:00:00+00:00,25.909954205799817 +2025-08-25 06:15:00+00:00,27.158607793707507 +2025-08-25 06:30:00+00:00,28.297533355588236 +2025-08-25 06:45:00+00:00,30.142046258432003 +2025-08-25 07:00:00+00:00,30.42399940473276 +2025-08-25 07:15:00+00:00,30.45342295500801 +2025-08-25 07:30:00+00:00,31.32449698461004 +2025-08-25 07:45:00+00:00,32.87813843666556 +2025-08-25 08:00:00+00:00,32.6458938445875 +2025-08-25 08:15:00+00:00,32.89649564773009 +2025-08-25 08:30:00+00:00,33.95194578756859 +2025-08-25 08:45:00+00:00,35.12107566917394 +2025-08-25 09:00:00+00:00,35.32985648215355 +2025-08-25 09:15:00+00:00,36.819795639533105 +2025-08-25 09:30:00+00:00,36.346940413851456 +2025-08-25 09:45:00+00:00,36.032701874314554 +2025-08-25 10:00:00+00:00,35.71192766699202 +2025-08-25 10:15:00+00:00,35.65648424763748 +2025-08-25 10:30:00+00:00,37.46805848834998 +2025-08-25 10:45:00+00:00,34.752420033671896 +2025-08-25 11:00:00+00:00,35.6834215693645 +2025-08-25 11:15:00+00:00,35.131130237585246 +2025-08-25 11:30:00+00:00,35.996989754499225 +2025-08-25 11:45:00+00:00,34.22485646940957 +2025-08-25 12:00:00+00:00,33.65441531310339 +2025-08-25 12:15:00+00:00,32.61589685153127 +2025-08-25 12:30:00+00:00,31.633496081253497 +2025-08-25 12:45:00+00:00,29.464835397421137 +2025-08-25 13:00:00+00:00,28.405121526012444 +2025-08-25 13:15:00+00:00,25.702969642523136 +2025-08-25 13:30:00+00:00,23.467007904779617 +2025-08-25 13:45:00+00:00,20.929599691300176 +2025-08-25 14:00:00+00:00,18.618717442597358 +2025-08-25 14:15:00+00:00,15.166463006011266 +2025-08-25 14:30:00+00:00,12.50607165720127 +2025-08-25 14:45:00+00:00,9.430045644384432 +2025-08-25 15:00:00+00:00,6.315489939309893 +2025-08-25 15:15:00+00:00,3.833191705863232 +2025-08-25 15:30:00+00:00,1.6817813915321862 +2025-08-26 03:30:00+00:00,1.7264745054148283 +2025-08-26 03:45:00+00:00,2.0628244420033948 +2025-08-26 04:00:00+00:00,7.929913737373116 +2025-08-26 04:15:00+00:00,11.5720670125551 +2025-08-26 04:30:00+00:00,14.213499772878372 +2025-08-26 04:45:00+00:00,19.231407326845947 +2025-08-26 05:00:00+00:00,22.26666530608775 +2025-08-26 05:15:00+00:00,21.380431998738523 +2025-08-26 05:30:00+00:00,23.00905551709311 +2025-08-26 05:45:00+00:00,24.180199467146515 +2025-08-26 06:00:00+00:00,24.24618697816848 +2025-08-26 06:15:00+00:00,25.676858327613502 +2025-08-26 06:30:00+00:00,28.02121856327573 +2025-08-26 06:45:00+00:00,27.811196941464033 +2025-08-26 07:00:00+00:00,27.603902486896214 +2025-08-26 07:15:00+00:00,29.36073259454903 +2025-08-26 07:30:00+00:00,30.541345567449188 +2025-08-26 07:45:00+00:00,30.61270986084448 +2025-08-26 08:00:00+00:00,31.270446112396627 +2025-08-26 08:15:00+00:00,32.26964499440681 +2025-08-26 08:30:00+00:00,33.01017694449136 +2025-08-26 08:45:00+00:00,32.083972676433355 +2025-08-26 09:00:00+00:00,34.17210513796611 +2025-08-26 09:15:00+00:00,34.81366518588264 +2025-08-26 09:30:00+00:00,35.7566972263056 +2025-08-26 09:45:00+00:00,35.26056249602971 +2025-08-26 10:00:00+00:00,34.75773041980636 +2025-08-26 10:15:00+00:00,36.449072944719184 +2025-08-26 10:30:00+00:00,36.92175010539199 +2025-08-26 10:45:00+00:00,36.520657875736056 +2025-08-26 11:00:00+00:00,36.012951521415964 +2025-08-26 11:15:00+00:00,35.13548128248358 +2025-08-26 11:30:00+00:00,35.93775906623999 +2025-08-26 11:45:00+00:00,34.95004092727287 +2025-08-26 12:00:00+00:00,17.707937118593918 +2025-08-26 12:15:00+00:00,33.24027325466338 +2025-08-26 12:30:00+00:00,31.706030385362606 +2025-08-26 12:45:00+00:00,30.139019923855884 +2025-08-26 13:00:00+00:00,28.690384223854213 +2025-08-26 13:15:00+00:00,26.560450086313335 +2025-08-26 13:30:00+00:00,24.1069727529548 +2025-08-26 13:45:00+00:00,21.379535363271486 +2025-08-26 14:00:00+00:00,18.430017822623938 +2025-08-26 14:15:00+00:00,15.32214466965254 +2025-08-26 14:30:00+00:00,12.363141228817094 +2025-08-26 14:45:00+00:00,9.231256717260512 +2025-08-26 15:00:00+00:00,6.223573493888736 +2025-08-26 15:15:00+00:00,3.6977271614199383 +2025-08-26 15:30:00+00:00,1.6000094004228047 +2025-08-27 03:30:00+00:00,1.7564061800058395 +2025-08-27 03:45:00+00:00,2.672900117693795 +2025-08-27 04:00:00+00:00,7.886005078068143 +2025-08-27 04:15:00+00:00,4.894907648621372 +2025-08-27 04:30:00+00:00,14.029676079018772 +2025-08-27 04:45:00+00:00,17.764929995804 +2025-08-27 05:00:00+00:00,19.06139981785594 +2025-08-27 05:15:00+00:00,11.930187103168242 +2025-08-27 05:30:00+00:00,19.453196360564032 +2025-08-27 05:45:00+00:00,11.998378219111476 +2025-08-27 06:00:00+00:00,25.94230746774391 +2025-08-27 06:15:00+00:00,26.174544519713045 +2025-08-27 06:30:00+00:00,26.31844329802066 +2025-08-27 06:45:00+00:00,28.75008632221095 +2025-08-27 07:00:00+00:00,28.77838002421792 +2025-08-27 07:15:00+00:00,28.36679314659922 +2025-08-27 07:30:00+00:00,29.00860173120323 +2025-08-27 07:45:00+00:00,31.358232268134767 +2025-08-27 08:00:00+00:00,30.454229061813884 +2025-08-27 08:15:00+00:00,30.803222597748693 +2025-08-27 08:30:00+00:00,31.366264539764124 +2025-08-27 08:45:00+00:00,32.561509038571586 +2025-08-27 09:00:00+00:00,33.31254665135926 +2025-08-27 09:15:00+00:00,32.754978860010105 +2025-08-27 09:30:00+00:00,32.772095857044555 +2025-08-27 09:45:00+00:00,33.09514639851418 +2025-08-27 10:00:00+00:00,33.41417074113929 +2025-08-27 10:15:00+00:00,33.228406134834174 +2025-08-27 10:30:00+00:00,35.02277160431462 +2025-08-27 10:45:00+00:00,33.63830807646297 +2025-08-27 11:00:00+00:00,33.584927093700166 +2025-08-27 11:15:00+00:00,33.59207919065234 +2025-08-27 11:30:00+00:00,33.26139581019813 +2025-08-27 11:45:00+00:00,32.07095701717727 +2025-08-27 12:00:00+00:00,31.665920208157566 +2025-08-27 12:15:00+00:00,31.59139444260455 +2025-08-27 12:30:00+00:00,30.20889195730725 +2025-08-27 12:45:00+00:00,29.34450486507089 +2025-08-27 13:00:00+00:00,27.71605634180321 +2025-08-27 13:15:00+00:00,25.800853243273664 +2025-08-27 13:30:00+00:00,23.172573043870273 +2025-08-27 13:45:00+00:00,21.2733888528405 +2025-08-27 14:00:00+00:00,18.331170756408074 +2025-08-27 14:15:00+00:00,15.318753783274637 +2025-08-27 14:30:00+00:00,12.720335601761443 +2025-08-27 14:45:00+00:00,9.409307245626755 +2025-08-27 15:00:00+00:00,6.265634345190378 +2025-08-27 15:15:00+00:00,3.6595573935078463 +2025-08-27 15:30:00+00:00,1.5638176481553838 +2025-08-28 03:45:00+00:00,4.847155739594209 +2025-08-28 04:00:00+00:00,7.698313808945329 +2025-08-28 04:15:00+00:00,10.694122966250093 +2025-08-28 04:30:00+00:00,13.793840652586534 +2025-08-28 04:45:00+00:00,16.413656398386117 +2025-08-28 05:00:00+00:00,19.30512014975606 +2025-08-28 05:15:00+00:00,21.343914147668336 +2025-08-28 05:30:00+00:00,24.537388809499497 +2025-08-28 05:45:00+00:00,22.791291606447842 +2025-08-28 06:00:00+00:00,24.796799703243657 +2025-08-28 06:15:00+00:00,25.21507235764965 +2025-08-28 06:30:00+00:00,26.706189539357826 +2025-08-28 06:45:00+00:00,26.69472894490165 +2025-08-28 07:00:00+00:00,26.73209042942696 +2025-08-28 07:15:00+00:00,29.103749753952762 +2025-08-28 07:30:00+00:00,30.959158769989955 +2025-08-28 07:45:00+00:00,31.753778470496187 +2025-08-28 08:00:00+00:00,32.05971339059517 +2025-08-28 08:15:00+00:00,32.630749534651315 +2025-08-28 08:30:00+00:00,33.603624638400404 +2025-08-28 08:45:00+00:00,32.98599633046406 +2025-08-28 09:00:00+00:00,36.29089401132074 +2025-08-28 09:15:00+00:00,33.86692544181783 +2025-08-28 09:30:00+00:00,35.58214068925172 +2025-08-28 09:45:00+00:00,37.19841831458515 +2025-08-28 10:00:00+00:00,37.94771391734225 +2025-08-28 10:15:00+00:00,37.66572084763045 +2025-08-28 10:30:00+00:00,37.51882318975568 +2025-08-28 10:45:00+00:00,17.657893855651952 +2025-08-28 11:00:00+00:00,17.796898433176224 +2025-08-28 11:15:00+00:00,35.65370636556019 +2025-08-28 11:30:00+00:00,17.964392587067366 +2025-08-28 11:45:00+00:00,17.88583839683683 +2025-08-28 12:00:00+00:00,34.38367072810608 +2025-08-28 12:15:00+00:00,17.376045037173714 +2025-08-28 12:30:00+00:00,16.94845920662499 +2025-08-28 12:45:00+00:00,30.022970826210955 +2025-08-28 13:00:00+00:00,27.945339358535897 +2025-08-28 13:15:00+00:00,25.275079991920705 +2025-08-28 13:30:00+00:00,23.117554485354198 +2025-08-28 13:45:00+00:00,20.97460886593027 +2025-08-28 14:00:00+00:00,17.404454473017164 +2025-08-28 14:15:00+00:00,15.16934885232174 +2025-08-28 14:30:00+00:00,11.843314482633378 +2025-08-28 14:45:00+00:00,8.844101598449647 +2025-08-28 15:00:00+00:00,5.999371688031442 +2025-08-28 15:15:00+00:00,3.411957144485463 +2025-08-28 15:30:00+00:00,1.422756117283522 +2025-08-29 03:45:00+00:00,4.337775211446804 +2025-08-29 04:00:00+00:00,7.311066044497519 +2025-08-29 04:15:00+00:00,10.651569789142654 +2025-08-29 04:30:00+00:00,13.655838676289768 +2025-08-29 04:45:00+00:00,16.517929462299037 +2025-08-29 05:00:00+00:00,19.098192017354446 +2025-08-29 05:15:00+00:00,20.672282584478538 +2025-08-29 05:30:00+00:00,22.594731967659108 +2025-08-29 05:45:00+00:00,23.974602213744163 +2025-08-29 06:00:00+00:00,24.83357241895763 +2025-08-29 06:15:00+00:00,26.086450751639376 +2025-08-29 06:30:00+00:00,28.317618538815143 +2025-08-29 06:45:00+00:00,29.242865864505795 +2025-08-29 07:00:00+00:00,30.163254868592308 +2025-08-29 07:15:00+00:00,30.596569997753654 +2025-08-29 07:30:00+00:00,30.672848374794814 +2025-08-29 07:45:00+00:00,32.678383012958946 +2025-08-29 08:00:00+00:00,33.17725509481495 +2025-08-29 08:15:00+00:00,33.59738625875997 +2025-08-29 08:30:00+00:00,34.53233861515069 +2025-08-29 08:45:00+00:00,34.49115824455881 +2025-08-29 09:00:00+00:00,36.82298517446348 +2025-08-29 09:15:00+00:00,36.711307896987606 +2025-08-29 09:30:00+00:00,36.5989433947943 +2025-08-29 09:45:00+00:00,36.30026195941177 +2025-08-29 10:00:00+00:00,36.53452526441112 +2025-08-29 10:15:00+00:00,37.23786900440347 +2025-08-29 10:30:00+00:00,36.13606186512752 +2025-08-29 10:45:00+00:00,36.13018687191761 +2025-08-29 11:00:00+00:00,35.571379683459 +2025-08-29 11:15:00+00:00,34.03507768810413 +2025-08-29 11:30:00+00:00,33.580301158260966 +2025-08-29 11:45:00+00:00,34.07092579034763 +2025-08-29 12:00:00+00:00,32.592520673879044 +2025-08-29 12:15:00+00:00,31.88947499577147 +2025-08-29 12:30:00+00:00,30.903589357261808 +2025-08-29 12:45:00+00:00,29.412555707864048 +2025-08-29 13:00:00+00:00,27.609455956883316 +2025-08-29 13:15:00+00:00,25.72550650442392 +2025-08-29 13:30:00+00:00,23.553941136773066 +2025-08-29 13:45:00+00:00,20.8533448182853 +2025-08-29 14:00:00+00:00,17.461397018448253 +2025-08-29 14:15:00+00:00,14.429233787583852 +2025-08-29 14:30:00+00:00,11.772827853946666 +2025-08-29 14:45:00+00:00,8.647150389237089 +2025-08-29 15:00:00+00:00,5.762592082981568 +2025-08-29 15:15:00+00:00,3.278451095147083 +2025-08-29 15:30:00+00:00,1.1746923812744616 +2025-08-30 03:30:00+00:00,2.21066634978751 +2025-08-30 03:45:00+00:00,4.648153657486809 +2025-08-30 04:00:00+00:00,7.4109345031915606 +2025-08-30 04:15:00+00:00,10.512447923246595 +2025-08-30 04:30:00+00:00,13.386077734795345 +2025-08-30 04:45:00+00:00,15.62582481804257 +2025-08-30 05:00:00+00:00,18.010942498420505 +2025-08-30 05:15:00+00:00,20.000715660909094 +2025-08-30 05:30:00+00:00,22.246069291320925 +2025-08-30 05:45:00+00:00,24.33287825028735 +2025-08-30 06:00:00+00:00,25.784478905816627 +2025-08-30 06:15:00+00:00,27.10330927428763 +2025-08-30 06:30:00+00:00,29.041494250533365 +2025-08-30 06:45:00+00:00,30.010450849915934 +2025-08-30 07:00:00+00:00,31.528340225506337 +2025-08-30 07:15:00+00:00,32.49844946228309 +2025-08-30 07:30:00+00:00,34.271714876858745 +2025-08-30 07:45:00+00:00,35.352381847437 +2025-08-30 08:00:00+00:00,35.481574112132165 +2025-08-30 08:15:00+00:00,18.36106681906982 +2025-08-30 08:30:00+00:00,36.96065561961092 +2025-08-30 08:45:00+00:00,18.243187710187534 +2025-08-30 09:00:00+00:00,17.60600982630805 +2025-08-30 09:15:00+00:00,17.6914307998292 +2025-08-30 09:30:00+00:00,17.77474119750379 +2025-08-30 09:45:00+00:00,17.51276619650152 +2025-08-30 10:00:00+00:00,15.30746951110777 +2025-08-30 10:15:00+00:00,16.296651411998436 +2025-08-30 10:30:00+00:00,16.59998337186209 +2025-08-30 10:45:00+00:00,15.835545735125953 +2025-08-30 11:00:00+00:00,15.492343690184217 +2025-08-30 11:15:00+00:00,15.834446955006129 +2025-08-30 11:30:00+00:00,17.139952721466155 +2025-08-30 11:45:00+00:00,16.36591918084919 +2025-08-30 12:00:00+00:00,17.151986080635368 +2025-08-30 12:15:00+00:00,17.058041555481136 +2025-08-30 12:30:00+00:00,16.284794927390035 +2025-08-30 12:45:00+00:00,17.027592472188754 +2025-08-30 13:00:00+00:00,27.385742975691365 +2025-08-30 13:15:00+00:00,25.438561819105573 +2025-08-30 13:30:00+00:00,22.369334994135162 +2025-08-30 13:45:00+00:00,18.56269093711169 +2025-08-30 14:00:00+00:00,16.613794006215144 +2025-08-30 14:15:00+00:00,14.135908729539272 +2025-08-30 14:30:00+00:00,10.934421161532784 +2025-08-30 14:45:00+00:00,7.967188331836119 +2025-08-30 15:00:00+00:00,5.201347286003573 +2025-08-30 15:15:00+00:00,2.8142818755592973 +2025-08-30 15:30:00+00:00,0.9478346681381 +2025-08-31 03:45:00+00:00,4.304254148796163 +2025-08-31 04:00:00+00:00,7.33017091197792 +2025-08-31 04:15:00+00:00,10.36440279681083 +2025-08-31 04:30:00+00:00,13.571804175347909 +2025-08-31 04:45:00+00:00,16.364320639159352 +2025-08-31 05:00:00+00:00,18.772856305313667 +2025-08-31 05:15:00+00:00,20.896825562911328 +2025-08-31 05:30:00+00:00,22.791955992082595 +2025-08-31 05:45:00+00:00,24.21251147665325 +2025-08-31 06:00:00+00:00,24.989676855976505 +2025-08-31 06:15:00+00:00,27.23599973505975 +2025-08-31 06:30:00+00:00,28.375818043655386 +2025-08-31 06:45:00+00:00,29.47842489020028 +2025-08-31 07:00:00+00:00,29.963737227006956 +2025-08-31 07:15:00+00:00,31.08209809335017 +2025-08-31 07:30:00+00:00,31.368712052108066 +2025-08-31 07:45:00+00:00,32.25539392437602 +2025-08-31 08:00:00+00:00,31.851319769932168 +2025-08-31 08:15:00+00:00,33.05112427760404 +2025-08-31 08:30:00+00:00,33.357105139818636 +2025-08-31 08:45:00+00:00,33.86013721085495 +2025-08-31 09:00:00+00:00,34.32759801737998 +2025-08-31 09:15:00+00:00,34.79461099929267 +2025-08-31 09:30:00+00:00,34.968841176462696 +2025-08-31 09:45:00+00:00,34.48349438219529 +2025-08-31 10:00:00+00:00,35.0673955078158 +2025-08-31 10:15:00+00:00,35.62937466415304 +2025-08-31 10:30:00+00:00,37.19836217866024 +2025-08-31 10:45:00+00:00,35.55917632438963 +2025-08-31 11:00:00+00:00,36.06589194446278 +2025-08-31 11:15:00+00:00,33.832105754028 +2025-08-31 11:30:00+00:00,34.29062810752751 +2025-08-31 11:45:00+00:00,32.54978829562734 +2025-08-31 12:00:00+00:00,32.243904071145415 +2025-08-31 12:15:00+00:00,31.323453303307105 +2025-08-31 12:30:00+00:00,30.534820339561094 +2025-08-31 12:45:00+00:00,28.62526769046422 +2025-08-31 13:00:00+00:00,27.006657642327824 +2025-08-31 13:15:00+00:00,25.04889493654502 +2025-08-31 13:30:00+00:00,22.74139806815468 +2025-08-31 13:45:00+00:00,20.52638534014945 +2025-08-31 14:00:00+00:00,17.97923077865442 +2025-08-31 14:15:00+00:00,15.107685088260446 +2025-08-31 14:30:00+00:00,12.089131509389833 +2025-08-31 14:45:00+00:00,8.774545438506557 +2025-08-31 15:00:00+00:00,5.71204846555238 +2025-08-31 15:15:00+00:00,3.0060714932570827 +2025-09-01 03:45:00+00:00,4.04282317462647 +2025-09-01 04:00:00+00:00,6.862888724821011 +2025-09-01 04:15:00+00:00,10.798537412601585 +2025-09-01 04:30:00+00:00,13.17144539633578 +2025-09-01 04:45:00+00:00,15.722869570828356 +2025-09-01 05:00:00+00:00,17.424592294951232 +2025-09-01 05:15:00+00:00,20.090621066908604 +2025-09-01 05:30:00+00:00,21.3938516493501 +2025-09-01 05:45:00+00:00,22.597946680982556 +2025-09-01 06:00:00+00:00,22.897947875278838 +2025-09-01 06:15:00+00:00,24.548802318436916 +2025-09-01 06:30:00+00:00,26.03739946206945 +2025-09-01 06:45:00+00:00,26.50934866687539 +2025-09-01 07:00:00+00:00,27.2929514428857 +2025-09-01 07:15:00+00:00,27.838850214490638 +2025-09-01 07:30:00+00:00,29.24170016380481 +2025-09-01 07:45:00+00:00,29.832809085121784 +2025-09-01 08:00:00+00:00,31.541305211958722 +2025-09-01 08:15:00+00:00,31.550612003283725 +2025-09-01 08:30:00+00:00,31.849761629458246 +2025-09-01 08:45:00+00:00,32.17209802085905 +2025-09-01 09:00:00+00:00,32.49616349383246 +2025-09-01 09:15:00+00:00,33.03434466835835 +2025-09-01 09:30:00+00:00,37.08005343769168 +2025-09-01 09:45:00+00:00,37.40486610909534 +2025-09-01 10:00:00+00:00,37.420051214802164 +2025-09-01 10:15:00+00:00,38.03642022908002 +2025-09-01 10:30:00+00:00,18.10891079268354 +2025-09-01 10:45:00+00:00,18.198340344325125 +2025-09-01 11:00:00+00:00,36.29894790831158 +2025-09-01 11:15:00+00:00,17.898185126619705 +2025-09-01 11:30:00+00:00,35.47792224789065 +2025-09-01 11:45:00+00:00,34.78934855426796 +2025-09-01 12:00:00+00:00,33.627637811619 +2025-09-01 12:15:00+00:00,32.225169851479215 +2025-09-01 12:30:00+00:00,31.25034952106431 +2025-09-01 12:45:00+00:00,29.810506702844606 +2025-09-01 13:00:00+00:00,27.969365538577975 +2025-09-01 13:15:00+00:00,25.90331597881588 +2025-09-01 13:30:00+00:00,23.415347599264464 +2025-09-01 13:45:00+00:00,20.764113121882847 +2025-09-01 14:00:00+00:00,18.112248431556925 +2025-09-01 14:15:00+00:00,14.950252121187562 +2025-09-01 14:30:00+00:00,11.470291132915847 +2025-09-01 14:45:00+00:00,8.721880176882863 +2025-09-01 15:00:00+00:00,5.592645592551703 +2025-09-01 15:15:00+00:00,2.954865483896912 +2025-09-02 03:45:00+00:00,2.2812501303590906 +2025-09-02 04:00:00+00:00,5.4505983218898715 +2025-09-02 04:15:00+00:00,6.388694107225474 +2025-09-02 04:30:00+00:00,17.419465952384588 +2025-09-02 04:45:00+00:00,19.364747297321397 +2025-09-02 05:00:00+00:00,7.001424412670516 +2025-09-02 05:15:00+00:00,22.842779162948723 +2025-09-02 05:30:00+00:00,24.226962314883895 +2025-09-02 05:45:00+00:00,17.600681093405445 +2025-09-02 06:00:00+00:00,11.604817896433145 +2025-09-02 06:15:00+00:00,26.884710679596314 +2025-09-02 06:30:00+00:00,24.15544893493692 +2025-09-02 06:45:00+00:00,27.723455156790767 +2025-09-02 07:00:00+00:00,27.195478929566676 +2025-09-02 07:15:00+00:00,28.590870775273608 +2025-09-02 07:30:00+00:00,30.147159280625683 +2025-09-02 07:45:00+00:00,31.085021361815972 +2025-09-02 08:00:00+00:00,31.588981505148865 +2025-09-02 08:15:00+00:00,30.209132793622402 +2025-09-02 08:30:00+00:00,30.89152492036755 +2025-09-02 08:45:00+00:00,31.632120107822313 +2025-09-02 09:00:00+00:00,32.37692140654548 +2025-09-02 09:15:00+00:00,33.851566901473255 +2025-09-02 09:30:00+00:00,34.66999994711932 +2025-09-02 09:45:00+00:00,33.475094237144816 +2025-09-02 10:00:00+00:00,34.63932010498703 +2025-09-02 10:15:00+00:00,35.39840108345249 +2025-09-02 10:30:00+00:00,34.807787499851756 +2025-09-02 10:45:00+00:00,34.8718977760807 +2025-09-02 11:00:00+00:00,34.62536625498169 +2025-09-02 11:15:00+00:00,33.682241813488666 +2025-09-02 11:30:00+00:00,32.70593369921933 +2025-09-02 11:45:00+00:00,32.37710528313445 +2025-09-02 12:00:00+00:00,31.8590272553632 +2025-09-02 12:15:00+00:00,31.422609804028948 +2025-09-02 12:30:00+00:00,29.873676338164508 +2025-09-02 12:45:00+00:00,27.48360548938729 +2025-09-02 13:00:00+00:00,26.292656418164746 +2025-09-02 13:15:00+00:00,25.1658731915592 +2025-09-02 13:30:00+00:00,22.689584671878123 +2025-09-02 13:45:00+00:00,20.44815212133229 +2025-09-02 14:00:00+00:00,17.77424974274618 +2025-09-02 14:15:00+00:00,14.747098708174779 +2025-09-02 14:30:00+00:00,11.868395527620082 +2025-09-02 14:45:00+00:00,8.696953083281963 +2025-09-02 15:00:00+00:00,5.695248976946457 +2025-09-02 15:15:00+00:00,2.959023125226115 +2025-09-03 03:45:00+00:00,3.017247143497933 +2025-09-03 04:00:00+00:00,5.842451538852862 +2025-09-03 04:15:00+00:00,10.44896332028196 +2025-09-03 04:30:00+00:00,9.364279937726252 +2025-09-03 04:45:00+00:00,15.451558771421473 +2025-09-03 05:00:00+00:00,18.844442447357636 +2025-09-03 05:15:00+00:00,20.483305485382235 +2025-09-03 05:30:00+00:00,11.300981105295344 +2025-09-03 05:45:00+00:00,27.11949106714634 +2025-09-03 06:00:00+00:00,28.049175957630307 +2025-09-03 06:15:00+00:00,24.7456128831942 +2025-09-03 06:30:00+00:00,27.017359972820415 +2025-09-03 06:45:00+00:00,26.507649902294926 +2025-09-03 07:00:00+00:00,27.13018620603231 +2025-09-03 07:15:00+00:00,27.876328947575793 +2025-09-03 07:30:00+00:00,27.75568755533462 +2025-09-03 07:45:00+00:00,28.099486322263143 +2025-09-03 08:00:00+00:00,29.568420071083743 +2025-09-03 08:15:00+00:00,29.39747054739907 +2025-09-03 08:30:00+00:00,30.379497025903632 +2025-09-03 08:45:00+00:00,31.100006723441044 +2025-09-03 09:00:00+00:00,31.82488867060288 +2025-09-03 09:15:00+00:00,32.910820599449046 +2025-09-03 09:30:00+00:00,34.45210865608806 +2025-09-03 09:45:00+00:00,34.01616619549577 +2025-09-03 10:00:00+00:00,33.87984728625403 +2025-09-03 10:15:00+00:00,34.96324474646598 +2025-09-03 10:30:00+00:00,34.92411542113612 +2025-09-03 10:45:00+00:00,36.86386330063973 +2025-09-03 11:00:00+00:00,35.63525357262 +2025-09-03 11:15:00+00:00,35.439556912807035 +2025-09-03 11:30:00+00:00,18.079578650727896 +2025-09-03 11:45:00+00:00,34.17093580700037 +2025-09-03 12:00:00+00:00,32.890213003633086 +2025-09-03 12:15:00+00:00,31.40671436484334 +2025-09-03 12:30:00+00:00,30.822644669675764 +2025-09-03 12:45:00+00:00,29.393103195180686 +2025-09-03 13:00:00+00:00,27.223083556274396 +2025-09-03 13:15:00+00:00,25.23215961621118 +2025-09-03 13:30:00+00:00,22.34438092988004 +2025-09-03 13:45:00+00:00,19.757508029975423 +2025-09-03 14:00:00+00:00,16.68280793608064 +2025-09-03 14:15:00+00:00,14.054221611533025 +2025-09-03 14:30:00+00:00,10.423234307159536 +2025-09-03 14:45:00+00:00,7.910820640105026 +2025-09-03 15:00:00+00:00,5.119548836275117 +2025-09-03 15:15:00+00:00,2.4226853910987174 +2025-09-04 03:45:00+00:00,4.003171271478143 +2025-09-04 04:00:00+00:00,6.857667691747781 +2025-09-04 04:15:00+00:00,9.970372534528881 +2025-09-04 04:30:00+00:00,13.322835793194358 +2025-09-04 04:45:00+00:00,16.06572124505046 +2025-09-04 05:00:00+00:00,18.462342660040072 +2025-09-04 05:15:00+00:00,20.31652163128706 +2025-09-04 05:30:00+00:00,22.177667564471033 +2025-09-04 05:45:00+00:00,23.375349298933003 +2025-09-04 06:00:00+00:00,24.695283718655922 +2025-09-04 06:15:00+00:00,26.797552159588697 +2025-09-04 06:30:00+00:00,27.002426755027745 +2025-09-04 06:45:00+00:00,27.39881275027534 +2025-09-04 07:00:00+00:00,28.64165360402909 +2025-09-04 07:15:00+00:00,28.617076251517492 +2025-09-04 07:30:00+00:00,30.776933643894676 +2025-09-04 07:45:00+00:00,31.31388690497405 +2025-09-04 08:00:00+00:00,30.405022792911204 +2025-09-04 08:15:00+00:00,30.958281661089 +2025-09-04 08:30:00+00:00,32.198700565852505 +2025-09-04 08:45:00+00:00,33.12958654937741 +2025-09-04 09:00:00+00:00,33.95288504383546 +2025-09-04 09:15:00+00:00,34.784816221110034 +2025-09-04 09:30:00+00:00,34.39778456585055 +2025-09-04 09:45:00+00:00,35.4819684459679 +2025-09-04 10:00:00+00:00,35.396038181999046 +2025-09-04 10:15:00+00:00,35.204781918398226 +2025-09-04 10:30:00+00:00,18.14205336342235 +2025-09-04 10:45:00+00:00,36.44143335256696 +2025-09-04 11:00:00+00:00,34.345390926182716 +2025-09-04 11:15:00+00:00,34.33099182337105 +2025-09-04 11:30:00+00:00,33.5513104239648 +2025-09-04 11:45:00+00:00,33.08980426106264 +2025-09-04 12:00:00+00:00,32.08385724331398 +2025-09-04 12:15:00+00:00,31.785666769725083 +2025-09-04 12:30:00+00:00,30.375984125369612 +2025-09-04 12:45:00+00:00,28.92635067089209 +2025-09-04 13:00:00+00:00,27.18055412029257 +2025-09-04 13:15:00+00:00,25.22635452833663 +2025-09-04 13:30:00+00:00,22.774547345641942 +2025-09-04 13:45:00+00:00,20.169273899962576 +2025-09-04 14:00:00+00:00,17.15069830258719 +2025-09-04 14:15:00+00:00,14.178807767415481 +2025-09-04 14:30:00+00:00,11.005710017615446 +2025-09-04 14:45:00+00:00,7.344238519851984 +2025-09-04 15:00:00+00:00,4.669266139713742 +2025-09-04 15:15:00+00:00,2.2191370890551467 +2025-09-05 03:45:00+00:00,4.079268131750811 +2025-09-05 04:00:00+00:00,7.005275953377049 +2025-09-05 04:15:00+00:00,10.198142910604732 +2025-09-05 04:30:00+00:00,13.070530858428482 +2025-09-05 04:45:00+00:00,15.594089657048926 +2025-09-05 05:00:00+00:00,18.19520965031692 +2025-09-05 05:15:00+00:00,20.24098288604918 +2025-09-05 05:30:00+00:00,21.483540899714566 +2025-09-05 05:45:00+00:00,23.173546516505308 +2025-09-05 06:00:00+00:00,24.63852802119327 +2025-09-05 06:15:00+00:00,26.34570942745541 +2025-09-05 06:30:00+00:00,27.624151148667814 +2025-09-05 06:45:00+00:00,28.886544713511604 +2025-09-05 07:00:00+00:00,28.075261531919065 +2025-09-05 07:15:00+00:00,29.908782528888775 +2025-09-05 07:30:00+00:00,31.208825781915408 +2025-09-05 07:45:00+00:00,31.323198008732522 +2025-09-05 08:00:00+00:00,33.2008034951232 +2025-09-05 08:15:00+00:00,34.27357855973347 +2025-09-05 08:30:00+00:00,35.56823514354026 +2025-09-05 08:45:00+00:00,36.949104590321134 +2025-09-05 09:00:00+00:00,36.644718315785 +2025-09-05 09:15:00+00:00,36.336433039424406 +2025-09-05 09:30:00+00:00,36.80789846078206 +2025-09-05 09:45:00+00:00,37.97013516915984 +2025-09-05 10:00:00+00:00,17.74808511677797 +2025-09-05 10:15:00+00:00,18.224207186317656 +2025-09-05 10:30:00+00:00,16.439168037189802 +2025-09-05 10:45:00+00:00,16.866111578125473 +2025-09-05 11:00:00+00:00,16.52667757321646 +2025-09-05 11:15:00+00:00,16.219380628265142 +2025-09-05 11:30:00+00:00,17.532428752527807 +2025-09-05 11:45:00+00:00,17.23541308209391 +2025-09-05 12:00:00+00:00,16.91829683892062 +2025-09-05 12:15:00+00:00,17.033887671271213 +2025-09-05 12:30:00+00:00,16.620907942384395 +2025-09-05 12:45:00+00:00,17.0424143364746 +2025-09-05 13:00:00+00:00,16.762823273968337 +2025-09-05 13:15:00+00:00,24.540036540520614 +2025-09-05 13:30:00+00:00,22.072646212451122 +2025-09-05 13:45:00+00:00,19.332492530116607 +2025-09-05 14:00:00+00:00,15.67503388621948 +2025-09-05 14:15:00+00:00,12.4585185516301 +2025-09-05 14:30:00+00:00,9.469503537143847 +2025-09-05 14:45:00+00:00,6.404204858383572 +2025-09-05 15:00:00+00:00,3.9642797484322223 +2025-09-05 15:15:00+00:00,1.8171452686954317 +2025-09-06 04:00:00+00:00,2.7670253156321984 +2025-09-06 04:15:00+00:00,3.7543805090480884 +2025-09-06 04:30:00+00:00,5.684756173702292 +2025-09-06 04:45:00+00:00,8.202707994512526 +2025-09-06 05:00:00+00:00,12.440109472622526 +2025-09-06 05:15:00+00:00,11.862367970159655 +2025-09-06 05:30:00+00:00,22.88182794892333 +2025-09-06 05:45:00+00:00,23.67929222574758 +2025-09-06 06:00:00+00:00,24.00017689465983 +2025-09-06 06:15:00+00:00,25.308633751841285 +2025-09-06 06:30:00+00:00,26.82401652497625 +2025-09-06 06:45:00+00:00,27.172572991054267 +2025-09-06 07:00:00+00:00,27.63120136737459 +2025-09-06 07:15:00+00:00,29.586893676431657 +2025-09-06 07:30:00+00:00,30.546388132764733 +2025-09-06 07:45:00+00:00,31.652255162697656 +2025-09-06 08:00:00+00:00,33.37069155773698 +2025-09-06 08:15:00+00:00,33.9782310976725 +2025-09-06 08:30:00+00:00,34.52188239126515 +2025-09-06 08:45:00+00:00,33.5765101988913 +2025-09-06 09:00:00+00:00,34.06051848681989 +2025-09-06 09:15:00+00:00,34.54149913879546 +2025-09-06 09:30:00+00:00,35.32807219145101 +2025-09-06 09:45:00+00:00,35.745820436321075 +2025-09-06 10:00:00+00:00,35.36891731803852 +2025-09-06 10:15:00+00:00,36.90702966232806 +2025-09-06 10:30:00+00:00,18.28183600775116 +2025-09-06 10:45:00+00:00,17.893684937658097 +2025-09-06 11:00:00+00:00,36.56265296101757 +2025-09-06 11:15:00+00:00,35.83211030827877 +2025-09-06 11:30:00+00:00,34.67569392437347 +2025-09-06 11:45:00+00:00,33.90882945788499 +2025-09-06 12:00:00+00:00,32.295591689466676 +2025-09-06 12:15:00+00:00,31.239989268877373 +2025-09-06 12:30:00+00:00,29.995872623382645 +2025-09-06 12:45:00+00:00,27.997123465996108 +2025-09-06 13:00:00+00:00,26.157811521396834 +2025-09-06 13:15:00+00:00,23.553648205897524 +2025-09-06 13:30:00+00:00,21.06487797195966 +2025-09-06 13:45:00+00:00,17.895493314827235 +2025-09-06 14:00:00+00:00,15.434274335333082 +2025-09-06 14:15:00+00:00,12.904095041385963 +2025-09-06 14:30:00+00:00,10.102242286314038 +2025-09-06 14:45:00+00:00,6.981801142937224 +2025-09-06 15:00:00+00:00,4.236451550894362 +2025-09-06 15:15:00+00:00,1.9185867228022644 +2025-09-07 03:45:00+00:00,4.708847655153962 +2025-09-07 04:00:00+00:00,6.431505750608404 +2025-09-07 04:15:00+00:00,9.393886811894033 +2025-09-07 04:30:00+00:00,12.42909043897468 +2025-09-07 04:45:00+00:00,15.736935019244104 +2025-09-07 05:00:00+00:00,17.73231790901551 +2025-09-07 05:15:00+00:00,14.820153984707495 +2025-09-07 05:30:00+00:00,23.31415380968175 +2025-09-07 05:45:00+00:00,25.137942384423457 +2025-09-07 06:00:00+00:00,23.912109287204327 +2025-09-07 06:15:00+00:00,25.777033116262714 +2025-09-07 06:30:00+00:00,28.116265399014978 +2025-09-07 06:45:00+00:00,22.955297332797258 +2025-09-07 07:00:00+00:00,28.54047061162238 +2025-09-07 07:15:00+00:00,29.124742212500774 +2025-09-07 07:30:00+00:00,15.940792394568055 +2025-09-07 07:45:00+00:00,31.529792146158115 +2025-09-07 08:00:00+00:00,21.162643965304504 +2025-09-07 08:15:00+00:00,21.37279854251566 +2025-09-07 08:30:00+00:00,29.076367263981698 +2025-09-07 08:45:00+00:00,33.87426766548585 +2025-09-07 09:00:00+00:00,33.24356759532664 +2025-09-07 09:15:00+00:00,34.81544888915743 +2025-09-07 09:30:00+00:00,36.850679541325384 +2025-09-07 09:45:00+00:00,35.65247438177221 +2025-09-07 10:00:00+00:00,36.08058364568984 +2025-09-07 10:15:00+00:00,36.03863605259741 +2025-09-07 10:30:00+00:00,35.94389457303706 +2025-09-07 10:45:00+00:00,35.9187989870259 +2025-09-07 11:00:00+00:00,34.511478650991904 +2025-09-07 11:15:00+00:00,34.79648879334728 +2025-09-07 11:30:00+00:00,33.94172756138756 +2025-09-07 11:45:00+00:00,32.62817235417628 +2025-09-07 12:00:00+00:00,31.483971069124376 +2025-09-07 12:15:00+00:00,30.75494802372174 +2025-09-07 12:30:00+00:00,29.423161149421617 +2025-09-07 12:45:00+00:00,27.51768793391886 +2025-09-07 13:00:00+00:00,25.536133081683204 +2025-09-07 13:15:00+00:00,23.067995625676495 +2025-09-07 13:30:00+00:00,20.605851315214924 +2025-09-07 13:45:00+00:00,18.044422324285428 +2025-09-07 14:00:00+00:00,14.993284802145213 +2025-09-07 14:15:00+00:00,13.042713894854579 +2025-09-07 14:30:00+00:00,10.973933692509432 +2025-09-07 14:45:00+00:00,8.792726018192177 +2025-09-07 15:00:00+00:00,5.820107229851562 +2025-09-07 15:15:00+00:00,3.1695808519459128 +2025-09-07 18:15:00+00:00,2.236142715178998 +2025-09-07 18:30:00+00:00,3.270582743159078 +2025-09-07 18:45:00+00:00,4.282806047010736 +2025-09-07 19:00:00+00:00,5.271067397249821 +2025-09-07 19:15:00+00:00,6.233507426625923 +2025-09-07 19:30:00+00:00,7.16816590429084 +2025-09-07 19:45:00+00:00,8.073003616974093 +2025-09-07 20:00:00+00:00,8.945934428249538 +2025-09-07 20:15:00+00:00,9.788318393118276 +2025-09-07 20:30:00+00:00,10.628237896447754 +2025-09-07 20:45:00+00:00,11.437295004380776 +2025-09-07 21:00:00+00:00,12.213953284992758 +2025-09-07 21:15:00+00:00,12.95692895563011 +2025-09-07 21:30:00+00:00,13.665261210174515 +2025-09-07 21:45:00+00:00,14.338370631612761 +2025-09-07 22:00:00+00:00,14.976098335167842 +2025-09-07 22:15:00+00:00,15.57872044866209 +2025-09-07 22:30:00+00:00,16.146935761991458 +2025-09-07 22:45:00+00:00,16.681828147170094 +2025-09-07 23:00:00+00:00,17.18480874078889 +2025-09-07 23:15:00+00:00,17.657545106470412 +2025-09-07 23:30:00+00:00,18.101885280791635 +2025-09-07 23:45:00+00:00,18.51978386038627 +2025-09-08 00:00:00+00:00,18.913235572177882 +2025-09-08 00:15:00+00:00,19.284219667467706 +2025-09-08 00:30:00+00:00,19.63465649497432 +2025-09-08 00:45:00+00:00,19.966376046707264 +2025-09-08 01:00:00+00:00,20.281097242541435 +2025-09-08 01:15:00+00:00,20.580416187237404 +2025-09-08 01:30:00+00:00,20.865801484447406 +2025-09-08 01:45:00+00:00,21.13859479481032 +2025-09-08 02:00:00+00:00,21.40001506468772 +2025-09-08 02:15:00+00:00,21.651165143640714 +2025-09-08 02:30:00+00:00,21.893039798227488 +2025-09-08 02:45:00+00:00,22.12653438770056 +2025-09-08 03:00:00+00:00,22.352453681574893 +2025-09-08 03:15:00+00:00,22.571520468319893 +2025-09-08 03:30:00+00:00,22.784383732751234 +2025-09-08 03:45:00+00:00,22.991626273591706 +2025-09-08 04:00:00+00:00,23.193771699095073 +2025-09-08 04:15:00+00:00,23.391290783979795 +2025-09-08 04:30:00+00:00,23.58460720060527 +2025-09-08 04:45:00+00:00,23.774102655681762 +2025-09-08 05:00:00+00:00,23.960121474176184 +2025-09-08 05:15:00+00:00,24.142974676973168 +2025-09-08 05:30:00+00:00,24.32294360010115 +2025-09-08 05:45:00+00:00,24.500283102261168 +2025-09-08 06:00:00+00:00,24.67522440491212 +2025-09-08 06:15:00+00:00,24.847977605916398 +2025-09-08 06:30:00+00:00,25.01873390414846 +2025-09-08 06:45:00+00:00,25.18766756880435 +2025-09-08 07:00:00+00:00,27.46729483616366 +2025-09-08 07:15:00+00:00,28.159682587151394 +2025-09-08 07:30:00+00:00,28.673670171812997 +2025-09-08 07:45:00+00:00,31.45100786817608 +2025-09-08 08:00:00+00:00,32.21557561894348 +2025-09-08 08:15:00+00:00,32.47392276039928 +2025-09-08 08:30:00+00:00,28.363751319998354 +2025-09-08 08:45:00+00:00,35.32068462092205 +2025-09-08 09:00:00+00:00,34.48276836140397 +2025-09-08 09:15:00+00:00,19.07837185217214 +2025-09-08 09:30:00+00:00,32.64365383371872 +2025-09-08 09:45:00+00:00,34.76835147110199 +2025-09-08 10:00:00+00:00,36.22138154708903 +2025-09-08 10:15:00+00:00,35.8788776666813 +2025-09-08 10:30:00+00:00,35.863924868586835 +2025-09-08 10:45:00+00:00,34.000348190640544 +2025-09-08 11:00:00+00:00,33.91865497929489 +2025-09-08 11:15:00+00:00,32.70801466884387 +2025-09-08 11:30:00+00:00,32.53744968608869 +2025-09-08 11:45:00+00:00,32.227550111611734 +2025-09-08 12:00:00+00:00,30.65638600319302 +2025-09-08 12:15:00+00:00,30.928586832773338 +2025-09-08 12:30:00+00:00,12.245611964341034 +2025-09-08 12:45:00+00:00,26.480327834949264 +2025-09-08 13:00:00+00:00,25.652074771522546 +2025-09-08 13:15:00+00:00,24.776291164845645 +2025-09-08 13:30:00+00:00,22.42565600673533 +2025-09-08 13:45:00+00:00,7.386522578739753 +2025-09-08 14:00:00+00:00,18.22197447365708 +2025-09-08 14:15:00+00:00,12.71677501565175 +2025-09-08 14:30:00+00:00,10.989068662527824 +2025-09-08 14:45:00+00:00,6.6472775329983955 +2025-09-08 15:00:00+00:00,2.2053419348738075 +2025-09-08 15:15:00+00:00,2.4004242427827047 +2025-09-09 03:45:00+00:00,2.9233546620874593 +2025-09-09 04:00:00+00:00,5.661006715552977 +2025-09-09 04:15:00+00:00,8.637307992581281 +2025-09-09 04:30:00+00:00,11.695682560962357 +2025-09-09 04:45:00+00:00,14.385619547419472 +2025-09-09 05:00:00+00:00,16.721326098838173 +2025-09-09 05:15:00+00:00,18.94574266756971 +2025-09-09 05:30:00+00:00,20.772889212560198 +2025-09-09 05:45:00+00:00,21.1946669590524 +2025-09-09 06:00:00+00:00,22.830260876164765 +2025-09-09 06:15:00+00:00,23.203258855985652 +2025-09-09 06:30:00+00:00,23.370866697097565 +2025-09-09 06:45:00+00:00,25.29770797303798 +2025-09-09 07:00:00+00:00,25.487502320179875 +2025-09-09 07:15:00+00:00,26.294388269378366 +2025-09-09 07:30:00+00:00,28.08042838229407 +2025-09-09 07:45:00+00:00,27.796206146767457 +2025-09-09 08:00:00+00:00,28.64679355786738 +2025-09-09 08:15:00+00:00,29.313629023104916 +2025-09-09 08:30:00+00:00,28.280918042363552 +2025-09-09 08:45:00+00:00,31.063178213283983 +2025-09-09 09:00:00+00:00,31.2958898964423 +2025-09-09 09:15:00+00:00,31.899751348921406 +2025-09-09 09:30:00+00:00,36.112443778906304 +2025-09-09 09:45:00+00:00,32.83007892637797 +2025-09-09 10:00:00+00:00,33.929760006800045 +2025-09-09 10:15:00+00:00,33.720605464258874 +2025-09-09 10:30:00+00:00,35.74989500601464 +2025-09-09 10:45:00+00:00,35.34952930858856 +2025-09-09 11:00:00+00:00,33.97176878883802 +2025-09-09 11:15:00+00:00,33.15308064212282 +2025-09-09 11:30:00+00:00,31.97742580133892 +2025-09-09 11:45:00+00:00,30.99583963139596 +2025-09-09 12:00:00+00:00,31.258194355368893 +2025-09-09 12:15:00+00:00,29.556136243891054 +2025-09-09 12:30:00+00:00,28.036626591728158 +2025-09-09 12:45:00+00:00,27.012965085192825 +2025-09-09 13:00:00+00:00,25.893940594969852 +2025-09-09 13:15:00+00:00,7.600741134880247 +2025-09-09 13:30:00+00:00,21.49920416440584 +2025-09-09 13:45:00+00:00,19.730347813538717 +2025-09-09 14:00:00+00:00,17.3638338360768 +2025-09-09 14:15:00+00:00,13.93918626211529 +2025-09-09 14:30:00+00:00,10.757421233559825 +2025-09-09 14:45:00+00:00,7.534114132939761 +2025-09-09 15:00:00+00:00,4.815258657981495 +2025-09-09 15:15:00+00:00,1.3827018494546115 +2025-09-10 04:00:00+00:00,5.813021926216882 +2025-09-10 04:15:00+00:00,7.816380415370225 +2025-09-10 04:30:00+00:00,8.85126386689129 +2025-09-10 04:45:00+00:00,14.813017627817231 +2025-09-10 05:00:00+00:00,16.7486707988708 +2025-09-10 05:15:00+00:00,18.36005527952921 +2025-09-10 05:30:00+00:00,19.94063218088754 +2025-09-10 05:45:00+00:00,21.378825386651524 +2025-09-10 06:00:00+00:00,22.09640772733716 +2025-09-10 06:15:00+00:00,23.706603779453534 +2025-09-10 06:30:00+00:00,25.47941463244427 +2025-09-10 06:45:00+00:00,25.028962942474624 +2025-09-10 07:00:00+00:00,26.444682371586833 +2025-09-10 07:15:00+00:00,28.629550834730814 +2025-09-10 07:30:00+00:00,27.71513195637979 +2025-09-10 07:45:00+00:00,29.737203795021582 +2025-09-10 08:00:00+00:00,28.561815509162535 +2025-09-10 08:15:00+00:00,29.382662986648793 +2025-09-10 08:30:00+00:00,31.828509578235924 +2025-09-10 08:45:00+00:00,30.978548836495115 +2025-09-10 09:00:00+00:00,30.570331832632643 +2025-09-10 09:15:00+00:00,33.40406535335863 +2025-09-10 09:30:00+00:00,34.107369753411525 +2025-09-10 09:45:00+00:00,34.70990238210303 +2025-09-10 10:00:00+00:00,33.66085498880517 +2025-09-10 10:15:00+00:00,34.794439951986305 +2025-09-10 10:30:00+00:00,33.91924564578576 +2025-09-10 10:45:00+00:00,34.99969952130694 +2025-09-10 11:00:00+00:00,33.19091237554035 +2025-09-10 11:15:00+00:00,32.272365564156395 +2025-09-10 11:30:00+00:00,31.709480337102406 +2025-09-10 11:45:00+00:00,31.36098429281659 +2025-09-10 12:00:00+00:00,30.11152722044989 +2025-09-10 12:15:00+00:00,29.7560927225168 +2025-09-10 12:30:00+00:00,28.332533681332976 +2025-09-10 12:45:00+00:00,25.896026021444015 +2025-09-10 13:00:00+00:00,24.47920733070318 +2025-09-10 13:15:00+00:00,22.831035276644712 +2025-09-10 13:30:00+00:00,21.28226599743178 +2025-09-10 13:45:00+00:00,19.106796095034824 +2025-09-10 14:00:00+00:00,16.46614042780362 +2025-09-10 14:15:00+00:00,13.60558198768124 +2025-09-10 14:30:00+00:00,10.70906036252779 +2025-09-10 14:45:00+00:00,7.700204984108082 +2025-09-10 15:00:00+00:00,4.730541709414285 +2025-09-10 15:15:00+00:00,2.3210595887536227 +2025-09-11 03:45:00+00:00,3.0491604110260657 +2025-09-11 04:00:00+00:00,5.925097555837355 +2025-09-11 04:15:00+00:00,8.869761784889517 +2025-09-11 04:30:00+00:00,12.03279919042205 +2025-09-11 04:45:00+00:00,14.952212212072691 +2025-09-11 05:00:00+00:00,17.214171974441843 +2025-09-11 05:15:00+00:00,18.676650263450757 +2025-09-11 05:30:00+00:00,19.818355623174625 +2025-09-11 05:45:00+00:00,21.015520508228857 +2025-09-11 06:00:00+00:00,22.093497813168465 +2025-09-11 06:15:00+00:00,22.639358739562237 +2025-09-11 06:30:00+00:00,25.005065200594995 +2025-09-11 06:45:00+00:00,25.390197541319605 +2025-09-11 07:00:00+00:00,26.545518146500033 +2025-09-11 07:15:00+00:00,26.881032069759982 +2025-09-11 07:30:00+00:00,28.08473967261198 +2025-09-11 07:45:00+00:00,29.392121073766067 +2025-09-11 08:00:00+00:00,31.0848459629038 +2025-09-11 08:15:00+00:00,29.406054917302953 +2025-09-11 08:30:00+00:00,31.056709060669025 +2025-09-11 08:45:00+00:00,31.73104466120419 +2025-09-11 09:00:00+00:00,33.22468646752636 +2025-09-11 09:15:00+00:00,36.30632689500793 +2025-09-11 09:30:00+00:00,36.022951580705005 +2025-09-11 09:45:00+00:00,36.07354930513331 +2025-09-11 10:00:00+00:00,37.09842082598114 +2025-09-11 10:15:00+00:00,36.48588058367173 +2025-09-11 10:30:00+00:00,36.367624422952666 +2025-09-11 10:45:00+00:00,17.686546481649238 +2025-09-11 11:00:00+00:00,17.998315513222334 +2025-09-11 11:15:00+00:00,34.6221839288093 +2025-09-11 11:30:00+00:00,34.34634817545154 +2025-09-11 11:45:00+00:00,34.01780057335743 +2025-09-11 12:00:00+00:00,32.97495502952973 +2025-09-11 12:15:00+00:00,31.837450999030775 +2025-09-11 12:30:00+00:00,30.247402088984067 +2025-09-11 12:45:00+00:00,28.256545505218362 +2025-09-11 13:00:00+00:00,26.00271014024395 +2025-09-11 13:15:00+00:00,23.755777201410055 +2025-09-11 13:30:00+00:00,21.257712204820642 +2025-09-11 13:45:00+00:00,18.613642145652193 +2025-09-11 14:00:00+00:00,15.611326668322732 +2025-09-11 14:15:00+00:00,12.788185759856745 +2025-09-11 14:30:00+00:00,9.656897668897487 +2025-09-11 14:45:00+00:00,6.640023442661286 +2025-09-11 15:00:00+00:00,3.8477425992806293 +2025-09-11 15:15:00+00:00,1.666909771214087 +2025-09-12 03:45:00+00:00,2.150727822461941 +2025-09-12 04:00:00+00:00,3.5542945119873 +2025-09-12 04:15:00+00:00,8.519267193952619 +2025-09-12 04:30:00+00:00,16.82288547211713 +2025-09-12 04:45:00+00:00,10.561803649819577 +2025-09-12 05:00:00+00:00,17.76517408320814 +2025-09-12 05:15:00+00:00,19.28432382075016 +2025-09-12 05:30:00+00:00,20.93442246952929 +2025-09-12 05:45:00+00:00,21.929156970695548 +2025-09-12 06:00:00+00:00,22.671654281730397 +2025-09-12 06:15:00+00:00,24.543923126721253 +2025-09-12 06:30:00+00:00,25.373215348065735 +2025-09-12 06:45:00+00:00,26.451700214103024 +2025-09-12 07:00:00+00:00,27.812791708850114 +2025-09-12 07:15:00+00:00,28.518007079259498 +2025-09-12 07:30:00+00:00,29.644611551481052 +2025-09-12 07:45:00+00:00,31.284696567183556 +2025-09-12 08:00:00+00:00,32.811091814929014 +2025-09-12 08:15:00+00:00,32.24231675225143 +2025-09-12 08:30:00+00:00,31.30493407646794 +2025-09-12 08:45:00+00:00,33.069268066516194 +2025-09-12 09:00:00+00:00,32.928431063228615 +2025-09-12 09:15:00+00:00,35.415412864524555 +2025-09-12 09:30:00+00:00,36.25060553156123 +2025-09-12 09:45:00+00:00,37.291756141647014 +2025-09-12 10:00:00+00:00,37.5164421948945 +2025-09-12 10:15:00+00:00,36.55178834312503 +2025-09-12 10:30:00+00:00,36.10961791087558 +2025-09-12 10:45:00+00:00,36.18082073852448 +2025-09-12 11:00:00+00:00,18.16795529340221 +2025-09-12 11:15:00+00:00,35.81712428648945 +2025-09-12 11:30:00+00:00,35.382883947155946 +2025-09-12 11:45:00+00:00,33.74251251917875 +2025-09-12 12:00:00+00:00,32.825256533390245 +2025-09-12 12:15:00+00:00,31.219130446943193 +2025-09-12 12:30:00+00:00,30.139747571438807 +2025-09-12 12:45:00+00:00,28.436899786618692 +2025-09-12 13:00:00+00:00,25.96110968290045 +2025-09-12 13:15:00+00:00,23.651950746407167 +2025-09-12 13:30:00+00:00,21.139003148361468 +2025-09-12 13:45:00+00:00,18.422707210197693 +2025-09-12 14:00:00+00:00,15.531579641009694 +2025-09-12 14:15:00+00:00,12.552437812467325 +2025-09-12 14:30:00+00:00,9.433372237256815 +2025-09-12 14:45:00+00:00,6.352423770751714 +2025-09-12 15:00:00+00:00,3.680405638623988 +2025-09-12 15:15:00+00:00,1.46074194194602 +2025-09-13 04:00:00+00:00,3.9533013615070667 +2025-09-13 04:15:00+00:00,6.599773308902872 +2025-09-13 04:30:00+00:00,9.00273923816542 +2025-09-13 04:45:00+00:00,14.03803294265111 +2025-09-13 05:00:00+00:00,16.4642166804794 +2025-09-13 05:15:00+00:00,18.2328899116704 +2025-09-13 05:30:00+00:00,20.42503077042836 +2025-09-13 05:45:00+00:00,21.667273259875085 +2025-09-13 06:00:00+00:00,23.306390694542397 +2025-09-13 06:15:00+00:00,24.67093902009547 +2025-09-13 06:30:00+00:00,25.49606450184406 +2025-09-13 06:45:00+00:00,26.716205250246784 +2025-09-13 07:00:00+00:00,28.164725550015405 +2025-09-13 07:15:00+00:00,28.94363467750553 +2025-09-13 07:30:00+00:00,29.8609077518717 +2025-09-13 07:45:00+00:00,31.8953155236893 +2025-09-13 08:00:00+00:00,32.66409015673535 +2025-09-13 08:15:00+00:00,33.28696398165192 +2025-09-13 08:30:00+00:00,32.78308560254706 +2025-09-13 08:45:00+00:00,35.22384004946249 +2025-09-13 09:00:00+00:00,35.95979680614782 +2025-09-13 09:15:00+00:00,37.32884108910767 +2025-09-13 09:30:00+00:00,37.203445636918666 +2025-09-13 09:45:00+00:00,17.979744898291397 +2025-09-13 10:00:00+00:00,37.00352755132462 +2025-09-13 10:15:00+00:00,17.782124855386968 +2025-09-13 10:30:00+00:00,16.8577971078646 +2025-09-13 10:45:00+00:00,17.062794284540388 +2025-09-13 11:00:00+00:00,17.982517743395356 +2025-09-13 11:15:00+00:00,17.801881433762606 +2025-09-13 11:30:00+00:00,17.609067900516006 +2025-09-13 11:45:00+00:00,16.653540881873795 +2025-09-13 12:00:00+00:00,33.11531710533397 +2025-09-13 12:15:00+00:00,17.08075219487631 +2025-09-13 12:30:00+00:00,16.605158654926136 +2025-09-13 12:45:00+00:00,28.060778950013482 +2025-09-13 13:00:00+00:00,25.615029905014342 +2025-09-13 13:15:00+00:00,23.16488581288034 +2025-09-13 13:30:00+00:00,20.57998186819831 +2025-09-13 13:45:00+00:00,17.954836348541487 +2025-09-13 14:00:00+00:00,14.550582370337969 +2025-09-13 14:15:00+00:00,11.881044478785565 +2025-09-13 14:30:00+00:00,8.965059465734614 +2025-09-13 14:45:00+00:00,6.045578038974018 +2025-09-13 15:00:00+00:00,3.3646626104853707 +2025-09-13 15:15:00+00:00,1.1936896281603422 +2025-09-14 03:45:00+00:00,3.459307337433062 +2025-09-14 04:00:00+00:00,6.222858313171756 +2025-09-14 04:15:00+00:00,9.080374717746416 +2025-09-14 04:30:00+00:00,11.892237017792157 +2025-09-14 04:45:00+00:00,14.441680905555485 +2025-09-14 05:00:00+00:00,16.538770151421268 +2025-09-14 05:15:00+00:00,18.078688937517583 +2025-09-14 05:30:00+00:00,20.37552066791182 +2025-09-14 05:45:00+00:00,22.108764167206743 +2025-09-14 06:00:00+00:00,23.57183405095007 +2025-09-14 06:15:00+00:00,24.826377662152762 +2025-09-14 06:30:00+00:00,26.378483884096774 +2025-09-14 06:45:00+00:00,27.873747648474534 +2025-09-14 07:00:00+00:00,28.36794560321099 +2025-09-14 07:15:00+00:00,29.423442233200475 +2025-09-14 07:30:00+00:00,30.532998864938545 +2025-09-14 07:45:00+00:00,31.45496276069457 +2025-09-14 08:00:00+00:00,32.86154210985791 +2025-09-14 08:15:00+00:00,32.11267464857734 +2025-09-14 08:30:00+00:00,33.76698038735689 +2025-09-14 08:45:00+00:00,33.87108668352677 +2025-09-14 09:00:00+00:00,35.317217763151206 +2025-09-14 09:15:00+00:00,37.60525129107481 +2025-09-14 09:30:00+00:00,36.825622832982816 +2025-09-14 09:45:00+00:00,36.30587499794151 +2025-09-14 10:00:00+00:00,18.276041514429572 +2025-09-14 10:15:00+00:00,36.68729236894341 +2025-09-14 10:30:00+00:00,36.63870716954113 +2025-09-14 10:45:00+00:00,18.200001434279436 +2025-09-14 11:00:00+00:00,35.09185697109051 +2025-09-14 11:15:00+00:00,34.75137183835683 +2025-09-14 11:30:00+00:00,34.384612206097 +2025-09-14 11:45:00+00:00,33.76234551538143 +2025-09-14 12:00:00+00:00,32.00181700334723 +2025-09-14 12:15:00+00:00,30.768046520589262 +2025-09-14 12:30:00+00:00,29.19116393845574 +2025-09-14 12:45:00+00:00,27.209752178706868 +2025-09-14 13:00:00+00:00,25.341825426009365 +2025-09-14 13:15:00+00:00,22.48176549050149 +2025-09-14 13:30:00+00:00,19.921048604576285 +2025-09-14 13:45:00+00:00,17.516012580175726 +2025-09-14 14:00:00+00:00,14.173000026713268 +2025-09-14 14:15:00+00:00,11.491075879394606 +2025-09-14 14:30:00+00:00,8.530254808134565 +2025-09-14 14:45:00+00:00,5.847683008084854 +2025-09-14 15:00:00+00:00,3.353617646264033 +2025-09-14 15:15:00+00:00,1.362616384743599 +2025-09-15 03:45:00+00:00,1.913294293472259 +2025-09-15 04:00:00+00:00,2.9024131940286724 +2025-09-15 04:15:00+00:00,5.7867248432208696 +2025-09-15 04:30:00+00:00,6.74750164668929 +2025-09-15 04:45:00+00:00,8.684426601144171 +2025-09-15 05:00:00+00:00,9.474676422707994 +2025-09-15 05:15:00+00:00,13.961550267178406 +2025-09-15 05:30:00+00:00,20.531520852767525 +2025-09-15 05:45:00+00:00,21.556631852327243 +2025-09-15 06:00:00+00:00,18.84341574926935 +2025-09-15 06:15:00+00:00,24.360779036668998 +2025-09-15 06:30:00+00:00,24.98472955221932 +2025-09-15 06:45:00+00:00,26.387783924145385 +2025-09-15 07:00:00+00:00,26.357015639739835 +2025-09-15 07:15:00+00:00,27.15604254182979 +2025-09-15 07:30:00+00:00,29.262182983872073 +2025-09-15 07:45:00+00:00,30.57248279857482 +2025-09-15 08:00:00+00:00,30.483341894765935 +2025-09-15 08:15:00+00:00,31.621216117212573 +2025-09-15 08:30:00+00:00,31.864404017129687 +2025-09-15 08:45:00+00:00,32.1050129085346 +2025-09-15 09:00:00+00:00,33.11314115310488 +2025-09-15 09:15:00+00:00,36.19800049142995 +2025-09-15 09:30:00+00:00,35.499914097256806 +2025-09-15 09:45:00+00:00,35.94327501566513 +2025-09-15 10:00:00+00:00,36.756690900426904 +2025-09-15 10:15:00+00:00,18.176567163326844 +2025-09-15 10:30:00+00:00,35.405549691052066 +2025-09-15 10:45:00+00:00,35.275505332082545 +2025-09-15 11:00:00+00:00,34.10024370549962 +2025-09-15 11:15:00+00:00,33.601564701408925 +2025-09-15 11:30:00+00:00,33.03541609490534 +2025-09-15 11:45:00+00:00,32.46167908352184 +2025-09-15 12:00:00+00:00,31.927455325057643 +2025-09-15 12:15:00+00:00,30.49458334914394 +2025-09-15 12:30:00+00:00,29.188125792329966 +2025-09-15 12:45:00+00:00,26.41603952173929 +2025-09-15 13:00:00+00:00,24.125281887334197 +2025-09-15 13:15:00+00:00,21.61462198056807 +2025-09-15 13:30:00+00:00,19.01457853101601 +2025-09-15 13:45:00+00:00,16.494005577439438 +2025-09-15 14:00:00+00:00,13.78242223597717 +2025-09-15 14:15:00+00:00,11.040502109438307 +2025-09-15 14:30:00+00:00,8.060680775581945 +2025-09-15 14:45:00+00:00,5.432934740530561 +2025-09-15 15:00:00+00:00,3.182614818083054 +2025-09-15 15:15:00+00:00,1.3000585767326744 +2025-09-16 04:00:00+00:00,3.9680149329431904 +2025-09-16 04:15:00+00:00,6.934684950133947 +2025-09-16 04:30:00+00:00,10.376914261233406 +2025-09-16 04:45:00+00:00,13.236800632474866 +2025-09-16 05:00:00+00:00,9.856116786370116 +2025-09-16 05:15:00+00:00,19.99255517402104 +2025-09-16 05:30:00+00:00,10.279620959432679 +2025-09-16 05:45:00+00:00,21.791617773438816 +2025-09-16 06:00:00+00:00,23.704179623894376 +2025-09-16 06:15:00+00:00,17.135339242201923 +2025-09-16 06:30:00+00:00,24.965152417857 +2025-09-16 06:45:00+00:00,24.840904323415362 +2025-09-16 07:00:00+00:00,27.68353461987554 +2025-09-16 07:15:00+00:00,27.09006498225978 +2025-09-16 07:30:00+00:00,27.397530996237716 +2025-09-16 07:45:00+00:00,29.48915089094768 +2025-09-16 08:00:00+00:00,31.02244127248063 +2025-09-16 08:15:00+00:00,30.807944365917706 +2025-09-16 08:30:00+00:00,31.517914044125753 +2025-09-16 08:45:00+00:00,31.63693777796798 +2025-09-16 09:00:00+00:00,32.58328436534927 +2025-09-16 09:15:00+00:00,33.83354284372365 +2025-09-16 09:30:00+00:00,32.71748744160823 +2025-09-16 09:45:00+00:00,36.415824629732626 +2025-09-16 10:00:00+00:00,33.68680491148288 +2025-09-16 10:15:00+00:00,34.81977525391918 +2025-09-16 10:30:00+00:00,34.43975916241601 +2025-09-16 10:45:00+00:00,34.918715340280116 +2025-09-16 11:00:00+00:00,33.90864809070675 +2025-09-16 11:15:00+00:00,33.20315100428853 +2025-09-16 11:30:00+00:00,32.88027933480233 +2025-09-16 11:45:00+00:00,32.52076565579634 +2025-09-16 12:00:00+00:00,31.35249231238898 +2025-09-16 12:15:00+00:00,30.330048058129083 +2025-09-16 12:30:00+00:00,28.293164328808423 +2025-09-16 12:45:00+00:00,26.791398428636498 +2025-09-16 13:00:00+00:00,24.263533072525025 +2025-09-16 13:15:00+00:00,22.263267272850445 +2025-09-16 13:30:00+00:00,19.478498959083343 +2025-09-16 13:45:00+00:00,17.116264275378388 +2025-09-16 14:00:00+00:00,14.02756684640957 +2025-09-16 14:15:00+00:00,11.372587444940208 +2025-09-16 14:30:00+00:00,8.303855815948957 +2025-09-16 14:45:00+00:00,5.689516578381696 +2025-09-16 15:00:00+00:00,3.1580891668452264 +2025-09-17 03:45:00+00:00,2.2830036730590964 +2025-09-17 04:00:00+00:00,4.9949196954892106 +2025-09-17 04:15:00+00:00,7.91079249391565 +2025-09-17 04:30:00+00:00,11.15148873339031 +2025-09-17 04:45:00+00:00,14.176185691854277 +2025-09-17 05:00:00+00:00,16.592467651980844 +2025-09-17 05:15:00+00:00,18.98671858805205 +2025-09-17 05:30:00+00:00,19.904584640502847 +2025-09-17 05:45:00+00:00,21.962587863958483 +2025-09-17 06:00:00+00:00,23.157124339928487 +2025-09-17 06:15:00+00:00,24.49894682194232 +2025-09-17 06:30:00+00:00,26.76476476915181 +2025-09-17 06:45:00+00:00,27.449452710889073 +2025-09-17 07:00:00+00:00,28.4169742537521 +2025-09-17 07:15:00+00:00,29.458311127815595 +2025-09-17 07:30:00+00:00,30.596176704722982 +2025-09-17 07:45:00+00:00,32.25909072263122 +2025-09-17 08:00:00+00:00,31.72388702102814 +2025-09-17 08:15:00+00:00,32.753453921784015 +2025-09-17 08:30:00+00:00,35.155432157204416 +2025-09-17 08:45:00+00:00,33.95988320013176 +2025-09-17 09:00:00+00:00,31.92124720543881 +2025-09-17 09:15:00+00:00,35.24440358339061 +2025-09-17 09:30:00+00:00,36.83464067175797 +2025-09-17 09:45:00+00:00,17.683730396848745 +2025-09-17 10:00:00+00:00,17.90585989913679 +2025-09-17 10:15:00+00:00,18.18141118950936 +2025-09-17 10:30:00+00:00,18.236720775624285 +2025-09-17 10:45:00+00:00,35.758171794095844 +2025-09-17 11:00:00+00:00,18.120044204702886 +2025-09-17 11:15:00+00:00,33.97727488321412 +2025-09-17 11:30:00+00:00,33.74275608744068 +2025-09-17 11:45:00+00:00,33.44989332323537 +2025-09-17 12:00:00+00:00,31.151213933222586 +2025-09-17 12:15:00+00:00,30.628808905983153 +2025-09-17 12:30:00+00:00,29.236286906330896 +2025-09-17 12:45:00+00:00,27.362376244657288 +2025-09-17 13:00:00+00:00,25.392181431830732 +2025-09-17 13:15:00+00:00,23.1602925337081 +2025-09-17 13:30:00+00:00,20.382495944888646 +2025-09-17 13:45:00+00:00,17.425067896161256 +2025-09-17 14:00:00+00:00,14.523753469788938 +2025-09-17 14:15:00+00:00,11.534346672461963 +2025-09-17 14:30:00+00:00,8.069005830114367 +2025-09-17 14:45:00+00:00,5.244763046317189 +2025-09-17 15:00:00+00:00,2.9143221820788012 +2025-09-18 03:45:00+00:00,2.497884947052774 +2025-09-18 04:00:00+00:00,5.161591740358126 +2025-09-18 04:15:00+00:00,8.138650992853423 +2025-09-18 04:30:00+00:00,11.074266937712459 +2025-09-18 04:45:00+00:00,13.94081585201504 +2025-09-18 05:00:00+00:00,16.443698092200066 +2025-09-18 05:15:00+00:00,18.430784737435044 +2025-09-18 05:30:00+00:00,20.1311100119429 +2025-09-18 05:45:00+00:00,22.077460617052026 +2025-09-18 06:00:00+00:00,22.74176924573417 +2025-09-18 06:15:00+00:00,23.61381762772175 +2025-09-18 06:30:00+00:00,24.010664828059948 +2025-09-18 06:45:00+00:00,24.808865662308715 +2025-09-18 07:00:00+00:00,26.76448709657531 +2025-09-18 07:15:00+00:00,27.888246268555083 +2025-09-18 07:30:00+00:00,28.50193387002751 +2025-09-18 07:45:00+00:00,30.402180268853257 +2025-09-18 08:00:00+00:00,30.849831073094254 +2025-09-18 08:15:00+00:00,30.11819167284526 +2025-09-18 08:30:00+00:00,33.196540964016165 +2025-09-18 08:45:00+00:00,32.30035477951238 +2025-09-18 09:00:00+00:00,35.41257632352264 +2025-09-18 09:15:00+00:00,34.43974067801618 +2025-09-18 09:30:00+00:00,35.89564487718812 +2025-09-18 09:45:00+00:00,18.010524084724114 +2025-09-18 10:00:00+00:00,36.6759044061227 +2025-09-18 10:15:00+00:00,17.660803689054333 +2025-09-18 10:30:00+00:00,18.23516650846274 +2025-09-18 10:45:00+00:00,17.966079095224405 +2025-09-18 11:00:00+00:00,35.079471994841235 +2025-09-18 11:15:00+00:00,17.774347257297336 +2025-09-18 11:30:00+00:00,33.4038338376184 +2025-09-18 11:45:00+00:00,32.62933825051241 +2025-09-18 12:00:00+00:00,31.84272265845296 +2025-09-18 12:15:00+00:00,30.430842857889196 +2025-09-18 12:30:00+00:00,28.92341259321529 +2025-09-18 12:45:00+00:00,27.06518886599591 +2025-09-18 13:00:00+00:00,24.896571566004972 +2025-09-18 13:15:00+00:00,22.330310868135115 +2025-09-18 13:30:00+00:00,19.577673357244585 +2025-09-18 13:45:00+00:00,16.686261164813143 +2025-09-18 14:00:00+00:00,13.826883653872612 +2025-09-18 14:15:00+00:00,10.735555870881923 +2025-09-18 14:30:00+00:00,7.6149698567602835 +2025-09-18 14:45:00+00:00,4.870305705918772 +2025-09-18 15:00:00+00:00,2.6177259886106583 +2025-09-19 04:00:00+00:00,3.4086407380640886 +2025-09-19 04:15:00+00:00,4.805314815500534 +2025-09-19 04:30:00+00:00,6.777418252548395 +2025-09-19 04:45:00+00:00,15.974255599935416 +2025-09-19 05:00:00+00:00,16.860300441603528 +2025-09-19 05:15:00+00:00,18.96164129356341 +2025-09-19 05:30:00+00:00,20.595827044670422 +2025-09-19 05:45:00+00:00,16.34569724063443 +2025-09-19 06:00:00+00:00,16.48638370381624 +2025-09-19 06:15:00+00:00,23.93349321608311 +2025-09-19 06:30:00+00:00,28.208548610617665 +2025-09-19 06:45:00+00:00,28.80393123018337 +2025-09-19 07:00:00+00:00,27.16114292423118 +2025-09-19 07:15:00+00:00,27.899633136471405 +2025-09-19 07:30:00+00:00,28.279659940699748 +2025-09-19 07:45:00+00:00,30.634606909550143 +2025-09-19 08:00:00+00:00,31.99348603700735 +2025-09-19 08:15:00+00:00,29.15087257355466 +2025-09-19 08:30:00+00:00,31.301983897492118 +2025-09-19 08:45:00+00:00,32.78931244092409 +2025-09-19 09:00:00+00:00,34.63551035728146 +2025-09-19 09:15:00+00:00,34.17430649521964 +2025-09-19 09:30:00+00:00,35.494497723197895 +2025-09-19 09:45:00+00:00,35.83940086658758 +2025-09-19 10:00:00+00:00,35.62979873294734 +2025-09-19 10:15:00+00:00,35.10693513039734 +2025-09-19 10:30:00+00:00,35.09430022959603 +2025-09-19 10:45:00+00:00,18.162295415745234 +2025-09-19 11:00:00+00:00,34.25448976940817 +2025-09-19 11:15:00+00:00,33.78021734030003 +2025-09-19 11:30:00+00:00,33.10726149886233 +2025-09-19 11:45:00+00:00,31.466982791768306 +2025-09-19 12:00:00+00:00,30.467723465920884 +2025-09-19 12:15:00+00:00,29.46428811917125 +2025-09-19 12:30:00+00:00,28.535013390216285 +2025-09-19 12:45:00+00:00,25.13366484956082 +2025-09-19 13:00:00+00:00,23.653891342160932 +2025-09-19 13:15:00+00:00,23.286908527982114 +2025-09-19 13:30:00+00:00,20.91926402264314 +2025-09-19 13:45:00+00:00,6.648538882434682 +2025-09-19 14:00:00+00:00,13.422550718644336 +2025-09-19 14:15:00+00:00,10.742342705049714 +2025-09-19 14:30:00+00:00,7.189637282766822 +2025-09-19 14:45:00+00:00,4.9853284731225616 +2025-09-19 15:00:00+00:00,2.6904176132961846 +2025-09-20 03:45:00+00:00,2.372869044616932 +2025-09-20 04:00:00+00:00,4.950875706851211 +2025-09-20 04:15:00+00:00,8.006113285409167 +2025-09-20 04:30:00+00:00,10.959584470321879 +2025-09-20 04:45:00+00:00,13.379090749162396 +2025-09-20 05:00:00+00:00,15.836468165387508 +2025-09-20 05:15:00+00:00,17.738015086621804 +2025-09-20 05:30:00+00:00,19.00441842056418 +2025-09-20 05:45:00+00:00,19.73401346641513 +2025-09-20 06:00:00+00:00,20.196896166034858 +2025-09-20 06:15:00+00:00,23.163441535111208 +2025-09-20 06:30:00+00:00,24.158106483464366 +2025-09-20 06:45:00+00:00,25.97716380325688 +2025-09-20 07:00:00+00:00,26.163589368747928 +2025-09-20 07:15:00+00:00,27.956737510781846 +2025-09-20 07:30:00+00:00,28.61544982968825 +2025-09-20 07:45:00+00:00,30.479635623668557 +2025-09-20 08:00:00+00:00,30.83606236656989 +2025-09-20 08:15:00+00:00,31.068745326798332 +2025-09-20 08:30:00+00:00,31.142539216411425 +2025-09-20 08:45:00+00:00,31.880887457879375 +2025-09-20 09:00:00+00:00,36.1636128415594 +2025-09-20 09:15:00+00:00,18.096313708164995 +2025-09-20 09:30:00+00:00,36.12240957720652 +2025-09-20 09:45:00+00:00,17.960381065056275 +2025-09-20 10:00:00+00:00,17.303491178220913 +2025-09-20 10:15:00+00:00,15.96869158914215 +2025-09-20 10:30:00+00:00,16.672021600775476 +2025-09-20 10:45:00+00:00,16.29914186082927 +2025-09-20 11:00:00+00:00,17.572303825511867 +2025-09-20 11:15:00+00:00,17.876911044467512 +2025-09-20 11:30:00+00:00,17.43445529424735 +2025-09-20 11:45:00+00:00,32.31172171813619 +2025-09-20 12:00:00+00:00,30.586698159271585 +2025-09-20 12:15:00+00:00,29.68102217798796 +2025-09-20 12:30:00+00:00,28.743908539903455 +2025-09-20 12:45:00+00:00,26.905684647747755 +2025-09-20 13:00:00+00:00,24.578167570716648 +2025-09-20 13:15:00+00:00,21.914744840133974 +2025-09-20 13:30:00+00:00,19.51275059446712 +2025-09-20 13:45:00+00:00,16.838000585072074 +2025-09-20 14:00:00+00:00,13.12542905821999 +2025-09-20 14:15:00+00:00,10.91041810949126 +2025-09-20 14:30:00+00:00,7.908071043718292 +2025-09-20 14:45:00+00:00,5.231922011800588 +2025-09-20 15:00:00+00:00,2.690625516329769 +2025-09-21 04:00:00+00:00,4.137408959323405 +2025-09-21 04:15:00+00:00,6.957130295747376 +2025-09-21 04:30:00+00:00,9.87334292974909 +2025-09-21 04:45:00+00:00,12.91134617513359 +2025-09-21 05:00:00+00:00,15.45017050601808 +2025-09-21 05:15:00+00:00,17.535064990307895 +2025-09-21 05:30:00+00:00,19.294974011676686 +2025-09-21 05:45:00+00:00,18.668675769248786 +2025-09-21 06:00:00+00:00,21.947875090268724 +2025-09-21 06:15:00+00:00,23.878272279470355 +2025-09-21 06:30:00+00:00,26.810670402273555 +2025-09-21 06:45:00+00:00,26.292972199576344 +2025-09-21 07:00:00+00:00,27.632835049396352 +2025-09-21 07:15:00+00:00,29.12759115365633 +2025-09-21 07:30:00+00:00,30.597090008173446 +2025-09-21 07:45:00+00:00,31.074787059514584 +2025-09-21 08:00:00+00:00,32.53759217550908 +2025-09-21 08:15:00+00:00,32.25534075384915 +2025-09-21 08:30:00+00:00,34.35801020856082 +2025-09-21 08:45:00+00:00,35.13247973016264 +2025-09-21 09:00:00+00:00,36.75472561139572 +2025-09-21 09:15:00+00:00,17.903891807786252 +2025-09-21 09:30:00+00:00,17.27872246729889 +2025-09-21 09:45:00+00:00,18.175620131751888 +2025-09-21 10:00:00+00:00,15.674842745041884 +2025-09-21 10:15:00+00:00,16.688219416563207 +2025-09-21 10:30:00+00:00,15.823819356400461 +2025-09-21 10:45:00+00:00,15.642684631839298 +2025-09-21 11:00:00+00:00,18.003391576695698 +2025-09-21 11:15:00+00:00,16.061526015532767 +2025-09-21 11:30:00+00:00,16.94309566342381 +2025-09-21 11:45:00+00:00,31.78146497348088 +2025-09-21 12:00:00+00:00,17.361703902707735 +2025-09-21 12:15:00+00:00,16.919927236944588 +2025-09-21 12:30:00+00:00,16.576693515023546 +2025-09-21 12:45:00+00:00,16.199420485528535 +2025-09-21 13:00:00+00:00,24.039570328032585 +2025-09-21 13:15:00+00:00,21.48692922619493 +2025-09-21 13:30:00+00:00,18.67708574918539 +2025-09-21 13:45:00+00:00,15.77382034761163 +2025-09-21 14:00:00+00:00,13.157749748096746 +2025-09-21 14:15:00+00:00,10.26807703236029 +2025-09-21 14:30:00+00:00,7.487995183263125 +2025-09-21 14:45:00+00:00,4.664218175793112 +2025-09-21 15:00:00+00:00,2.1533266832866502 +2025-09-22 04:00:00+00:00,3.454719510377788 +2025-09-22 04:15:00+00:00,6.284225634841437 +2025-09-22 04:30:00+00:00,9.11909845110179 +2025-09-22 04:45:00+00:00,12.696264141212822 +2025-09-22 05:00:00+00:00,13.946966657850268 +2025-09-22 05:15:00+00:00,11.191644784124156 +2025-09-22 05:30:00+00:00,21.37484441944921 +2025-09-22 05:45:00+00:00,13.268251010022713 +2025-09-22 06:00:00+00:00,15.706746195242053 +2025-09-22 06:15:00+00:00,16.810569362206326 +2025-09-22 06:30:00+00:00,24.180821693268406 +2025-09-22 06:45:00+00:00,20.578076418669518 +2025-09-22 07:00:00+00:00,26.85507438846372 +2025-09-22 07:15:00+00:00,27.50846215781827 +2025-09-22 07:30:00+00:00,29.050255052016137 +2025-09-22 07:45:00+00:00,29.95580351084067 +2025-09-22 08:00:00+00:00,30.53688563047232 +2025-09-22 08:15:00+00:00,31.098217070074416 +2025-09-22 08:30:00+00:00,32.12244992447371 +2025-09-22 08:45:00+00:00,33.6097298146316 +2025-09-22 09:00:00+00:00,33.488370908449 +2025-09-22 09:15:00+00:00,34.357413718726406 +2025-09-22 09:30:00+00:00,35.64456039720382 +2025-09-22 09:45:00+00:00,35.27115643639646 +2025-09-22 10:00:00+00:00,35.27241436423448 +2025-09-22 10:15:00+00:00,18.14321587321718 +2025-09-22 10:30:00+00:00,35.61510279577481 +2025-09-22 10:45:00+00:00,33.98097296690574 +2025-09-22 11:00:00+00:00,34.20787381526325 +2025-09-22 11:15:00+00:00,33.60285918269614 +2025-09-22 11:30:00+00:00,32.77598009972352 +2025-09-22 11:45:00+00:00,30.73254850517464 +2025-09-22 12:00:00+00:00,29.58523614081577 +2025-09-22 12:15:00+00:00,28.05914057569227 +2025-09-22 12:30:00+00:00,26.15680338699614 +2025-09-22 12:45:00+00:00,25.102535916800537 +2025-09-22 13:00:00+00:00,24.013851112253572 +2025-09-22 13:15:00+00:00,21.61405837364427 +2025-09-22 13:30:00+00:00,18.743855808309988 +2025-09-22 13:45:00+00:00,16.171536428330164 +2025-09-22 14:00:00+00:00,13.196803619835618 +2025-09-22 14:15:00+00:00,10.380866631877527 +2025-09-22 14:30:00+00:00,7.20342192729993 +2025-09-22 14:45:00+00:00,4.381525769309238 +2025-09-22 15:00:00+00:00,1.9059801334738433 +2025-09-23 04:00:00+00:00,3.4412440147094645 +2025-09-23 04:15:00+00:00,6.62847182175627 +2025-09-23 04:30:00+00:00,9.320598896006391 +2025-09-23 04:45:00+00:00,12.384915879124708 +2025-09-23 05:00:00+00:00,15.223948063522457 +2025-09-23 05:15:00+00:00,17.66431766017184 +2025-09-23 05:30:00+00:00,15.510299548966035 +2025-09-23 05:45:00+00:00,12.584534336645696 +2025-09-23 06:00:00+00:00,24.03890335083363 +2025-09-23 06:15:00+00:00,24.00540042156406 +2025-09-23 06:30:00+00:00,24.444801643043903 +2025-09-23 06:45:00+00:00,26.042484661086 +2025-09-23 07:00:00+00:00,26.879412427102768 +2025-09-23 07:15:00+00:00,27.979068761009163 +2025-09-23 07:30:00+00:00,28.083198598805975 +2025-09-23 07:45:00+00:00,28.641624255481155 +2025-09-23 08:00:00+00:00,28.819899316213604 +2025-09-23 08:15:00+00:00,30.04851633969115 +2025-09-23 08:30:00+00:00,30.864090130703747 +2025-09-23 08:45:00+00:00,32.072000015510966 +2025-09-23 09:00:00+00:00,33.7859111018908 +2025-09-23 09:15:00+00:00,33.41072845479202 +2025-09-23 09:30:00+00:00,36.15211472492336 +2025-09-23 09:45:00+00:00,35.11621988376045 +2025-09-23 10:00:00+00:00,35.38408996827888 +2025-09-23 10:15:00+00:00,35.397713782480075 +2025-09-23 10:30:00+00:00,35.390837611901695 +2025-09-23 10:45:00+00:00,33.993171027640855 +2025-09-23 11:00:00+00:00,34.529593422417044 +2025-09-23 11:15:00+00:00,32.96887802309241 +2025-09-23 11:30:00+00:00,31.363666310184016 +2025-09-23 11:45:00+00:00,30.573097880938583 +2025-09-23 12:00:00+00:00,29.384571603241074 +2025-09-23 12:15:00+00:00,27.59089708553346 +2025-09-23 12:30:00+00:00,25.86845728501593 +2025-09-23 12:45:00+00:00,24.868919255799888 +2025-09-23 13:00:00+00:00,23.812715809983388 +2025-09-23 13:15:00+00:00,21.341862291753582 +2025-09-23 13:30:00+00:00,18.518690692045595 +2025-09-23 13:45:00+00:00,15.915922450036431 +2025-09-23 14:00:00+00:00,12.869681434424331 +2025-09-23 14:15:00+00:00,9.72986519279659 +2025-09-23 14:30:00+00:00,6.848903106500161 +2025-09-23 14:45:00+00:00,4.260488630525748 +2025-09-23 15:00:00+00:00,2.21753710797077 +2025-09-24 04:00:00+00:00,1.8393731803987252 +2025-09-24 04:15:00+00:00,2.0652147404217396 +2025-09-24 04:30:00+00:00,6.706553635297795 +2025-09-24 04:45:00+00:00,6.2840263607272755 +2025-09-24 05:00:00+00:00,9.957655653224894 +2025-09-24 05:15:00+00:00,11.582469879731086 +2025-09-24 05:30:00+00:00,20.005708275475822 +2025-09-24 05:45:00+00:00,19.557360307226087 +2025-09-24 06:00:00+00:00,24.292449893688595 +2025-09-24 06:15:00+00:00,23.7793438117343 +2025-09-24 06:30:00+00:00,23.95250122971271 +2025-09-24 06:45:00+00:00,25.62445494645942 +2025-09-24 07:00:00+00:00,16.46912877952454 +2025-09-24 07:15:00+00:00,28.536524662574635 +2025-09-24 07:30:00+00:00,27.486573475819057 +2025-09-24 07:45:00+00:00,28.449954055586286 +2025-09-24 08:00:00+00:00,28.620137712951397 +2025-09-24 08:15:00+00:00,30.343932856564376 +2025-09-24 08:30:00+00:00,30.94928582382163 +2025-09-24 08:45:00+00:00,30.25577684288502 +2025-09-24 09:00:00+00:00,33.095801993520936 +2025-09-24 09:15:00+00:00,35.218708910912234 +2025-09-24 09:30:00+00:00,34.27335179923758 +2025-09-24 09:45:00+00:00,33.81482538630612 +2025-09-24 10:00:00+00:00,35.90712890932236 +2025-09-24 10:15:00+00:00,34.60616620343365 +2025-09-24 10:30:00+00:00,34.98408855044575 +2025-09-24 10:45:00+00:00,32.71248541608221 +2025-09-24 11:00:00+00:00,30.951769795848833 +2025-09-24 11:15:00+00:00,14.675475865345595 +2025-09-24 11:30:00+00:00,18.887003809929713 +2025-09-24 11:45:00+00:00,32.22154711812425 +2025-09-24 12:00:00+00:00,16.091946588467533 +2025-09-24 12:15:00+00:00,12.117205429662707 +2025-09-24 12:30:00+00:00,15.579343239443304 +2025-09-24 12:45:00+00:00,24.55893655986685 +2025-09-24 13:00:00+00:00,23.531349222230137 +2025-09-24 13:15:00+00:00,22.408412360499295 +2025-09-24 13:30:00+00:00,18.778440283944793 +2025-09-24 13:45:00+00:00,3.6211069135910443 +2025-09-24 14:00:00+00:00,6.189278048871636 +2025-09-24 14:15:00+00:00,4.538989526332886 +2025-09-24 14:30:00+00:00,2.570759012597226 +2025-09-24 14:45:00+00:00,2.366739194825005 +2025-09-25 04:00:00+00:00,4.22101012549105 +2025-09-25 04:15:00+00:00,5.999671195190843 +2025-09-25 04:30:00+00:00,10.047978996439328 +2025-09-25 04:45:00+00:00,8.481399464805216 +2025-09-25 05:00:00+00:00,15.794468029113368 +2025-09-25 05:15:00+00:00,17.730645058939718 +2025-09-25 05:30:00+00:00,19.057956551105935 +2025-09-25 05:45:00+00:00,20.158439422308494 +2025-09-25 06:00:00+00:00,21.485174986042438 +2025-09-25 06:15:00+00:00,22.053567371361755 +2025-09-25 06:30:00+00:00,9.463712238346188 +2025-09-25 06:45:00+00:00,16.36921291800416 +2025-09-25 07:00:00+00:00,14.383340936086537 +2025-09-25 07:15:00+00:00,27.289471860122312 +2025-09-25 07:30:00+00:00,26.35529440793898 +2025-09-25 07:45:00+00:00,17.999208665394043 +2025-09-25 08:00:00+00:00,28.90107473362671 +2025-09-25 08:15:00+00:00,29.089695709353528 +2025-09-25 08:30:00+00:00,32.23877399668274 +2025-09-25 08:45:00+00:00,28.11173395691507 +2025-09-25 09:00:00+00:00,31.90763965738455 +2025-09-25 09:15:00+00:00,34.019701498325134 +2025-09-25 09:30:00+00:00,33.61707435803574 +2025-09-25 09:45:00+00:00,29.116826510789025 +2025-09-25 10:00:00+00:00,35.96602533313239 +2025-09-25 10:15:00+00:00,34.2647313560994 +2025-09-25 10:30:00+00:00,34.3712623096292 +2025-09-25 10:45:00+00:00,36.49534008262719 +2025-09-25 11:00:00+00:00,32.48478183693526 +2025-09-25 11:15:00+00:00,33.40796380921742 +2025-09-25 11:30:00+00:00,29.110983333896456 +2025-09-25 11:45:00+00:00,11.806548214884806 +2025-09-25 12:00:00+00:00,21.978585919742425 +2025-09-25 12:15:00+00:00,9.681087654323388 +2025-09-25 12:30:00+00:00,25.88469550531781 +2025-09-25 12:45:00+00:00,24.32350153188685 +2025-09-25 13:00:00+00:00,18.31938003664717 +2025-09-25 13:15:00+00:00,9.662224457694888 +2025-09-25 13:30:00+00:00,19.42410353848053 +2025-09-25 13:45:00+00:00,16.175277942990313 +2025-09-25 14:00:00+00:00,12.035438097498638 +2025-09-25 14:15:00+00:00,10.342974837513157 +2025-09-25 14:30:00+00:00,6.157176948621394 +2025-09-25 14:45:00+00:00,4.423433171881321 +2025-09-25 15:00:00+00:00,1.5383351346554184 +2025-09-26 04:00:00+00:00,3.666087777578418 +2025-09-26 04:15:00+00:00,6.44506327642779 +2025-09-26 04:30:00+00:00,9.258476068793914 +2025-09-26 04:45:00+00:00,12.26276078820613 +2025-09-26 05:00:00+00:00,14.915544510763416 +2025-09-26 05:15:00+00:00,17.29576782405763 +2025-09-26 05:30:00+00:00,19.406667135694917 +2025-09-26 05:45:00+00:00,21.076887439143896 +2025-09-26 06:00:00+00:00,21.910555793802565 +2025-09-26 06:15:00+00:00,22.40069254793875 +2025-09-26 06:30:00+00:00,24.666136669066674 +2025-09-26 06:45:00+00:00,24.5844164007488 +2025-09-26 07:00:00+00:00,25.941953939030647 +2025-09-26 07:15:00+00:00,25.350116798832527 +2025-09-26 07:30:00+00:00,27.176812194704347 +2025-09-26 07:45:00+00:00,27.099007722596234 +2025-09-26 08:00:00+00:00,27.314802454144168 +2025-09-26 08:15:00+00:00,29.245470643644452 +2025-09-26 08:30:00+00:00,30.40533846599685 +2025-09-26 08:45:00+00:00,29.991517332530325 +2025-09-26 09:00:00+00:00,32.377459933791194 +2025-09-26 09:15:00+00:00,33.312270177754186 +2025-09-26 09:30:00+00:00,33.58777137833939 +2025-09-26 09:45:00+00:00,35.0566254383976 +2025-09-26 10:00:00+00:00,32.434852100469406 +2025-09-26 10:15:00+00:00,32.15555691954814 +2025-09-26 10:30:00+00:00,33.7032370044184 +2025-09-26 10:45:00+00:00,33.3182643007528 +2025-09-26 11:00:00+00:00,32.42493347419488 +2025-09-26 11:15:00+00:00,31.709120394848462 +2025-09-26 11:30:00+00:00,30.16834839240863 +2025-09-26 11:45:00+00:00,29.02487129938046 +2025-09-26 12:00:00+00:00,27.89691769368674 +2025-09-26 12:15:00+00:00,26.61657615778008 +2025-09-26 12:30:00+00:00,24.73490893930932 +2025-09-26 12:45:00+00:00,23.054891665970562 +2025-09-26 13:00:00+00:00,19.523291534461695 +2025-09-26 13:15:00+00:00,18.633140931504382 +2025-09-26 13:30:00+00:00,17.719263878876042 +2025-09-26 13:45:00+00:00,15.224598750115339 +2025-09-26 14:00:00+00:00,11.741380976264947 +2025-09-26 14:15:00+00:00,9.164112914045067 +2025-09-26 14:30:00+00:00,6.458898025077296 +2025-09-26 14:45:00+00:00,3.7820744169441536 +2025-09-26 15:00:00+00:00,1.7583529169197167 +2025-09-27 04:00:00+00:00,1.8318473620013183 +2025-09-27 04:15:00+00:00,3.9174773386978723 +2025-09-27 04:30:00+00:00,8.018307891364003 +2025-09-27 04:45:00+00:00,6.936889741570322 +2025-09-27 05:00:00+00:00,13.637638129338075 +2025-09-27 05:15:00+00:00,16.84655377286949 +2025-09-27 05:30:00+00:00,19.08175784522496 +2025-09-27 05:45:00+00:00,20.28036550123062 +2025-09-27 06:00:00+00:00,21.254095322938802 +2025-09-27 06:15:00+00:00,22.84808926008536 +2025-09-27 06:30:00+00:00,23.74479851176099 +2025-09-27 06:45:00+00:00,24.629781950653733 +2025-09-27 07:00:00+00:00,25.336235062229658 +2025-09-27 07:15:00+00:00,26.6895769271684 +2025-09-27 07:30:00+00:00,27.41097372226811 +2025-09-27 07:45:00+00:00,27.801463327346074 +2025-09-27 08:00:00+00:00,29.083706123433704 +2025-09-27 08:15:00+00:00,28.589572765736943 +2025-09-27 08:30:00+00:00,30.621427574558474 +2025-09-27 08:45:00+00:00,30.87581175053245 +2025-09-27 09:00:00+00:00,32.13258482918437 +2025-09-27 09:15:00+00:00,34.531012222140156 +2025-09-27 09:30:00+00:00,34.30374244683509 +2025-09-27 09:45:00+00:00,34.85999875551959 +2025-09-27 10:00:00+00:00,36.22377796647844 +2025-09-27 10:15:00+00:00,35.22630597938098 +2025-09-27 10:30:00+00:00,35.56034584115946 +2025-09-27 10:45:00+00:00,34.69038346065688 +2025-09-27 11:00:00+00:00,34.60672821534876 +2025-09-27 11:15:00+00:00,33.17197858077284 +2025-09-27 11:30:00+00:00,31.58351411086978 +2025-09-27 11:45:00+00:00,30.667404632984063 +2025-09-27 12:00:00+00:00,29.38212286661683 +2025-09-27 12:15:00+00:00,27.274550961128917 +2025-09-27 12:30:00+00:00,25.431533249722584 +2025-09-27 12:45:00+00:00,23.37298959883406 +2025-09-27 13:00:00+00:00,20.968973800031932 +2025-09-27 13:15:00+00:00,19.72073006955629 +2025-09-27 13:30:00+00:00,18.427721591415043 +2025-09-27 13:45:00+00:00,14.908934412037413 +2025-09-27 14:00:00+00:00,11.652898842723443 +2025-09-27 14:15:00+00:00,8.732455394356759 +2025-09-27 14:30:00+00:00,5.910644641640599 +2025-09-27 14:45:00+00:00,3.407310053590814 +2025-09-27 15:00:00+00:00,1.4024525674237271 +2025-09-28 04:00:00+00:00,3.237644652892136 +2025-09-28 04:15:00+00:00,6.302055518088107 +2025-09-28 04:30:00+00:00,9.423958574604944 +2025-09-28 04:45:00+00:00,12.205451050028405 +2025-09-28 05:00:00+00:00,14.498513845534205 +2025-09-28 05:15:00+00:00,16.630877131689005 +2025-09-28 05:30:00+00:00,18.549270506667504 +2025-09-28 05:45:00+00:00,19.90006511596111 +2025-09-28 06:00:00+00:00,21.85804200954776 +2025-09-28 06:15:00+00:00,23.198991878080715 +2025-09-28 06:30:00+00:00,23.414742307733214 +2025-09-28 06:45:00+00:00,24.77698632487359 +2025-09-28 07:00:00+00:00,25.794561327241375 +2025-09-28 07:15:00+00:00,26.081297997001176 +2025-09-28 07:30:00+00:00,27.134010236802435 +2025-09-28 07:45:00+00:00,26.668874712722914 +2025-09-28 08:00:00+00:00,27.481845460594208 +2025-09-28 08:15:00+00:00,28.92545968732837 +2025-09-28 08:30:00+00:00,30.76483935147729 +2025-09-28 08:45:00+00:00,32.571316128336534 +2025-09-28 09:00:00+00:00,34.17210523192082 +2025-09-28 09:15:00+00:00,35.717294224678064 +2025-09-28 09:30:00+00:00,36.35856037714395 +2025-09-28 09:45:00+00:00,17.768922287570682 +2025-09-28 10:00:00+00:00,17.359089648782685 +2025-09-28 10:15:00+00:00,16.77941922190657 +2025-09-28 10:30:00+00:00,17.390072743788107 +2025-09-28 10:45:00+00:00,17.129368878209974 +2025-09-28 11:00:00+00:00,17.490232499614663 +2025-09-28 11:15:00+00:00,17.025131394474876 +2025-09-28 11:30:00+00:00,17.0704670829801 +2025-09-28 11:45:00+00:00,30.845964198735082 +2025-09-28 12:00:00+00:00,28.96590955985795 +2025-09-28 12:15:00+00:00,27.148556247937723 +2025-09-28 12:30:00+00:00,25.31141797107413 +2025-09-28 12:45:00+00:00,22.729332247073316 +2025-09-28 13:00:00+00:00,20.44262127918376 +2025-09-28 13:15:00+00:00,17.49310058724471 +2025-09-28 13:30:00+00:00,16.14333393934574 +2025-09-28 13:45:00+00:00,14.7458001812264 +2025-09-28 14:00:00+00:00,12.009719950099647 +2025-09-28 14:15:00+00:00,9.095781278325385 +2025-09-28 14:30:00+00:00,6.045801172566941 +2025-09-28 14:45:00+00:00,3.381399815769774 +2025-09-28 15:00:00+00:00,1.3386563115159635 +2025-09-29 04:15:00+00:00,2.358673910199572 +2025-09-29 04:30:00+00:00,3.125805003257926 +2025-09-29 04:45:00+00:00,4.777891783511903 +2025-09-29 05:00:00+00:00,6.608519283777946 +2025-09-29 05:15:00+00:00,5.445245457405873 +2025-09-29 05:30:00+00:00,6.951592327991642 +2025-09-29 05:45:00+00:00,11.766601886755637 +2025-09-29 06:00:00+00:00,14.51826518075864 +2025-09-29 06:15:00+00:00,21.785649231846367 +2025-09-29 06:30:00+00:00,23.116424355880966 +2025-09-29 06:45:00+00:00,24.764298488723394 +2025-09-29 07:00:00+00:00,25.62063726812918 +2025-09-29 07:15:00+00:00,26.880684597375627 +2025-09-29 07:30:00+00:00,27.155475915554977 +2025-09-29 07:45:00+00:00,28.343980484626467 +2025-09-29 08:00:00+00:00,28.934203896583114 +2025-09-29 08:15:00+00:00,30.64093544388262 +2025-09-29 08:30:00+00:00,30.31629772509873 +2025-09-29 08:45:00+00:00,32.7258755860141 +2025-09-29 09:00:00+00:00,34.48502098870992 +2025-09-29 09:15:00+00:00,35.13163752720489 +2025-09-29 09:30:00+00:00,17.229773149911537 +2025-09-29 09:45:00+00:00,35.75821284490379 +2025-09-29 10:00:00+00:00,35.69429318006884 +2025-09-29 10:15:00+00:00,17.444089856209057 +2025-09-29 10:30:00+00:00,16.06669614095263 +2025-09-29 10:45:00+00:00,17.534446104915993 +2025-09-29 11:00:00+00:00,17.713644482027895 +2025-09-29 11:15:00+00:00,32.91248528360562 +2025-09-29 11:30:00+00:00,31.476401575786085 +2025-09-29 11:45:00+00:00,29.977567154516603 +2025-09-29 12:00:00+00:00,28.329205491442288 +2025-09-29 12:15:00+00:00,26.805498663585208 +2025-09-29 12:30:00+00:00,25.15069999237276 +2025-09-29 12:45:00+00:00,22.79481365468712 +2025-09-29 13:00:00+00:00,20.441336849381532 +2025-09-29 13:15:00+00:00,17.817840070589135 +2025-09-29 13:30:00+00:00,15.023212149185078 +2025-09-29 13:45:00+00:00,13.692416501184809 +2025-09-29 14:00:00+00:00,12.309394745600127 +2025-09-29 14:15:00+00:00,8.995838759780332 +2025-09-29 14:30:00+00:00,6.202662126206554 +2025-09-29 14:45:00+00:00,3.524185047991357 +2025-09-29 15:00:00+00:00,1.4812438438187394 +2025-09-30 04:15:00+00:00,3.6632420983936975 +2025-09-30 04:30:00+00:00,4.880255258629613 +2025-09-30 04:45:00+00:00,8.028234874532442 +2025-09-30 05:00:00+00:00,10.437926563697394 +2025-09-30 05:15:00+00:00,19.75042247659852 +2025-09-30 05:30:00+00:00,15.869156137835773 +2025-09-30 05:45:00+00:00,24.038862554763902 +2025-09-30 06:00:00+00:00,18.190595522439523 +2025-09-30 06:15:00+00:00,20.071744804593546 +2025-09-30 06:30:00+00:00,23.70282496386178 +2025-09-30 06:45:00+00:00,22.34199841939201 +2025-09-30 07:00:00+00:00,25.407534541186124 +2025-09-30 07:15:00+00:00,25.767319437142824 +2025-09-30 07:30:00+00:00,28.149120468271548 +2025-09-30 07:45:00+00:00,28.032761126004758 +2025-09-30 08:00:00+00:00,27.5126955030713 +2025-09-30 08:15:00+00:00,27.23602988880078 +2025-09-30 08:30:00+00:00,30.09520411425042 +2025-09-30 08:45:00+00:00,30.500924630710323 +2025-09-30 09:00:00+00:00,31.685903519458833 +2025-09-30 09:15:00+00:00,33.937397744198236 +2025-09-30 09:30:00+00:00,35.22517866541415 +2025-09-30 09:45:00+00:00,34.82372992459769 +2025-09-30 10:00:00+00:00,35.60535681344332 +2025-09-30 10:15:00+00:00,32.332208097695585 +2025-09-30 10:30:00+00:00,34.26999001485147 +2025-09-30 10:45:00+00:00,33.63007666211829 +2025-09-30 11:00:00+00:00,35.26041648100067 +2025-09-30 11:15:00+00:00,33.000837724537625 +2025-09-30 11:30:00+00:00,8.806017683858572 +2025-09-30 11:45:00+00:00,29.967377143658872 +2025-09-30 12:00:00+00:00,28.03585865609653 +2025-09-30 12:15:00+00:00,27.045939699527082 +2025-09-30 12:30:00+00:00,24.890979767853107 +2025-09-30 12:45:00+00:00,22.943875907648764 +2025-09-30 13:00:00+00:00,21.669985401959934 +2025-09-30 13:15:00+00:00,18.57110534005596 +2025-09-30 13:30:00+00:00,16.303897332793163 +2025-09-30 13:45:00+00:00,14.569394898359956 +2025-09-30 14:00:00+00:00,12.721043345880258 +2025-09-30 14:15:00+00:00,9.65623987033578 +2025-09-30 14:30:00+00:00,6.355543531696133 +2025-09-30 14:45:00+00:00,3.503381266923452 +2025-09-30 15:00:00+00:00,1.4111311998572484 diff --git a/README.md b/README.md index 1160b0aa41215bc7fd44c875858c852209898bb0..0b4f4e66aed189b820abec7127048994b438105f 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,117 @@ ---- -title: SolarWine API -emoji: 🌿 -colorFrom: green -colorTo: yellow -sdk: docker -app_port: 7860 -private: true ---- - -# SolarWine API - -FastAPI backend for the SolarWine agrivoltaic vineyard control system. - -## Endpoints - -### Health & Monitoring -- `GET|HEAD /api/health` — system health (uptime, Redis, TB, IMS, Gemini status) -- `GET /api/health/data` — data freshness per source (age, ok/degraded) -- `GET /api/health/data-sources` — per-source green/yellow/red status with thresholds - -### Weather (IMS Station 43) -- `GET /api/weather/current` — latest weather readings + data age -- `GET /api/weather/history?start_date&end_date&format` — historical weather (hourly) -- `GET /api/weather/forecast` — weather forecast - -### Vine Sensors (ThingsBoard) -- `GET /api/sensors/snapshot` — latest readings (treatment vs reference) -- `GET /api/sensors/history?type&area&hours` — sensor time-series -- `GET /api/sensors/soil-moisture?hours` — soil moisture history -- `GET /api/sensors/rain?hours` — rainfall history - -### Energy -- `GET /api/energy/current` — current power output (kW) -- `GET /api/energy/daily/{date}` — daily production + hourly profile -- `GET /api/energy/history` — energy generation time-series -- `GET /api/energy/predict/{date}` — predicted daily generation - -### Photosynthesis -- `GET /api/photosynthesis/current?model` — current A rate (FvCB or ML) -- `GET /api/photosynthesis/forecast` — 24h predicted A profile - -### Control System -- `GET /api/control/status` — last control loop tick -- `GET /api/control/plan` — current day-ahead plan -- `GET /api/control/budget` — energy budget status -- `GET /api/control/trackers` — tracker angles and modes - -### Chatbot (Gemini AI) -- `POST /api/chatbot/message` — send message to vineyard advisor -- `POST /api/chatbot/feedback` — submit feedback on response -- `GET /api/chatbot/briefing` — current system status briefing - -### Biology -- `GET /api/biology/phenology` — current growth stage -- `GET /api/biology/rules` — all biology rules -- `GET /api/biology/rules/{name}` — single rule detail -- `GET /api/biology/chill-units?season_start` — accumulated chill units - -### Auth -- `POST /api/auth/login` — JWT token (guest mode when JWT_SECRET unset) - -### Events -- `GET /api/events/stream` — SSE stream for live frontend updates - -Interactive docs at `/docs`. - -## Environment Variables - -| Variable | Required | Description | -|----------|----------|-------------| -| `IMS_API_TOKEN` | Yes | IMS weather API token | -| `THINGSBOARD_HOST` | Yes | ThingsBoard server URL | -| `THINGSBOARD_USERNAME` | Yes | ThingsBoard login | -| `THINGSBOARD_PASSWORD` | Yes | ThingsBoard password | -| `GOOGLE_API_KEY` | No | Gemini AI for chatbot/advisor | -| `JWT_SECRET` | No | JWT signing key (guest mode if unset) | -| `ADMIN_PASSWORD` | No | Login password | -| `REDIS_URL` | No | Upstash Redis for shared cache | -| `SENTRY_DSN` | No | Sentry error tracking | -| `SMTP_HOST` | No | Email alerts (with ALERT_EMAIL_TO) | -| `ALERT_EMAIL_TO` | No | Alert recipient email(s) | +# SolarWine — Photosynthesis Prediction for Agrivoltaic Vineyards + +A two-stage pipeline that models grapevine photosynthesis under agrivoltaic panels (solar panels above vineyard rows) and predicts it from publicly available weather data. Built for the Sde Boker research site (Negev, Israel). + +## Status — May 2026 + +- **2026 sensor migration complete.** `DEVICE_REGISTRY` clean-replaced (19 Crop_2Soil with spectrometer + dual soil profile, 12 panel thermocouples, 4 trackers). `VineSnapshot` rewritten with NDVI / PRI / PSRI / SIPI / GCI / LCI / DUVI + dual-soil + position-keyed dicts. Treatment = rows 501/502/503/504/509; Reference = row 202. +- **Energy predictor refreshed.** New `scripts/refresh_energy_data.py` + `scripts/train_energy_predictor.py`. Hourly MAE 4.5 kWh on the May hold-out; **daily bias +50%** is intervention-regime drift (training tracker-angle avg −15°, hold-out avg −51° due to active shading), not a code bug — fix lands once ≥3 months of 2026 growing-season data accumulate (~Aug 2026). +- **2026 ML pipeline scaffolded.** `scripts/collect_2026_training_data.py` pulls treatment + reference Crop_2Soil + IMS, applies a tracker-angle + ShadowModel PAR-shading correction (PAR factor 0.10–1.00, median 0.82), then computes Farquhar A as labels. First 10 days: 1,896 rows, daytime mean A ≈ 11.7 µmol CO₂/m²/s — squarely in the Greer–Weedon Semillon range. +- **Frontend redesigned.** React app at `frontend/` rebuilt to the SolarWine editorial design system (Negev sand surfaces, vine green + sun gold, Source Serif 4 + IBM Plex Sans + IBM Plex Mono). All 11 pages — Home, Agronomy, Photosynthesis, Shading, Power, Trackers, Control loop, Advisor, Monitoring, Documentation, **Research** (new) — use the new chrome and Recharts wrappers. +- **Streamlit dashboard cleaned of stale data.** Control Replay defaults to a fresh 2026 sim log; `scripts/run_control_simulation.py` defaults to `today − 7 d / today`; Shading tab clarifies the legacy `sensors_wide.csv` is frozen at Feb 2026; freshness warnings flag stale logs. + +See `context/3_todo.md` § 12 for the rolling work log. `frontend/` is the production UI; `app.py` remains as the legacy Streamlit dashboard. + +## What it does + +**Stage 1 — Mechanistic model (sensors → photosynthesis rate A)** +Uses on-site sensor data (PAR, leaf temperature, CO2, VPD, air temperature) collected at 15-minute intervals to compute net carbon assimilation *A* via the Farquhar et al. (1980) biochemical model, with Greer & Weedon (2012) temperature response curves calibrated for *Vitis vinifera*. Includes Crop Water Stress Index (CWSI) and stomatal conductance adjustments. Only the growing season (May–September) is used; vines are dormant October–April. + +**Stage 2 — ML prediction (IMS weather → A)** +Trains regression models to predict *A* using only Israel Meteorological Service (IMS) station 43 data (air temperature, GHI solar radiation, relative humidity, rainfall, wind speed). This enables photosynthesis forecasting without on-site sensors. Models evaluated: Linear Regression, Decision Tree, Random Forest, Gradient Boosting, and XGBoost. + +**Time-series forecasting** +Direct multi-horizon forecasting (15 min, 1 hour, 1 day, 1 week, 1 month ahead) using lag features and daytime-session indexing to handle overnight gaps. Per-horizon XGBoost/GradientBoosting models. + +**Tracker optimizer** +Simulates agrivoltaic panel tilt angles to find the optimal tradeoff between solar energy capture and crop photosynthesis. Computes a stress-aware daily schedule that recommends shading during heat stress periods, with season-level summaries of energy yield, photosynthesis impact, and estimated water savings. + +**Solar geometry & canopy photosynthesis** +Calculates sun position, panel shadow geometry, and diffuse/direct PAR reaching the vine canopy at configurable panel dimensions and row spacings. + +## Interactive Streamlit app + +A branded dashboard (`app.py`, ~1900 lines) with: + +- **Sidebar** — Run Stage 1 / Stage 2, download IMS data (chunked 7-day fetches for 2024–2025), data status indicators +- **Stage 1 tab** — Labels distribution, validation plots, Farquhar model outputs +- **Stage 2 tab** — Model comparison metrics (RMSE, MAE, R²), prediction vs actual plots, feature importance +- **EDA tab** — Sensor distributions, A over time, IMS weather statistics, merged dataset exploration +- **Time-Series tab** — Multi-horizon forecast results with per-tab explanations +- **Tracker Optimizer tab** — Tilt-angle simulations, stress heatmaps, daily shading schedule, season summary +- **About tab** — Two-stage rationale, methodology, and project roadmap + +## Project structure + +``` +config/settings.py Site/panel geometry, IMS channel map, paths, train ratio +src/ + farquhar_model.py Farquhar–Greer–Weedon mechanistic photosynthesis model + sensor_data_loader.py Load and filter on-site sensor CSVs + ims_client.py IMS REST API client with caching + preprocessor.py Merge IMS + labels, add time features, temporal split + predictor.py Train/evaluate ML regressors (LR, DT, RF, GBR, XGB) + ts_predictor.py Lag-based multi-horizon time-series forecasting + tracker_optimizer.py Tilt-angle simulation and stress-aware scheduling + solar_geometry.py Sun position, shadow projection, canopy PAR + canopy_photosynthesis.py Canopy-level photosynthesis integration +scripts/ + download_ims_data.py CLI: fetch IMS station data (--list-channels, date range) + run_pipeline.py CLI: execute full Stage 1 → Stage 2 pipeline + create_sample_data.py Generate trimmed sample CSV for cloud deployment + eda.py Standalone exploratory data analysis +app.py Streamlit dashboard +Data/Seymour/ On-site sensor data (15-min intervals) +Data/ims/ Cached IMS API responses +Data/processed/ Intermediate files (labels, merged data) +outputs/ Metrics CSVs and plots (gitignored) +assets/ Logo and vineyard imagery +``` + +## Setup + +```bash +python -m venv .venv +source .venv/bin/activate # Windows: .venv\Scripts\activate +pip install -r requirements.txt +``` + +Create a `.env` file with your IMS API token: + +``` +IMS_API_TOKEN= +``` + +See [ims_api_documentation.md](ims_api_documentation.md) for token registration. + +## Usage + +### Download IMS weather data + +```bash +python -m scripts.download_ims_data --list-channels # show available channels +python -m scripts.download_ims_data --from 2024-01-01 --to 2024-12-31 +``` + +### Run the pipeline + +```bash +python -m scripts.run_pipeline +``` + +Stage 1: load sensors → filter daytime → keep growing season (May–Sep) → compute Farquhar *A* → save labels. +Stage 2: load IMS + labels → merge on timestamp → add time features → temporal train/test split → train & evaluate models → save metrics and plots to `outputs/`. + +### Launch the app + +```bash +streamlit run app.py +``` + +## Key dependencies + +pandas, numpy, scikit-learn, xgboost, pvlib, matplotlib, seaborn, plotly, streamlit, requests, python-dotenv + +## Deployment + +See [DEPLOY.md](DEPLOY.md) for Streamlit Community Cloud deployment instructions. A trimmed sensor sample (`sensors_wide_sample.csv`) is included for cloud use where the full 982 MB dataset is not available. diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..5c108a8e109494b0eae4d333aeb7f95084a2722d --- /dev/null +++ b/app.py @@ -0,0 +1,201 @@ +""" +Streamlit app: SolarWine — Smart Shading for Vineyard Solar Panels. +5 tabs: Overview, Photosynthesis & Data, Forecasting, Shading Simulator, Documentation. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +try: + from dotenv import load_dotenv + load_dotenv(PROJECT_ROOT / ".env") +except ImportError: + pass + +import os +import streamlit as st + +# Copy Streamlit secrets into os.environ so downstream clients (ThingsBoard, +# IMS, etc.) can read them via os.environ without any code changes. +for key, value in st.secrets.items(): + if isinstance(value, str) and key not in os.environ: + os.environ[key] = value + +from ui.bootstrap import img_to_base64, now_israel + +# --------------------------------------------------------------------------- +# Page config +# --------------------------------------------------------------------------- + +st.set_page_config(page_title="SolarWine - Smart Shading for Vineyards", layout="wide") + +# --------------------------------------------------------------------------- +# Migration banner (shows only when new frontend URL is configured) +# --------------------------------------------------------------------------- +_NEW_FRONTEND_URL = os.environ.get("SOLARWINE_FRONTEND_URL", "") +if _NEW_FRONTEND_URL: + st.info( + f"A new version of the SolarWine dashboard is available at " + f"[{_NEW_FRONTEND_URL}]({_NEW_FRONTEND_URL}). " + f"This Streamlit app will be retired soon.", + icon="🔄", + ) + +# --------------------------------------------------------------------------- +# Brand CSS +# --------------------------------------------------------------------------- + +_BRAND_GREEN = "#00BD3E" +_BRAND_DARK = "#1A1A1A" + +st.markdown(f""" + +""", unsafe_allow_html=True) + +# --------------------------------------------------------------------------- +# Hero banner with logo +# --------------------------------------------------------------------------- + +_ASSETS = PROJECT_ROOT / "assets" +_logo_path = _ASSETS / "logo.png" + +if _logo_path.exists(): + _logo_b64 = img_to_base64(_logo_path) + st.markdown(f""" +
+ SolarWine logo +
+

Smart Shading for Vineyard Solar Panels

+

Empowering growers · Harvesting sunshine

+
+
+ """, unsafe_allow_html=True) +else: + st.title("SolarWine — Smart Shading for Vineyard Solar Panels") + +# --------------------------------------------------------------------------- +# Sidebar +# --------------------------------------------------------------------------- + +sidebar = st.sidebar +if _logo_path.exists(): + sidebar.image(str(_logo_path), width=180) + +_now = now_israel() +sidebar.caption("**Site:** Yeruham, Israel") +sidebar.markdown(f"**Date:** {_now.strftime('%Y-%m-%d')}") +sidebar.markdown(f"**Time (local):** {_now.strftime('%H:%M')}") +st.session_state.current_time_israel = _now + +# --------------------------------------------------------------------------- +# Navigation — only the selected page renders (avoids running all 6 tabs) +# --------------------------------------------------------------------------- + +_PAGES = [ + "System Status", + "Overview", + "Photosynthesis & Data", + "Forecasting", + "Shading Simulator", + "Documentation", +] + +_selected = sidebar.radio("Navigate", _PAGES, label_visibility="collapsed") + +if _selected == "System Status": + from ui.tab_system_status import render_tab_system_status + render_tab_system_status() +elif _selected == "Overview": + from ui.tab_overview import render_tab_overview + render_tab_overview() +elif _selected == "Photosynthesis & Data": + from ui.tab_data import render_tab_data + render_tab_data() +elif _selected == "Forecasting": + from ui.tab_forecast import render_tab_forecast + render_tab_forecast() +elif _selected == "Shading Simulator": + from ui.tab_shading import render_tab_shading + render_tab_shading() +elif _selected == "Documentation": + from ui.tab_docs import render_tab_docs + render_tab_docs() diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad268c6899a051147febe636d8cac42af9d9c9f8 Binary files /dev/null and b/assets/logo.png differ diff --git a/assets/vineyard_closeup.png b/assets/vineyard_closeup.png new file mode 100644 index 0000000000000000000000000000000000000000..ed040e886b66b31f812e6bab04ea20429a88efce --- /dev/null +++ b/assets/vineyard_closeup.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e60d3120f0b2a85fedfd801a81e2a9a07977714279f148755b38c5b1971a711 +size 158687 diff --git a/assets/vineyard_panels.png b/assets/vineyard_panels.png new file mode 100644 index 0000000000000000000000000000000000000000..17dc3d37798fe2882a2c957ee7af4fb5fe2f408a --- /dev/null +++ b/assets/vineyard_panels.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59172bdd4c49c8bee82112de76687c0199038f50d5eaa1179bd6f55268c175e3 +size 181334 diff --git a/backend/api/routes/control.py b/backend/api/routes/control.py index e327f418aeb21b53edbb3ef1d7720bb79e0bacd2..63fee3d692f5ec22a54720258897312a514c59a5 100644 --- a/backend/api/routes/control.py +++ b/backend/api/routes/control.py @@ -75,3 +75,104 @@ async def control_trackers(hub: DataHub = Depends(get_datahub)): """Live tracker angles (cached via VineSensorService).""" result = hub.vine_sensors.get_tracker_details() return {"trackers": result.get("trackers", []), "source": "ThingsBoard"} + + +@router.get("/trackers/{tracker_id}/history") +async def tracker_history( + tracker_id: str, + hours: int = 24, + user: dict = Depends(optional_auth), +): + """15-min angle history for one tracker, last N hours. + + Returns a list of `{ts, angle}` ordered by time asc. Floors timestamps + to the 15-min bucket so the UI sparkline lands on stable ticks. + """ + from datetime import datetime, timedelta, timezone + import pandas as pd + from src.data.thingsboard_client import ThingsBoardClient, DEVICE_REGISTRY + + if tracker_id not in DEVICE_REGISTRY or not tracker_id.startswith("Tracker"): + raise HTTPException(404, detail=f"Unknown tracker: {tracker_id}") + if not 1 <= hours <= 24 * 14: + raise HTTPException(400, detail="hours must be 1..336") + + end = datetime.now(tz=timezone.utc) + start = end - timedelta(hours=hours) + try: + df = ThingsBoardClient().get_timeseries( + tracker_id, ["angle"], + start=start, end=end, + limit=10_000, interval_ms=900_000, agg="AVG", + ) + except Exception as exc: + raise HTTPException(status_code=502, detail=f"TB fetch failed: {exc}") + if df.empty: + return {"tracker": tracker_id, "hours": hours, "samples": []} + + df.index = pd.to_datetime(df.index, utc=True).floor("15min") + df = df[~df.index.duplicated(keep="last")] + return { + "tracker": tracker_id, + "hours": hours, + "samples": [ + {"ts": ts.isoformat(), "angle": round(float(v), 2)} + for ts, v in df["angle"].items() + if pd.notna(v) + ], + } + + +@router.get("/dispatches/summary") +async def dispatch_summary(user: dict = Depends(optional_auth)): + """Recent-tick dispatch statistics: count, p50/p95 latency, hard fails. + + Reads from Redis where the worker writes `control:recent_ticks` + (rolling window of the last ~96 ticks). Returns empty stats if the + worker hasn't run yet — UI degrades to "—". + """ + redis = get_redis_client() + if not redis: + return _empty_dispatch_summary() + ticks = redis.get_json("control:recent_ticks") or [] + if not isinstance(ticks, list) or not ticks: + # Fall back to the single last tick if available. + last = redis.get_json("control:last_tick") + ticks = [last] if isinstance(last, dict) else [] + + if not ticks: + return _empty_dispatch_summary() + + latencies = [ + float(t.get("dispatch_latency_ms")) + for t in ticks + if isinstance(t, dict) and t.get("dispatch_latency_ms") is not None + ] + n_disp = sum(1 for t in ticks if isinstance(t, dict) and t.get("dispatch")) + n_fail = sum(1 for t in ticks if isinstance(t, dict) and t.get("dispatch_error")) + + def _pct(xs, p): + if not xs: + return None + xs = sorted(xs) + k = max(0, min(len(xs) - 1, int(round(p / 100 * (len(xs) - 1))))) + return round(xs[k], 1) + + return { + "tick_count": len(ticks), + "dispatches": n_disp, + "hard_fails": n_fail, + "latency_p50_ms": _pct(latencies, 50), + "latency_p95_ms": _pct(latencies, 95), + "latency_mean_ms": round(sum(latencies) / len(latencies), 1) if latencies else None, + "window_first_ts": ticks[0].get("timestamp") if isinstance(ticks[0], dict) else None, + "window_last_ts": ticks[-1].get("timestamp") if isinstance(ticks[-1], dict) else None, + } + + +def _empty_dispatch_summary() -> dict: + return { + "tick_count": 0, "dispatches": 0, "hard_fails": 0, + "latency_p50_ms": None, "latency_p95_ms": None, "latency_mean_ms": None, + "window_first_ts": None, "window_last_ts": None, + } diff --git a/backend/api/routes/energy.py b/backend/api/routes/energy.py index 25cfec91576b908a270a48f274bc5fe3b49cc8fc..5ea558f419e2b341c395b3c7252fd599230bdc86 100644 --- a/backend/api/routes/energy.py +++ b/backend/api/routes/energy.py @@ -49,4 +49,83 @@ async def energy_history( async def energy_predict(target_date: str, hub: DataHub = Depends(get_datahub)): _validate_date(target_date) result = hub.energy.predict(target_date=target_date) - return check_service_error(result, "energy predict") + result = check_service_error(result, "energy predict") + # Forecast remaining today — sum hourly_profile after current UTC hour. + if target_date == str(__import__("datetime").date.today()): + hp = result.get("hourly_profile") or [] + now_h = __import__("datetime").datetime.now(__import__("datetime").timezone.utc).hour + remaining = sum(float(h.get("energy_kwh", 0) or 0) for h in hp if int(h.get("hour", -1)) >= now_h) + result["remaining_kwh_today"] = round(remaining, 2) + return result + + +@router.get("/history-daily") +async def energy_history_daily( + days: int = Query(7, ge=1, le=365, description="Number of calendar days back from today"), + hub: DataHub = Depends(get_datahub), +): + """Daily kWh totals for the last N calendar days. + + Sums TB Plant `production` (Wh) per UTC day. Returns a list ordered by + date asc, including days with zero/missing production (filled as 0). + Built for the Power-page weekly bars and the revenue ledger. + """ + from datetime import datetime, timedelta, timezone + import pandas as pd + + from src.data.thingsboard_client import ThingsBoardClient + end = datetime.now(tz=timezone.utc) + start = (end - timedelta(days=days)).replace(hour=0, minute=0, second=0, microsecond=0) + try: + df = ThingsBoardClient().get_asset_timeseries( + "Plant", keys=["production"], start=start, end=end, + limit=10_000, interval_ms=3_600_000, agg="SUM", + ) + except Exception as exc: + raise HTTPException(status_code=502, detail=f"TB fetch failed: {exc}") + + if df.empty: + return [] + + df.index = pd.to_datetime(df.index, utc=True).floor("h") + by_day = df.groupby(df.index.date)["production"].sum() / 1000.0 + + # Fill missing days with 0 so the bar chart has stable bucket count. + out = [] + cursor = start.date() + today = end.date() + while cursor <= today: + out.append({ + "date": cursor.isoformat(), + "daily_kwh": round(float(by_day.get(cursor, 0.0)), 2), + }) + cursor += timedelta(days=1) + return out + + +@router.get("/inverters") +async def energy_inverters(hub: DataHub = Depends(get_datahub)): + """Per-inverter live state. + + The 2026 fleet exposes only a Plant-level asset on ThingsBoard + (no per-inverter telemetry). We return a single entry derived from + that asset so the UI degrades gracefully; when per-inverter + telemetry is added, extend this endpoint to enumerate them. + """ + current = hub.energy.get_current() + p_kw = current.get("power_kw") if isinstance(current, dict) else None + return { + "inverters": [ + { + "id": "Plant", + "model": "SolarEdge (aggregate)", + "capacity_kw": 48.0, + "power_kw": p_kw, + "status": "live" if p_kw is not None else "offline", + "ac_freq_hz": None, + "dc_string_v": None, + }, + ], + "note": "Per-inverter telemetry not yet plumbed; single aggregate " + "Plant asset returned. See todo §12.5.", + } diff --git a/backend/api/routes/events.py b/backend/api/routes/events.py index 15c9b5721d3b9a0da89fe19aa55133b5ff79cce2..f10b24541b6e51fa4a228455acb72e8eea9260d8 100644 --- a/backend/api/routes/events.py +++ b/backend/api/routes/events.py @@ -13,10 +13,12 @@ from __future__ import annotations import json import logging -from fastapi import APIRouter, Request +from fastapi import APIRouter, Depends, Query, Request from starlette.responses import StreamingResponse +from backend.api.deps import get_datahub, get_redis_client from backend.api.events import event_bus +from src.data.data_providers import DataHub log = logging.getLogger("solarwine.sse") router = APIRouter() @@ -53,3 +55,85 @@ async def event_stream(request: Request): "X-Accel-Buffering": "no", # disable nginx/proxy buffering }, ) + + +@router.get("/list") +async def events_list( + limit: int = Query(50, ge=1, le=500), + hub: DataHub = Depends(get_datahub), +): + """Recent discrete events (alerts + dispatches + data-flow changes). + + There's no persisted event log yet. This endpoint stitches together + the freshest sources we *do* have so the UI alert stream and + dispatch log can render live without fabrication: + + - data-flow monitor state per source (any non-green → event) + - Redis `control:recent_ticks` (per-tick dispatch result) + - Redis `control:last_tick` (single fallback if no rolling window) + """ + from datetime import datetime, timezone + + events: list[dict] = [] + + # ---------- Data-flow monitor → 1 event per source not in `green` ---------- + try: + flow = hub.vine_sensors.get_data_flow_status() # type: ignore[attr-defined] + except Exception: + flow = None + if isinstance(flow, dict): + checked = flow.get("checked_at") or datetime.now(timezone.utc).isoformat() + for key, src in (flow.get("sources") or {}).items(): + status = (src or {}).get("status", "unknown") + if status == "green": + continue + events.append({ + "id": f"flow:{key}:{status}", + "ts": checked, + "source": key, + "name": f"{key} {status}", + "detail": (src or {}).get("message") or "", + "severity": "warn" if status == "yellow" else "fail", + "kind": "data_flow", + "acked": False, + }) + + # ---------- Recent control ticks → dispatch + plan-change events ---------- + redis = get_redis_client() + ticks = [] + if redis: + ticks = redis.get_json("control:recent_ticks") or [] + if not ticks: + last = redis.get_json("control:last_tick") + ticks = [last] if isinstance(last, dict) else [] + for t in ticks[-min(len(ticks), limit):]: + if not isinstance(t, dict): + continue + ts = t.get("timestamp") + if t.get("dispatch_error"): + events.append({ + "id": f"dispatch_err:{ts}", + "ts": ts, + "source": "ControlLoop", + "name": "dispatch failed", + "detail": str(t.get("dispatch_error"))[:240], + "severity": "fail", + "kind": "dispatch", + "acked": False, + }) + elif t.get("dispatch"): + events.append({ + "id": f"dispatch:{ts}", + "ts": ts, + "source": "ControlLoop", + "name": f"angle → {t.get('target_angle')}°", + "detail": (f"offset {t.get('plan_offset_deg', 0)}°" + + (f" · {t.get('mode')}" if t.get('mode') else "")), + "severity": "info", + "kind": "dispatch", + "acked": True, # successful dispatch is auto-acked + }) + + # Newest first, capped. + events.sort(key=lambda e: e.get("ts") or "", reverse=True) + return {"events": events[:limit], "count": len(events[:limit])} diff --git a/backend/api/routes/photosynthesis.py b/backend/api/routes/photosynthesis.py index 8677d90dc548e5f1ace83261deca0846c4fe4480..7e98146e3a83159bf633c54319b4dc241089c1e0 100644 --- a/backend/api/routes/photosynthesis.py +++ b/backend/api/routes/photosynthesis.py @@ -54,3 +54,79 @@ async def ps_current( @router.get("/forecast") async def ps_forecast(hub: DataHub = Depends(get_datahub)): return hub.photosynthesis.forecast_day_ahead() + + +@router.get("/stress-grid") +async def stress_grid( + date: str = Query(None, description="Target date YYYY-MM-DD (default: today)"), + hub: DataHub = Depends(get_datahub), +): + """24-hour × 5-row CWSI matrix for the Home + Shading heatmap. + + Rows are the 5 vineyard rows that have at least one active sensor: + 501, 502, 504, 509 (treatment) + 202 (reference). For each (row, hour) + cell, CWSI = clip((Tleaf − Tair_IRT) / 15, 0, 1) averaged across all + Crop_2Soil devices in that row that reported in the hour. + + Sparse rows (no telemetry in an hour) get a null cell; the UI renders + those as the "low-stress" colour. Returns the requested date if given, + else the most recent 24-hour rolling window. + """ + from datetime import datetime, timedelta, timezone + import pandas as pd + from src.data.thingsboard_client import ( + ThingsBoardClient, DEVICE_REGISTRY, VineArea, + ) + + rows_to_report = [501, 502, 504, 509, 202] + devices_by_row = { + r: [n for n, d in DEVICE_REGISTRY.items() + if n.startswith("Crop_2Soil") and d.row == r] + for r in rows_to_report + } + + if date: + try: + day = datetime.fromisoformat(date).replace(tzinfo=timezone.utc) + start = day + end = day + timedelta(days=1) + except ValueError: + raise HTTPException(400, "date must be YYYY-MM-DD") + else: + end = datetime.now(tz=timezone.utc) + start = end - timedelta(hours=24) + + client = ThingsBoardClient() + grid: list[list[float | None]] = [] + for row_id in rows_to_report: + hourly = [None] * 24 + for dev in devices_by_row.get(row_id, []): + try: + df = client.get_timeseries( + dev, ["leafTemperature", "ambientTemperatureIRT"], + start=start, end=end, + limit=10_000, interval_ms=3_600_000, agg="AVG", + ) + except Exception: + continue + if df.empty or "leafTemperature" not in df.columns or "ambientTemperatureIRT" not in df.columns: + continue + df.index = pd.to_datetime(df.index, utc=True).floor("h") + df = df[~df.index.duplicated(keep="last")] + df["cwsi"] = ((df["leafTemperature"] - df["ambientTemperatureIRT"]) / 15.0).clip(0, 1) + for ts, v in df["cwsi"].items(): + if pd.isna(v): + continue + h = ts.hour + prev = hourly[h] + hourly[h] = float(v) if prev is None else (prev + float(v)) / 2.0 + grid.append([None if v is None else round(v, 3) for v in hourly]) + + return { + "rows": [str(r) for r in rows_to_report], + "hours": list(range(24)), + "grid": grid, + "window_start": start.isoformat(), + "window_end": end.isoformat(), + "source": "Crop_2Soil leaf-air ΔT, hourly, CWSI = clip((Tleaf − Tair)/15, 0, 1)", + } diff --git a/backend/workers/control_tick.py b/backend/workers/control_tick.py index 7f4ef939487d4312c0cf06e2a9c8a7d701ffbf93..3c3c92a7b02ac3a942ac4f4666616158ceca3a60 100644 --- a/backend/workers/control_tick.py +++ b/backend/workers/control_tick.py @@ -61,6 +61,17 @@ def main(): redis.set_json("control:last_tick", safe, ttl=1200) # 20 min TTL log.info("Tick result saved to Redis") + # Rolling window of recent ticks so the Trackers reliability stats + # + Monitoring event stream have something to compute over. Keep + # the last 96 ticks (24 h at 15-min cadence). TTL 48 h so the + # window survives a full day of downtime. + recent = redis.get_json("control:recent_ticks") or [] + if not isinstance(recent, list): + recent = [] + recent.append(safe) + recent = recent[-96:] + redis.set_json("control:recent_ticks", recent, ttl=2 * 24 * 3600) + # Also persist budget state for the /control/budget endpoint from config.settings import MAX_ENERGY_REDUCTION_PCT budget_info = { diff --git a/config/settings.py b/config/settings.py index 015c90026117d17f69cd630e37c3c495f1ddedd2..a96df40a60db0ae92e465e4dd46f950efb3f26c2 100644 --- a/config/settings.py +++ b/config/settings.py @@ -217,3 +217,34 @@ ENERGY_STALE_RED_MIN = 60 # Energy telemetry older than this = red # Email alerts (activated when SMTP_HOST + ALERT_EMAIL_TO env vars are set) ALERT_COOLDOWN_MIN = 60 # minimum minutes between repeat alerts for same source + +# --------------------------------------------------------------------------- +# Proxy-A score — composite photosynthesis health metric +# --------------------------------------------------------------------------- +# Replaces direct LiCor A measurement (not available this season). Combines +# 5 already-collected sensors into a single 0..1 scalar where 1 = healthy. +# See src/proxy_a_score.py and src/season_ground_truth.py. +# +# Calibrate weights with two weeks of null-intervention baseline data; +# defaults below are pre-calibration starting points. + +PROXY_A_WEIGHTS = { + "pri": 0.30, # Photochemical Reflectance Index — light-use efficiency + "psri": 0.20, # senescence (inverted: low = good) + "delta_t": 0.25, # leaf − air ΔT (inverted: low = good) + "soil": 0.15, # shallow soil moisture, normalised availability + "ndvi": 0.10, # canopy greenness baseline +} + +# Healthy / stress bounds per metric. Score per metric maps [stress → healthy] +# linearly into [0 → 1]; outside the range clips. Tune from baseline data. +PROXY_A_BOUNDS = { + "pri": {"stress": -0.10, "healthy": 0.05}, # higher PRI = better + "psri": {"stress": 0.30, "healthy": 0.00}, # lower PSRI = better (inverted) + "delta_t": {"stress": 5.00, "healthy": -2.00}, # lower ΔT = better (inverted) + "soil": {"stress": 10.0, "healthy": 30.0}, # higher soil moisture % = better + "ndvi": {"stress": 0.40, "healthy": 0.80}, # higher NDVI = better +} + +# Path for manual ground-truth observations (SPAD, brix, yield, pruning, etc.) +MANUAL_OBSERVATIONS_PATH = DATA_DIR / "2026" / "manual_observations.csv" diff --git a/context/.gitkeep b/context/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/context/1_purpose.md b/context/1_purpose.md new file mode 100644 index 0000000000000000000000000000000000000000..129dbf955c30676179d3aab79ba7844ac96271f6 --- /dev/null +++ b/context/1_purpose.md @@ -0,0 +1,20 @@ +# Photosynthesis Prediction Model – Purpose & Background + +This project builds a **two-stage photosynthesis prediction pipeline for grapevines**: + +- **Stage 1 (Mechanistic)**: Use on-site crop sensor data from the Seymour plot to compute leaf photosynthesis rate \(A\) using the **Farquhar et al. (1980)** model with **Greer & Weedon (2012)** parameterization for *Vitis vinifera*. This includes temperature-dependent Vcmax/Jmax, electron transport, and a Crop Water Stress Index (CWSI) based on leaf–air temperature differences and humidity. +- **Stage 2 (ML)**: Train simple machine‑learning models to predict \(A\) **using only external IMS weather station data** (station 43, Sde Boker). This lets us estimate grapevine photosynthesis from standard meteorological inputs without needing the full sensor stack. + +### Domain context + +- Site: solar wine‑farm experimental vineyard near Yeruham, Israel (Seymour plot). +- Crop: grapevine (*Vitis vinifera*). +- On‑site sensors: PAR, leaf temperature, air temperature, CO₂, VPD, humidity, and crop spectral indices (PRI, NDVI variants). +- External weather: IMS station 43 (Sde Boker) providing temperature, solar radiation, humidity, rain, wind, and pressure. + +### Design principles + +- **Mechanistic first, then ML**: Ground the target \(A\) in a physiological model before fitting data‑driven models. +- **Strict separation of data sources**: Stage 1 uses only on‑site sensors; Stage 2 uses only IMS weather features to avoid leakage. +- **Reproducible, well‑documented pipeline**: Clear directory layout, config in `config/settings.py`, and this `context/` folder as the long‑term project memory. + diff --git a/context/2_plan.md b/context/2_plan.md new file mode 100644 index 0000000000000000000000000000000000000000..69546ea69412ff2270f8d51e01e3fe887c249154 --- /dev/null +++ b/context/2_plan.md @@ -0,0 +1,1534 @@ +# SolarWine 2.0 — Implementation Plan + +## Executive Summary + +Evolve the existing two-stage photosynthesis prediction pipeline into a biology-driven agrivoltaic control system. The core principle: **full astronomical tracking is the default — the panels follow the sun and generate maximum energy 100% of the time**. Anti-tracking (tilting away from the sun to shade the vine) is a rare, targeted intervention used ONLY when the vine's fruiting zone is at measurable risk of heat or radiation damage, and ONLY at the minimum dose necessary to protect yield. + +The user sets a hard ceiling on annual energy sacrifice (e.g., 5%). The system distributes that budget across Year → Month → Week → Day → 15-min slots, concentrating almost all of it in July–August midday windows when heat stress actually threatens grape quality. Margins at each level allow the system to respond to unexpected stress events while guaranteeing the energy ceiling is never breached. + +--- + +## Biological Design Principles + +These principles, drawn from viticultural research for *Vitis vinifera* in hot-arid climates, constrain every decision the algorithm makes: + +### Principle 1: Morning light is sacred — never shade mornings + +Morning radiation (sunrise to ~10:00) is the most valuable light the vine receives: +- **Stomata are maximally open** in early morning (low VPD, cool air). This is when gas exchange is most efficient and photosynthetic carbon loading peaks. +- **Spring mornings (May–June)** are critical for flowering, fruit set, and early berry development. Shading during this period directly reduces yield potential. +- The vine "charges" its carbohydrate reserves in the morning to survive afternoon heat stress. Reducing morning PAR weakens the vine's ability to cope later in the day. + +**Hard constraint**: Shading is PROHIBITED before 10:00 local time, regardless of any other signal. + +### Principle 2: The fruiting zone matters more than the canopy top + +In a VSP (Vertical Shoot Positioning) trellis, the grape clusters hang in the **mid-canopy zone** (~0.4–0.8m height, zone index 1 in our 3-zone ShadowModel at center height ~0.6m). This zone determines grape quality: +- **Berry color** (anthocyanins) requires moderate light exposure — but direct midday sun in the Negev causes sunburn (berry surface > 35°C). +- **Sugar accumulation** (Brix) depends on canopy photosynthesis above, not direct fruit irradiance. +- **Flavor compounds** (terpenes, phenolics) develop best under filtered/diffuse light in the fruiting zone, not harsh direct radiation. + +**Optimization target**: When intervention IS needed, choose the minimum tilt angle that shades the **fruiting zone** specifically while keeping the **upper canopy** (zone index 2, where 50% of leaf area lives) in full sun for photosynthesis. + +### Principle 3: Shade only when it actually helps — minimum effective dose + +Shading is not inherently beneficial. Below 30°C (RuBP-limited state), the vine is light-limited and shading HURTS both energy generation AND photosynthesis. The system should only intervene when: +- The vine crosses into **Rubisco-limited state** (Tleaf > 30°C for Semillon) +- CWSI indicates real water stress (> 0.4), meaning stomata are closing due to heat/VPD +- The FvCB model confirms that reducing PAR at the current temperature would actually improve or maintain A (not reduce it) + +And the intervention must be the **smallest angle offset** that brings the fruiting zone below the damage threshold. Once the stress signal drops, return immediately to full tracking. + +### Principle 4: Most of the season needs zero intervention + +In a typical Sde Boker growing season: +- **May**: Canopy developing, temps moderate (25–32°C). Almost no stress events. Budget needed: ~0%. +- **June**: Temps rising, occasional heat spikes. Rare intervention. Budget needed: ~5%. +- **July**: Peak heat (35–42°C), daily midday stress. This is where 40–45% of the budget goes. +- **August**: Sustained heat, fruit ripening. Critical sunburn risk. Budget needed: 40–45%. +- **September**: Declining heat, pre-harvest. Occasional late heat waves. Budget needed: ~10%. + +The budget is heavily concentrated in ~4 hours/day (11:00–15:00) during ~8 weeks (mid-July to mid-August). Outside those windows, the tracker runs at full astronomical tracking with zero sacrifice. + +--- + +## What Already Exists (Baseline v1) + +| Component | Module | Status | +|---|---|---| +| Farquhar/Greer-Weedon FvCB model | `src/farquhar_model.py` | Done — Vcmax/Jmax temp response, CWSI, stomatal conductance | +| Shadow/solar geometry | `src/solar_geometry.py` | Done — ShadowModel, 3-zone vertical grid (bottom/mid/top), ray-tracing, PAR distribution | +| Canopy-level photosynthesis | `src/canopy_photosynthesis.py` | Done — zone-weighted Farquhar, LAI weights [0.15, 0.35, 0.50] bottom→top | +| Tilt-angle simulation | `src/tracker_optimizer.py` | Done — cosine-factor PAR scaling, stress heatmap | +| IMS weather client | `src/ims_client.py` | Done — fetch/cache/resample IMS station 43 | +| ML predictor (Stage 2) | `src/predictor.py` | Done — LR, DT, RF, GBR, XGBoost | +| Time-series forecasting | `src/ts_predictor.py` | Done — multi-horizon lag-based | +| Preprocessor | `src/preprocessor.py` | Done — merge, time features, temporal split | +| Sensor data loader | `src/sensor_data_loader.py` | Done | +| Streamlit dashboard | `app.py` | Done — 6 tabs, branded UI | +| Site/panel config | `config/settings.py` | Done — panel 1.13m wide at 2.05m height, canopy 1.2m VSP, 3.0m row spacing | + +### Key existing geometry (from ShadowModel) + +``` +Vertical zones (n_vertical=3): + Zone 0 (bottom): center ~0.2m — trunk/cordons — LAI weight 15% + Zone 1 (mid): center ~0.6m — FRUITING ZONE — LAI weight 35% + Zone 2 (top): center ~1.0m — main leaf canopy — LAI weight 50% + +Panel: 1.13m wide, mounted at 2.05m, row spacing 3.0m +Canopy: 1.2m tall, 0.6m wide, VSP trellis +``` + +--- + +## Gap Analysis + +### New Components + +1. **EnergyBudgetPlanner** — Hierarchical budget with no-shade windows and fruiting-zone targeting +2. **TradeoffEngine** — Budget-constrained, minimum-dose optimization +3. **Command Arbiter** — Fallback logic, hysteresis, mode priority +4. **Safety Rails** — FvCB vs ML divergence validation +5. **Spectral Aggregator** — CWSI/NDVI/PRI from sensor data +6. **ROI Reporting Service** — Budget utilization, LER +7. **Weather Protection / Harvest Modes** — Override protocols +8. **Data Schema** — Telemetry storage definitions + +### Existing Components to Upgrade + +1. **FarquharModel** — Add 30°C Semillon transition returning limiting state +2. **ShadowModel** — Add fruiting-zone-specific shadow query +3. **CanopyPhotosynthesisModel** — Expose per-zone A and fruiting zone metrics +4. **Config/Settings** — Add no-shade windows, fruiting zone thresholds, budget parameters + +--- + +## Implementation Phases + +### Phase 1: Configuration & Data Infrastructure + +#### 1.1 Extend `config/settings.py` + +```python +# === ENERGY BUDGET === +MAX_ENERGY_REDUCTION_PCT = 5.0 # user's hard ceiling (%) +ANNUAL_RESERVE_PCT = 15.0 # emergency reserve from total budget +WEEKLY_RESERVE_PCT = 20.0 # within-week flexibility +DAILY_MARGIN_PCT = 20.0 # real-time response pool + +# Monthly budget distribution — concentrated in peak heat months +MONTHLY_BUDGET_WEIGHTS = { + 5: 0.00, # May — no intervention, canopy establishing + 6: 0.05, # June — rare, only extreme heat spikes + 7: 0.45, # July — peak heat, primary shading window + 8: 0.40, # August — sustained heat, fruit ripening/sunburn risk + 9: 0.10, # Sept — occasional late heat waves +} + +# === NO-SHADE WINDOWS (hard constraints — shading PROHIBITED) === +NO_SHADE_BEFORE_HOUR = 10 # local solar time — morning light is sacred +NO_SHADE_MONTHS = [5] # May — full spring exposure for fruit set +NO_SHADE_GHI_BELOW = 300 # W/m2 — overcast, already diffuse +NO_SHADE_TLEAF_BELOW = 28.0 # C — no heat stress risk +NO_SHADE_CWSI_BELOW = 0.3 # vine is healthy, wants light + +# === SHADE-ELIGIBLE CONDITIONS (ALL must be true to allow intervention) === +SHADE_ELIGIBLE_TLEAF_ABOVE = 30.0 # C — Semillon Rubisco transition +SHADE_ELIGIBLE_CWSI_ABOVE = 0.4 # moderate stress confirmed +SHADE_ELIGIBLE_GHI_ABOVE = 500 # W/m2 — high direct radiation +SHADE_ELIGIBLE_HOURS = (10, 16) # local solar time window + +# === FRUITING ZONE === +FRUITING_ZONE_INDEX = 1 # mid-canopy zone in 3-zone ShadowModel +FRUITING_ZONE_HEIGHT_M = 0.6 # center height of grape cluster zone +BERRY_SUNBURN_TEMP_C = 35.0 # berry surface temperature damage threshold +FRUITING_ZONE_TARGET_PAR = 400 # umol/m2/s — sufficient for quality, below burn + +# === TRADEOFF ENGINE === +CANDIDATE_OFFSETS = [0, 3, 5, 8, 10, 15, 20] # degrees off astronomical (small steps) +SIMULATION_TIMEOUT_SEC = 5 + +# === SAFETY RAILS === +DIVERGENCE_THRESHOLD = 0.12 # 12% FvCB vs ML mismatch triggers fallback + +# === SEMILLON FvCB === +SEMILLON_TRANSITION_TEMP_C = 30.0 + +# === WEATHER PROTECTION === +WIND_STOW_SPEED_MS = 15.0 +HEAT_SHIELD_TEMP_C = 38.0 +HEAT_SHIELD_CWSI = 0.6 + +# === MECHANICAL HARVESTING === +HARVEST_PARK_CLEARANCE_CM = 250 +HARVEST_LATERAL_WIDTH_CM = 18 +HARVESTER_RPM_RANGE = (430, 460) + +# === HYSTERESIS === +HYSTERESIS_WINDOW_MIN = 15 +ANGLE_TOLERANCE_DEG = 2.0 + +# === ROI === +TARGET_LER = 1.5 +``` + +#### 1.2 Create `src/data_schema.py` + +Dataclass definitions for the four telemetry tables (SensorRawTelemetry, BiologicalState, TrackerKinematics, SimulationLog). CSV/Parquet backend for now; schema supports future TimescaleDB migration. + +#### 1.3 Create `scripts/import_layout.py` + +Spatial initialization: read site layout, assign 3D coordinates to assets, output `layout.json` for ShadowModel. + +--- + +### Phase 2: Biological Digital Twin Upgrades + +#### 2.1 Upgrade `src/farquhar_model.py` — Semillon State Transition + +```python +def calc_photosynthesis_semillon(self, PAR, Tleaf, CO2, VPD, Tair, CWSI=None): + """FvCB with explicit 30C Semillon state transition. + Returns (A, limiting_state, shading_helps). + + shading_helps is True ONLY when the vine is Rubisco-limited AND + reducing PAR would not reduce A (because the bottleneck is heat, not light). + """ + Tk = Tleaf + 273.15 + Kc, Ko = self.calc_Kc(Tk), self.calc_Ko(Tk) + gamma_star = self.calc_gamma_star(Tk) + Vcmax, Jmax = self.calc_Vcmax(Tk), self.calc_Jmax(Tk) + J = self.calc_electron_transport(PAR, Jmax) + Rd = self.params["rd_frac"] * Vcmax + ci = self._ci_from_ca(CO2, VPD, CWSI or 0.0) + + Ac = Vcmax * (ci - gamma_star) / (ci + Kc * (1.0 + OI / Ko)) + Aj = J * (ci - gamma_star) / (4.0 * ci + 8.0 * gamma_star) + + if Tleaf < SEMILLON_TRANSITION_TEMP_C: + # RuBP-limited: light is the bottleneck + # Shading HURTS — reduces J, reduces Aj, reduces A + state = "RuBP_Limited" + shading_helps = False + An = min(Ac, Aj) - Rd # standard min-based + else: + # Rubisco-limited: enzyme/heat is the bottleneck + # Shading helps IF it cools the leaf without cutting PAR below + # the point where Aj drops below Ac + state = "Rubisco_Limited" + shading_helps = (Aj > Ac) # True when light is abundant relative to Vcmax + An = min(Ac, Aj) - Rd + + return max(0.0, An), state, shading_helps +``` + +The third return value `shading_helps` is the gate: the TradeoffEngine will NOT shade unless this is True. Even above 30°C, if PAR is already low (cloudy), Aj may be below Ac and shading would still hurt. + +#### 2.2 Upgrade `src/solar_geometry.py` — Fruiting Zone Shadow Query + +Add to ShadowModel: + +```python +def fruiting_zone_shadow(self, shadow_mask: np.ndarray, + fruiting_zone_idx: int = 1) -> dict: + """Report shading specifically on the fruiting zone (mid-canopy).""" + fz_row = shadow_mask[fruiting_zone_idx, :] # shape (n_horizontal,) + fz_shaded_fraction = float(fz_row.mean()) + return { + "fruiting_zone_shaded_pct": fz_shaded_fraction * 100, + "fruiting_zone_sunlit_pct": (1 - fz_shaded_fraction) * 100, + "fruiting_zone_mask": fz_row, + } + +def evaluate_candidate_offsets(self, solar_elevation, solar_azimuth, + theta_astro, offsets, total_par): + """Evaluate shadow at astronomical angle + each offset. + Returns dict keyed by offset with shadow mask, PAR distribution, + and fruiting zone metrics.""" + results = {} + for offset in offsets: + theta = theta_astro + offset + mask = self.project_shadow(solar_elevation, solar_azimuth, theta) + par_dist = self.compute_par_distribution(total_par, mask) + fz = self.fruiting_zone_shadow(mask) + results[offset] = { + "shadow_mask": mask, + "par_distribution": par_dist, + "sunlit_fraction": self.sunlit_fraction(mask), + "fruiting_zone": fz, + } + return results +``` + +#### 2.3 Upgrade `src/canopy_photosynthesis.py` — Expose Fruiting Zone Metrics + +Add to `compute_vine_A()` return dict: + +```python +# After computing A_zones: +fruiting_zone_A = float(A_zones[FRUITING_ZONE_INDEX, :].mean()) +fruiting_zone_par = float(par_zones[FRUITING_ZONE_INDEX, :].mean()) +top_canopy_A = float(A_zones[2, :].mean()) # zone 2 = top, 50% LAI + +return { + "A_vine": A_vine, + "A_zones": A_zones, + "sunlit_fraction": sunlit_frac, + "par_zones": par_zones, + "fruiting_zone_A": fruiting_zone_A, + "fruiting_zone_par": fruiting_zone_par, + "top_canopy_A": top_canopy_A, +} +``` + +#### 2.4 Create `src/safety_rails.py` + +FvCB vs ML divergence check. 12% threshold triggers fallback to astronomical tracking (zero sacrifice). + +#### 2.5 Create `src/spectral_aggregator.py` + +Batch preprocessing of CWSI, NDVI, PRI from sensor columns. Operates as a function, not a service (message bus deferred to production). + +--- + +### Phase 3: The Control Algorithm + +**Default behavior: FULL ASTRONOMICAL TRACKING. The system generates maximum energy and only deviates when the vine's fruiting zone is genuinely at risk.** + +--- + +#### 3.0 Algorithm Overview + +``` +┌──────────────────────────────────────────────────────────────┐ +│ EVERY 15 MINUTES │ +│ │ +│ 1. Compute θ_astro (pvlib single-axis tracking) │ +│ 2. DEFAULT DECISION: θ = θ_astro (full tracking, 0 sacrifice)│ +│ │ +│ 3. CHECK: Is this a no-shade window? │ +│ - Before 10:00 local? → STAY at θ_astro. Done. │ +│ - May? → STAY at θ_astro. Done. │ +│ - Tleaf < 28C? → STAY at θ_astro. Done. │ +│ - CWSI < 0.3? → STAY at θ_astro. Done. │ +│ - GHI < 300 W/m2? → STAY at θ_astro. Done. │ +│ │ +│ 4. CHECK: Are shade-eligible conditions ALL met? │ +│ - Tleaf > 30C (Rubisco-limited)? │ +│ - CWSI > 0.4 (real stress)? │ +│ - FvCB says shading_helps = True? │ +│ - GHI > 500 W/m2 (high direct radiation)? │ +│ - Hour between 10:00 and 16:00? │ +│ → If ANY condition is False: STAY at θ_astro. Done. │ +│ │ +│ 5. All gates passed → INTERVENTION ALLOWED │ +│ - Budget available? (slot_budget + margin > 0) │ +│ → If no budget: STAY at θ_astro. Done. │ +│ │ +│ 6. FIND MINIMUM EFFECTIVE DOSE: │ +│ For offsets [3, 5, 8, 10, 15, 20] degrees: │ +│ - Ray-trace shadow at θ_astro + offset │ +│ - Check: does fruiting zone PAR drop below 400 umol? │ +│ - Check: does top canopy stay mostly sunlit (>70%)? │ +│ - Check: sacrifice(offset) ≤ available budget? │ +│ → Select SMALLEST offset that protects fruiting zone │ +│ while keeping top canopy productive │ +│ │ +│ 7. Record sacrifice, update budget ledger. │ +└──────────────────────────────────────────────────────────────┘ +``` + +The critical difference from the prior plan: **the utility function does not pick the "best" angle — it picks the SMALLEST angle that achieves the biological target.** Energy sacrifice is minimized, not balanced. + +--- + +#### 3.1 Energy Budget Planner — `src/energy_budget.py` + +##### 3.1.1 The Budget Hierarchy + +``` +USER INPUT: max_energy_reduction_pct = 5% + +ANNUAL PLAN (computed at season start) + total_potential = Σ E_astro(slot) for May 1 – Sep 30 + total_budget = potential × 5% + annual_reserve = budget × 15% (for heat waves) + distributable = budget × 85% + + Monthly allocation (where the budget goes): + May: 0% = 0 kWh ← NO intervention ever in May + June: 5% = small ← rare extreme events only + July: 45% = bulk ← peak heat, daily midday shading + August: 40% = bulk ← sustained heat, sunburn risk + Sept: 10% = moderate ← late heat waves + +WEEKLY PLAN (generated Monday or rolling) + weekly_raw = monthly_remaining / weeks_left + rollover + weekly_reserve = weekly_raw × 20% + distributable = weekly_raw × 80% + + Daily allocation weighted by forecast Tmax: + weight(day) = max(0, forecast_Tmax - 30)² + Hot days get quadratically more budget. + Days with Tmax < 30: zero allocation (no stress expected). + +DAILY PLAN (generated at sunrise) + daily_raw = weekly_allocation + yesterday's rollover + daily_margin = daily_raw × 20% (unexpected afternoon spike) + planned = daily_raw × 80% + + Slot allocation: + Before 10:00: ZERO (no-shade window) + 10:00-11:00: planned × 0.05 (transition period) + 11:00-14:00: planned × 0.60 (peak stress window) + 14:00-16:00: planned × 0.30 (sustained heat) + After 16:00: planned × 0.05 (rare late stress) + +SLOT EXECUTION (every 15 min) + available = slot_budget + margin_share + → If intervention triggered AND budget > 0: shade + → If no intervention needed: budget preserved (rolls forward) +``` + +##### 3.1.2 Why the Budget Is Small + +At 5% annual sacrifice with Sde Boker's solar geometry: +- Annual energy potential (May–Sep) ≈ 750 kWh/kWp equivalent +- Total budget ≈ 37.5 kWh sacrifice allowed +- July gets ≈ 14 kWh → ≈ 0.45 kWh/day → spread across ≈ 3 hours of eligibility +- Each 15-min slot gets ≈ 0.04 kWh — enough for 3–8° offset during peak + +This is intentionally tight. The algorithm must be surgical: intervene only when truly necessary, at the minimum dose, and return to full tracking immediately. + +##### 3.1.3 Budget Implementation + +```python +class EnergyBudgetPlanner: + def __init__(self, max_energy_reduction_pct, shadow_model): + self.max_pct = max_energy_reduction_pct + self.shadow = shadow_model + + def compute_annual_plan(self, year: int) -> dict: + """Compute energy potential under astronomical tracking, allocate budget.""" + season_start = pd.Timestamp(f"{year}-05-01", tz="UTC") + season_end = pd.Timestamp(f"{year}-09-30 23:45", tz="UTC") + times = pd.date_range(season_start, season_end, freq="15min") + solar_pos = self.shadow.get_solar_position(times) + + energy_per_slot = [] + for _, sp in solar_pos.iterrows(): + if sp["solar_elevation"] <= 0: + energy_per_slot.append(0.0) + continue + tracker = self.shadow.compute_tracker_tilt( + sp["solar_azimuth"], sp["solar_elevation"]) + e = max(0, np.cos(np.radians(tracker["aoi"]))) * 0.25 + energy_per_slot.append(e) + + total_potential = sum(energy_per_slot) + total_budget = total_potential * self.max_pct / 100 + annual_reserve = total_budget * ANNUAL_RESERVE_PCT / 100 + distributable = total_budget - annual_reserve + + monthly = {} + for month, weight in MONTHLY_BUDGET_WEIGHTS.items(): + monthly[month] = distributable * weight + + return { + "year": year, + "total_potential_kWh": total_potential, + "total_budget_kWh": total_budget, + "annual_reserve_kWh": annual_reserve, + "monthly_budgets": monthly, + "budget_spent_kWh": 0.0, + } + + def compute_weekly_plan(self, week_start, monthly_remaining, + forecast_tmax=None, rollover=0.0): + """Distribute to days weighted by (Tmax - 30)^2. Days < 30C get zero.""" + month = week_start.month + weeks_left = max(1, (pd.Timestamp( + f"{week_start.year}-{month:02d}-30") - week_start).days // 7) + weekly_raw = monthly_remaining / weeks_left + rollover + weekly_reserve = weekly_raw * WEEKLY_RESERVE_PCT / 100 + distributable = weekly_raw - weekly_reserve + + if forecast_tmax and len(forecast_tmax) == 7: + weights = [max(0, t - 30.0) ** 2 for t in forecast_tmax] + total_w = sum(weights) + if total_w > 0: + daily = [distributable * w / total_w for w in weights] + else: + daily = [0.0] * 7 # all days < 30C → no budget needed + else: + daily = [distributable / 7] * 7 + + return { + "weekly_total_kWh": weekly_raw, + "weekly_reserve_kWh": weekly_reserve, + "daily_budgets_kWh": daily, + } + + def compute_daily_plan(self, date, daily_budget, rollover=0.0): + """Distribute to 15-min slots. Zero before 10:00. Peak at 11-14.""" + daily_raw = daily_budget + rollover + daily_margin = daily_raw * DAILY_MARGIN_PCT / 100 + planned = daily_raw - daily_margin + + slot_budgets = {} + blocks = [ + ((5, 10), 0.00), # NO SHADE — morning is sacred + ((10, 11), 0.05), # transition + ((11, 14), 0.60), # peak stress window + ((14, 16), 0.30), # sustained heat + ((16, 20), 0.05), # rare late stress + ] + for (h_start, h_end), weight in blocks: + block_budget = planned * weight + n_slots = (h_end - h_start) * 4 + per_slot = block_budget / n_slots if n_slots > 0 else 0 + for h in range(h_start, h_end): + for m in (0, 15, 30, 45): + slot_budgets[f"{h:02d}:{m:02d}"] = per_slot + + return { + "date": date, + "daily_total_kWh": daily_raw, + "daily_margin_kWh": daily_margin, + "daily_margin_remaining_kWh": daily_margin, + "slot_budgets": slot_budgets, + "cumulative_spent": 0.0, + } + + def emergency_draw(self, annual_plan, amount): + """Draw from annual reserve for extreme heat events.""" + available = annual_plan["annual_reserve_kWh"] + drawn = min(amount, available) + annual_plan["annual_reserve_kWh"] -= drawn + return drawn +``` + +--- + +#### 3.2 The Intervention Gate — `src/tradeoff_engine.py` + +The gate is a series of hard checks. The engine does NOT run a utility function to decide WHETHER to shade — it runs a strict pass/fail gate. Only after all gates pass does it search for the minimum effective dose. + +##### 3.2.1 The Gate Logic + +```python +class InterventionGate: + """Determines whether shading is allowed at this timestep. + Returns True only when ALL conditions for intervention are met. + This is not an optimization — it is a hard pass/fail filter.""" + + def check(self, timestamp, tleaf, tair, cwsi, ghi, par, + co2, vpd, farquhar_model) -> dict: + + local_hour = timestamp.hour # approximate (should use solar noon) + + # --- NO-SHADE WINDOWS (any one blocks intervention) --- + if local_hour < NO_SHADE_BEFORE_HOUR: + return {"allowed": False, "reason": "morning_protected"} + + if timestamp.month in NO_SHADE_MONTHS: + return {"allowed": False, "reason": "spring_protected"} + + if tleaf < NO_SHADE_TLEAF_BELOW: + return {"allowed": False, "reason": "no_heat_stress"} + + if cwsi < NO_SHADE_CWSI_BELOW: + return {"allowed": False, "reason": "vine_healthy"} + + if ghi < NO_SHADE_GHI_BELOW: + return {"allowed": False, "reason": "overcast"} + + # --- SHADE-ELIGIBLE CONDITIONS (all must pass) --- + if tleaf < SHADE_ELIGIBLE_TLEAF_ABOVE: + return {"allowed": False, "reason": "below_rubisco_threshold"} + + if cwsi < SHADE_ELIGIBLE_CWSI_ABOVE: + return {"allowed": False, "reason": "stress_insufficient"} + + h_start, h_end = SHADE_ELIGIBLE_HOURS + if not (h_start <= local_hour < h_end): + return {"allowed": False, "reason": "outside_eligible_hours"} + + if ghi < SHADE_ELIGIBLE_GHI_ABOVE: + return {"allowed": False, "reason": "low_radiation"} + + # --- BIOLOGICAL CONFIRMATION --- + _, state, shading_helps = farquhar_model.calc_photosynthesis_semillon( + par, tleaf, co2, vpd, tair + ) + if not shading_helps: + return {"allowed": False, "reason": "fvcb_says_shade_hurts", + "state": state} + + return {"allowed": True, "reason": "all_gates_passed", "state": state} +``` + +##### 3.2.2 Minimum Effective Dose Selection + +When the gate passes, the engine does NOT maximize a utility function. Instead, it searches for the **smallest offset** that achieves the biological target: bring fruiting zone PAR below the sunburn threshold while keeping the top canopy productive. + +```python +class TradeoffEngine: + def __init__(self, shadow_model, canopy_model, farquhar_model): + self.shadow = shadow_model + self.canopy = canopy_model + self.farquhar = farquhar_model + self.gate = InterventionGate() + + def evaluate_slot(self, timestamp, par, tleaf, tair, co2, vpd, + cwsi, ghi, slot_budget_kWh, margin_kWh) -> dict: + + # 1. Astronomical optimal (always computed — this is the default) + sp = self.shadow.get_solar_position(pd.DatetimeIndex([timestamp])) + solar_elev = sp["solar_elevation"].iloc[0] + solar_az = sp["solar_azimuth"].iloc[0] + + if solar_elev <= 2.0: + return {"angle": 0, "offset": 0, "sacrifice": 0, "action": "night"} + + tracker = self.shadow.compute_tracker_tilt(solar_az, solar_elev) + theta_astro = tracker["tracker_theta"] + E_astro = max(0, np.cos(np.radians(tracker["aoi"]))) * 0.25 + + # 2. DEFAULT: full astronomical tracking + result = { + "angle": theta_astro, + "offset": 0, + "sacrifice_kWh": 0.0, + "margin_spent_kWh": 0.0, + "budget_saved_kWh": slot_budget_kWh, # entire slot budget preserved + "action": "full_tracking", + "E_kWh": E_astro, + } + + # 3. Check intervention gate + gate = self.gate.check(timestamp, tleaf, tair, cwsi, ghi, + par, co2, vpd, self.farquhar) + result["gate"] = gate + + if not gate["allowed"]: + return result # stay at full tracking + + # 4. Budget check + total_available = slot_budget_kWh + margin_kWh + if total_available <= 0: + result["action"] = "gate_passed_but_no_budget" + return result + + # 5. MINIMUM EFFECTIVE DOSE — scan offsets smallest to largest + for offset in CANDIDATE_OFFSETS: + if offset == 0: + continue # 0 = full tracking, already the default + + theta = theta_astro + offset + E_theta = E_astro * np.cos(np.radians(offset)) + sacrifice = E_astro - E_theta + + # Budget constraint + if sacrifice > total_available: + break # larger offsets will cost even more — stop scanning + + # Ray-trace at this angle + mask = self.shadow.project_shadow(solar_elev, solar_az, theta) + + # Fruiting zone check: is the fruit zone now shaded enough? + fz = self.shadow.fruiting_zone_shadow(mask) + fz_par = par * (1.0 - fz["fruiting_zone_shaded_pct"] / 100) + # Target: reduce fruiting zone PAR below sunburn threshold + # but not below minimum useful level (~100 umol for diffuse photosynthesis) + fz_par_with_diffuse = max(fz_par, par * 0.15) # diffuse floor + + # Top canopy check: is the top canopy still mostly sunlit? + top_mask = mask[2, :] # zone 2 = top canopy + top_sunlit_pct = float(1.0 - top_mask.mean()) * 100 + + if top_sunlit_pct < 70: + continue # this angle shades too much of the productive canopy + + # Does this offset actually help the fruiting zone? + if fz_par_with_diffuse > FRUITING_ZONE_TARGET_PAR: + continue # not enough shade on fruit zone yet, try larger offset + + # SUCCESS — this is the minimum offset that protects the fruit + # while keeping the top canopy productive + vine_result = self.canopy.compute_vine_A( + par, tleaf, co2, vpd, tair, mask) + + margin_spent = max(0, sacrifice - slot_budget_kWh) + + return { + "angle": theta, + "offset": offset, + "sacrifice_kWh": sacrifice, + "margin_spent_kWh": margin_spent, + "budget_saved_kWh": max(0, slot_budget_kWh - sacrifice), + "action": "minimum_dose_shade", + "E_kWh": E_theta, + "A_vine": vine_result["A_vine"], + "fruiting_zone_par": fz_par_with_diffuse, + "fruiting_zone_shaded_pct": fz["fruiting_zone_shaded_pct"], + "top_canopy_sunlit_pct": top_sunlit_pct, + "gate": gate, + } + + # No offset achieved the target within budget/constraints + # → stay at full tracking (do not shade ineffectively) + result["action"] = "no_effective_dose_found" + return result +``` + +##### 3.2.3 Why This is NOT a Utility Function + +The prior plan used `U(θ) = α·E(θ) + β(CWSI)·A(θ)` — a weighted sum that trades energy for photosynthesis. This is wrong for three reasons: + +1. **The default must be zero intervention.** A utility function always finds a "best" angle, which may not be zero. The gate-then-minimum-dose approach ensures the system stays at full tracking unless the biological case is clear. + +2. **Minimum dose, not maximum benefit.** A utility function would pick the angle with the highest A, which may be a large offset. We want the SMALLEST offset that prevents damage — less energy sacrifice for the same biological protection. + +3. **The vine doesn't always benefit from shade.** In RuBP-limited state (< 30°C), shading reduces A. A utility function with high β could still recommend shading if the math works out. The gate prevents this categorically. + +##### 3.2.4 The Daily Cycle Under This Algorithm + +``` +Typical July day in Sde Boker: + +05:00-10:00 θ = θ_astro (FULL TRACKING) + Gate blocked: morning_protected + Budget spent: 0. All slot budgets preserved → margin pool. + Vine: stomata open, photosynthesizing efficiently. + +10:00-10:30 θ = θ_astro (FULL TRACKING) + Gate blocked: below_rubisco_threshold (Tleaf = 29C) + Budget spent: 0. + +10:45 θ = θ_astro (FULL TRACKING) + Gate blocked: stress_insufficient (CWSI = 0.35) + Vine is warming but not yet stressed enough. + +11:00 θ = θ_astro + 3° (MINIMUM DOSE) + Gate passed: Tleaf=32C, CWSI=0.45, GHI=850 W/m2, + FvCB: Rubisco_Limited, shading_helps=True + Offset 3°: fruiting zone PAR drops to ≈ 380, top canopy ≈ 95% sunlit + Sacrifice: ≈ 0.03 kWh. Fruiting zone protected. + +11:15-13:45 θ = θ_astro + 5° to +8° (ESCALATING AS NEEDED) + CWSI rising to 0.55, Tleaf 34-37C. + System uses 5° offset for most slots, 8° for peak. + Top canopy stays ≈ 80–90% sunlit. + Sacrifice: ≈ 0.04–0.08 kWh per slot. + +14:00 θ = θ_astro + 5° (MAINTAINING) + CWSI still elevated but no longer rising. + Minimum dose maintained. + +15:00 θ = θ_astro + 3° (DE-ESCALATING) + CWSI dropping to 0.38. + +15:30 θ = θ_astro (BACK TO FULL TRACKING) + Gate blocked: stress_insufficient (CWSI = 0.28) + Immediate return to full energy generation. + +16:00-19:00 θ = θ_astro (FULL TRACKING) + Vine recovering, afternoon light for late photosynthesis. + +Total day sacrifice: ≈ 1.2 kWh out of ≈ 25 kWh potential (≈ 4.8%) +Shading duration: ≈ 4.5 hours out of ≈ 14 hours of daylight +Budget used: within daily allocation + small margin draw +``` + +##### 3.2.5 The Seasonal Pattern + +``` +MAY: 100% full tracking. Zero sacrifice. Zero intervention. + Vine establishing canopy, flowering, fruit set. + Every photon is valuable. Budget allocation: 0%. + +JUNE: ≈ 99% full tracking. Rare intervention on extreme days (>38C). + Maybe 2–3 days in the month trigger 1–2 hours of shading. + Budget allocation: 5%. + +JULY: ≈ 85% full tracking. Daily midday shading ≈ 3–5 hours. + This is where the budget is consumed. + Typical: 3–5° offset, 11:00–15:00. + Budget allocation: 45%. + +AUGUST: ≈ 85% full tracking. Similar to July but with fruit ripening. + Berry sunburn is the primary concern now. + Fruiting zone targeting is most critical this month. + Budget allocation: 40%. + +SEPT: ≈ 95% full tracking. Occasional late heat waves. + Pre-harvest period: balance sugar/acid/phenolics. + Budget allocation: 10%. + +SEASON TOTAL: ≈ 92% of time at full astronomical tracking. + ≈ 8% of time with minimum-dose shading. + Energy sacrifice: ≤ 5% (guaranteed by budget ceiling). +``` + +--- + +#### 3.3 Command Arbiter — `src/command_arbiter.py` + +##### 3.3.1 Priority Stack + +``` +Priority 1 (highest): Weather Protection → stow angle +Priority 2: Mechanical Harvesting → vertical park (90°) +Priority 3: Safety Rail Alert → θ_astro (zero sacrifice) +Priority 4: Simulation Timeout → θ_astro (zero sacrifice) +Priority 5 (normal): TradeoffEngine output → θ_astro or θ_astro + offset +``` + +All fallbacks default to **full astronomical tracking** — the safe, energy-maximizing default. There is no scenario where a fallback costs energy. + +##### 3.3.2 Hysteresis — Motor Protection + +```python +class CommandArbiter: + def __init__(self, hysteresis_window_min=15, angle_tolerance_deg=2.0): + self.window_min = hysteresis_window_min + self.tolerance = angle_tolerance_deg + self.buffer = [] + self.current_angle = 0.0 + + def should_move(self, requested_angle, timestamp): + self.buffer.append((timestamp, requested_angle)) + cutoff = timestamp - pd.Timedelta(minutes=self.window_min) + self.buffer = [(t, a) for t, a in self.buffer if t >= cutoff] + + if len(self.buffer) < 2: + return {"dispatch": False, "angle": self.current_angle} + + stable = all(abs(a - requested_angle) <= self.tolerance + for _, a in self.buffer) + if stable: + self.current_angle = requested_angle + return {"dispatch": True, "angle": requested_angle} + return {"dispatch": False, "angle": self.current_angle} + + def select_source(self, engine_result, safety_result, + sim_time_sec, weather_override, harvest_active): + if weather_override: + return {"angle": weather_override["target_angle"], + "source": "weather"} + if harvest_active: + return {"angle": 90, "source": "harvest"} + if not safety_result["valid"]: + return {"angle": engine_result.get("angle", 0), + "source": "safety_fallback"} + if sim_time_sec > SIMULATION_TIMEOUT_SEC: + return {"angle": engine_result.get("angle", 0), + "source": "timeout_fallback"} + return {"angle": engine_result["angle"], + "source": "engine"} +``` + +##### 3.3.3 Return-to-Tracking Speed + +When the gate closes (stress drops below threshold), the system returns to full astronomical tracking **at the next 15-min slot** — no ramp-down, no smoothing. The vine transitions from Rubisco-limited back to RuBP-limited and immediately wants full light. The hysteresis only prevents sub-slot jitter; it does not delay the return-to-tracking decision across slots. + +--- + +#### 3.4 Astronomical Tracker (Fallback) — `src/astronomical_tracker.py` + +```python +class AstronomicalTracker: + """Pure sun-following. The always-safe default.""" + def __init__(self, shadow_model): + self.shadow = shadow_model + + def get_angle(self, timestamp): + sp = self.shadow.get_solar_position(pd.DatetimeIndex([timestamp])) + result = self.shadow.compute_tracker_tilt( + sp["solar_azimuth"].iloc[0], sp["solar_elevation"].iloc[0]) + return result["tracker_theta"] +``` + +--- + +#### 3.5 The Complete 15-Minute Control Loop + +``` +┌────────────────────────────────────────────────────────────────┐ +│ STEP 1: READ SENSORS │ +│ PAR, Tleaf, Tair, CO2, VPD (on-site) │ +│ GHI, wind, Tmax (IMS) │ +│ CWSI (from SpectralAggregator) │ +│ │ +│ STEP 2: COMPUTE θ_astro (pvlib) │ +│ This is the default. System starts here. │ +│ │ +│ STEP 3: CHECK WEATHER / HARVEST OVERRIDES │ +│ Weather stow? → dispatch stow angle. END. │ +│ Harvest mode? → dispatch 90°. END. │ +│ │ +│ STEP 4: RUN INTERVENTION GATE │ +│ No-shade window? → θ = θ_astro. END. │ +│ Shade conditions not met? → θ = θ_astro. END. │ +│ FvCB says shade hurts? → θ = θ_astro. END. │ +│ │ +│ STEP 5: BUDGET CHECK │ +│ slot_budget + margin > 0? → proceed │ +│ No budget? → θ = θ_astro. END. │ +│ │ +│ STEP 6: MINIMUM DOSE SEARCH │ +│ Scan offsets 3°, 5°, 8°, 10°, 15°, 20° (smallest first) │ +│ For each: ray-trace → check fruiting zone PAR < 400 │ +│ check top canopy > 70% sunlit │ +│ check sacrifice ≤ available budget │ +│ Select FIRST (smallest) offset that passes all checks. │ +│ No offset works? → θ = θ_astro. END. │ +│ │ +│ STEP 7: SAFETY RAILS │ +│ FvCB vs ML divergence > 12%? → θ = θ_astro. END. │ +│ │ +│ STEP 8: COMMAND ARBITER │ +│ Apply hysteresis (15-min stability, ±2° tolerance) │ +│ Stable? → dispatch move command. │ +│ Not stable? → hold current angle. │ +│ │ +│ STEP 9: BUDGET ACCOUNTING │ +│ Record sacrifice. Update daily margin. │ +│ If zero sacrifice: slot budget rolls forward as savings. │ +└────────────────────────────────────────────────────────────────┘ +``` + +--- + +#### 3.6 Edge Cases and Guarantees + +| Scenario | System Response | +|---|---| +| Heat wave, 5 days of 42°C | Daily budgets consumed rapidly. Weekly reserve engaged. If exhausted, annual reserve drawn. If ALL reserves empty → full tracking (energy guarantee holds). | +| Cool July week (Tmax 28°C) | Weekly Tmax < 30°C → daily budgets = 0. Gate never opens. Full tracking. Entire week's budget rolls forward to next week. | +| Morning heat spike (09:30, Tleaf 33°C, CWSI 0.5) | Gate BLOCKED: before 10:00. Morning light is protected regardless of stress level. | +| May heat wave (Tmax 40°C) | Gate BLOCKED: May is a no-shade month. Full tracking. Budget for May = 0. Vine exposed but this is critical for fruit set; spring stress is accepted. | +| CWSI = 0.45 but FvCB says shading hurts | Gate BLOCKED: `shading_helps = False`. This means Aj < Ac even above 30°C (e.g., late afternoon with declining PAR). Vine is actually light-limited despite stress signals. No intervention. | +| Offset 3° protects fruit zone sufficiently | Selected immediately (smallest effective dose). Sacrifice minimized. Top canopy stays 95% sunlit. Energy cost: ~0.03 kWh per slot. | +| No offset protects fruit zone within budget | No intervention. System stays at θ_astro. Action = "no_effective_dose_found". Budget preserved. | + +--- + +### Phase 4: Operational Modes + +#### 4.1 `src/operational_modes.py` + +```python +class OperationalModes: + def check_weather_protection(self, weather_state): + if weather_state.get("hail_alert"): + return {"mode": "hail_stow", "target_angle": 75} + if weather_state.get("wind_speed_ms", 0) > WIND_STOW_SPEED_MS: + return {"mode": "wind_stow", "target_angle": 0} + if (weather_state.get("air_temp_c", 0) > HEAT_SHIELD_TEMP_C + and weather_state.get("cwsi", 0) > HEAT_SHIELD_CWSI): + return {"mode": "heat_shield", "target_angle": "maximize_shade"} + return None + + def enter_harvest_mode(self): + return {"mode": "harvest", "target_angle": 90, + "clearance_cm": HARVEST_PARK_CLEARANCE_CM, + "vibration_alarms_disabled": True} +``` + +Weather and harvest overrides do NOT consume budget. They either generate full energy (wind stow at 0°, harvest at 90°) or protect hardware (hail stow at 75°). The heat shield mode is the only one that costs energy, and it draws from the budget system. + +--- + +### Phase 5: ROI Reporting + +#### 5.1 `src/roi_service.py` + +Reports on budget utilization and biological effectiveness: +- Budget spent vs allocated (daily, weekly, monthly, annual) +- Number of intervention slots and total shading hours +- Fruiting zone temperature during interventions (was it effective?) +- Energy sacrifice as % of potential (must always be ≤ user ceiling) +- LER computation + +--- + +### Phase 6: Dashboard v2 + +New tabs in `app.py`: +- **Budget Planner** — Annual/monthly/weekly/daily budget gauges, rollover visualization, margin utilization +- **Control Replay** — Select a day, step through 15-min slots, see gate decisions, offset selection, shadow projection on fruiting zone +- **Fruiting Zone Monitor** — PAR and temperature at mid-canopy over time, sunburn risk indicator +- **ROI Dashboard** — Cumulative sacrifice vs ceiling, LER, intervention frequency + +--- + +### Phase 7: Integration Testing + +#### 7.1 `scripts/run_control_simulation.py` + +Replay historical data through the full control loop. + +#### 7.2 Validation Criteria + +- **Hard guarantee**: cumulative sacrifice NEVER exceeds `max_energy_reduction_pct` +- **Default tracking rate**: > 90% of daytime slots remain at full astronomical tracking +- **Gate accuracy**: no interventions in no-shade windows (May, mornings, low stress) +- **Minimum dose**: average intervention offset < 10° (small, surgical corrections) +- **Fruiting zone effectiveness**: during interventions, mid-canopy PAR reduced below 400 umol target in > 80% of cases +- **Top canopy preservation**: during interventions, top canopy sunlit fraction > 70% in all cases +- **Budget utilization**: July–August consume > 80% of total budget; May consumes 0% + +--- + +## Agronomic Value Weighting + +A unit of carbon assimilated by the vine does not have a fixed value. Its contribution to the final economic yield depends on **which leaf zone** is doing the work and the **phenological stage** of the vine. The control algorithm must account for both dimensions when evaluating whether a candidate angle is worth its energy cost. + +### Spatial Weighting: Contribution by Canopy Zone + +The 3-zone ShadowModel maps directly to the vine's source-sink physiology: + +#### Zone 0 — Basal Leaves (trunk/cordons, ~0.2m, LAI 15%) + +Early in the season, these mature leaves provide the primary carbon source for developing inflorescences. As the season progresses they age and photosynthetic efficiency declines. Removing them later (basal defoliation) has minimal negative impact because their efficiency is already low. + +**Algorithmic implication**: Photons reaching zone 0 have declining marginal value as the season progresses. By veraison, shading zone 0 carries almost no penalty. + +#### Zone 1 — Fruiting Zone (grape clusters, ~0.6m, LAI 35%) + +The grape clusters themselves do not photosynthesize, but the leaves interspersed at this height supply carbon directly to the berries via short transport paths. Berry quality (anthocyanins, phenolics, flavor compounds) develops best under filtered/diffuse light — not harsh direct radiation. Berry surface temperatures above 35°C cause sunburn. + +**Algorithmic implication**: This zone's light environment is the primary optimization target. The goal is not maximum PAR but *optimal* PAR — enough for quality development, below the sunburn threshold (400 µmol/m²/s target). + +#### Zone 2 — Apical/Lateral Leaves (upper canopy, ~1.0m, LAI 50%) + +Young developing leaves do not export carbon until they reach ~50% of final size. However, from veraison onwards, these mid-to-apical leaves and lateral shoots become the most efficient photosynthetic engines — they drive sugar accumulation (°Brix) in the berries. + +**Algorithmic implication**: Photons hitting zone 2 during ripening have the highest marginal value. The minimum-dose search already enforces >70% sunlit fraction on zone 2; the spatial weight reinforces this — sacrificing zone 2 light is the most expensive possible intervention. + +#### Zone-Weighted Crop Value + +When the TradeoffEngine evaluates a candidate offset, the crop value of the resulting light distribution is: + +```python +# Spatial value weights by zone (phenology-dependent) +ZONE_CROP_WEIGHTS = { + "pre_veraison": [0.25, 0.35, 0.40], # zone 0, 1, 2 + "veraison": [0.10, 0.30, 0.60], # apical leaves dominate sugar loading + "post_harvest": [0.15, 0.15, 0.70], # reserve building, top canopy matters most +} + +def zone_weighted_crop_value(A_zones, par_zones, stage, base_crop_value): + """Compute the economic crop value of a given light distribution.""" + weights = ZONE_CROP_WEIGHTS[stage] + weighted_A = sum(w * A for w, A in zip(weights, A_zones)) + return base_crop_value * weighted_A +``` + +--- + +### Temporal Weighting: Contribution across Growth Stages + +The vine's carbon demands shift drastically throughout the season. The crop value multiplier must scale dynamically based on phenological stage, tracked via Growing Degree Days (GDD): + +#### Pre-Flowering to Fruit Set (May–early June) + +Carbon reserves from trunk and roots are mobilized to support early shoot growth. Maximum daily temperatures and radiation during this window have the largest statistical impact on determining bunch number and overall yield mass. + +**Value**: High. Maximizing photosynthesis sets the baseline yield capacity. +**Budget policy**: NO_SHADE_MONTHS = [5] already enforces this — zero intervention, full astronomical tracking. + +#### Fruit Set to Veraison (June–mid July) + +Rapid berry cell division. Canopy expanding. Carbon demand is high but the vine is generally not yet heat-stressed (Negev temperatures rising but not yet at sustained peaks). + +**Value**: High. Intervention rare; the gate's CWSI and temperature thresholds protect this window naturally. +**Seasonal multiplier**: 1.0× (baseline). + +#### Veraison to Ripening (mid July–August) + +The fruit becomes the dominant carbon sink. Vegetative growth slows to allow preferential carbon redistribution into berries. The ratio of leaf area to fruit weight directly dictates berry mass, sugar concentration, and anthocyanin accumulation. + +**Value**: Extremely high, but with a thermal caveat. Above 30°C, carbon assimilation is hampered and organic acids degrade. This is where the intervention system earns its keep — protecting the fruiting zone from sunburn while keeping the top canopy productive for sugar loading. +**Seasonal multiplier**: 1.5× (reflects that each unit of photosynthesis during ripening has disproportionate impact on final grape value). + +#### Post-Harvest (September–October) + +Berries are gone. The carbon sink shifts back to roots and trunk for starch storage (next spring's budburst reserves). + +**Value**: Moderate. The system only needs to maintain sufficient photosynthesis to replenish reserves. The tracker can heavily favor energy generation. +**Seasonal multiplier**: 0.5× (energy production prioritized). + +#### Phenology Tracker + +```python +# Growing Degree Day thresholds for Semillon (Sde Boker) +PHENOLOGY_GDD_THRESHOLDS = { + "budburst": 0, # GDD base, ~March + "flowering": 350, # ~May + "fruit_set": 500, # ~early June + "veraison": 1200, # ~mid July + "harvest": 1800, # ~late August / September +} + +STAGE_CROP_MULTIPLIER = { + "pre_flowering": 1.2, # setting yield capacity + "fruit_set": 1.0, # baseline + "veraison": 1.5, # sugar loading, highest crop value + "post_harvest": 0.5, # reserve building only +} + +def get_phenological_stage(gdd_cumulative): + """Return current growth stage based on accumulated GDD.""" + if gdd_cumulative < PHENOLOGY_GDD_THRESHOLDS["flowering"]: + return "pre_flowering" + elif gdd_cumulative < PHENOLOGY_GDD_THRESHOLDS["veraison"]: + return "fruit_set" + elif gdd_cumulative < PHENOLOGY_GDD_THRESHOLDS["harvest"]: + return "veraison" + else: + return "post_harvest" +``` + +--- + +### Predicting Baseline Photosynthesis + +To assess whether a candidate angle's photosynthesis sacrifice is acceptable, the system needs a baseline prediction — the expected photosynthesis under full astronomical tracking for the day ahead. + +#### Mechanistic Baseline (FvCB) + +The existing Farquhar model computes A at each 15-min slot under full tracking. This serves as the denominator: `A_baseline(t) = FvCB(PAR_astro(t), Tleaf_forecast(t), CO2, VPD_forecast(t))`. + +#### ML-Enhanced Baseline (Auto-regressive) + +The Stage 2 ML predictor (RF/XGBoost) ingests the previous day's metrics (approximated A, CWSI, soil moisture) and day-ahead IMS weather forecast (radiation, temperature, wind) to predict next-day A at each slot. This catches microclimate effects the pure mechanistic model may miss. + +#### Hybrid Consensus + +```python +def predict_baseline_ps(slot, farquhar_model, ml_predictor, weather_forecast): + """Predict baseline photosynthesis (full tracking) for a future slot.""" + A_fvcb = farquhar_model.calc_photosynthesis( + weather_forecast["par"], weather_forecast["tleaf"], + weather_forecast["co2"], weather_forecast["vpd"], + weather_forecast["tair"]) + + A_ml = ml_predictor.predict(weather_forecast) + + # Safety rails: if FvCB and ML diverge > 12%, flag uncertainty + divergence = abs(A_fvcb - A_ml) / max(A_fvcb, A_ml, 1e-6) + if divergence > DIVERGENCE_THRESHOLD: + return A_fvcb, {"confident": False, "divergence": divergence} + + # Weighted average (FvCB anchored, ML corrects) + A_baseline = 0.6 * A_fvcb + 0.4 * A_ml + return A_baseline, {"confident": True, "divergence": divergence} +``` + +--- + +## Day-Ahead Trajectory Optimization + +The real-time control loop (Phase 3) makes slot-by-slot decisions. A greedy per-slot approach can cause excessive motor movement and misallocate the daily budget. A **day-ahead planner** uses Discrete Dynamic Programming to compute the optimal trajectory for the entire day, which the real-time arbiter then executes (or overrides if live sensor data diverges from forecast). + +### Algorithm: Day-Ahead Agrivoltaic Trajectory Optimization + +#### Step 1: Retrieve Inputs + +For the next 24-hour horizon (96 slots at 15-min intervals): + +| Input | Source | +|---|---| +| GHI, DHI, ambient temp, wind | IMS station 43 day-ahead forecast | +| Energy market price `Price_energy(t)` | Grid tariff schedule (or flat rate for now) | +| Crop value `Price_crop(t)` | Phenology stage multiplier × base crop value per hectare | +| Baseline PS `A_baseline(t)` | Hybrid FvCB + ML prediction (see above) | +| Candidate angles Θ | `CANDIDATE_OFFSETS` mapped to absolute angles: `{θ_astro(t) + offset}` for each slot | + +#### Step 2: Pre-compute State Space + +For every slot `t` and every candidate angle `θ ∈ Θ`, pre-compute: + +- **`E_t(θ)`**: Expected PV energy generation, accounting for sun position and cosine losses +- **`A_t(θ)`**: Predicted photosynthesis, from ray-traced PAR distribution at angle θ through the FvCB model +- **Gate status**: Whether the intervention gate would allow θ ≠ θ_astro at slot t (no-shade windows, temperature thresholds, etc.) + +Slots where the gate blocks intervention are locked to `θ_astro` — the DP does not consider alternatives for those slots. + +#### Step 3: Utility Function + +For each slot `t` and angle `θ`: + +``` +U_t(θ) = Price_energy(t) · E_t(θ) + Price_crop(t) · A_t(θ) +``` + +The crop price term incorporates: +- The **phenological multiplier** (1.5× during veraison, 0.5× post-harvest) +- The **spatial zone weights** (penalizes angles that shade zone 2 more than angles that shade zone 0) +- A **heat-stress penalty** when forecasted Tleaf > 30°C and the angle exposes the fruiting zone to direct sun + +#### Step 4: Dynamic Programming with Movement Cost + +A greedy approach (best angle per slot independently) causes excessive motor wear. The DP includes a mechanical movement penalty: + +``` +max Σ_{t=0}^{96} [ U_t(θ_t) - Cost_move · |θ_t - θ_{t-1}| ] +``` + +- **Forward pass**: For each slot, compute the optimal cumulative utility to reach each candidate angle, considering all possible transitions from the previous slot. +- **Backward pass**: Trace back from slot 96 to extract the single optimal angle sequence `[θ_0, θ_1, ..., θ_96]`. + +The movement cost biases the optimizer toward smooth trajectories — holding a consistent offset during the midday stress window rather than oscillating between angles. + +#### Step 5: Budget Constraint Integration + +The DP trajectory must respect the daily energy budget: + +``` +Σ_{t=0}^{96} [ E_t(θ_astro) - E_t(θ_t) ] ≤ daily_budget_kWh +``` + +This is enforced as a constraint during the forward pass: any path whose cumulative sacrifice exceeds the daily budget is pruned. The DP naturally finds the trajectory that maximizes combined utility while staying within the energy ceiling. + +#### Step 6: Output — `daily_plan.json` + +The optimizer outputs a schedule with explainability tags: + +```python +{ + "date": "2025-07-15", + "slots": [ + { + "time": "05:00", "angle": 45.2, "offset": 0, + "action": "full_tracking", + "tag": "Morning protected — maximizing photosynthesis" + }, + { + "time": "11:15", "angle": 48.7, "offset": 5, + "action": "minimum_dose_shade", + "tag": "Sacrificing 0.04 kWh to protect fruiting zone (Tleaf=33°C)" + }, + { + "time": "15:30", "angle": 32.1, "offset": 0, + "action": "full_tracking", + "tag": "Stress subsided — maximizing energy revenue" + } + ], + "total_sacrifice_kWh": 1.18, + "daily_budget_kWh": 1.35, + "budget_remaining_kWh": 0.17 +} +``` + +### Relationship to Real-Time Control + +The day-ahead plan is a **schedule**, not a command. The real-time arbiter (Phase 3.3) executes the planned trajectory but can override it when: + +- Live sensor data diverges significantly from the forecast (e.g., unexpected cloud cover, sudden heat spike) +- Weather protection or harvest mode is triggered (Priority 1–2 overrides) +- The safety rails detect FvCB vs ML divergence > 12% + +When the arbiter overrides the plan, it falls back to the real-time gate + minimum-dose logic. The daily plan is recalculated at sunrise each morning using the latest forecast. + +``` +DAY-AHEAD PLANNER (runs once at sunrise) + │ + ▼ daily_plan.json +REAL-TIME ARBITER (runs every 15 min) + ├── Plan matches live conditions? → Execute planned angle + ├── Live conditions diverge? → Fall back to real-time gate + min-dose + └── Emergency override? → Weather stow / harvest park +``` + +### New Module: `src/day_ahead_planner.py` + +```python +class DayAheadPlanner: + """Discrete DP optimizer for day-ahead tracker trajectory.""" + + def __init__(self, shadow_model, canopy_model, farquhar_model, + ml_predictor, energy_budget): + self.shadow = shadow_model + self.canopy = canopy_model + self.farquhar = farquhar_model + self.ml_predictor = ml_predictor + self.budget = energy_budget + self.gate = InterventionGate() + + def generate_plan(self, date, weather_forecast, energy_prices, + crop_value_base, gdd_cumulative, + daily_budget_kWh, cost_move=0.01): + """Generate optimal angle trajectory for the next day. + + Args: + date: Target date + weather_forecast: 96-slot weather forecast DataFrame + energy_prices: 96-slot price vector ($/kWh) + crop_value_base: Base crop value ($/hectare/season) + gdd_cumulative: Growing degree days to date + daily_budget_kWh: Max allowed energy sacrifice + cost_move: Penalty per degree of motor movement + + Returns: + Daily plan dict with angle sequence and explainability tags. + """ + stage = get_phenological_stage(gdd_cumulative) + crop_multiplier = STAGE_CROP_MULTIPLIER[stage] + zone_weights = ZONE_CROP_WEIGHTS.get( + "veraison" if stage == "veraison" else + "post_harvest" if stage == "post_harvest" else + "pre_veraison") + + # Pre-compute state space + n_slots = len(weather_forecast) + candidates = self._build_candidate_angles(weather_forecast) + utility, energy, gate_locked = self._precompute( + weather_forecast, candidates, energy_prices, + crop_value_base, crop_multiplier, zone_weights) + + # DP forward pass with budget constraint + trajectory = self._dp_optimize( + utility, energy, gate_locked, candidates, + daily_budget_kWh, cost_move) + + # Generate explainability tags + plan = self._build_plan(date, trajectory, weather_forecast, + utility, energy, daily_budget_kWh) + return plan +``` + +--- + +## File Summary + +| File | Purpose | +|---|---| +| `src/energy_budget.py` | Hierarchical Year→Month→Week→Day→Slot budget planner | +| `src/tradeoff_engine.py` | InterventionGate + minimum-dose offset search | +| `src/command_arbiter.py` | Fallback logic, hysteresis, priority stack | +| `src/safety_rails.py` | FvCB vs ML divergence validation | +| `src/spectral_aggregator.py` | CWSI/NDVI/PRI batch preprocessing | +| `src/astronomical_tracker.py` | pvlib single-axis fallback | +| `src/operational_modes.py` | Weather protection + harvesting | +| `src/roi_service.py` | Budget utilization + LER reporting | +| `src/data_schema.py` | Telemetry table definitions | +| `src/day_ahead_planner.py` | DP trajectory optimizer + agronomic value weighting | +| `scripts/import_layout.py` | Spatial asset registration | +| `scripts/run_control_simulation.py` | End-to-end historical replay | +| `src/licor_ingest.py` | LiCor data parsing, validation, and storage | +| `src/calibration_pipeline.py` | Parameter fitting + model retraining + versioned deployment | +| `scripts/upload_licor.py` | CLI script for batch LiCor upload | + +| Modified File | Changes | +|---|---| +| `src/farquhar_model.py` | `calc_photosynthesis_semillon()` → returns (A, state, shading_helps) | +| `src/solar_geometry.py` | `fruiting_zone_shadow()`, `evaluate_candidate_offsets()` | +| `src/canopy_photosynthesis.py` | Expose `fruiting_zone_A`, `fruiting_zone_par`, `top_canopy_A` | +| `config/settings.py` | No-shade windows, fruiting zone params, budget config, candidate offsets | +| `app.py` | Budget Planner, Control Replay, Fruiting Zone Monitor, ROI tabs | + +--- + +### Phase 8: LiCor Ground-Truth Calibration Pipeline + +#### 8.1 Background + +Manual LiCor measurements (LI-6400/6800 portable gas-exchange systems) provide the highest-fidelity ground-truth photosynthesis data available — direct leaf-level A, gs, Ci, and transpiration measured under controlled chamber conditions. These readings serve as the gold standard for calibrating and validating the Farquhar model and the ML prediction pipeline. + +#### 8.2 Module: `src/licor_ingest.py` + +Dedicated ingestion module for LiCor calibration datasets: + +```python +class LiCorIngest: + """Ingest, validate, and store manual LiCor gas-exchange measurements. + + Accepts Excel/CSV exports from LI-6400/6800 instruments. + Maps LiCor columns (Photo, Cond, Ci, Trmmol, Tleaf, PARi, etc.) + to internal schema and stores as ground-truth reference data. + """ + + LICOR_COLUMN_MAP = { + "Photo": "A_measured", # µmol CO₂ m⁻² s⁻¹ + "Cond": "gs_measured", # mol H₂O m⁻² s⁻¹ + "Ci": "Ci_measured", # µmol mol⁻¹ + "Trmmol": "E_measured", # mmol H₂O m⁻² s⁻¹ + "Tleaf": "Tleaf_measured", # °C + "PARi": "PAR_measured", # µmol m⁻² s⁻¹ + "VpdL": "VPD_measured", # kPa + } + + def ingest(self, file_path: str, metadata: dict) -> pd.DataFrame: + """Parse LiCor export, validate ranges, attach metadata + (date, vine ID, zone, operator), return clean DataFrame.""" + ... + + def validate(self, df: pd.DataFrame) -> dict: + """Range checks: A in [-5, 35], PAR in [0, 2500], Tleaf in [10, 55]. + Flag outliers and instrument errors (e.g., negative gs).""" + ... + + def store(self, df: pd.DataFrame, dest_dir: str): + """Append to ground-truth archive (Parquet partitioned by date).""" + ... +``` + +#### 8.3 API Endpoint for Calibration Upload + +A dedicated endpoint (FastAPI or Streamlit file-upload widget) that: + +1. **Accepts** LiCor datasets (CSV/Excel upload with metadata: date, vine ID, canopy zone, operator notes) +2. **Validates** data integrity and physiological plausibility +3. **Triggers** a re-training / fine-tuning pipeline: + - Recalibrate Farquhar model parameters (Vcmax25, Jmax25, Rd) by fitting to LiCor A-Ci curves + - Fine-tune ML regressors (Stage 2) using LiCor A as ground-truth labels instead of Farquhar-derived A + - Optionally fine-tune Chronos-2 LoRA adapter on the updated label set +4. **Versions** the updated model artifacts (model registry with timestamp, LiCor dataset hash, metrics delta) +5. **Promotes** the new model version to production only if validation metrics improve (gated deployment) + +```python +class CalibrationPipeline: + """End-to-end: LiCor upload → parameter fitting → model retraining → versioned deployment.""" + + def run(self, licor_df: pd.DataFrame, current_model_version: str) -> dict: + """ + 1. Fit Farquhar params to A-Ci curves → updated Vcmax25, Jmax25 + 2. Regenerate Stage 1 labels using calibrated Farquhar + 3. Retrain Stage 2 ML models on calibrated labels + 4. Evaluate on held-out LiCor validation set + 5. If RMSE improves ≥ 5%: promote new version + Else: keep current version, log comparison + """ + ... +``` + +#### 8.4 Files + +| File | Purpose | +|---|---| +| `src/licor_ingest.py` | LiCor data parsing, validation, and storage | +| `src/calibration_pipeline.py` | Parameter fitting + model retraining + versioned deployment | +| `scripts/upload_licor.py` | CLI script for batch LiCor upload | + +--- + +--- + +## Phase 10: Reliable Advisor — Anti-Hallucination Guardrails + +### Problem + +The Gemini chatbot (Phase 9/9.5) hallucinated: it could fabricate sensor readings, +recommend shading that violates biology rules, and answer data questions from +training knowledge instead of calling tools. No grounding verification existed. + +### Architecture + +``` +User Query + ↓ +QueryClassifier (regex) ← Step 2: data / knowledge / greeting + ↓ +Gemini Pass 1 + ↓ +Tool call missing + data query? ← Step 2: re-prompt to force tool use + ↓ +_dispatch_tool() + ↓ +tag_tool_result() ← Step 4: source label + data age + freshness warning + ↓ +Gemini Pass 2 (with source citation instructions) + ↓ +validate_response() ← Step 3: deterministic rule checks (block / warn) + ↓ +estimate_confidence() ← Step 7: high / medium / low / insufficient_data + ↓ +ChatResponse ← Step 1: structured schema with metadata + ↓ +UI: render confidence badge, sources, caveats +``` + +### Components + +| Component | File | Role | +|-----------|------|------| +| `QueryClassifier` | `src/chatbot/guardrails.py` | Regex-based query routing: forces tool calls for data questions | +| `ResponseValidator` | `src/chatbot/guardrails.py` | Deterministic post-response check against biology rules | +| `estimate_confidence` | `src/chatbot/guardrails.py` | Data freshness → confidence level mapping | +| `tag_tool_result` | `src/chatbot/guardrails.py` | Adds `_source`, `_data_age_minutes`, `_freshness_warning` to tool results | +| `ChatResponse` | `src/chatbot/vineyard_chatbot.py` | Extended with `confidence`, `sources`, `caveats`, `rule_violations` | +| `_render_grounding_metadata` | `ui/tab_advisor.py` | Renders confidence badge, source citations, caveats in UI | + +### Validation rules enforced + +| Rule | Severity | Trigger | +|------|----------|---------| +| `no_shade_before_10` | **Block** | Response recommends shading before 10:00 | +| `no_shade_in_may` | **Block** | Response recommends shading in May without citing extreme conditions | +| `temperature_transition` | Warn | Response recommends shading below 28°C | +| `no_leaves_no_shade_problem` | Warn | Response recommends shading during dormancy | +| `no_shading_must_explain` | Warn | Response says "don't shade" without giving a biological reason | + +Block = response text overridden; Warn = caveat appended. + +### Confidence mapping + +| Condition | Confidence | +|-----------|------------| +| Tool succeeded, data < 30 min | **High** | +| Tool succeeded, data 30–120 min | **Medium** | +| Tool succeeded, data > 120 min | **Low** | +| No tool called | **Low** | +| Tool failed | **Insufficient data** | +| Computed result (FvCB, sim) | **High** | + +### Remaining steps (future phases) + +- **Step 5 — RAG knowledge base**: Move biology rules from prompt stuffing to searchable documents; inject only relevant rules per query +- **Step 6 — Conversation memory**: Sliding context window with session summary; pin critical context (vine state, active alerts) +- **Step 8 — Guardrail test suite**: Automated adversarial prompts run on every prompt/model change (5 QA tests implemented, expand to 20+) +- **Step 9 — Dual-channel advisory**: Separate information mode (blue, factual) from advisory mode (amber, recommendations with reasoning chain) +- **Step 10 — Feedback loop**: Thumbs up/down, "flag as incorrect" button, weekly failure-mode review + +--- + +## Dependency Order + +``` +Phase 1 (Config + Schema) + │ + ▼ +Phase 2 (FvCB Semillon + Fruiting Zone Shadow + Safety Rails) + │ + ▼ +Phase 3 (InterventionGate + MinDose Engine + Budget + Arbiter) ← CORE + │ + ▼ +Phase 3.5 (Agronomic Weighting + Day-Ahead DP Planner) + │ + ▼ +Phase 4 (Operational Modes) + │ + ▼ +Phase 5 (ROI Service) + │ + ▼ +Phase 6 (Dashboard v2) + │ + ▼ +Phase 7 (Integration Testing + Budget Guarantee Validation) + │ + ▼ +Phase 8 (LiCor Ground-Truth Calibration Pipeline) + │ + ▼ +Phase 9/9.5 (Vineyard Advisor Chatbot + Data Integration) + │ + ▼ +Phase 10 (Reliable Advisor — Anti-Hallucination Guardrails) +``` diff --git a/context/3_todo.md b/context/3_todo.md new file mode 100644 index 0000000000000000000000000000000000000000..6eaa021a04c24d015fb5aed09d7cb6f1113b46a6 --- /dev/null +++ b/context/3_todo.md @@ -0,0 +1,555 @@ +# SolarWine – Todo Tracker + +This file mirrors the high-level plan in `2_plan.md` and tracks day-to-day progress. + +--- + +## Baseline v1 (Complete) + +- [x] **scaffold** – project directory structure, `.env`, `.gitignore`, `requirements.txt` +- [x] **context-files** – create `context/1_purpose.md`, `context/2_plan.md`, `context/3_todo.md` +- [x] **git-init** – create git repository and make initial commit +- [x] **oop-architecture** – implement OOP modules in `src/` +- [x] **ims-fetch** – implement `IMSClient` and cache IMS data +- [x] **stage1-farquhar** – implement mechanistic Farquhar/Greer–Weedon model +- [x] **stage1-validate** – validate Stage 1 A outputs and plots +- [x] **stage2-preprocess** – preprocessing and temporal split +- [x] **stage2-models** – train and evaluate ML models +- [x] **stage2-visualize** – build evaluation visualizations +- [x] **streamlit-app** – build Streamlit UI (6 tabs) + +--- + +## SolarWine 2.0 + +### Phase 1: Configuration & Data Infrastructure + +- [x] **config-extend** – add energy budget, no-shade windows, fruiting zone, and tradeoff params to `config/settings.py` (most params added in earlier session; no-shade windows `NO_SHADE_BEFORE_HOUR`, `NO_SHADE_MONTHS`, `NO_SHADE_GHI_BELOW`, `NO_SHADE_TLEAF_BELOW` and `SHADE_ELIGIBLE_HOURS` added 2026-03-10; guardrails wired to reference settings) +- [x] **data-schema** – `src/data/data_schema.py` (telemetry dataclasses: SensorRaw, BiologicalState, TrackerKinematics, SimulationLog). Re-exported via `src/data_schema.py` +- [x] **import-layout** – `scripts/import_layout.py` generates `Data/layout.json` from config geometry + TB device registry (4 rows, 22 devices with 3D positions). Added 2026-03-10 + +### Phase 2: Biological Digital Twin Upgrades + +- [x] **fvcb-semillon** – upgrade `src/farquhar_model.py` with `calc_photosynthesis_semillon()` → returns (A, limiting_state, shading_helps). Added 2026-03-10: uses configurable `transition_temp` (default `SEMILLON_TRANSITION_TEMP_C=30°C`); `shading_helps` is True only when Rubisco-limited AND Aj > Ac (light abundant relative to enzyme capacity) +- [x] **shadow-fruiting** – upgrade `src/solar_geometry.py` with `fruiting_zone_shadow()` and `evaluate_candidate_offsets()` (added 2026-03-10) +- [x] **canopy-expose** – `compute_vine_A()` now returns `fruiting_zone_A`, `fruiting_zone_par`, `top_canopy_A`, `top_canopy_par` alongside existing fields. Added 2026-03-10 +- [x] **safety-rails** – `src/advisor/safety_rails.py` (FvCB vs ML divergence check, 12% threshold → fallback). Re-exported via `src/safety_rails.py` +- [x] **spectral-agg** – `src/spectral_aggregator.py` with `aggregate_spectral()` (single-timestep) and `aggregate_spectral_df()` (batch DataFrame). CWSI from explicit value → delta-T proxy → VPD fallback. Physical bounds clipping with quality flags. Added 2026-03-10 + +### Phase 3: The Control Algorithm (Core) + +- [x] **energy-budget** – create `src/energy_budget.py` (hierarchical Year→Month→Week→Day→Slot budget planner). Added 2026-03-10: `EnergyBudgetPlanner` with `compute_annual_plan()`, `compute_weekly_plan()`, `compute_daily_plan()`, `spend_slot()`, `emergency_draw()`, `compute_daily_rollover()`. Analytical fallback when no ShadowModel. Budget: ~920 kWh potential → 46 kWh budget (5%), July gets 17.6 kWh (45%) +- [x] **intervention-gate** – `InterventionGate` in `src/shading/tradeoff_engine.py` (physiology-only pass/fail: GHI, Tleaf, CWSI, shading_helps; no time/month hard-coding — geometry decides). Re-exported via `src/tradeoff_engine.py` +- [x] **min-dose-engine** – `TradeoffEngine` in `src/shading/tradeoff_engine.py` (smallest offset satisfying: fruiting PAR < 400 µmol, top canopy ≥ 85% baseline, sacrifice ≤ budget; geometric feasibility pre-check; face-PAR sun-side selection) +- [x] **command-arbiter** – `src/command_arbiter.py` `CommandArbiter` (5-level priority stack: weather→harvest→safety→timeout→engine; hysteresis filter with configurable window/tolerance; `arbitrate()` combines selection + filter; weather/harvest bypass hysteresis). Added 2026-03-10 +- [x] **astro-tracker** – `AstronomicalTracker` in `src/command_arbiter.py` (pure sun-following via ShadowModel; `get_angle(timestamp)` interface). Added 2026-03-10 + +### Phase 3.5: Agronomic Weighting & Day-Ahead Planner + +- [x] **zone-crop-weights** – spatial zone weighting implemented in `DayAheadPlanner._get_crop_multiplier()` using `STAGE_CROP_MULTIPLIER` + `ZONE_CROP_WEIGHTS` from settings. Added 2026-03-10 +- [x] **day-ahead-dp** – created `src/day_ahead_planner.py` with `DayAheadPlanner` (DP trajectory optimizer: forward pass over daylight slots × candidate offsets, budget constraint via discretised DP, movement cost penalty for smooth trajectories, simplified InterventionGate using forecast data). Returns `DayAheadPlan` with `SlotPlan` list + explainability tags. Added 2026-03-10 +- [x] **daily-plan-output** – `DayAheadPlan.to_dict()` serialises plan to JSON-ready dict with per-slot offset, energy cost, gate status, and tags. Added 2026-03-10 +- [x] **phenology-tracker** – `src/models/phenology.py` upgraded with three estimation methods: (1) GDD-based via `compute_gdd_from_ims()` + `estimate_stage_by_gdd()` using IMS tdmax/tdmin and `PHENOLOGY_GDD_THRESHOLDS`, (2) camera-based via `detect_stage_from_camera()` using Gemini Vision on live vineyard feed, (3) calendar fallback. `estimate_stage_combined()` merges all three (camera high-confidence > GDD > calendar). Backward-compatible API. Added 2026-03-10 +- [x] **baseline-ps** – created `src/baseline_predictor.py` (hybrid FvCB+ML with RoutingAgent rule-based selection per slot); wired into DayAheadPlanner as optional `baseline_predictor` param, replaces temperature heuristic with actual A predictions for crop value +- [x] **arbiter-plan-integration** – ControlLoop now tracks plan divergence (cumulative kWh + consecutive slots), triggers re-plan when thresholds exceeded, with cooldown to avoid thrashing +- [x] **tracker-rpc** – added `send_rpc_command()` and `set_device_attributes()` to ThingsBoardClient (two-way RPC with one-way fallback, shared attribute writes) +- [x] **tracker-verify** – TrackerDispatcher verifies |actual - target| < tolerance after dispatch via `_verify_all()` +- [x] **tracker-dispatch** – created `src/tracker_dispatcher.py`: takes `ArbiterDecision` → sends to all 4 trackers via RPC/attribute fallback → verifies execution → logs result +- [x] **control-loop** – created `src/control_loop.py`: 15-min main loop (fetch sensors → plan lookup → live gate check → budget guard → arbitrate → fleet overrides → dispatch → budget spend → divergence check → re-plan → log). One-shot, continuous, and dry_run modes. TrackerFleet/Scheduler wired for per-tracker overrides (default = all same). EnergyBudgetPlanner wired for real-time budget consumption. Plan divergence tracking with auto re-plan + +### Phase 4: Operational Modes + +- [x] **ops-modes** – created `src/operational_modes.py` (WindStow, HailStow, HeatShield, HarvestMode + composite `OperationalModeChecker`; integrated into ControlLoop) + +### Phase 5: ROI Reporting + +- [x] **roi-service** – created `src/roi_service.py` (BudgetStatus, InterventionStats, LERResult, ROIService with budget tracking + LER computation) + +### Phase 6: Dashboard v2 + +- [x] **tab-system-status** – unified System Status tab (`ui/tab_system_status.py`) with 5 sub-sections: + - **Tracker Status**: live angles from TB, coherence check, bar chart + - **Energy Budget**: annual/monthly budget allocation, gauge, weekly plan + - **Control Replay**: load simulation logs, timeline charts, slot-by-slot detail + - **Fruiting Zone**: live canopy temp/PAR/VPD, sunburn risk assessment, thresholds + - **ROI Dashboard**: budget utilisation gauge, intervention stats, LER calculator + +### Phase 7: Integration Testing + +- [x] **sim-script** – created `scripts/run_control_simulation.py` (historical replay through full control loop with per-day summary, CLI args, JSON output) +- [x] **validate-budget** – `scripts/validate_control_system.py` verifies cumulative sacrifice never exceeds `max_energy_reduction_pct` (tested with real sim log + synthetic violations) +- [x] **validate-gates** – validates no interventions in May, before 10:00, below transition temp, or below GHI threshold (3/3 violation types caught in self-test) +- [x] **validate-dose** – validates average offset < 10°, max offset < 20°, intervention rate < 30% (catches excessive dose in self-test) + +### Phase 8: AI-Enhanced Forecasting & Routing + +#### 8A — Chronos-2 Multivariate Day-Ahead Forecasting + +- [x] **install-chronos** – install `chronos-forecasting>=2.0` and verify compatibility with existing env (done: conda env `solarwine` with Python 3.12, chronos 2.2.2, torch 2.10, llvm-openmp for XGBoost) +- [x] **chronos-data-prep** – build multivariate input pipeline: combine historical A_n (target) with past IMS station 43 measurements + on-site sensors (PAR, T_canopy, VPD, CWSI) as historical context, plus IMS *forecast* data (predicted GHI, air temperature, wind speed, humidity) as known-future covariates for the prediction horizon; IMS forecasts are available at inference time so this is not a data leak — only actual future sensor measurements would be +- [x] **chronos-predict** – execute zero-shot 96-step (24h @ 15-min) day-ahead A_n prediction using Chronos-2 (`amazon/chronos-t5-small` or `-base`) with multivariate context (past A_n + past sensor measurements as history, IMS forecasts as known-future covariates); integrate into `src/day_ahead_planner.py` baseline prediction +- [x] **chronos-benchmark** – benchmark Chronos-2 MAE against existing ML baseline (MAE ≈ 2.7) on held-out test set; compare univariate (A_n only) vs multivariate (A_n + IMS covariates) performance; document results and decide on integration path + +#### 8B — Gemini LLM Data Engineering + +- [x] **install-gemini** – `google-genai>=1.0` added to `requirements.txt`; already installed in `solarwine` conda env (v1.65.0) +- [x] **llm-data-cleaning** – `src/llm_data_engineer.py` `LLMDataEngineer.analyze_anomalies()`: sends per-column descriptive stats + domain context (physical ranges, Negev site notes) to Gemini; receives Z-score/IQR/bound thresholds as JSON; `apply_cleaning()` applies clip/nan/drop strategies; graceful fallback to physics-based bounds when API key unavailable +- [x] **llm-feature-eng** – `LLMDataEngineer.engineer_features()`: adds `hour_sin`, `hour_cos`, `doy_sin`, `doy_cos` (cyclical time encodings) and `stress_risk_score` (normalised weighted VPD + CWSI, weights confirmed by Gemini); `run_pipeline()` orchestrates clean → feature-engineer in one call +- [x] **dashboard-8b** – Data Explorer: added **AI Data Engineering** as third radio option (Gemini anomaly thresholds, cleaning summary, before/after charts, engineered features, daytime stress profile). Presentation tab: added Gemini LLM data engineering to “What’s Next” completed list, Key takeaways, and “What each tab shows” (Data Explorer bullet). All data precomputed in-tab (no cache loader). + +#### 8C — Gemini Intelligent Routing Layer + +- [x] **routing-prompt** – define supervisory system prompt for Gemini model router: given real-time telemetry (Temp, Irradiance, CWSI), route to FvCB (Model A, accurate under standard conditions) or ML (Model B, handles non-linear stress) — reply only `MODEL_A` or `MODEL_B` +- [x] **routing-agent** – build `RoutingAgent` function: executes Gemini API call at start of 15-min control loop, constructs prompt from live telemetry, parses response to determine model path +- [x] **arbiter-routing** – RoutingAgent wired into ControlLoop tick (step 2b): routes each slot to FvCB or ML via rule-based fast path (>90% of cases) with Gemini fallback for transition zone; `model_route` field added to TickResult; safety_rails divergence check remains as independent safety layer + +#### 8E — Gemini Day-Ahead Advisor + +- [x] **day-ahead-advisor** – `src/day_ahead_advisor.py` DayAheadAdvisor: Gemini analyzes IMS forecast + vine state → structured stress profile, budget recommendations, model routing, Chronos sanity check; dashboard display in Predictions tab + +#### 8D — Shadow Mode Validation + +- [x] **shadow-mode-test** – created `scripts/shadow_mode_test.py`: 4 validation tests — (1) LLM data cleaning filters catch anomalies, (2) BaselinePredictor generates valid A profiles (peak=17.0 µmol, daylight mean=6.1), (3) RoutingAgent routes cool→fvcb and hot→ml correctly, (4) full pipeline shadow simulation over date range + +### Phase 9: Vineyard Advisor Chatbot + +- [x] **chatbot-todo** – add Phase 9 to `context/3_todo.md` +- [x] **chatbot-scaffold** – create `src/vineyard_chatbot.py` scaffold + Gemini client (lazy init, same pattern as DayAheadAdvisor) +- [x] **chatbot-system-prompt** – write `CHATBOT_SYSTEM_PROMPT` (persona, site facts, 8 biology rules, tool definitions, response rules) +- [x] **chatbot-tool-defs** – implement `TOOL_DEFINITIONS` list + `_dispatch_tool()` router +- [x] **chatbot-tools-weather** – implement `_tool_current_weather()`, `_tool_calc_photosynthesis()`, `_tool_explain_rule()` +- [x] **chatbot-tools-shading** – implement `_tool_simulate_shading()`, `_tool_compare_angles()`, `_tool_daily_schedule()`, `_tool_day_ahead_advisory()` +- [x] **chatbot-chat-flow** – implement two-pass chat flow (`_build_messages()`, `_call_gemini()`, `chat()`) +- [x] **chatbot-tab** – add Vineyard Advisor tab to `app.py` (Vineyard Advisor tab, chat UI, session state) +- [x] **chatbot-quick-actions** – add quick-action buttons + `_render_tool_data()` helper + clear chat +- [x] **chatbot-test** – syntax check, import check, tabs render, tool call test, fallback test + +### Phase 9.5: Chatbot Data Integration + +Wire all five data sources into the chatbot (IMS weather, TB sensors, PS prediction, +energy generation, energy prediction) via a loosely-coupled provider layer. + +#### Architecture (`src/data_providers.py`) + +``` +VineyardChatbot ──▶ DataHub ──┬── WeatherService (IMS, 30-min TTL cache) + (tool dispatch) (registry) ├── VineSensorService (TB, 5-min TTL snapshot) + ├── PhotosynthesisService (FvCB + ML + forecast) + ├── EnergyService (TB generation + prediction) + ├── AdvisoryService (Gemini day-ahead) + └── BiologyService (rules lookup) +``` + +- Chatbot never imports data clients directly — only talks to `self.hub`. +- Each Service owns its caching (TTLCache), error handling, lazy init. +- Adding a new source = write a Service subclass + `hub.register()`. +- `summarise_dataframe()` auto-compresses large results for LLM context. + +#### Data strategy + +| Source | Service | Strategy | Detail | +|---|---|---|---| +| IMS weather | WeatherService | Cache (preload) | `ims_merged_15min.csv`, 30-min TTL | +| TB sensor snapshot | VineSensorService | On-demand + 5-min TTL | `get_vine_snapshot()` | +| TB sensor time-series | VineSensorService | On-demand | `get_timeseries()` → hourly downsample | +| PS prediction (FvCB/ML) | PhotosynthesisService | On-demand (compute) | Lazy-load models | +| Energy generation (TB) | EnergyService | On-demand | Fetch from inverter/meter devices | +| Energy prediction | EnergyService | On-demand (compute) | GHI × panel × efficiency × cos(θ) | + +#### Steps + +- [x] **chatbot-provider-scaffold** – Create `src/data_providers.py` with BaseService ABC, TTLCache, summarise_dataframe, DataHub registry, and 6 service classes (Weather, VineSensor, Photosynthesis, Energy, Advisory, Biology) +- [x] **chatbot-hub-wiring** – Refactored `VineyardChatbot.__init__` to accept a `DataHub` (default: `DataHub.default()`); rewrote `_dispatch_tool()` to delegate to hub services (15 tools); removed all direct imports of IMSClient/ThingsBoardClient/FarquharModel from chatbot +- [x] **chatbot-ims-history** – Implemented `WeatherService.get_history()` with hourly resample + `summarise_dataframe()`; added `get_weather_history` tool to system prompt and dispatch +- [x] **chatbot-tb-timeseries** – Implemented `VineSensorService.get_history()` (device_type, area, hours_back → hourly averages via `get_timeseries()`); added `get_sensor_history` tool to system prompt and dispatch +- [x] **chatbot-ml-predictor** – Implemented `PhotosynthesisService.predict_ml()` with train-once-cache pattern: lazy loads sensor data + IMS, runs Preprocessor + PhotosynthesisPredictor, picks best model by MAE, auto-fills features from latest IMS if not provided. *Note: requires IMS cache with temperature/GHI overlapping sensor data dates* +- [x] **chatbot-ps-forecast** – Implemented `PhotosynthesisService.forecast_day_ahead()`: FvCB-based projection over IMS hourly weather (PAR~2×GHI, Tleaf~Tair+2°C, VPD from T+RH). Returns hourly A profile + peak/stress summary +- [x] **chatbot-energy-devices** – Discovered Plant asset "Yeruham Vineyard" (ASSET, not DEVICE) with `power` (W) + `production` (Wh/5min) keys. Added `ASSET_REGISTRY`, `get_asset_timeseries()`, `get_asset_latest()` to TB client. Also registered 4 Tracker devices (501-509) with angle/mode telemetry +- [x] **chatbot-energy-tool** – `EnergyService` rewritten: past/today → real TB Plant asset data (daily ~270-290 kWh for 48 kW system); future → analytical estimate (persistence forecast × system capacity). Hourly profiles in Israel local time +- [x] **chatbot-energy-predict** – `EnergyService.predict()` now routes: past/today → `get_daily_production()` (real TB), future → `_predict_analytical()` (IMS GHI × 48 kW) +- [x] **chatbot-prompt-update** – Updated system prompt with all 15 tools (grouped: weather, vine sensors, photosynthesis, shading, energy, advisory, biology); added energy/prediction/irrigation/fertiliser keywords to fallback matcher +- [x] **chatbot-integration-test** – All 15 tools dispatch correctly; verified imports + instantiation (no circular imports); tested fallback keyword matching; `summarise_dataframe()` compresses >48-row results. Remaining data gaps: IMS cache lacks GHI/temperature (only wind_speed_ms), no date overlap between IMS and sensors for ML training + +### Phase 10: Reliable Advisor — Anti-Hallucination Guardrails + +Deterministic guardrails to prevent the chatbot from hallucinating data, +violating biology rules, or answering data questions without tool grounding. + +#### Step 1: Structured Response Schema +- [x] **structured-response** – Extended `ChatResponse` with `confidence`, `sources`, `caveats`, `rule_violations` fields; all responses carry grounding metadata + +#### Step 2: Mandatory Tool Grounding +- [x] **query-classifier** – `classify_query()` in `src/chatbot/guardrails.py`: regex-based classification (data / knowledge / greeting / ambiguous); data queries force tool calls +- [x] **tool-enforcement** – If LLM answers a data query without calling a tool, chatbot re-prompts: "You MUST call a tool" + +#### Step 3: Post-Response Rule Validator +- [x] **response-validator** – `validate_response()` in `src/chatbot/guardrails.py`: deterministic checks for no_shade_before_10 (block), no_shade_in_may (block), temperature_transition (warn), no_leaves_no_shade_problem (warn), no_shading_must_explain (warn) +- [x] **validator-integration** – Validator runs on every response in `chat()`; block-severity overrides response text; warn-severity appends caveats + +#### Step 4: Source-Tagged Context Injection +- [x] **source-tagging** – `tag_tool_result()` adds `_source`, `_data_age_minutes`, `_freshness_warning` to tool results before Gemini Pass 2 +- [x] **citation-prompt** – Pass 2 prompt instructs Gemini to cite source and timestamp when quoting numbers + +#### Step 5: RAG Knowledge Base +- [x] **rag-knowledge-base** – Keyword-indexed rule retrieval with pinned rules (no_shade_before_10, energy_budget, temperature_transition) + top-scoring rules per query; `retrieve_relevant_rules()` + `build_contextual_prompt()` in vineyard_chatbot.py + +#### Step 6: Conversation Memory +- [x] **sliding-context** – Summarize older messages into topics, keep recent 6 verbatim, pin critical context; `_summarize_history()` in vineyard_chatbot.py + +#### Step 7: Confidence-Gated Responses +- [x] **confidence-estimator** – `estimate_confidence()` maps data freshness to high/medium/low/insufficient_data +- [x] **confidence-ui** – `_render_grounding_metadata()` in `ui/tab_advisor.py` shows colored confidence badge, sources, caveats, rule warnings + +#### Step 8: Guardrail Test Suite +- [x] **qa-tests-5** – 5 adversarial QA tests in `tests/test_advisor_chatbot.py`: shade-before-10 blocked, data-question forces tool, stale-data warns, no-shade-without-reason warns, tool-failure returns insufficient_data +- [x] **guardrail-unit-tests** – Unit tests for QueryClassifier, ResponseValidator, ConfidenceEstimation, SourceTagging (42 tests total, all passing) +- [x] **qa-tests-expand** – Expanded to 21 adversarial prompts (QA1-QA21) covering May shading, dormancy, night queries, prompt injection, boundary conditions, multi-rule violations, energy/irrigation classification, ambiguous queries. 58 tests total, all passing + +#### Step 9: Dual-Channel Advisory +- [x] **dual-channel** – `classify_response_mode()` separates info mode (blue, factual) from advisory mode (amber, recommendations); `response_mode` field on ChatResponse; UI renders mode indicator + +#### Step 10: Feedback Loop +- [x] **feedback-ui** – Thumbs up/down/flag buttons on each response in `ui/tab_advisor.py`; `_render_feedback_buttons()` + `_submit_feedback()` +- [x] **feedback-storage** – `src/chatbot/feedback.py` logs feedback to JSONL (query, response, tool_calls, rules, confidence, comment) + +--- + +## Phase 11: Production Migration + +Full architecture documented in `context/4_production.md`. +3-layer architecture: Lovable/React frontend (Cloudflare Pages) → FastAPI middleware (HuggingFace Spaces) → existing Python core. +Cron workers via GitHub Actions (free for private repos). + +### Phase 11.1: Redis Caching Layer + +Replace in-memory TTLCache with Upstash Redis so API and workers share state. + +- [x] **upstash-setup** – Upstash Redis instance created (many-mammal-76248.upstash.io), credentials in `.env`, connectivity verified with dual-layer TTLCache round-trip +- [x] **redis-client** – Create `src/data/redis_cache.py`: thin wrapper around Upstash Redis REST API with `get_json()`, `set_json(ttl)`, `delete()`, `exists()`, `ping()`. Singleton via `get_redis()`, returns None when not configured +- [x] **datahub-redis** – Refactored `TTLCache` in `data_providers.py`: tries Redis first (via `redis_prefix`), falls back to in-memory. WeatherService prefix `weather:`, VineSensorService prefix `vine:`. Streamlit works unchanged (no Redis = pure in-memory) +- [x] **tick-result-redis** – `backend/workers/control_tick.py` writes TickResult to Redis `control:last_tick` (20-min TTL) after each tick +- [x] **plan-redis** – `backend/workers/daily_planner.py` writes plan to Redis `control:plan` (24h TTL) + backup `Data/daily_plan.json` +- [x] **budget-redis** – ControlLoop `_ensure_daily_budget()` restores from Redis `control:budget` on startup; `_persist_budget()` saves after every `spend_slot()`. Falls back to recompute if Redis unavailable + +### Phase 11.2: FastAPI Middleware (HuggingFace Spaces) + +Create the API gateway in `backend/api/`, deploy as HF Space (Docker SDK). + +- [x] **fastapi-scaffold** – Created `backend/api/main.py` with FastAPI app, CORS (configurable via `ALLOWED_ORIGINS`), lifespan, all route includes +- [x] **fastapi-deps** – Created `backend/api/deps.py` with `get_datahub()` (lru_cache singleton) and `get_redis_client()` +- [x] **route-weather** – `backend/api/routes/weather.py`: GET `/api/weather/current`, `/api/weather/history?start_date&end_date`, `/api/weather/forecast` +- [x] **route-sensors** – `backend/api/routes/sensors.py`: GET `/api/sensors/snapshot`, `/api/sensors/history?type&area&hours` +- [x] **route-energy** – `backend/api/routes/energy.py`: GET `/api/energy/current`, `/api/energy/daily/{date}`, `/api/energy/history`, `/api/energy/predict/{date}` +- [x] **route-photosynthesis** – `backend/api/routes/photosynthesis.py`: GET `/api/photosynthesis/current?model`, `/api/photosynthesis/forecast` +- [x] **route-control** – `backend/api/routes/control.py`: GET `/api/control/status`, `/api/control/plan`, `/api/control/budget`, `/api/control/trackers` +- [x] **route-chatbot** – `backend/api/routes/chatbot.py`: POST `/api/chatbot/message`, POST `/api/chatbot/feedback` with Pydantic request models +- [x] **route-biology** – `backend/api/routes/biology.py`: GET `/api/biology/phenology`, `/api/biology/rules`, `/api/biology/rules/{name}` +- [x] **rate-limiting** – Added `slowapi`: 60 req/min global default, 10 req/min on `/api/chatbot/message` +- [x] **fastapi-dockerfile** – Created `backend/Dockerfile` (Python 3.12 slim, port 7860, copies src/config/backend/Data) +- [x] **hf-space-readme** – Created `backend/HF_README.md` (sdk: docker, app_port: 7860, private: true, endpoint summary) +- [x] **fastapi-test** – Smoke tested: `/api/health` returns OK (uptime + redis status), `/api/weather/current` returns live IMS data + +### Phase 11.3: Background Workers (GitHub Actions) + +Extract ControlLoop and DayAheadPlanner into standalone entry points, run as scheduled GitHub Actions. + +- [x] **worker-control** – Created `backend/workers/control_tick.py`: loads ControlLoop, runs single tick, writes TickResult to Redis, supports `--dry-run` +- [x] **worker-planner** – Created `backend/workers/daily_planner.py`: runs DayAheadPlanner, writes plan to Redis + JSON backup +- [x] **gh-action-tick** – Created `.github/workflows/control-tick.yml`: schedule `*/15 * * * *`, Python 3.12 + pip cache, all secrets +- [x] **gh-action-planner** – Created `.github/workflows/daily-planner.yml`: schedule `0 2 * * *`, Python 3.12 + pip cache, all secrets +- [x] **gh-secrets** – All 7 secrets added to GitHub repo Settings → Actions secrets +- [x] **worker-logging** – Structured JSON logging (asctime + level + name + message) in both workers +- [x] **worker-test** – Dry-run tested: `python -m backend.workers.control_tick --dry-run` loads plan (43 slots), computes angle (-10.5°), dispatches to 4 trackers (DRY RUN), logs tick result + +### Phase 11.4: Lovable Frontend (React + Cloudflare Pages) + +Generate and customize the production frontend via Lovable. + +- [x] **lovable-project** – Created via Lovable, exported to `solarwine-ai/solarvine-dashboard` repo +- [x] **lovable-dashboard** – Dashboard page: weather card, energy (yesterday/today/tomorrow), phenology, quick stats +- [x] **lovable-advisor** – Advisor page: chat panel with bubbles, advisory cards, confidence/channel badges, feedback +- [x] **lovable-control** – Control page: tracker bars, energy budget, last tick, plan timeline +- [x] **lovable-photosynthesis** – Photosynthesis page: FvCB vs ML, forecast chart, sensor snapshot +- [x] **lovable-shading** – Shading page: offset slider, 3-zone canopy, stress heatmap +- [x] **lovable-docs** – Docs page: biology rules accordion, architecture cards, API reference (18 endpoints) +- [x] **lovable-export** – Imported into `frontend/` directory in main repo +- [x] **api-hooks** – 7 hooks (weather, energy, sensors/PS, control, chatbot, auth) + `api.ts` + `types/api.ts` +- [x] **api-integration** – All 6 pages wired to real API: mock data replaced with live TanStack Query hooks, field names mapped to backend snake_case responses +- [x] **chatbot-component** – Real mutations (useSendMessage/useSendFeedback), confidence badges, source citations, caveats, dual-channel (INFO/ADVISORY), auto-scroll +- [x] **responsive-polish** – Sidebar hamburger already implemented (lg breakpoint). Fixed: Power chart responsive height, Shading heatmap mobile min-width, Home grid breakpoints, camera/map sizing + +### Phase 11.5: Deployment & Integration + +Wire everything together and deploy. + +- [x] **frontend-hosting** – Switched from Vercel (requires Pro for private org repos) to **Cloudflare Pages** (free, unlimited bandwidth, private org repos supported). Connect GitHub repo → root `frontend/`, build `npm run build`, output `dist`, set `VITE_API_URL` env var +- [x] **hf-deploy** – HF Space `SolarWine/api` deployed (Docker SDK, public), secrets injected via huggingface_hub, `/api/health` returns OK with Redis connected. 14/17 endpoints passing; 3 fixed (phenology missing arg, photosynthesis missing method, sensors null area) +- [ ] **upstash-connect** – Verify Redis connectivity from HF Space and GitHub Actions, test cache read/write round-trip +- [x] **e2e-smoke** – Created `scripts/smoke_test.py`: tests 12 endpoints (health, weather, sensors, energy, PS, control, biology, chatbot). Run: `python scripts/smoke_test.py [url]` +- [x] **streamlit-deprecate** – Added migration banner to `app.py`; shows only when `SOLARWINE_FRONTEND_URL` env var is set (invisible until new frontend is live) +- [ ] **dns-custom** – (Optional) Configure custom domain on Cloudflare Pages if available + +### Phase 11.6: Security & Monitoring (Post-Launch) + +- [x] **auth-jwt** – Created `backend/api/auth.py` (create_token, require_auth, optional_auth) + `backend/api/routes/login.py` (POST `/api/auth/login`). Auth returns `role: "guest"` when JWT_SECRET not set (read-only). PyJWT added to backend/requirements.txt +- [x] **api-hardening** – Standardized error handling (HTTPException everywhere, no JSONResponse for errors), data provider error dict detection, startup path validation, Sentry fail-loud, chatbot session_id validation + blank message guard + init failure circuit breaker, Redis singleton retry-storm fix, CORS defaults include HF Space + Cloudflare Pages URLs +- [x] **auth-frontend** – Created `useAuth.ts` hook (login/logout/token restore from localStorage) + updated `api.ts` to auto-attach JWT Bearer header + auto-clear on 401 +- [ ] **monitoring-health** – UptimeRobot or similar free monitor on HF Space `/api/health` (5-min interval, email alerts) +- [x] **monitoring-logs** – Structured logging (asctime/level/name/message) in `main.py` + request logging middleware (method, path, status, duration). Health endpoint extended with ThingsBoard/IMS/Gemini connectivity checks +- [x] **error-tracking** – Added Sentry integration to `backend/api/main.py` (optional, enabled via `SENTRY_DSN` env var). `sentry-sdk[fastapi]>=2.0` in backend/requirements.txt +- [x] **budget-alerts** – `control_tick.py` checks budget after each tick; logs warning if >80% spent before 14:00 IST; sends webhook to `BUDGET_ALERT_WEBHOOK` if configured + +--- + +## Phase 12: Robustness & Efficiency + +### 12.1: Immediate (Week 1) + +- [x] **tb-health-fix** – Fixed ThingsBoard health check: `/api/noauth/health` returns 404, switched to root URL. Needs HF Space redeploy +- [x] **hf-redeploy** – Redeployed HF Space via `huggingface_hub` API (git push blocked by binary file policy). Uploaded 8 files, space auto-rebuilt +- [x] **redis-verify** – Smoke test against live HF URL: 11/12 pass (control plan 404 expected — no cron run yet). Redis connected, IMS/Gemini configured +- [x] **weather-fix** – Fixed WeatherService crash: Redis deserialised DataFrame as dict/list → `.empty` AttributeError. Added type guard + skip DataFrame Redis serialisation +- [x] **uptime-monitor** – UptimeRobot configured on `/api/health` (5-min interval). Added HEAD method support to health endpoint for monitoring compatibility +- [x] **monitoring-page** – Redesigned Alarms page → Monitoring & Alarms: overall status banner, 3 data source cards (IMS/TB/Energy), backend services panel (Redis/TB/IMS/Gemini), data flow issues surface as system alarms. Sidebar renamed Alarms → Monitoring +- [x] **code-review-fixes** – Fixed email alerter string formatting bug (CRITICAL), duplicate className in Home.tsx, DataFlowStatus null safety, energy price consistency (0.162 USD/kWh), table accessibility (scope attrs), negative age logging +- [x] **data-flow-monitor** – New `/api/health/data-sources` endpoint returning per-source green/yellow/red status (IMS weather, TB sensors, TB energy) with age tracking and configurable thresholds. `DataFlowMonitor` in `backend/services/data_flow_monitor.py`. Thresholds in `config/settings.py`: IMS yellow 60m/red 180m, TB yellow 15m/red 60m +- [x] **data-flow-alerts** – `EmailAlerter` in `backend/services/email_alerter.py`: SMTP email alerts when sources go red, per-source cooldown (60 min). Activated by `SMTP_HOST` + `ALERT_EMAIL_TO` env vars. Background loop in `main.py` checks every 5 min, pushes SSE `health` event +- [x] **data-flow-frontend** – `DataFlowStatus` component on Home page: colored dots (green/yellow/red) for each source, hover tooltips, auto-refresh via SSE. Hook: `useDataFlowStatus`, types: `DataSourceStatus` / `DataFlowStatusResponse` +- [x] **chatbot-range-validation** – `validate_numeric_ranges()` in guardrails.py: checks tool results against physical bounds (temp, GHI, PAR, VPD, CO2, power, etc.), flags sensor faults as caveats +- [x] **chatbot-cross-source** – `check_cross_source_consistency()` in guardrails.py: compares IMS vs TB temperature readings, warns when they diverge by >5°C +- [x] **chatbot-rag-scoring** – Improved `retrieve_relevant_rules()`: weighted scoring (exact match +2, partial word overlap +0.5), increased max_rules to 6 + +### 12.2: Short-term (Week 2–4) + +- [x] **responsive-polish** – Sidebar hamburger already implemented (lg breakpoint). Fixed: Power chart responsive height (280/350/450px), Shading heatmap mobile min-width (400px), Home grid md breakpoint for map/camera/power row, camera/map responsive min-heights +- [x] **load-test** – `scripts/load_test.py` (Locust): 16 weighted endpoints, 10 users × 1 min = 157 requests, p50=250ms, p95=1700ms, 0 errors. All endpoints healthy except `/api/health/data-sources` (not yet deployed at test time) +- [x] **circuit-breaker** – Added `CircuitBreaker` class (3 failures in 60s → open for 5 min) to VineSensorService and EnergyService. Prevents retry storms when TB is down +- [x] **tracker-timeout** – Added exponential backoff retry (3 attempts: 1s, 2s) for TB shared attribute writes in TrackerDispatcher + +### 12.2b: Code quality improvements (done 2026-03-29) + +- [x] **code-review-critical** – Fixed: Redis health try-catch, chatbot init race condition (lock before null check), background task try-finally, daily planner IST timezone, JWT login parse safety, error boundary on Outlet +- [x] **error-standardization** – Extracted `check_service_error()` to `backend/api/utils.py`, used by energy + sensors routes. Fixed energy route ignoring errors when `daily_kwh` present +- [x] **control-auth** – Added `optional_auth` to all `/control/*` endpoints (status, plan, budget) +- [x] **farquhar-sigmoid** – Replaced hard 30°C RuBP→Rubisco cutoff with smooth sigmoid (28–32°C). New "Transition" state. Prevents flip-flopping near threshold +- [x] **divergence-fix** – Fixed inverted logic in `control_loop.py:704` divergence check +- [x] **frontend-extract** – Extracted `StatCard` to `/components/StatCard.tsx`, date formatters to `/lib/dateUtils.ts`, energy price to `/config/constants.ts`. Home.tsx reduced by ~50 lines +- [x] **strict-types** – Added TypeScript interfaces: `ChillUnitResponse`, `SoilMoistureRow`, `RainRow`, `TrackerInfo`, `ControlTrackers`, `ControlBudget`. Replaced inline `any` types +- [x] **chart-memoize** – `useMemo` on tempData chart transformation in Home.tsx + +### 12.2c: Architecture refactors (done 2026-03-29) + +- [x] **vectorize-farquhar** – `compute_all()` rewritten with vectorized pandas/numpy (no iterrows). 10K rows: 7.5ms (was ~750ms). Numerically identical output (max diff=0) +- [x] **control-loop-di** – `ControlLoop.__init__()` accepts all 8 dependencies as keyword args. Pass None (default) for lazy auto-create; pass mocks for testing +- [x] **gate-pipeline** – `InterventionGate.evaluate()` split into 5 methods (`_check_meaningful_sun`, `_check_heat_stress`, `_check_water_stress`, `_check_radiation_load`, `_check_biology`) composed as pipeline. First rejection short-circuits +- [x] **budget-audit** – `src/budget_audit.py`: `BudgetAuditLog` appends one parquet row per control tick. `daily_summary(date)` and `weekly_report()` for compliance verification. Wired into `control_loop.py` tick step 12. CLI: `python -m src.budget_audit --report` +- [x] **chatbot-hebrew** – Added 18 Hebrew keywords to query classifier. System prompt: language matching, phenology-first, conciseness. IMS stale → auto-supplement with TB sensors. Confidence rule override for dormancy/blocks +- [x] **refactor-tests** – 23 new tests in `tests/test_refactors.py`: vectorized vs scalar (4), sigmoid transition (2), gate pipeline (6), ControlLoop DI (3), budget audit (3), Hebrew classification (3), confidence override (2) + +### 12.2e: Data + energy-model refresh — done 2026-05-18 + +- [x] **ims-refresh** – Pulled IMS station 43 from 2025-12-01 → 2026-05-10 (10,748 rows, 15-min). API has ~8-day lag; data ends 2026-05-10. +- [x] **scripts-refresh-energy-data** – New `scripts/refresh_energy_data.py`: joins TB Plant `production` (1h SUM agg) with IMS hourly weather, reindexes to contiguous hours (nighttime = 0 kWh), adds time + solar-geometry features, writes `Data/energy_weather_merged.csv` (3,477 rows × 18 cols). +- [x] **scripts-train-energy** – New `scripts/train_energy_predictor.py`: temporal hold-out (last 14 days), sklearn `GradientBoostingRegressor` + `LinearRegression` fallback (xgboost requires libomp on macOS; not installed). Bundle slot named `xgb_model` for backward compat with `EnergyPredictor.__init__`. +- [x] **energy-backtest-fix** – `EnergyPredictor.backtest()` now reads weather from `IMSClient` instead of the dead Air1 device. +- [x] **energy-model-validation** – 1,343 train rows / 337 hold-out rows. Hourly MAE = 4.5 kWh. **Daily mean signed error = +50%** — model systematically over-predicts in late April/May. Cause: model has no `tracker_angle` feature, so it can't see the agrivoltaic interventions that actively detune trackers as growing season starts. See 12.5 below for the planned fix. +- [x] **energy-tracker-feature-attempted** – Wired `tracker_angle_mean` + `tracker_angle_std` + `abs_tracker_angle` from TB into the refresh pipeline (`scripts/refresh_energy_data.py:fetch_tb_tracker_angles`). Two variants tried: (a) with imputation of pre-Feb history via hour-of-day medians → bias worsened to **+57%**; (b) without imputation + dropped `sin_elevation` → bias worsened to **+75%**. **Root cause is distribution shift, not features**: training tracker_angle avg = -15° (mild), hold-out avg = -51° (aggressive interventions). The model can't extrapolate operational regimes it didn't see in training. Reverted features to the original best config. Tracker telemetry is still collected into the CSV (columns `tracker_angle_mean`/`_std`) — ready to be consumed once 2026 growing-season data accumulates. See 12.6 / `bigml-tracker-feature` for the proper fix path. + +### 12.2d: 2026 sensor migration — done 2026-05-18 + +- [x] **tb-2026-registry** – Clean-replaced `DEVICE_REGISTRY` in `src/data/thingsboard_client.py` with the 2026 fleet (35 entries: 19 Crop_2Soil + 12 Thermocouples + 4 Trackers). Legacy `Air1-4`, `Crop1-7`, `Soil*`, `Irrigation1`, `Thermocouples1-2` removed. Added `DeviceInfo.position` field (north/south/center/etc.). Convenience subsets `TREATMENT_DEVICES`/`REFERENCE_DEVICES`/`CROP_2SOIL_DEVICES`/`THERMOCOUPLE_DEVICES` derived at import. Treatment = rows 501/502/503/504/509; Reference = row 202. +- [x] **vinesnapshot-2026** – Rewrote `VineSnapshot` with 61 fields. Removed PAR/DLI/VPD/CO2/Irrigation (no 2026 sensor); added NDVI/PRI/PSRI/SIPI/GCI/LCI/DUVI ratios, dual soil profile (shallow + deep moisture/temp/pore-water EC), `panel_temp_active_count`. Legacy field names kept as None-valued compat shims so downstream consumers don't crash. Per-position keys use `{row}-{cardinal}` form (e.g. `"502-south-east"`). +- [x] **vinesnapshot-aggregation** – `get_vine_snapshot()` no longer hard-codes device names; iterates `DEVICE_REGISTRY` filtered by `area`. Full fleet fetched in 1.1 s via `ThreadPoolExecutor`. +- [x] **bounds-fixes** – Added physical bounds for PSRI/SIPI/GCI/LCI/DUVI/leaf-wetness in `_BOUNDS`. **Critical fix**: GCI was being clipped to `[-1, 1]` (real range 0..30), causing all daytime values to be discarded. Split `treatment_soil_pore_water_ec` into shallow + `_deep`. De-duped the `treatment_pri` computation. + +### 12.3: Medium-term (Month 1–2) + +- [ ] **chatbot-feedback** – Review first 20 thumbs-down/flag submissions, identify top 3 guardrail failures, tune rules +- [ ] **model-versioning** – Create `model_registry/` to track Chronos/ML/Farquhar parameter versions, enable A/B testing +- [ ] **phenology-validation** – Cross-reference GDD-based stage estimates vs camera observations, refine thresholds for Sde Boker + +### 12.5: 2026 sensor follow-ups (queued after the foundational registry rewrite) + +Bugs and design debt surfaced during the May 2026 sensor migration. Foundational +work landed in 12.2d above; these are the deferred items. + +**Remaining bugs** + +- [ ] **panel-tc-semantics** – `panel_temp_active_count` is per-device but the panel-temp avg is per-channel — inconsistent. Pick one. (`src/data/thingsboard_client.py:get_vine_snapshot`) +- [x] **tab-system-status-2026** – `ui/tab_system_status.py` `_render_fruiting_zone` rewritten to use NDVI / PRI / leaf-air ΔT / PSRI; risk assessment now triggers on ΔT > 3°C and PSRI > 0.2 in addition to canopy temp. Done 2026-05-18. +- [ ] **frontend-types-2026** – `frontend/src/types/api.ts` and the React hooks (`useSensors`, etc.) still declare `treatment_par_umol: number | null` and similar. After the migration these are always null — type narrows to `null`. Audit `frontend/src/lib/` + `frontend/src/hooks/` and remove or mark deprecated. + +**Architectural concerns (numbered to match the post-migration code review)** + +- [ ] **2026-A-auto-sync-registry** – Hardcoded `DEVICE_REGISTRY` is brittle: each TB change requires a code edit + redeploy. Build `scripts/sync_devices.py` that reads the `Crop 2Soil 2026` + `Thermocouples 2026` entity groups, writes `Data/devices.json`, and have `thingsboard_client.py` prefer that file with the hardcoded dict as offline fallback. Position decoding belongs in this sync script (regex over the Hebrew TB labels: `צפון`→north, `דרום`→south, `מזרח`→east, `מערב`→west, `מרכז`→center). +- [ ] **2026-B-vinesnapshot-nest** – `VineSnapshot` is 61 flat fields and growing. Nest as `snapshot.treatment.{air,canopy,soil_shallow,soil_deep}` and `snapshot.panel`, expose flat `to_dict()` only at the JSON boundary. Defer until you're already breaking the API for another reason. +- [ ] **2026-C-schema-version** – Compat shims (`treatment_par_umol=None` etc.) silently say "sensor down" when the truth is "this metric no longer exists." Add `schema_version: "2026.1"` to the snapshot and let consumers branch / error explicitly; remove the shims one release later. +- [ ] **2026-D-split-fetch-aggregate** – `get_vine_snapshot()` mixes ~80 lines of I/O with ~70 lines of transformation. Split into `_fetch_all_latest(plan) → raw_dict` + `_aggregate_snapshot(raw, now) → VineSnapshot`. Then unit-test the aggregate step with fixture dicts (currently no test covers it). +- [ ] **2026-E-position-source-of-truth** – Position labels were decoded by hand from Hebrew TB labels — not reproducible. After 2026-A lands, decode at sync time. Until then, store the original TB label as `DeviceInfo.tb_label_hebrew` so the human-readable source survives. +- [ ] **2026-F-per-device-freshness** – `DataFlowMonitor` checks aggregate "newest TB timestamp" — one fast-reporting device makes the fleet look healthy even if 11 thermocouples are silent. Move to per-device staleness with grace per device-type (Crop_2Soil ~15min, Thermocouples up to ~60min due to deep-sleep cycles). +- [x] **2026-G-layout-regen** – `scripts/import_layout.py` updated to handle 2026 rows (202 reference; 501/502/503/504/509 treatment) and the `DeviceInfo.position` field via `_POSITION_OFFSETS`. `Data/layout.json` regenerated: 6 rows, 35 devices, each with `position_m: [x, y, z]`. Done 2026-05-18. +- [ ] **2026-H-position-taxonomy** – Position strings (`"south-east"`, `"center-east"`, …) are free-form. Convert to a `CardinalPosition` enum in `src/data/data_schema.py` (or document the canonical form in CLAUDE.md) so future labels match. +- [ ] **2026-I-aggregation-tests** – No unit test covers the new aggregation logic. Add at least 3 fixture-based tests in `tests/test_thingsboard_client.py`: full fleet, 1 device per area, all-empty. Depends on 2026-D. + +**Follow-on integration work** + +- [ ] **2026-J-ims-ambient-bridge** – Wire IMS Sde Boker station 43 → `VineSnapshot.ambient_*` fields so they stop returning None. Currently `Alarms.tsx` and `Home.tsx` fall through to `treatment_air_temp_c`, which is misleading (it's not ambient). +- [ ] **2026-K-chatbot-spectral-tools** – Add chatbot tools `get_vegetation_indices()` and `get_canopy_health()` exposing the new 2026-only data (NDVI/PRI/PSRI/SIPI per row + position). +- [ ] **2026-L-spectrometer-page** – New frontend page (or extend `Agro.tsx`): vegetation-index time series, NDVI/SIPI heatmap across the 17 active Crop_2Soil devices, panel surface-temp 4×12 grid from the thermocouples. + +### 12.6: "Big" — Stage 2 photosynthesis ML retrain on 2026 schema + +Plan, not yet executed. The Stage 2 ML predictor (`src/forecasting/predictor.py`) +forecasts A_n (photosynthesis rate) from weather features. Currently trained on +`Data/Seymour/sensors_wide.csv` (frozen at 2026-02-01) — features include PAR, +airTemperature, CO2, VPD, leafTemperature from the legacy Air1/Crop fleet. +The 2026 sensor refresh deprecated all of those sensors. The new fleet emits +NDVI/PRI/PSRI/spectrometer bands + dual-soil profile + IRT ambient — a +fundamentally different feature space. This is a redesign, not a refresh. + +**Phase 1 — Data collection pipeline (2-3 days work)** +- [x] **bigml-collection** – `scripts/collect_2026_training_data.py` written + and smoke-tested 2026-05-18. Pulls 15-min telemetry from the 10 treatment + + 7 reference Crop_2Soil devices via TB, averages per area per timestep, + inner-joins with IMS 15-min weather, writes to + `Data/2026/sensor_history.parquet`. Append-mode dedupes on + (timestamp, area). May 1–10 sample: **1,896 rows** (948 per area). +- [x] **bigml-stage1-2026** – Farquhar inputs derived from the 2026 fleet: + PAR ≈ 2.0 × GHI (Akitsu et al. 2017, ±10 %), VPD via Tetens from IMS + RH + Tair, CO2 = 420 ppm assumed, CWSI = (Tleaf − Tair)/15 clipped to + [0, 1]. `compute_farquhar_a()` runs `FarquharModel.calc_photosynthesis()` + row-by-row; result column `a_farquhar_umol`. Validation: daytime mean + 13.1 µmol CO₂/m²/s, peak 19.6 µmol — squarely in Greer & Weedon's + empirical Semillon range for the leaf-temp window seen. +- [x] **bigml-collection-shading-correction** – `apply_shading_correction()` + added to `scripts/collect_2026_training_data.py`. For each treatment-area + timestep: pulls `tracker_angle_mean` (or astronomical fallback when telemetry + missing), runs `ShadowModel.project_shadow()` + `compute_par_distribution()`, + takes the fruiting-zone mean PAR, and multiplies the IMS-derived + `par_umol_derived` by that factor. Reference rows untouched. May 1–10 sample: + treatment PAR factor distribution is 0.10–1.0 (median 0.82, mean 0.73) — + panels meaningfully reduce fruiting-zone PAR. Farquhar A label is recomputed + after the correction. Done 2026-05-18. +- [ ] **bigml-baseline** – Until enough 2026 data accumulates (≥3 months + growing-season hours), run Farquhar-only as the photosynthesis estimate + (skip Stage 2 ML for 2026). The chatbot's photosynthesis tool already + supports this via `PhotosynthesisService.compute_fvcb()`. +- [ ] **bigml-collection-cron** – Schedule + `scripts.collect_2026_training_data` to run weekly via GitHub Actions + (similar pattern to `control-tick.yml` / `daily-planner.yml`). Window = + last 8 days (overlaps to be safe against IMS's ~8-day publication lag). + +**Phase 2 — Feature engineering (1-2 days)** +- [ ] **bigml-features** – Define the 2026 ML feature set. Candidates: + IMS GHI/Tair/RH/wind (forecastable), Crop_2Soil NDVI/PRI/PSRI/SIPI (now), + soilMoisture (shallow + deep), leafTemperature, tracker angle (current), + hour, doy_sin/cos. Decide whether to keep the per-device dimension (input + = 17 device readings per timestep) or aggregate to area-level (~5 features). +- [ ] **bigml-spectral-pca** – With 17 spectrometer bands per device × 17 + devices = 289 columns, dimensionality reduction is needed. Run PCA on the + spectral subset and keep the top 5-8 components. + +**Phase 3 — Training + validation (1 day)** +- [ ] **bigml-train** – Train RF / GBR / Linear regressors (analogous to + Stage 2 v1). Use temporal hold-out from the latest 14 days of the + collected 2026 data. Compare MAE vs Farquhar-only baseline. +- [ ] **bigml-tracker-feature** – Add `tracker_angle` and + `intervention_active` as features to the **energy predictor too** (fixes + the +50% over-prediction bias seen in 12.2e). Requires pulling tracker + telemetry alongside production into the energy refresh script. +- [ ] **bigml-deploy** – Wire the trained model into + `PhotosynthesisService.predict_ml()`, replacing the current + Stage 2 v1 model. Update model_versioning in `model_registry/` + (Phase 12.3 — `model-versioning`). + +**Dependencies / open questions** +- Need ≥3 months of 2026 growing-season data before Phase 3 is statistically + meaningful. With data collection starting May 2026, retraining is realistic + for **August–September 2026**. +- CO2 atmospheric assumption (420 ppm) is conservative but the lack of a + real sensor is a real degradation vs the legacy fleet. Consider sourcing + hourly CO2 from a nearby Mauna Loa proxy if precision matters. +- Tracker-angle feature needs ThingsBoard telemetry alignment — trackers + emit `angle` as shared-attribute, not telemetry by default. Verify the + control loop is writing telemetry to TB. + +### 12.7: Frontend redesign — Claude Design handoff (done 2026-05-18) + +- [x] **redesign-foundation** — Replaced `:root` tokens with Negev sand + vine green + sun gold; loaded Source Serif 4 + IBM Plex Sans + IBM Plex Mono; added brand stripe motif + masked-PNG wordmark; re-targeted shadcn aliases. `tailwind.config.ts` extended with serif/mono families and brand color tokens. +- [x] **redesign-layout** — Rewrote `AppSidebar` to a 240 px sand sidebar with 4-section nav (Vineyard / Energy / Operations / Knowledge), masked logo, brand stripes, vine left-bar on active. New `Topbar.tsx` (breadcrumb · ⌘K search · refresh · bell · avatar). New `PageHeader.tsx` (eyebrow + serif H1 with optional italic emphasis + deck + 3-row meta panel). `AppLayout` adds Topbar + footer hairline strip. +- [x] **redesign-shared-components** — New `Sparkline`, `CardHead`, `DataFlowRail`, `TrackerArc`, `PlanTimeline` (96-cell ribbon), `StressHeatmap`. `StatCard` rewritten with eyebrow + delta + serif tabular number + caption + Sparkline. New chart wrappers `charts/SwAreaChart.tsx` and `charts/SwLineChart.tsx` with shared SolarWine defaults (hairline grid, mono ticks, brand palette, dashed reference lines). +- [x] **redesign-home** — Editorial header, data-flow rail, 4-stat row, 96-slot plan ribbon + power chart, tracker fleet with arc dials + status pills, FvCB-vs-ML photosynthesis card, stress heatmap, **dark Advisor card** with sun-gold "Apply at next tick" CTA, 7-day climate w/ 32°C dashed line, chill-accumulation bars. +- [x] **redesign-pages-all** — All 10 remaining pages rewritten: + - **Agronomy** — 4-stat row + A1–A4 block table w/ vigor bars + soil profile + agronomy log + water budget + - **Photosynthesis** — model-comparison big numbers + Chronos forecast + sensor explorer + - **Shading** — 64 px serif offset slider w/ vine→sun gradient, 3-zone canopy diagram, stress×offset map, 8-rule policy grid + - **Power** — 4-cell KPI strip + today-vs-yesterday-vs-astro line, inverter cards, weekly bars, revenue ledger + - **Trackers** — fleet table w/ arc dials + status pills + 24h sparklines, dispatch log, reliability fields + - **Control loop** — 5-stage pipeline with active highlight, L0..L4 priority stack, hierarchical energy budget, plan ribbon + - **Advisor** — chat surface w/ confidence pills + citations + feedback, dark day-ahead brief, active recommendations, quick-asks + - **Monitoring** (was Alarms) — alert stream w/ severity pills + ack, 6-source health column + - **Documentation** — numbered serif accordion (10 biology rules), API ref table (21 endpoints), 12-term glossary + - **Research** (new) — vineyard-photo hero band, 3 paper cards, datasets table, 7-person crew strip. `/research` route added. +- [x] **redesign-build** — TypeScript clean, vite build 2.5 s, 240 KB gzipped JS. Dev server at http://localhost:8080/. + +**TODO markers inline (would benefit from new backend endpoints)** +- [ ] **redesign-stress-grid** — `/api/photosynthesis/stress-grid?date=...` for live 4×24 CWSI grid (used by Home + Shading; currently synthetic). +- [ ] **redesign-inverters** — `/api/energy/inverters` for per-inverter live state on Power. +- [ ] **redesign-dispatch-stats** — `/api/control/dispatches` summary for p95 ack latency on Trackers. +- [ ] **redesign-events-dispatch** — surface dispatch + alert events through `/api/events/*` so the Trackers log + Monitoring stream are live, not seeded. +- [ ] **redesign-frontend-types-purge** — `frontend/src/types/api.ts` and hooks still declare `treatment_par_umol: number | null` etc. After the 2026 fleet migration these are always null; trim or mark deprecated. + +### 12.8: Streamlit staleness audit (done 2026-05-18) + +- [x] **streamlit-control-replay-freshness** — `ui/tab_system_status.py:_render_control_replay`: empty-state message now uses today's date; loaded log shows a freshness warning when older than 30 days; caption surfaces the simulated date range (sim_2026-05-01 → 2026-05-10). +- [x] **scripts-sim-defaults** — `scripts/run_control_simulation.py` defaults changed from `2025-07-01 / 2025-07-07` to `today − 7 d / today` so future runs are fresh. +- [x] **fresh-sim-log** — Generated `Data/simulation_logs/sim_2026-05-01_2026-05-10.json` (960 ticks). Required installing `astral` into the venv (was missing; fixed 960/960 errors on the first attempt). +- [x] **streamlit-shading-caption** — Added "historical analysis · `sensors_wide.csv` frozen at Feb 2026" caption to the Shading tab so the date picker isn't read as live. +- [x] **camera-caption** — Camera image caption now says "if the view shows only sky, the on-site camera needs realignment". Physical site issue; can't be fixed from code. + +### 12.4: Long-term (3+ months) + +- [ ] **multi-vineyard** – Refactor `config/settings.py` to multi-tenant pattern (vineyard ID → settings), add Postgres (Neon free tier) +- [ ] **licor-calibration** – Ingest first real LiCor measurements, retrain Farquhar Vcmax/Jmax via `src/calibration_pipeline.py` +- [ ] **chronos-vs-ml** – 3-month live comparison of Chronos-2 vs ML ensemble, promote winner to primary predictor + +--- + +## Session notes + +### 2026-02-27 — Phase 8B: Gemini LLM Data Engineering +- Created `src/llm_data_engineer.py` with `LLMDataEngineer` class. +- `analyze_anomalies()`: constructs a structured prompt from per-column descriptive stats + site-specific domain context (physical ranges, Negev notes) → Gemini returns a JSON with `lower_bound`, `upper_bound`, `zscore_threshold`, `iqr_multiplier`, `rationale` per column; falls back to physics-based bounds when API unavailable. +- `apply_cleaning()`: applies union of bound violations + Z-score + IQR anomaly flags; three strategies: `clip` (default), `nan`, `drop`. Detected 14 PAR anomalies (0.05%), 9 VPD anomalies (0.03%), 168 CO₂ anomalies (0.58%) on `sensors_wide_sample.csv`. +- `engineer_features()`: adds `hour_sin`, `hour_cos`, `doy_sin`, `doy_cos` (cyclical encodings); `stress_risk_score = vpd_weight × norm(VPD) + cwsi_weight × norm(CWSI)` in [0, 1]; weights sourced from Gemini (default: 0.6/0.4, falls back gracefully without CWSI). +- `run_pipeline()`: single-call orchestration of anomaly detection → cleaning → feature engineering. +- Added `google-genai>=1.0` to `requirements.txt`. + +### 2026-02-27 — Dashboard & pvlib +- **Data Explorer:** Intro text now lists all three data sources (Vineyard sensors, Weather station data, **AI Data Engineering**). Third option runs full LLM pipeline in-tab (thresholds, cleaning summary, before/after PAR/VPD, feature spec, stress profile); no cache loader, all precomputed on selection. +- **Presentation tab:** “What’s Next” completed list includes **Gemini LLM data engineering** with pointer to Data Explorer → AI Data Engineering. “What each tab shows” updated so Data Explorer bullet mentions AI Data Engineering. Key takeaways add Gemini data engineering (anomaly cleaning + stress/time features). +- **pvlib:** `src/solar_geometry.py` — `compute_tracker_tilt()` now calls `pvlib.tracking.singleaxis()` with first two args positional (zenith, azimuth) so it works with both pvlib < 0.13.1 (`apparent_azimuth`) and ≥ 0.13.1 (`solar_azimuth`). Fixes “Shadow model demo unavailable: singleaxis() got an unexpected keyword argument 'solar_azimuth'”. + +### 2026-03-05 — ThingsBoard live telemetry integration (Step 1) +- Rewrote `src/thingsboard_client.py`: full device registry (22 devices, UUIDs from devices.csv), area classification (treatment rows 501–502 / reference rows 503–504 / ambient Air1), parallel fetch with `ThreadPoolExecutor`, JWT auth with token refresh. +- Added `VineSnapshot` dataclass: aggregated treatment vs reference readings — Air, Crop (per panel position: west-bottom/east-upper/east-bottom/west-upper), Soil, Irrigation, Thermocouples. Includes `to_advisor_text()` and `to_dict()`. +- Added `_bounded_avg()` with `_BOUNDS` dict: physical plausibility filter rejects sensor faults (e.g. Soil5 thermocouple reading 653°C). Soil, Air, PAR, NDVI, VPD, CO₂ all filtered by domain bounds. +- Wired into `src/vineyard_chatbot.py`: new `_tool_get_vine_state()` tool + `get_vine_state` in system prompt + dispatch router; `_tool_day_ahead_advisory()` now passes `VineSnapshot` to advisor. +- Wired into `src/day_ahead_advisor.py`: optional `vine_snapshot` param in `advise()`; `to_advisor_text()` inserted before weather forecast in Gemini prompt. +- TB credentials (`TB_USERNAME`, `TB_PASSWORD`) added to `.env`; config also accepts `THINGSBOARD_USERNAME`/`THINGSBOARD_PASSWORD`. +- Tested live: all 22 devices fetched in 1.1 s, PAR shading ratio 0.33 (67% reduction), soil temp 15.5°C (outlier-filtered). +- Synced Phase 9 checklist: all chatbot tasks marked done (implemented in a prior session, todo file not updated). + +### 2026-03-09 — Phase 10: Anti-Hallucination Guardrails +- Created `src/chatbot/guardrails.py` with 4 components: QueryClassifier (regex data/knowledge/greeting routing), ResponseValidator (deterministic rule checks with block/warn severity), estimate_confidence (data freshness → confidence level), tag_tool_result (source metadata injection). +- Rewrote `src/chatbot/vineyard_chatbot.py`: integrated all guardrails into `chat()` flow — query classification → forced tool re-prompting → source-tagged tool results → response validation → confidence estimation. Extended `ChatResponse` with confidence/sources/caveats/rule_violations. Strengthened system prompt: "NEVER invent sensor readings", "MUST call a tool for data questions", "cite source and timestamp". +- Updated `ui/tab_advisor.py`: new `_render_grounding_metadata()` renders colored confidence badge, source citations, caveats, and rule violation warnings under each chat response. Metadata persisted in chat history. +- Added 23 new tests to `tests/test_advisor_chatbot.py`: 5 adversarial QA scenarios (shade-before-10 blocked, data-question forces tool call, stale-data warns, no-shade-without-reason warns, tool-failure returns insufficient_data) + unit tests for all guardrail components. Total: 42 tests, all passing. +- Updated `context/2_plan.md` with Phase 10 architecture, validation rules, confidence mapping, and remaining steps. Updated dependency order. + +### 2026-02-17 — Code quality fixes +- Fixed `Preprocessor.merge_ims_with_labels` position-based fallback: now raises `ValueError` instead of silently misaligning rows when `timestamp_index_labels=False` and labels have no named index. +- Removed all ~50 deprecated `use_container_width=True` calls in `app.py` (Streamlit 1.54): `st.image` → `width='stretch'`; `st.plotly_chart` / `st.dataframe` → argument removed (default is already `'stretch'`). +- Fixed follow-up `SyntaxError`: regex removal of `use_container_width=True` in the middle of argument lists left double commas (`,,`); collapsed all `,,` → `,`. +- Updated `context/CODE_REVIEW.md` sections 16–17 with applied fixes and remaining work list. +- Updated "What's next" sections in `app.py` (tab_photosynthesis section 6 and About tab) to reflect Chronos-2 and Gemini routing as completed. diff --git a/context/4_production.md b/context/4_production.md new file mode 100644 index 0000000000000000000000000000000000000000..3a5a3c0b04b0e3f40a05c4b1dbbcfddd721105c5 --- /dev/null +++ b/context/4_production.md @@ -0,0 +1,564 @@ +# SolarWine — Production Architecture + +## Overview + +Migrate from a single-process Streamlit prototype to a 3-layer production system +deployed on free-tier infrastructure. The monorepo stays — no new repositories. + +``` +Baseline/ (monorepo) +├── frontend/ NEW — Lovable-generated React app +│ ├── src/ +│ │ ├── pages/ +│ │ │ ├── Dashboard.tsx Overview + energy + weather +│ │ │ ├── Advisor.tsx Chatbot + advisory cards +│ │ │ ├── Control.tsx System status + tracker angles +│ │ │ ├── Photosynthesis.tsx FvCB/ML results + forecasts +│ │ │ ├── Shading.tsx Interactive simulator +│ │ │ └── Docs.tsx Documentation +│ │ ├── components/ +│ │ │ ├── EnergyCard.tsx +│ │ │ ├── WeatherCard.tsx +│ │ │ ├── Chatbot.tsx +│ │ │ ├── TrackerStatus.tsx +│ │ │ └── Charts.tsx Recharts / Plotly wrappers +│ │ ├── hooks/ +│ │ │ ├── useWeather.ts fetch /api/weather/* +│ │ │ ├── useEnergy.ts fetch /api/energy/* +│ │ │ ├── useSensors.ts fetch /api/sensors/* +│ │ │ ├── useChatbot.ts POST /api/chatbot/message +│ │ │ └── useControl.ts fetch /api/control/* +│ │ ├── lib/ +│ │ │ └── api.ts API base URL + fetch wrapper +│ │ └── App.tsx Router + layout +│ ├── package.json +│ └── tailwind.config.js +│ +├── backend/ NEW — FastAPI middleware + background services +│ ├── api/ +│ │ ├── __init__.py +│ │ ├── main.py FastAPI app, CORS, lifespan +│ │ ├── routes/ +│ │ │ ├── weather.py GET /api/weather/* +│ │ │ ├── sensors.py GET /api/sensors/* +│ │ │ ├── energy.py GET /api/energy/* +│ │ │ ├── photosynthesis.py GET /api/photosynthesis/* +│ │ │ ├── control.py GET /api/control/* +│ │ │ ├── chatbot.py POST /api/chatbot/message +│ │ │ └── health.py GET /api/health +│ │ ├── deps.py Shared dependencies (DataHub, Redis) +│ │ └── auth.py JWT middleware (Phase 11.6) +│ ├── workers/ +│ │ ├── control_tick.py ControlLoop 15-min cron entry point +│ │ └── daily_planner.py DayAheadPlanner daily cron entry point +│ ├── Dockerfile +│ └── requirements.txt +│ +├── .github/ +│ └── workflows/ +│ ├── control-tick.yml GitHub Actions: 15-min cron +│ └── daily-planner.yml GitHub Actions: daily 05:00 IST cron +│ +├── src/ UNCHANGED — shared Python core +│ ├── control_loop.py +│ ├── command_arbiter.py +│ ├── tracker_dispatcher.py +│ ├── day_ahead_planner.py +│ ├── energy_budget.py +│ ├── data/ +│ │ ├── data_providers.py DataHub + 6 services +│ │ ├── thingsboard_client.py +│ │ └── ims_client.py +│ ├── chatbot/ +│ │ ├── vineyard_chatbot.py +│ │ ├── guardrails.py +│ │ └── routing_agent.py +│ ├── models/ +│ │ ├── farquhar_model.py +│ │ └── phenology.py +│ ├── forecasting/ +│ │ ├── predictor.py +│ │ └── ts_predictor.py +│ ├── shading/ +│ │ ├── solar_geometry.py +│ │ └── tradeoff_engine.py +│ └── ... +│ +├── config/settings.py UNCHANGED — shared configuration +├── app.py KEPT temporarily (Streamlit, deprecated) +├── ui/ KEPT temporarily (Streamlit tabs, deprecated) +├── docker-compose.yml NEW — local dev orchestration +└── requirements.txt Shared Python deps +``` + +--- + +## Layer 1 — The Brain (Backend Services) + +### What it is + +All business logic, models, data access, and control algorithms. This layer +already exists in `src/`. The only change is extracting the runtime entry points +into `backend/workers/`. + +### Components + +| Component | Module | Runtime | Schedule | +|-----------|--------|---------|----------| +| ControlLoop | `src/control_loop.py` | GitHub Actions cron | Every 15 min | +| DayAheadPlanner | `src/day_ahead_planner.py` | GitHub Actions cron | Daily 05:00 IST + re-plan events | +| DataHub | `src/data/data_providers.py` | Imported by API + workers | Always available | +| ThingsBoard client | `src/data/thingsboard_client.py` | Imported by DataHub | On-demand | +| IMS client | `src/data/ims_client.py` | Imported by DataHub | On-demand (30-min TTL) | +| FvCB model | `src/models/farquhar_model.py` | Imported by PhotosynthesisService | On-demand (~10ms) | +| ML ensemble | `src/forecasting/predictor.py` | Imported by PhotosynthesisService | On-demand (~500ms) | +| Chronos forecaster | `src/forecasting/ts_predictor.py` | Imported by PhotosynthesisService | On-demand (~2-5s) | +| CommandArbiter | `src/command_arbiter.py` | Imported by ControlLoop | Per tick | +| TrackerDispatcher | `src/tracker_dispatcher.py` | Imported by ControlLoop | Per tick | +| EnergyBudget | `src/energy_budget.py` | Imported by ControlLoop | Per tick | +| Chatbot + guardrails | `src/chatbot/*.py` | Imported by API route | Per message | + +### Caching strategy + +| Data | Current | Production | +|------|---------|------------| +| IMS weather | In-memory TTLCache (30 min) | **Upstash Redis** (30 min TTL) | +| Vine sensors | In-memory TTLCache (5 min) | **Upstash Redis** (5 min TTL) | +| Energy daily | No cache | **Upstash Redis** (15 min TTL) | +| ML trained model | Pickle file | Pickle in `/tmp` + Redis metadata | +| Day-ahead plan | JSON file | Redis hash + JSON file backup | +| Chatbot history | Streamlit session_state | Redis list per session | + +### External dependencies + +| Service | URL | Auth | Purpose | +|---------|-----|------|---------| +| ThingsBoard | `web.seymouragri.com` | Username/password → JWT | 21 sensors, 4 trackers, energy | +| IMS | `api.ims.gov.il` | API token | Weather station 43 (Sde Boker) | +| Google Gemini | `generativelanguage.googleapis.com` | API key | Chatbot (2.5-flash), routing | +| Upstash Redis | `*.upstash.io` | Token | Shared cache | + +--- + +## Layer 2 — Middleware (FastAPI on HuggingFace Spaces) + +### What it is + +A thin Python API layer that wraps `DataHub` services as REST endpoints. Hosted +on **HuggingFace Spaces** (Docker SDK, free tier) — Python-native, no cold starts +on the free tier's persistent container. + +### Tech stack + +| Component | Technology | Why | +|-----------|-----------|-----| +| Framework | **FastAPI** | Same Python team, async, auto-docs, WebSocket | +| Serialization | **Pydantic v2** | Already a FastAPI dependency, typed responses | +| Auth | **JWT** (PyJWT) | Simple, stateless, no external IdP needed initially | +| Rate limiting | **slowapi** | Token bucket per IP, protects Gemini quota | +| CORS | FastAPI `CORSMiddleware` | Allow Cloudflare Pages frontend origin | +| WebSocket | FastAPI WebSocket | Live tracker angles, energy push (future) | +| Process manager | **uvicorn** | ASGI server, production-ready | +| Hosting | **HuggingFace Spaces** (Docker SDK) | Free, Python-native, persistent container | + +### HuggingFace Space configuration + +The API Space uses Docker SDK. A `Dockerfile` at `backend/` builds the FastAPI +server. The Space README metadata: + +```yaml +--- +title: SolarWine API +emoji: 🌿 +colorFrom: green +colorTo: yellow +sdk: docker +app_port: 7860 +private: true +--- +``` + +Note: HF Spaces exposes port 7860, so FastAPI binds to `0.0.0.0:7860`. + +### API endpoints + +``` +Health + GET /api/health → { status, uptime, redis_ok, tb_ok } + +Weather + GET /api/weather/current → WeatherService.get_current() + GET /api/weather/history?days=7 → WeatherService.get_history() + GET /api/weather/forecast → WeatherService.get_forecast() + +Vine Sensors + GET /api/sensors/snapshot → VineSensorService.get_snapshot() + GET /api/sensors/history?type=crop&hours=24 → VineSensorService.get_history() + +Energy + GET /api/energy/current → EnergyService.get_current() + GET /api/energy/daily/{date} → EnergyService.get_daily_production() + GET /api/energy/history?hours=24 → EnergyService.get_history() + GET /api/energy/predict/{date} → EnergyService.predict() + +Photosynthesis + GET /api/photosynthesis/current → PhotosynthesisService.get_current() + GET /api/photosynthesis/forecast → PhotosynthesisService.forecast_day_ahead() + +Control + GET /api/control/status → Last TickResult from Redis + GET /api/control/plan → Current DayAheadPlan from Redis + GET /api/control/budget → EnergyBudget current state + GET /api/control/trackers → Live tracker angles from TB + +Chatbot + POST /api/chatbot/message → VineyardChatbot.chat() + Body: { message, session_id } + Response: { message, confidence, sources, caveats, rule_violations } + + POST /api/chatbot/feedback → feedback.log_feedback() + Body: { session_id, message_id, rating, comment } + +Biology + GET /api/biology/phenology → BiologyService current stage + GET /api/biology/rules → All biology rules +``` + +### Middleware stack (order matters) + +1. **CORS** — allow `*.pages.dev` + localhost +2. **Rate limiter** — 60 req/min general, 10 req/min chatbot (Gemini costs) +3. **Auth** — JWT validation (initially optional, enforced in Phase 11.6) +4. **Request logging** — structured JSON logs +5. **Error handler** — consistent error response format + +--- + +## Layer 3 — Frontend (Lovable → Cloudflare Pages) + +### What it is + +Production-grade React frontend generated via **Lovable** (AI-powered React +builder). Produces a standard Vite + React + TypeScript + Tailwind project. +Deployed to **Cloudflare Pages** (free tier, unlimited bandwidth, private org repos supported). + +Lovable generates the initial scaffold and components rapidly. After generation, +the code is committed to the monorepo under `frontend/` and maintained manually +or with further Lovable iterations. + +### Tech stack + +| Component | Technology | Why | +|-----------|-----------|-----| +| Generator | **Lovable** | AI-generated React UI, rapid prototyping | +| Framework | **React 19 + Vite** | Lovable default output, fast build | +| Language | **TypeScript** | Type safety, IDE support | +| Styling | **Tailwind CSS + shadcn/ui** | Lovable default, beautiful components | +| Charts | **Recharts** (default) or **Plotly.js** | Data visualization | +| HTTP | **TanStack Query** (React Query) | Auto-refresh, caching, loading states | +| Routing | **React Router** | Page navigation | +| Hosting | **Cloudflare Pages** (free) | Unlimited bandwidth, private org repos, global CDN, auto-deploy from GitHub | + +### Pages (mapped from current Streamlit tabs) + +| Streamlit Tab | React Page | Route | Key Components | +|---------------|------------|-------|----------------| +| Vineyard Advisor | `Advisor.tsx` | `/` | Chatbot, weather card, energy card, shading card, irrigation card | +| System Status | `Control.tsx` | `/control` | Tracker angles, energy budget gauge, control replay, ROI | +| Overview | `Dashboard.tsx` | `/dashboard` | Energy history, crop comparisons | +| Photosynthesis & Data | `Photosynthesis.tsx` | `/photosynthesis` | FvCB/ML results, sensor explorer | +| Forecasting | — | merged into `/dashboard` | Weather + PS forecast cards | +| Shading Simulator | `Shading.tsx` | `/shading` | Interactive offset tester | +| Documentation | `Docs.tsx` | `/docs` | Help, API reference | + +### Data fetching pattern + +Using TanStack Query for all API calls. Auto-refetch on window focus and +configurable polling intervals. + +```typescript +// hooks/useWeather.ts +import { useQuery } from "@tanstack/react-query"; +import { api } from "@/lib/api"; + +export function useCurrentWeather() { + return useQuery({ + queryKey: ["weather", "current"], + queryFn: () => api.get("/api/weather/current"), + refetchInterval: 60_000, // 60s auto-refresh + }); +} +``` + +```typescript +// lib/api.ts +const API_URL = import.meta.env.VITE_API_URL; + +export const api = { + get: async (path: string) => { + const res = await fetch(`${API_URL}${path}`); + if (!res.ok) throw new Error(res.statusText); + return res.json(); + }, + post: async (path: string, body: unknown) => { + const res = await fetch(`${API_URL}${path}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + if (!res.ok) throw new Error(res.statusText); + return res.json(); + }, +}; +``` + +### Frontend ↔ Backend communication + +| Pattern | Use Case | Protocol | +|---------|----------|----------| +| REST | All data reads, chatbot messages | HTTPS (fetch via TanStack Query) | +| Polling | Dashboard auto-refresh | 60s interval via `refetchInterval` | +| WebSocket | Live tracker angles, energy (future) | WSS (native WebSocket, future) | + +--- + +## Infrastructure & Deployment + +### Hosting (all free tier) + +| Layer | Platform | Tier | Limits | +|-------|----------|------|--------| +| Frontend | **Cloudflare Pages** | Free | Unlimited bandwidth, 500 builds/month, auto-deploy from GitHub | +| API server | **HuggingFace Spaces** | Free (Docker SDK) | 2 vCPU, 16GB RAM, persistent container, private spaces | +| Cron workers | **GitHub Actions** | Free (private repos) | 2,000 min/month, plenty for 15-min cron + daily planner | +| Cache | **Upstash Redis** | Free | 10K commands/day, 256MB, REST API | +| Secrets | **HF Space secrets** + **Cloudflare env vars** + **GitHub Actions secrets** | Free | Per-service | +| Repo | **GitHub** | Free private | Unlimited | + +### Deployment topology + +``` +GitHub (private repo, main branch) + │ + ├──── push ────► Cloudflare Pages (auto-deploy) + │ ├── frontend/ → Vite build → static React app + │ ├── URL: baseline.pages.dev (or custom domain) + │ └── Env: VITE_API_URL=https://-solarwine-api.hf.space + │ + ├──── push ────► HuggingFace Space (auto-deploy via HF GitHub sync) + │ ├── backend/ → Dockerfile → FastAPI (uvicorn, port 7860) + │ ├── URL: https://-solarwine-api.hf.space + │ └── Secrets: TB creds, IMS token, Gemini key, Redis URL + │ + └──── cron ────► GitHub Actions (scheduled workflows) + ├── control-tick.yml: */15 * * * * → pip install + python control_tick.py + ├── daily-planner.yml: 0 2 * * * (02:00 UTC = 05:00 IST) + └── Secrets: TB creds, IMS token, Redis URL + +Upstash Redis + └── URL: solarwine-cache-*.upstash.io (shared by API + workers) +``` + +### GitHub Actions cron workflows + +The ControlLoop and DayAheadPlanner run as scheduled GitHub Actions. This +replaces the need for a separate worker host. + +```yaml +# .github/workflows/control-tick.yml +name: Control Loop Tick +on: + schedule: + - cron: "*/15 * * * *" # every 15 min + workflow_dispatch: # manual trigger + +jobs: + tick: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + - run: pip install -r requirements.txt -r backend/requirements.txt + - run: python -m backend.workers.control_tick + env: + THINGSBOARD_HOST: ${{ secrets.THINGSBOARD_HOST }} + THINGSBOARD_USERNAME: ${{ secrets.THINGSBOARD_USERNAME }} + THINGSBOARD_PASSWORD: ${{ secrets.THINGSBOARD_PASSWORD }} + IMS_API_TOKEN: ${{ secrets.IMS_API_TOKEN }} + UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }} + UPSTASH_REDIS_TOKEN: ${{ secrets.UPSTASH_REDIS_TOKEN }} +``` + +```yaml +# .github/workflows/daily-planner.yml +name: Day-Ahead Planner +on: + schedule: + - cron: "0 2 * * *" # 02:00 UTC = 05:00 IST + workflow_dispatch: + +jobs: + plan: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + - run: pip install -r requirements.txt -r backend/requirements.txt + - run: python -m backend.workers.daily_planner + env: + THINGSBOARD_HOST: ${{ secrets.THINGSBOARD_HOST }} + THINGSBOARD_USERNAME: ${{ secrets.THINGSBOARD_USERNAME }} + THINGSBOARD_PASSWORD: ${{ secrets.THINGSBOARD_PASSWORD }} + IMS_API_TOKEN: ${{ secrets.IMS_API_TOKEN }} + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }} + UPSTASH_REDIS_TOKEN: ${{ secrets.UPSTASH_REDIS_TOKEN }} +``` + +### Docker setup (HuggingFace Space) + +```dockerfile +# backend/Dockerfile +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +COPY backend/requirements.txt backend/ +RUN pip install -r requirements.txt -r backend/requirements.txt + +COPY src/ src/ +COPY config/ config/ +COPY backend/ backend/ +COPY Data/ Data/ + +ENV PYTHONPATH=/app + +# HuggingFace Spaces requires port 7860 +EXPOSE 7860 +CMD ["uvicorn", "backend.api.main:app", "--host", "0.0.0.0", "--port", "7860"] +``` + +### Environment variables + +| Variable | Where | Source | +|----------|-------|--------| +| `THINGSBOARD_HOST` | HF Space, GH Actions | HF secrets, GH secrets | +| `THINGSBOARD_USERNAME` | HF Space, GH Actions | HF secrets, GH secrets | +| `THINGSBOARD_PASSWORD` | HF Space, GH Actions | HF secrets, GH secrets | +| `IMS_API_TOKEN` | HF Space, GH Actions | HF secrets, GH secrets | +| `GOOGLE_API_KEY` | HF Space, GH Actions | HF secrets, GH secrets | +| `UPSTASH_REDIS_URL` | HF Space, GH Actions | HF secrets, GH secrets | +| `UPSTASH_REDIS_TOKEN` | HF Space, GH Actions | HF secrets, GH secrets | +| `JWT_SECRET` | HF Space | HF secrets | +| `ALLOWED_ORIGINS` | HF Space | HF secrets (Cloudflare Pages URL) | +| `VITE_API_URL` | Cloudflare Pages | Cloudflare env vars (HF Space URL) | + +--- + +## Data Flow + +### Request flow (user views dashboard) + +``` +Browser → Cloudflare CDN → React SPA (static) + │ + └── useQuery → fetch https://-solarwine-api.hf.space/api/weather/current + │ + ▼ + FastAPI route (HuggingFace Spaces) + │ + ▼ + DataHub.weather.get_current() + │ + ├── Redis cache hit? → return cached + └── Redis miss → IMS API → cache → return +``` + +### Control flow (15-min tick) + +``` +GitHub Actions cron (*/15 * * * *) + │ + └── python -m backend.workers.control_tick + │ + ▼ + ControlLoop.tick() + │ + ├── DataHub.weather.get_current() → IMS (via Redis cache) + ├── DataHub.vine_sensors.get_snapshot() → ThingsBoard + ├── RoutingAgent → FvCB or ML model + ├── DayAheadPlan lookup → Redis + ├── InterventionGate check + ├── BudgetGuard check + ├── CommandArbiter → decide angle + ├── TrackerDispatcher → ThingsBoard shared attributes + ├── EnergyBudget.spend_slot() + └── Save TickResult → Redis (for API /control/status) +``` + +### Chatbot flow + +``` +Browser → React → POST /api/chatbot/message { message, session_id } + │ + ▼ +FastAPI route (HF Space) → VineyardChatbot.chat(message, hub=DataHub) + │ + ├── QueryClassifier → data / knowledge / greeting + ├── Gemini Pass 1 → tool calls (if data query) + ├── DataHub.dispatch_tool() → real data + ├── tag_tool_result() → source metadata + ├── Gemini Pass 2 → grounded response + ├── ResponseValidator → rule checks + ├── estimate_confidence() + └── Return ChatResponse → JSON → Browser +``` + +--- + +## Security + +| Concern | Mitigation | +|---------|-----------| +| API keys in repo | `.env` in `.gitignore`; secrets in HF/Cloudflare/GH settings | +| TB credentials | Server-side only; frontend never sees TB creds | +| Gemini API abuse | Rate limit 10 req/min on `/api/chatbot/message` | +| CORS | Whitelist Cloudflare Pages domain only | +| Auth (Phase 11.6) | JWT tokens; initially optional for research use | +| Tracker commands | Only GH Actions worker can write to TB; API is read-only | +| HF Space | Set to **private** — not publicly accessible without auth | + +--- + +## Migration from Streamlit + +The existing `app.py` and `ui/` folder remain functional throughout migration. +They are deprecated once the Lovable frontend reaches feature parity. + +| Phase | Streamlit | Lovable/React | Notes | +|-------|-----------|---------------|-------| +| 11.1–11.3 | Primary | Not started | Backend being built | +| 11.4 | Primary | Scaffold | Pages generated via Lovable | +| 11.5 | Deprecated | Primary | Feature parity reached | +| 11.6+ | Removed | Primary | Auth, monitoring, polish | + +--- + +## Scaling path (when free tier is outgrown) + +| Bottleneck | Upgrade | Cost | +|-----------|---------|------| +| HF Space resources | HF Space upgrade (2× CPU, 16GB) | $0 (already free) → $9/mo for GPU | +| GitHub Actions minutes | GitHub Team (3,000 min) | $4/user/mo | +| Upstash 10K commands/day | Upstash Pay-as-you-go ($0.20/100K) | ~$1/mo | +| Cloudflare Pages | Already unlimited on free tier | $0 | +| Heavy ML inference | Add GPU worker (Modal/RunPod) | $5–10/mo | +| Multi-site (>1 vineyard) | Add Postgres (Neon free) for multi-tenant state | Free → $19/mo | + +Total cost to run a real commercial deployment: **~$25/month**. diff --git a/context/CODE_REVIEW.md b/context/CODE_REVIEW.md new file mode 100644 index 0000000000000000000000000000000000000000..b4531c7bd7ff77d3390eca914eb75d6d6f671134 --- /dev/null +++ b/context/CODE_REVIEW.md @@ -0,0 +1,311 @@ +# Deep Code Review – Photosynthesis Prediction Model + +**Scope:** `config/settings.py`, `src/*.py` +**Date:** 2025-02 + +--- + +## 1. Executive Summary + +The OOP architecture matches the plan and is generally sound. **Critical issues** to fix: (1) IMS `resample_to_15min` receives DataFrames whose first channel may have `timestamp_utc` as index, not column; (2) `Preprocessor.merge_ims_with_labels` can produce duplicate timestamp columns and misalign when labels are not index-aligned; (3) `FarquharModel.compute_all` uses row-wise Python loop and can leak NaN. **Medium** issues: missing validation (paths, token, NaN handling), IMS timezone handling, and preprocessor edge cases. **Low**: type hints, docstrings, and minor robustness. + +--- + +## 2. config/settings.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| No validation that paths exist | Low | `SENSORS_WIDE_PATH` may not exist; code fails at load time. Acceptable but could add a `validate_paths()` or document. | +| `TRAIN_RATIO` used with `or` in Preprocessor | Low | `train_ratio or settings.TRAIN_RATIO` treats `0.0` as falsy; use `train_ratio if train_ratio is not None else settings.TRAIN_RATIO` if 0 is ever valid. | + +**Verdict:** Good; no critical bugs. + +--- + +## 3. src/sensor_data_loader.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| `read_csv(..., usecols=lambda c: c in use_cols)` | Medium | If the CSV has no `time` column or a column is missing, `read_csv` may error or drop columns silently. Consider validating columns after load. | +| Missing columns not reported | Low | When requested columns are absent, pandas may omit them; caller gets incomplete DataFrame. | +| `filter_daytime` with NaN in PAR | Low | `df[par_column] > par_threshold` yields False for NaN; those rows are dropped. Document or add `dropna(subset=[par_column])` explicitly. | + +**Verdict:** Solid. Add a post-load check that required columns exist and optionally log missing ones. + +--- + +## 4. src/ims_client.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| **`resample_to_15min` assumes column** | **Critical** | `fetch_channel` returns a DataFrame with `timestamp_utc` as **index** (line 83). `fetch_all_channels` builds `out` by joining such DataFrames and then `reset_index()`, so the final `out` has `timestamp_utc` as a column. So after `fetch_all_channels` we're OK. But `resample_to_15min` is also called with the result of `fetch_all_channels` which has the column. So actually OK. Double-check: `load_cached` returns df with column; `fetch_and_cache` calls `fetch_all_channels` then `resample_to_15min` – and `fetch_all_channels` does `reset_index()`, so column exists. **Verdict:** OK as written. | +| Empty token | Medium | If `IMS_API_TOKEN` is missing, `fetch_channel` will call API with empty token and get 401. Add an explicit check in `fetch_channel` or `__init__` and raise a clear error. | +| IMS returns Israel time | Medium | Doc says IMS returns Israel time; we pass to `pd.to_datetime(..., utc=True)`. If the string has no timezone, pandas treats it as local (or naive). We should parse as Israel and convert to UTC, or document that we assume UTC. | +| No retries / rate limiting | Low | Single request; 60s timeout. For long ranges the API may throttle; consider retries and chunking (as in plan). | +| `fetch_all_channels` first frame has index, no column | Critical | First iteration: `out = df` where `df` is from `fetch_channel` – so `out` has **index** `timestamp_utc`, no column named `timestamp_utc`. Then `out.join(df, ...)` keeps index. So after the loop, `out.reset_index()` creates column `timestamp_utc`. So we're good. | +| `load_cached` and CSV timestamp | Low | After `read_csv`, column is object; we convert with `pd.to_datetime(..., utc=True)`. Good. | + +**Verdict:** Add token validation; clarify or fix timezone handling for IMS datetime. + +--- + +## 5. src/farquhar_model.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| **`compute_all` row-wise loop** | **Medium** | `df.iterrows()` is slow and not vectorized; any NaN in a row propagates (e.g. `row[par_col]` can be NaN). We should vectorize or use `apply` and handle NaN explicitly (e.g. skip or fill). | +| **NaN propagation** | **Medium** | `calc_photosynthesis` and helpers don't check for NaN; numpy will propagate them. So `compute_all` can return a Series full of NaN if one input column has NaNs. Add NaN handling (e.g. return NaN for that row and document). | +| Ko units and OI | Low | Plan: `Ko = exp(20.30 - 36380/(R*Tk))`; code multiplies by 1000 "to match OI". OI is 210 mmol/mol. Formula units vary by source; document or cite so Ko/OI consistency is clear. | +| Vcmax/Jmax above Topt | Low | Simplified Gaussian decline above Topt; not the full Greer & Weedon equation. Document as simplified. | +| `_ci_from_ca` and gs_factor | Low | Stomatal model is heuristic (VPD/CWSI scaling). Document as simplified. | +| Division by zero | Low | In `calc_photosynthesis`, `ci + Kc*(1+OI/Ko)` could in theory be 0 for extreme T; clip or guard if needed. | + +**Verdict:** Fix NaN handling and consider vectorization or explicit NaN-in → NaN-out in `compute_all`. + +--- + +## 6. src/preprocessor.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| **merge when labels not index-aligned** | **Critical** | When `timestamp_index_labels=False`, we do `merged["A"] = labels.values[: len(merged)]`. This assumes `labels` and `ims_df` are **ordered identically** by time and that `len(labels) >= len(merged)`. If IMS and labels have different timestamps (inner join not used), alignment is wrong. When `timestamp_index_labels=True`, inner merge is correct. Recommendation: deprecate or remove the `timestamp_index_labels=False` path, or require an explicit timestamp column in labels and merge on it. | +| Duplicate timestamp columns after merge | Low | After inner merge we may have both `timestamp_utc` (from IMS) and the label index column (e.g. `time`). Consider dropping the duplicate: `merged.drop(columns=[ts_lab], inplace=True)` if `ts_lab != timestamp_col_ims`. | +| `temporal_split` return contract when n>=len(df) | Medium | When `n >= len(df)` we return `X, y, empty, empty` – so "train" is full dataset, test is empty. Caller may not expect that. Document or return a clear sentinel. | +| `int(len(df) * self.train_ratio)` | Low | For very small df, n can be 0; we already return early for `n <= 0`. Good. | +| `fit_transform_train` overwrites scaler | Low | Each call fits a new scaler; no way to "refit" explicitly. Acceptable. | + +**Verdict:** Fix merge logic when labels are not index-based; document or adjust temporal_split when test is empty. + +--- + +## 7. src/predictor.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| `get_feature_importance` | Low | Uses `feature_names_in_` (sklearn 1.0+). For older sklearn, fallback to `list(range(len(imp)))` is correct. | +| `plot_results` and `self.results` | Low | If `evaluate` was never called, `self.results` is empty and plot is no-op. Document. | +| R2 when variance is zero | Low | If `y_test` is constant, `r2_score` can be negative or undefined; sklearn returns 0 or a value. Acceptable. | +| Unused import `seaborn` | Low | Remove if not used. | + +**Verdict:** Minor cleanups only. + +--- + +## 8. src/__init__.py + +| Finding | Severity | Notes | +|--------|----------|--------| +| Lazy `__getattr__` | Low | Works; avoids pulling config/requests on import. | +| No `__dir__` | Low | `dir(src)` won't list the lazy attributes; could add `__dir__` returning `__all__` for better discoverability. | + +**Verdict:** Good. + +--- + +## 9. Cross-Cutting and Data Flow + +| Finding | Severity | Notes | +|--------|----------|--------| +| Sensor timestamp vs IMS timestamp | Medium | SensorDataLoader uses column `time` (from sensors_wide); IMS uses `timestamp_utc`. For merge, Preprocessor expects labels with datetime index or a column. Ensure sensor data index (or column) is set to the same timezone (UTC) and format when building labels for merge. | +| No end-to-end test | Medium | A minimal script or test that runs load → Farquhar → merge → split → train → evaluate would catch integration bugs. | + +--- + +## 10. Recommended Fixes (Priority Order) + +1. **Preprocessor.merge_ims_with_labels:** When `timestamp_index_labels=False`, do not align by position; require a timestamp column in labels and merge on it, or drop this branch and require index-based labels. +2. **IMSClient:** Validate `self.token` in `__init__` or at first fetch and raise a clear error if missing. +3. **FarquharModel.compute_all:** Handle NaN (e.g. skip row or set A=NaN); consider vectorizing or using `apply` with a wrapper that catches NaN. +4. **Preprocessor:** After merge, drop the redundant timestamp column if `ts_lab != timestamp_col_ims`. +5. **SensorDataLoader.load:** After `read_csv`, check that required columns (at least timestamp and Stage 1) are present and log or raise if not. +6. **predictor:** Remove unused `seaborn` import; add `__dir__` to `src/__init__.py` for discoverability. + +--- + +## 11. Summary Table + +| Module | Critical | Medium | Low | +|--------|----------|--------|-----| +| config/settings.py | 0 | 0 | 2 | +| sensor_data_loader.py | 0 | 1 | 2 | +| ims_client.py | 0 | 2 | 2 | +| farquhar_model.py | 0 | 2 | 4 | +| preprocessor.py | 1 | 1 | 3 | +| predictor.py | 0 | 0 | 3 | +| __init__.py | 0 | 0 | 1 | + +**Total: 1 critical, 6 medium, 17 low.** + +--- + +## 12. scripts/run_pipeline.py and app.py (post-todo completion) + +| Finding | Severity | Notes | +|--------|----------|--------| +| run_pipeline: Stage 1 labels index | Low | Labels index set to floor 15min and aggregated; aligns with IMS for merge. Good. | +| run_pipeline: Stage 2 requires overlap | Low | If IMS cache and sensor date ranges don't overlap, merge is empty; message added. | +| run_pipeline: global `pd` | Low | `import pandas as pd` at module level; used in run_stage1 and validate_stage1. | +| app.py: run_stage1/run_stage2 buttons | Low | Buttons trigger pipeline; state not persisted across reruns. Acceptable. | +| app.py: paths in sidebar | Low | Shows config paths; no secrets. Good. | + +**Verdict:** Pipeline and app are consistent with the plan; no critical issues. + +--- + +## 13. Applied Fixes (post-review) + +- **Preprocessor:** Drop duplicate timestamp column after merge when `ts_lab != timestamp_col_ims`; when `timestamp_index_labels=False`, use labels.index for merge if present to avoid position-based alignment. `train_ratio`: use `None` default and `if train_ratio is None else train_ratio` so `0.0` is valid. +- **IMSClient:** Validate token in `__init__` and raise `ValueError` if missing. +- **FarquharModel.compute_all:** Check for NaN in required inputs per row and append NaN to output; catch TypeError/ZeroDivisionError/ValueError and append NaN. +- **SensorDataLoader.load:** After `read_csv`, raise `ValueError` with missing column names if any requested column is absent. +- **predictor:** Removed unused `seaborn` import. +- **src/__init__.py:** Added `__dir__` returning `__all__` for better discoverability. + +--- + +## 14. Growing-season filter (Oct–April excluded) + +| Finding | Severity | Notes | +|--------|----------|--------| +| config.GROWING_SEASON_MONTHS | Low | (5,6,7,8,9) = May–September; single source of truth. | +| run_stage1: filter by month after daytime | Low | Only rows with month in GROWING_SEASON_MONTHS are used for A; labels and Stage 2 are thus growing-season only. No change needed in Stage 2 merge. | +| Hemisphere | Low | Assumes Northern Hemisphere (Israel). Document if reused elsewhere. | + +**Verdict:** Correct; reduces label count to active season only and improves Stage 2 relevance. + +--- + +## 15. Applied fixes (verified) + +Verified in the codebase as of 2026-02. The following fixes from section 13 are present: + +| Fix | Status | Location | +|-----|--------|----------| +| Preprocessor: drop duplicate timestamp after merge | Done | `preprocessor.py` 48–49, 59–61 | +| Preprocessor: merge on timestamp when `timestamp_index_labels=False` and labels have index | Done (partial) | When labels have a named index, merge is on timestamp; else position-based alignment still used (lines 62–64) | +| Preprocessor: `train_ratio` default `None`, use `if train_ratio is None else train_ratio` | Done | `preprocessor.py` 19, 21 | +| IMSClient: validate token in `__init__`, raise `ValueError` if missing | Done | `ims_client.py` 38–41 | +| FarquharModel.compute_all: NaN handling and exception → NaN | Done | `farquhar_model.py` 184–185, 193 | +| SensorDataLoader.load: raise `ValueError` with missing column names | Done | `sensor_data_loader.py` 61–64 | +| predictor: remove unused `seaborn` | Done | Not present in `predictor.py` | +| `src/__init__.py`: add `__dir__` returning `__all__` | Done | `__init__.py` line 14 | + +--- + +## 16. Fixes applied 2026-02-17 + +The following issues identified in the full code + design review (2026-02-17) have been resolved: + +| Fix | Severity | Location | Change | +|-----|----------|----------|--------| +| **Preprocessor position-based merge fallback removed** | Critical | `preprocessor.py:52–64` | The `else` branch that silently aligned labels to IMS rows by position (`labels.values[:len(merged)]`) — which produces incorrect joins when row counts differ — has been replaced with an explicit `ValueError`. All callers use `timestamp_index_labels=True`; the dead code path is no longer reachable. | +| **`use_container_width=True` deprecated API removed** | Medium | `app.py` (~50 occurrences) | Streamlit 1.54 deprecates `use_container_width=True`. All occurrences replaced: `st.image` calls now use `width='stretch'` (equivalent behaviour, since the old default for images was `width='content'`); `st.plotly_chart` and `st.dataframe` calls have the argument removed (their default is already `width='stretch'`). | + +--- + +## 17. Remaining work + +**Medium (not yet applied)** + +- **IMS timezone:** Doc states IMS returns Israel time; code uses `pd.to_datetime(..., utc=True)`. Either parse as Israel and convert to UTC, or document that input is assumed UTC. *(Note: `ims_client.py` was updated to correctly localize to `Asia/Jerusalem` then convert to UTC; verify this is actually called on the datetime string.)* +- **FarquharModel.compute_all:** Still uses `df.iterrows()`; vectorization or `apply` with NaN-safe wrapper would improve performance for large datasets (NaN handling is already correct). +- **Preprocessor.temporal_split:** When `n >= len(df)` the function returns full dataset as train and empty test; document this contract or return a clear sentinel. +- **No automated tests:** Add at minimum: `test_farquhar.py` (known inputs, NaN handling, ci floor), `test_preprocessor.py` (merge, split, empty edge cases, ValueError for position-based path), `test_solar_geometry.py` (tracker tilt scalar output, shadow mask shape). +- **app.py monolith:** 2568 lines, all 5 tabs inline. Extract tab content into a `tabs/` package for maintainability. + +**Low (optional)** + +- `compute_face_shading` unbound locals: initialize `east_sunlit = 0.0` and `west_sunlit = 0.0` before conditional branches (currently safe in practice but fragile). +- No-op rename in `ims_client.py:141`: `df.rename(columns={c: c ...})` is an identity operation; remove it. +- Unused `humidity_col` parameter in `FarquharModel.compute_all`: remove or document. +- Module-level singletons in `tracker_optimizer.py`: `_model` and `_shadow` are created on import; acceptable but note this if config changes at runtime. +- Path validation in `config/settings.py`; `filter_daytime` NaN in PAR; Ko/OI units documentation; division-by-zero guard in Farquhar; etc. See sections 2–9 for the full list. + +--- + +## 18. src/chatbot/guardrails.py (added 2026-03-09) + +Anti-hallucination guardrails for the vineyard advisor chatbot. + +| Component | Role | Notes | +|-----------|------|-------| +| `QueryClassifier` | Regex-based query routing | Tags queries as data/knowledge/greeting/ambiguous. Data queries force tool calls. Generic "what is" without domain keyword → ambiguous (avoids false positives). | +| `ResponseValidator` | Deterministic post-response rule checks | 5 rules: no_shade_before_10 (block), no_shade_in_may (block), temperature_transition (warn <28°C), no_leaves_no_shade_problem (warn), no_shading_must_explain (warn). Block overrides response text. | +| `estimate_confidence` | Data freshness → confidence level | high (<30min), medium (30-120min), low (>120min or no tool), insufficient_data (tool failed). Computed results (FvCB, sim) → high. | +| `tag_tool_result` | Source metadata injection | Adds `_source` (human-readable), `_data_age_minutes`, `_freshness_warning` (if >60min) to tool result dict before Gemini Pass 2. | + +**Verdict:** Solid first layer. Heuristic text matching in `_text_recommends_shading` could be fooled by unusual phrasing; consider LLM-based classification for edge cases in a future iteration. Query classifier has a good balance of specificity (domain keywords) vs generality (generic question words treated as ambiguous). + +--- + +## 19. src/chatbot/vineyard_chatbot.py (updated 2026-03-09) + +| Change | Notes | +|--------|-------| +| `ChatResponse` extended | New fields: `confidence`, `sources`, `caveats`, `rule_violations`. Backward-compatible (all have defaults). | +| `chat()` flow upgraded | 7-step pipeline: classify → Gemini Pass 1 → force tool if data query → dispatch + tag → Gemini Pass 2 → validate → confidence. | +| System prompt strengthened | Added: "NEVER invent sensor readings", "MUST call a tool for data questions", "cite source and timestamp", "If data unavailable, say so — do NOT estimate". | +| `_get_validation_context()` | Gathers hour, month, stage_id, temp_c for rule validation. Uses `zoneinfo` for Israel time. | + +**Verdict:** Well-integrated. The re-prompt mechanism (force tool call) adds one extra Gemini call for data queries where the LLM skips the tool — acceptable latency cost for reliability. + +--- + +## 20. src/energy_budget.py (created 2026-03-10) + +| Finding | Severity | Fix | +|---------|----------|-----| +| `compute_weekly_plan` month-end calc overflowed for month=12 (→ month 13) | Bug | Added December guard before the `month+1` path | +| `compute_daily_plan` block weights assumed `NO_SHADE_BEFORE_HOUR=10`; transition block `(10,11)` hardcoded | Medium | Made `transition_end = max(NO_SHADE_BEFORE_HOUR+1, 11)` dynamic | +| `_energy_analytical` loops 15k timestamps in Python | Low | Acceptable for one-shot season planning | +| `spend_slot` doesn't validate negative amounts | Low | Internal API; callers are trusted | + +**Verdict:** Clean hierarchical design. Budget math is correct: 920 kWh potential → 46 kWh (5%) → monthly/weekly/daily/slot. Both bugs fixed. + +--- + +## 21. src/command_arbiter.py (created 2026-03-10) + +| Finding | Severity | Fix | +|---------|----------|-----| +| `AstronomicalTracker.get_angle` passed naive datetime to pvlib (warns on tz) | Medium | Added `tz_localize("UTC")` fallback for naive timestamps | +| `should_move` uses `pd.Timedelta` for `datetime` comparison | Low | Works; pd dependency already imported | +| `arbitrate` mutates `decision.source` on dispatch | Low | Intentional; overrides "stable"/"initial" with actual priority source | + +**Verdict:** Priority stack is clear and correct. Hysteresis correctly prevents sub-slot jitter while allowing safety-critical overrides (weather/harvest) to bypass the filter. All fallbacks default to θ_astro (zero energy cost). + +--- + +## 22. src/spectral_aggregator.py (created 2026-03-10) + +| Finding | Severity | Fix | +|---------|----------|-----| +| `aggregate_spectral_df` had no `cwsi_col` parameter — couldn't pass explicit CWSI from TB | Medium | Added `cwsi_col: Optional[str] = None` parameter | +| CWSI cascade (explicit → delta-T → VPD → missing) matches `data_schema.py` proxy logic | — | Consistent | +| Physical bounds hardcoded (not in config) | Low | Acceptable; these are physical constants, not tunable params | +| `_clip_or_flag` only checks `isinstance(float)` for NaN | Low | Sensor values are always float; safe | + +**Verdict:** Good stateless design. CWSI cascade is well-ordered. Quality flags provide auditability. + +--- + +## 23. scripts/import_layout.py (created 2026-03-10) + +| Finding | Severity | Fix | +|---------|----------|-----| +| Row azimuth 315.0° duplicated from ShadowModel default | Low | Acceptable; layout is a snapshot, not a live reference | +| `--print` shadows Python builtin | Low | argparse convention; fine | +| Crop sensor positions (west/east, bottom/upper) parsed from label strings | Low | Works for current 7 Crop devices; fragile if naming changes | + +**Verdict:** Useful spatial registration script. Generates a clean JSON for dashboard map view and future ShadowModel integration. + +--- + +## 24. src/models/canopy_photosynthesis.py (modified 2026-03-10) + +| Finding | Severity | Fix | +|---------|----------|-----| +| `from config.settings import FRUITING_ZONE_INDEX` was inside method body | Medium | Moved to module-level import | +| `compute_timeseries` doesn't include new fruiting/top fields | Low | Acceptable; it's a batch summary for historical analysis | + +**Verdict:** Clean addition. New fields (`fruiting_zone_A`, `fruiting_zone_par`, `top_canopy_A`, `top_canopy_par`) integrate well with existing return dict. diff --git a/context/refactor_todo.md b/context/refactor_todo.md new file mode 100644 index 0000000000000000000000000000000000000000..47bf07fbd3dfba00032f57fd9482a17041b97538 --- /dev/null +++ b/context/refactor_todo.md @@ -0,0 +1,83 @@ +# Refactor Plan & Todo – SolarWine Baseline + +This file tracks the refactor steps for Gemini utilities, phenology, time features, IMS coverage, and performance/caching improvements. + +--- + +## High Priority + +- [x] **Unify Gemini client & JSON handling** + - [x] `genai_utils`: verify `get_google_api_key`, `get_genai_client`, `extract_json_object` (already created). + - [x] `day_ahead_advisor`: + - [x] Use `extract_json_object` via local `_extract_json` wrapper. + - [x] Confirm `api_key` and `client` now call `genai_utils`. + - [x] `llm_data_engineer`: + - [x] Replace `api_key` property with `get_google_api_key(self._api_key)`. + - [x] Replace `client` property with `get_genai_client(self._api_key)`. + - [x] Swap local `_extract_json` to use `extract_json_object`. + - [x] `routing_agent`: + - [x] Replace `api_key` property with `get_google_api_key(self._api_key)`. + - [x] Replace `client` property with `get_genai_client(self._api_key)`. + - [x] `vineyard_chatbot`: + - [x] Replace `api_key` property with `get_google_api_key(self._api_key)`. + - [x] Replace `client` property with `get_genai_client(self._api_key)`. + - [x] Make `has_api_key` call `get_google_api_key` in a try/except instead of duplicating logic. + +- [x] **Centralise phenology logic** + - [x] `phenology.py`: confirm `estimate_stage_for_date` and `stage_id_and_description_for_date` match the biology plan and skills. + - [x] `app.py` (Vineyard Advisor vine snapshot): + - [x] Replace inline month→stage mapping with `stage_id_and_description_for_date(today)`. + - [x] Any future modules that reason about "current stage" should import from `phenology` instead of re-implementing month logic. + +- [x] **IMS cache coverage & observability** + - [ ] `IMSClient.fetch_and_cache`: + - [ ] Add lightweight logging or counters for skipped chunks (date ranges that failed). + - [x] `app.py` – Forecasting tab: + - [x] Add a small IMS coverage panel that shows: + - [x] First timestamp in cache + - [x] Last timestamp in cache + - [x] Number of days of coverage + - [x] Age (minutes/hours) of the latest record + - [ ] `app.py` – Vineyard Advisor tab: + - [ ] Reuse the cached vine snapshot to also display IMS coverage (not just last point) where useful. + +--- + +## Medium Priority + +- [x] **Shared time-feature utilities** + - [x] `time_features.py`: confirm `add_cyclical_time_features` API (timestamp column or index). + - [x] `preprocessor.create_time_features`: + - [x] Replace manual sin/cos code with `add_cyclical_time_features(df, timestamp_col="timestamp_utc")`. + - [x] Keep raw `month` and `day_of_year` features as now. + - [x] `chronos_forecaster.load_data`: + - [x] Replace inline `hour_sin/cos` and `doy_sin/cos` computations with `add_cyclical_time_features(resampled, index_is_timestamp=True)`. + - [x] `llm_data_engineer.engineer_features`: + - [x] Replace its own cyclical feature block with a call to `add_cyclical_time_features` on the resolved timestamp. + +- [ ] **Cache heavy shading simulations** + - [ ] `tracker_optimizer.simulate_tilt_angles`: + - [ ] Add a simple in-module cache (e.g. dict keyed by `(len(df), tuple(sorted(angles)))` or `(date_min, date_max, angles)` for the sample dataset). + - [ ] Ensure caching does not break if `df` changes (avoid caching across different data sources). + - [ ] `vineyard_chatbot._tool_compare_angles`: + - [ ] Confirm it benefits from the new `simulate_tilt_angles` cache (repeated queries reuse results). + - [ ] Optionally expose precomputed angle summaries in the Shading tab for instant advisor-like responses. + +- [ ] **Use phenology helper in future logic** + - [ ] When adding or refactoring: + - [ ] Day-ahead planner + - [ ] Energy budget planner + - [ ] Operational modes / real-time control + - Always derive phenological stage via `phenology.estimate_stage_for_date` or `stage_id_and_description_for_date` instead of hand-written month rules. + +--- + +## Low Priority (later) + +- [ ] **Vectorise `FarquharModel.compute_all`** if Stage 1 datasets grow significantly or are needed in near real-time. +- [ ] **Design and implement `thingsboard_client`** according to the `thingsboard-client` skill, then gradually wire real-time vine telemetry (soil moisture, irrigation, local temps) into Vineyard Advisor and future control logic. +- [ ] **Add focused tests** for: + - [ ] `FarquharModel` (known inputs, NaN handling). + - [ ] `Preprocessor` (merge, split, edge cases). + - [ ] `SolarGeometry/ShadowModel` (tracker tilt, mask shape). + - [ ] `ChronosForecaster.load_data` (grid coverage, growing-season filter, time features). diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..2a91cb42c824aea445e2462f5ff8387554c34cd2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: "3.9" + +services: + api: + build: + context: . + dockerfile: backend/Dockerfile + ports: + - "7860:7860" + env_file: .env + environment: + - ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173 + volumes: + - ./src:/app/src + - ./config:/app/config + - ./backend:/app/backend + - ./Data:/app/Data diff --git a/ims_api_documentation.md b/ims_api_documentation.md new file mode 100644 index 0000000000000000000000000000000000000000..b2e806d8c77e4bf696a635bad55cb5b0ebe8a5ef --- /dev/null +++ b/ims_api_documentation.md @@ -0,0 +1,287 @@ +# דו"ח משימה 2 – הבאת נתונים מ-IMS (Israel Meteorological Service) + +--- + +## אילו נתונים נלקחים מ-IMS ואיך הם נשמרים + +### מקור הנתונים + +- **שירות:** IMS (Israel Meteorological Service) – שירות המטאורולוגיה הישראלי. +- **ממשק:** API Envista – `https://api.ims.gov.il/v1/envista/stations/{STATION_ID}/data/{CHANNEL_ID}/?from=YYYY/MM/DD&to=YYYY/MM/DD` +- **תחנה:** **43 – שדה בוקר** (דומה לאקלים ירוחם; מיקום הכרם). +- **אימות:** טוקן API ב־משתנה סביבה `IMS_API_TOKEN` (נשמר מקומית ב־`.env`, לא ב־git). + +### ערוצים (Channels) שנלקחים + +מזהי הערוצים תלויים בתחנה. **לתחנה 43 (שדה בוקר)** מוגדרים ב־`config/dev.yaml` תחת `ims:`: + +| ערוץ IMS (מזהה) | שם IMS | משתנה בפלט (סכמה קנונית) | יחידות | תיאור | +|-----------------|--------|---------------------------|--------|--------| +| 6 | TD | `air_temperature_c` | °C | טמפרטורת אוויר נוכחית | +| 8 | TDmax| `tdmax_c` | °C | טמפרטורת מקסימום (במהלך המרווח) | +| 9 | TDmin| `tdmin_c` | °C | טמפרטורת מינימום (במהלך המרווח) | +| 10 | Grad | `ghi_w_m2` | W/m²| קרינה גלובלית אופקית (GHI) | + +- אם `channel_radiation` מוגדר כ־`null` בתצורה (תחנה ללא Grad), עמודת הקרינה לא נמשכת ומופיעה רק טמפרטורה. + +### טווח זמן ורזולוציה + +- **טווח ברירת מחדל:** שנתיים אחורה מתאריך ההרצה (ניתן לשנות עם `--from`, `--to` או `--years`). +- **רזולוציה:** נתוני IMS בתדירות 10 דקות; נשמרים כפי שהתקבלו (לא מצוננים). +- **בקשות:** טווח של יותר מ־60 יום מפוצל לחלקים (chunks) כדי למנוע תגובות ריקות מה־API; בין בקשות יש השהייה קצרה. + +### עיבוד לפני שמירה + +1. **המרת זמן:** חותמות הזמן מגיעות מ־IMS בזמן ישראל (UTC+2/UTC+3). כל התאריכים מומרים ל־**UTC** לפני שמירה. +2. **מיזוג ערוצים:** כל ערוץ נמשך בנפרד; השורות ממוזגות לפי `timestamp_utc` (איחוד אינדקסים – חסרים מסומנים כ־NaN). +3. **סינון טמפרטורה:** ערכים מחוץ לטווח **־50 עד 60 °C** (למשל ערוץ Time hhmm שנדבק בטעות) מוחלפים ב־NaN. +4. **מקור:** נוספת עמודה `source` עם הערך `ims`. + +### איפה ואיך נשמרים הנתונים + +| פריט | ערך | +|------|-----| +| **קובץ פלט** | `data/ims_radiation_temperature.csv` (נתיב: `config.data_paths.IMS_RADIATION_TEMPERATURE_CSV`) | +| **פורמט** | CSV (פסיק כמפריד) | +| **קידוד** | ברירת מחדל של pandas (בדרך כלל UTF-8) | + +**עמודות בקובץ:** + +| עמודה | תיאור | יחידות | +|--------|--------|--------| +| `timestamp_utc` | חותמת זמן (UTC) | ISO format, timezone-aware UTC | +| `air_temperature_c` | טמפרטורת אוויר | °C | +| `tdmax_c` | טמפרטורה מקסימלית | °C | +| `tdmin_c` | טמפרטורה מינימלית | °C | +| `ghi_w_m2` | קרינה גלובלית אופקית (Grad) | W/m² | +| `source` | מקור הנתון | תמיד `ims` | + +- עמודות שלא נמשכו (למשל קרינה אם אין ערוץ Grad) לא יופיעו או יהיו ריקות. +- שורות עם NaN בחלק מהעמודות אפשריות (למשל אי־התאמה בזמנים בין ערוצים). + +### שימוש בנתונים בפרויקט + +- הקובץ משמש כ־**מקור מטאורולוגיה (IMS)** ל־**Ground Truth** (משימה 1 – Data fusion). +- סקריפטים נוספים: `scripts/gap_fill_future.py` ממלא פערים (כולל עתיד) ויכול לכתוב ל־`data/ims_radiation_temperature_gap_filled.csv`; `scripts/build_ground_truth.py` ממיר/ממזג ל־Ground Truth (Parquet) לפי הסכמה ב־`context/05_ground_truth_schema.md`. + +### ארגון הנתונים (ת pipeline) + +סדר העבודה לפי התיעוד: + +1. **הורדת IMS (גולמי)** + `python -m scripts.download_ims_data` + → פלט: `data/ims_radiation_temperature.csv` (רזולוציה 10 דקות, UTC, סינון טמפרטורה -50..60 °C). + +2. **השלמת פערים (כולל עתיד)** + `python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv` + → פלט: `data/ims_radiation_temperature_gap_filled.csv` (רשת רגולרית, quality_flag). + +3. **בניית Ground Truth (Parquet)** + `python -m scripts.build_ground_truth` + → פלט: `data/ground_truth/ground_truth_2024_2025.parquet` + `ground_truth_metadata.json` (רזולוציה 15 דקות). + +הרצת כל הצעדים ברצף (אם קיים קובץ גולמי): + +```bash +python -m scripts.download_ims_data && \ +python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv && \ +python -m scripts.build_ground_truth +``` + +או עדכון אוטומטי (כולל TB/DB): `python -m scripts.update_ground_truth`. + +--- + +## נספח – פקודות API (מקור: השירות המטאורולוגי) + +תיעוד זה מבוסס על המסמך הרשמי **"ממשק עבור מאגר הנתונים המטאורולוגיים העשר דקתיים"** – משרד התחבורה, השירות המטאורולוגי (תאריך עדכון 11.05.2017). מקור: קובץ "פקודות API" מהשמ"ט. כ־85 תחנות אוטומטיות; הנתונים נמשכים בפורמט JSON. + +### אימות (Authorization) + +- **שיטה:** `Authorization: ApiToken XXXX` +- **קבלת TOKEN:** פנייה במייל ל־**ims@ims.gov.il** +- בפרויקט: משתנה סביבה `IMS_API_TOKEN` (נשמר ב־`.env`). + +### מוסכמת זמן + +- **כל השנה לפי זמן מקומי תקני (LST)** – שעון חורף. +- בתקופת שעון קיץ יש הפרש של שעה בין `datetime` המוצג לזמן בפועל (למשל אוקטובר: 11:40+03:00 מוצג בעוד שבפועל 12:40). +- בסקריפט שלנו: כל חותמות הזמן מומרות ל־**UTC** לפני שמירה. + +### מטה־דאטה: תחנות ואזורים + +מזהי מק placeholders: `{%ST_ID%}` = מספר תחנה, `{%REG_ID%}` = מספר אזור, `{%CH_ID%}` = מספר ערוץ. תאריך: `YYYY/MM/DD`, `MM` = חודש (למשל 05), `DD` = יום (למשל 28). + +**תחנות:** + +| תיאור | כתובת | +|--------|--------| +| מידע על כל התחנות | `https://api.ims.gov.il/v1/envista/stations` | +| מידע על תחנה ספציפית | `https://api.ims.gov.il/v1/envista/stations/{%ST_ID%}` | + +תגובת תחנה כוללת: `name`, `location`, `regionId`, `monitors` (רשימת ערוצים). לכל ערוץ: `active`, `channelId`, `name`, `typeId`, `units`. + +**אזורים:** + +| תיאור | כתובת | +|--------|--------| +| מידע על כל האזורים (כולל תחנות) | `https://api.ims.gov.il/v1/envista/regions` | +| מידע על אזור ספציפי | `https://api.ims.gov.il/v1/envista/regions/{%REG_ID%}` | + +אזור כולל: מספר אזור, שם, רשימת תחנות והערוצים שלהן. + +### משיכת נתונים מטאורולוגיים מתחנה + +בסיס: `https://api.ims.gov.il/v1/envista/stations/{%ST_ID%}/data/...` + +**נתונים אחרונים / ישנים ביותר:** + +| תיאור | כתובת | +|--------|--------| +| אחרונים – כל הערוצים | `.../stations/{%ST_ID%}/data/latest` | +| אחרונים – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/{%CH_ID%}/latest` | +| ישנים ביותר – כל הערוצים | `.../stations/{%ST_ID%}/data/earliest` | +| ישנים ביותר – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/{%CH_ID%}/earliest` | + +**היום / החודש הנוכחי:** + +| תיאור | כתובת | +|--------|--------| +| נתונים מהיום – כל הערוצים | `.../stations/{%ST_ID%}/data/daily` | +| נתונים מהיום – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/{%CH_ID%}/daily` | +| נתונים מהחודש – כל הערוצים | `.../stations/{%ST_ID%}/data/monthly` | +| נתונים מהחודש – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/{%CH_ID%}/monthly` | + +**יום / חודש מסוים:** + +| תיאור | כתובת | +|--------|--------| +| יום מסוים – כל הערוצים | `.../stations/{%ST_ID%}/data/daily/YYYY/MM/DD` | +| יום מסוים – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/daily/{%CH_ID%}/YYYY/MM/DD` | +| חודש מסוים – כל הערוצים | `.../stations/{%ST_ID%}/data/monthly/YYYY/MM` | +| חודש מסוים – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/{%CH_ID%}/monthly/YYYY/MM` | + +**טווח תאריכים (זה מה שהסקריפט משתמש בו):** + +| תיאור | כתובת | +|--------|--------| +| טווח – כל הערוצים | `.../stations/{%ST_ID%}/data?from=YYYY/MM/DD&to=YYYY/MM/DD` | +| טווח – ערוץ ספציפי | `.../stations/{%ST_ID%}/data/{%CH_ID%}?from=YYYY/MM/DD&to=YYYY/MM/DD` | + +### מבנה תגובת נתונים + +- **מספר התחנה** +- **זמן המדידה** (`datetime`) +- **רשימת ערוצים**, לכל ערוץ: + - `id` – מס' ערוץ + - `name` – שם הערוץ + - `status` – **1** = תקין, **2** = לא תקין (כאשר Status=2 הנתונים לא תקינים) + - `valid` – `true` / `false` + - ערך מספרי של הפרמטר הנמדד + +**הערה:** לא כל התחנות מודדות את כל המשתנים; **מס' הערוץ לאותו משתנה יכול להיות שונה מתחנה לתחנה**. כדי לדעת את מס' הערוץ – להריץ מטה־דאטה על התחנה (או `--list-stations` בסקריפט). + +### רשימת משתנים מטאורולוגיים (CHANNEL) – נספח ג' + +משתנים שהתחנות עשויות למדוד (שם הערוץ ב-API, יחידות, תיאור): + +| משתנה | יחידות | תיאור | +|--------|--------|--------| +| BP | mb | לחץ בגובה התחנה | +| DiffR | w/m² | קרינה מפוזרת | +| Grad | w/m² | קרינה גלובלית (GHI) | +| NIP | w/m² | קרינה ישירה | +| Rain | mm | כמות גשם | +| RH | % | לחות יחסית | +| STDwd | deg | סטיית תקן של כיוון הרוח | +| TD | degC | טמפרטורה יבשה (אוויר) | +| TDmax | degC | טמפרטורת מקסימום | +| TDmin | degC | טמפרטורת מינימום | +| TG | degC | טמפרטורה ליד הקרקע | +| Time | hhmm | זמן סיום 10 הדקות המקסימליות | +| WD | deg | כיוון הרוח | +| WDmax | deg | כיוון המשב העליון | +| WS | m/sec | מהירות הרוח | +| Ws10mm | m/sec | מהירות רוח 10 דקתית מקסימלית | +| WS1mm | m/sec | מהירות רוח דקתית מקסימלית | +| WSmax | m/sec | מהירות המשב העליון | + +בפרויקט נמשכים כיום: **TD, TDmax, TDmin, Grad** (תחנה 43 – שדה בוקר). שאר המשתנים (לחץ, גשם, רוח, לחות, קרינה מפוזרת/ישירה וכו') זמינים באותו API לפי מס' ערוץ לכל תחנה. + +### שימוש ב-Fiddler (נספח ב') + +לבדיקות: כלי חינמי Fiddler. ב-Composer: GET עם הכתובת הרצויה, וב־Header: `Authorization: ApiToken XXXX`. + +--- + +## מה בוצע + +### 1. סקריפט הורדת נתונים IMS (`scripts/download_ims_data.py`) + +- **מטרה:** הורדת נתונים היסטוריים של קרינה (Grad ≈ GHI) וטמפרטורה (TD, TDmax, TDmin) מ-IMS לשנתיים אחורה. +- **API:** `https://api.ims.gov.il/v1/envista/stations/{STATION_ID}/data/{CHANNEL_ID}/?from=YYYY/MM/DD&to=YYYY/MM/DD` +- **אימות:** טוקן IMS – לבקש מ-ims@ims.gov.il (תנאי שימוש: https://ims.gov.il/en/ObservationDataAPI). +- **משתנה סביבה:** `IMS_API_TOKEN` (או `IMS_TOKEN`) – מומלץ להגדיר ב־`.env`. +- **תצורה:** תחנה וערוצים ב־`config/dev.yaml` תחת `ims:` (ברירת מחדל: תחנה **43 – שדה בוקר**, דומה לירוחם; תחנה 98 = נבטים). +- **פלט:** `data/ims_radiation_temperature.csv` עם עמודות קנוניות: `timestamp_utc`, `air_temperature_c`, `ghi_w_m2`, `tdmax_c`, `tdmin_c`, `source=ims`. חותמות הזמן מומרות מישראל (UTC+2/3) ל-UTC. + +**שימוש:** +```bash +# רשימת תחנות (דורש טוקן) +python -m scripts.download_ims_data --list-stations + +# הורדה לשנתיים אחורה (ברירת מחדל) +python -m scripts.download_ims_data + +# טווח תאריכים ידני +python -m scripts.download_ims_data --from 2024-01-01 --to 2025-12-31 --station 43 +``` + +**הערה:** מזהי הערוצים (channel IDs) תלויים בתחנה; יש לאמת מול ה-API או תיעוד IMS (למשל תחנה 28: TDmax=10, TDmin=11). + +--- + +### 2. סקריפט השלמת פערים לעתיד (`scripts/gap_fill_future.py`) + +- **מטרה:** השלמת פערים בעתיד – רשת זמן רגולרית מהתאריך האחרון בנתונים עד תאריך סיום (אופציונלי), עם מילוי פערים ב-forward-fill או אינטרפולציה ליניארית, ואופציה למיזוג עם קובץ תחזית (למשל Open-Meteo). +- **קלט:** קובץ IMS (או כל CSV עם `timestamp_utc` + עמודות מספריות). +- **פלט:** `data/ims_radiation_temperature_gap_filled.csv` עם עמודה `quality_flag`: `observed` | `forward_fill` | `interpolated` | `forecast`. + +**שימוש:** +```bash +# השלמת פערים עם forward-fill עד סוף הנתונים +python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv + +# הארכת רשת עד תאריך עתידי +python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv --end-date 2026-12-31 + +# מילוי עתיד מתחזית (למשל weather_forecast_cache) +python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv --forecast data/weather_forecast_cache.csv +``` + +--- + +### 3. עדכוני קונפיגורציה + +- **`config/data_paths.py`:** נוספו `IMS_RADIATION_TEMPERATURE_CSV`, `IMS_GAP_FILLED_CSV` ו-CSV_SPECS מתאימים. +- **`config/dev.yaml`:** נוסף בלוק `ims:` עם `station_id`, `default_station_id`, ו-channel IDs (ניתן להתאמה לפי תחנה). +- **`config/env.example`:** נוסף `IMS_API_TOKEN` עם הערה לבקשת טוקן. + +--- + +## מה נשאר (אופציונלי) + +- **ולידציה:** להריץ הורדה עם טוקן אמיתי ולוודא כיסוי ורזולוציה (שעתי/יומי) מול דרישות Ground Truth. +- **התאמת תחנה/ערוצים:** תחנה 43 = שדה בוקר (דומה לירוחם), תחנה 98 = נבטים. להריץ `--list-stations` לעדכון תחנה/ערוצים. + +--- + +## סיכום + +| פריט | סטטוס | +|------|--------| +| תיעוד/גישה ל-IMS API | בוצע – תיעוד וסקריפט | +| סקריפט הורדה (שנתיים אחורה) | בוצע – `download_ims_data.py` | +| מיפוי לסכמה קנונית + CSV | בוצע – `timestamp_utc`, `air_temperature_c`, `ghi_w_m2`, וכו' | +| סקריפט השלמת פערים לעתיד | בוצע – `gap_fill_future.py` | +| ולידציה כיסוי/רזולוציה | ממתין – דורש טוקן IMS והרצה | diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..cba6ec314140c0ffd4b07abac344c2e0617d6cff --- /dev/null +++ b/scripts/__init__.py @@ -0,0 +1 @@ +# Scripts for IMS download and pipeline runs diff --git a/scripts/collect_2026_training_data.py b/scripts/collect_2026_training_data.py new file mode 100644 index 0000000000000000000000000000000000000000..b54744a5adf93938cf15ea847ec71b8066abbeb2 --- /dev/null +++ b/scripts/collect_2026_training_data.py @@ -0,0 +1,411 @@ +"""Collect 2026-schema training data for the next-gen photosynthesis ML model. + +Pulls 15-min telemetry from all Crop_2Soil devices (treatment + reference) and +the IMS station, derives Farquhar inputs from the 2026 fleet's reduced sensor +set, computes a Farquhar net-assimilation label (A_n) per row, and appends to +``Data/2026/sensor_history.parquet``. + +Designed to be re-run periodically (weekly) to accumulate growing-season data. +By August/September 2026 the parquet should hold ≥3 months of growing-season +hours — enough to retrain Stage 2 ML on the 2026 schema (see +``context/3_todo.md`` § 12.6 ``bigml-train``). + +Why we derive inputs vs measure them +------------------------------------ +The 2026 fleet retired the on-site Air1 sensor that previously supplied PAR, +CO2, and VPD. We approximate: + + PAR (µmol/m²/s) ≈ 2.0 × GHI (W/m²) + — daylight broadband-to-PAR conversion; ±10 % vs measured PAR + (Akitsu et al. 2017). Worst at low sun angles. + + CO2 (ppm) = 420 (assumed atmospheric) + — Sde Boker is far from urban/forest. Hourly CO2 fluctuates by + ~5 ppm; small effect on A via Ci. + + VPD (kPa) = SVP(Tair) × (1 − RH/100) (Tetens equation) + — SVP(T) = 0.611 × exp(17.27·T / (T+237.3)). + Within ~5 % of measured VPD over the Negev range. + + CWSI = max(0, min(1, (Tleaf − Tair) / 15)) + — Crude but defensible until we add an empirical CWSI baseline. + +Usage +----- + python -m scripts.collect_2026_training_data + python -m scripts.collect_2026_training_data --from 2026-05-01 --to 2026-05-18 +""" + +from __future__ import annotations + +import argparse +import sys +from datetime import datetime, timedelta, timezone +from pathlib import Path +from typing import Dict, List + +import numpy as np +import pandas as pd + +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(_PROJECT_ROOT)) + +try: + from dotenv import load_dotenv + load_dotenv(_PROJECT_ROOT / ".env") +except ImportError: + pass + +from src.data.thingsboard_client import ( + ThingsBoardClient, + DEVICE_REGISTRY, + TREATMENT_DEVICES, + REFERENCE_DEVICES, + VineArea, +) +from src.models.farquhar_model import FarquharModel +from src.shading.solar_geometry import ShadowModel + +_IMS_CSV = _PROJECT_ROOT / "Data" / "ims" / "ims_merged_15min.csv" +_OUT_DIR = _PROJECT_ROOT / "Data" / "2026" +_OUT_PARQUET = _OUT_DIR / "sensor_history.parquet" + +# Telemetry keys we pull per Crop_2Soil device. +_DEVICE_KEYS: List[str] = [ + "leafTemperature", "ambientTemperatureIRT", "NDVI", + "PRI", "PSRI", "SIPI", "GCI", "LCI", "DUVI", + "soilTemperature", "soilMoisture", "soilBulkEC", "soilPoreWaterEC", + "soilTemperature2", "soilMoisture2", "soilPoreWaterEC2", +] + +_TRACKER_DEVICES = ["Tracker501", "Tracker502", "Tracker503", "Tracker509"] + +_CO2_ASSUMED_PPM = 420.0 +_PAR_FROM_GHI = 2.0 # µmol/m²/s per W/m² + + +# --------------------------------------------------------------------------- +# Derivations +# --------------------------------------------------------------------------- + +def _saturation_vapour_pressure_kpa(t_c: pd.Series) -> pd.Series: + """Tetens equation: SVP(T) in kPa given T in °C.""" + return 0.611 * np.exp(17.27 * t_c / (t_c + 237.3)) + + +def derive_inputs(df: pd.DataFrame) -> pd.DataFrame: + """Add PAR, VPD, CO2, CWSI columns derived from the 2026 sensor set. + + `par_umol_derived` is the **above-canopy** PAR estimate from IMS GHI; + the treatment-area shading correction is applied separately in + `apply_shading_correction()` so reference rows keep the open-sky PAR. + """ + df = df.copy() + df["par_umol_derived"] = (df["ghi_w_m2"].clip(lower=0) * _PAR_FROM_GHI).clip(lower=0, upper=3000) + svp = _saturation_vapour_pressure_kpa(df["air_temperature_c"]) + df["vpd_kpa_derived"] = (svp * (1.0 - df["rh_percent"].clip(0, 100) / 100.0)).clip(lower=0, upper=10) + df["co2_ppm_assumed"] = _CO2_ASSUMED_PPM + # CWSI proxy from leaf-air ΔT (positive when leaf > air = stress) + df["cwsi_proxy"] = ((df["leaf_temperature"] - df["air_temperature_c"]).clip(lower=0) / 15.0).clip(0, 1) + return df + + +def fetch_tracker_angles_15min(client: ThingsBoardClient, + start: datetime, end: datetime) -> pd.Series: + """Pull 15-min mean tracker angle across the 4 trackers.""" + step = timedelta(days=7) + per_tracker = {} + for name in _TRACKER_DEVICES: + frames = [] + cursor = start + while cursor < end: + cursor_end = min(cursor + step, end) + try: + df = client.get_timeseries( + name, ["angle"], + start=cursor, end=cursor_end, + limit=10_000, interval_ms=900_000, agg="AVG", + ) + except Exception: + df = pd.DataFrame() + if not df.empty: + frames.append(df) + cursor = cursor_end + if frames: + tdf = pd.concat(frames).sort_index() + tdf.index = pd.to_datetime(tdf.index, utc=True).floor("15min") + tdf = tdf[~tdf.index.duplicated(keep="last")] + per_tracker[name] = tdf["angle"].rename(name) + if not per_tracker: + return pd.Series(dtype=float, name="tracker_angle_mean") + wide = pd.concat(per_tracker.values(), axis=1) + return wide.mean(axis=1, skipna=True).rename("tracker_angle_mean") + + +def apply_shading_correction(df: pd.DataFrame, + tracker_angles: pd.Series) -> pd.DataFrame: + """Compute treatment-area fruiting-zone PAR with panel shading. + + For each treatment-area timestep, runs `ShadowModel.project_shadow()` + with the actual tracker angle and replaces `par_umol_derived` with + the fruiting-zone mean PAR (averaged across the row's horizontal + positions in the fruiting vertical zone). Reference rows are + untouched (open sky = above-canopy PAR). + + Adds: + par_factor_treatment : ratio of corrected to open-sky PAR + tracker_angle_mean : mean across the 4 trackers (NaN if missing) + """ + df = df.copy() + df["par_factor_treatment"] = 1.0 + + # Align tracker telemetry to every row's timestamp. + df["tracker_angle_mean"] = tracker_angles.reindex( + df.index, method="nearest", tolerance=pd.Timedelta("15min"), + ).values + + treat_mask = (df["area"] == "treatment").to_numpy() + if not treat_mask.any(): + return df + + sm = ShadowModel() + from config.settings import FRUITING_ZONE_INDEX + fz_idx = FRUITING_ZONE_INDEX + + # Compute solar position once per unique timestamp (treatment + reference + # share timestamps, so use the unique set to avoid duplicate work). + unique_ts = pd.DatetimeIndex(df.index.unique()) + sun = sm.get_solar_position(unique_ts) + sun_lookup = { + ts: (float(sun.loc[ts, "solar_elevation"]), float(sun.loc[ts, "solar_azimuth"])) + for ts in unique_ts + } + + # Vector pass over treatment rows via positional indices to avoid the + # duplicate-index gotcha with `.at[]`. + treat_positions = np.where(treat_mask)[0] + ghi_col = df.columns.get_loc("ghi_w_m2") + par_col = df.columns.get_loc("par_umol_derived") + tilt_col = df.columns.get_loc("tracker_angle_mean") + factor_col = df.columns.get_loc("par_factor_treatment") + + for pos in treat_positions: + ts = df.index[pos] + ghi = df.iat[pos, ghi_col] + if pd.isna(ghi) or ghi <= 0: + continue + elev, azim = sun_lookup[ts] + if elev <= 2.0: + continue + tilt = df.iat[pos, tilt_col] + if pd.isna(tilt): + tilt = float(sm.compute_tracker_tilt(azim, elev)["tracker_theta"]) + total_par = float(ghi * _PAR_FROM_GHI) + try: + mask = sm.project_shadow(elev, azim, float(tilt)) + par_grid = sm.compute_par_distribution( + total_par, mask, + solar_elevation=elev, solar_azimuth=azim, tracker_tilt=float(tilt), + ) + factor = float(par_grid[fz_idx, :].mean()) / total_par + except Exception: + factor = 1.0 + df.iat[pos, factor_col] = factor + df.iat[pos, par_col] = df.iat[pos, par_col] * factor + + return df + + +def compute_farquhar_a(df: pd.DataFrame) -> pd.Series: + """Run the Semillon Farquhar model row-by-row over the derived inputs.""" + fm = FarquharModel() + out = np.full(len(df), np.nan) + for i, row in enumerate(df.itertuples(index=False)): + # Skip rows missing any input + par = getattr(row, "par_umol_derived", None) + tleaf = getattr(row, "leaf_temperature", None) + tair = getattr(row, "air_temperature_c", None) + vpd = getattr(row, "vpd_kpa_derived", None) + cwsi = getattr(row, "cwsi_proxy", 0.0) + if any(v is None or (isinstance(v, float) and np.isnan(v)) + for v in (par, tleaf, tair, vpd)): + continue + try: + out[i] = fm.calc_photosynthesis(par, tleaf, _CO2_ASSUMED_PPM, vpd, tair, cwsi) + except Exception: + continue + return pd.Series(out, index=df.index, name="a_farquhar_umol") + + +# --------------------------------------------------------------------------- +# TB fetch helpers +# --------------------------------------------------------------------------- + +def _fetch_device_history(client: ThingsBoardClient, + name: str, + start: datetime, + end: datetime) -> pd.DataFrame: + """Pull 15-min telemetry for one Crop_2Soil device over [start, end].""" + step = timedelta(days=7) + frames = [] + cursor = start + while cursor < end: + cursor_end = min(cursor + step, end) + try: + df = client.get_timeseries( + name, _DEVICE_KEYS, + start=cursor, end=cursor_end, + limit=10_000, interval_ms=900_000, agg="AVG", + ) + except Exception: + df = pd.DataFrame() + if not df.empty: + frames.append(df) + cursor = cursor_end + if not frames: + return pd.DataFrame() + out = pd.concat(frames).sort_index() + out.index = pd.to_datetime(out.index, utc=True).floor("15min") + out = out[~out.index.duplicated(keep="last")] + return out + + +def fetch_area_history(client: ThingsBoardClient, + area: VineArea, + start: datetime, + end: datetime) -> pd.DataFrame: + """Aggregate (mean across devices) per area for the requested window.""" + names = TREATMENT_DEVICES if area == VineArea.TREATMENT else REFERENCE_DEVICES + per_device: Dict[str, pd.DataFrame] = {} + for name in names: + df = _fetch_device_history(client, name, start, end) + if not df.empty: + per_device[name] = df + + if not per_device: + return pd.DataFrame() + + # Stack by device, average columns per timestamp + stacked = pd.concat(per_device.values(), keys=per_device.keys(), + names=["device", "timestamp_utc"]) + averaged = stacked.groupby(level="timestamp_utc").mean(numeric_only=True) + + # Rename camelCase TB keys → snake_case for the parquet schema + averaged = averaged.rename(columns={ + "leafTemperature": "leaf_temperature", + "ambientTemperatureIRT": "ambient_temp_irt", + "NDVI": "ndvi", "PRI": "pri", "PSRI": "psri", + "SIPI": "sipi", "GCI": "gci", "LCI": "lci", "DUVI": "duvi", + "soilTemperature": "soil_temp_shallow_c", + "soilTemperature2": "soil_temp_deep_c", + "soilMoisture": "soil_moisture_shallow_pct", + "soilMoisture2": "soil_moisture_deep_pct", + "soilBulkEC": "soil_bulk_ec", + "soilPoreWaterEC": "soil_pore_water_ec_shallow", + "soilPoreWaterEC2": "soil_pore_water_ec_deep", + }) + averaged["area"] = area.value + return averaged + + +def load_ims_15min(start: datetime, end: datetime) -> pd.DataFrame: + """Load IMS CSV, filter to window, leave at 15-min resolution.""" + if not _IMS_CSV.exists(): + raise FileNotFoundError(f"{_IMS_CSV} not found. Run scripts.download_ims_data first.") + df = pd.read_csv(_IMS_CSV) + df["timestamp_utc"] = pd.to_datetime(df["timestamp_utc"], utc=True) + df = df.set_index("timestamp_utc").sort_index() + df = df.loc[start:end] + return df + + +# --------------------------------------------------------------------------- +# Top-level pipeline +# --------------------------------------------------------------------------- + +def build_dataset(start: datetime, end: datetime) -> pd.DataFrame: + client = ThingsBoardClient() + + print(f"Fetching treatment area ({len(TREATMENT_DEVICES)} devices) ...") + treat = fetch_area_history(client, VineArea.TREATMENT, start, end) + print(f" {len(treat):,} 15-min rows") + + print(f"Fetching reference area ({len(REFERENCE_DEVICES)} devices) ...") + ref = fetch_area_history(client, VineArea.REFERENCE, start, end) + print(f" {len(ref):,} 15-min rows") + + print("Loading IMS weather ...") + ims = load_ims_15min(start, end) + print(f" {len(ims):,} 15-min rows") + + print("Fetching tracker angles for shading correction ...") + tracker_series = fetch_tracker_angles_15min(client, start, end) + print(f" {len(tracker_series):,} 15-min tracker rows") + + frames = [] + for label, area_df in [("treatment", treat), ("reference", ref)]: + if area_df.empty: + continue + # Inner-join with IMS so every row has weather context + joined = area_df.join(ims, how="inner") + joined = derive_inputs(joined) + frames.append(joined) + + if not frames: + raise RuntimeError("No data assembled — TB or IMS returned nothing.") + + combined = pd.concat(frames) + combined.index.name = "timestamp_utc" + + # Apply panel shading correction to treatment rows only. + combined = apply_shading_correction(combined, tracker_series) + + # Recompute Farquhar label after PAR correction. + combined["a_farquhar_umol"] = compute_farquhar_a(combined) + return combined + + +def main() -> None: + p = argparse.ArgumentParser(description="Collect 2026-schema training data.") + p.add_argument("--from", dest="from_date", default=None, + help="Start date (UTC, inclusive). Default: 30 days ago.") + p.add_argument("--to", dest="to_date", default=None, + help="End date (UTC, inclusive). Default: today.") + p.add_argument("--mode", choices=["append", "replace"], default="append", + help="append (default) merges into existing parquet on timestamp+area; " + "replace overwrites the file.") + args = p.parse_args() + + end = (datetime.fromisoformat(args.to_date).replace(tzinfo=timezone.utc) + if args.to_date else datetime.now(tz=timezone.utc)) + start = (datetime.fromisoformat(args.from_date).replace(tzinfo=timezone.utc) + if args.from_date else end - timedelta(days=30)) + + new = build_dataset(start, end) + print(f"\nCollected {len(new):,} new rows range: {new.index.min()} → {new.index.max()}") + + _OUT_DIR.mkdir(parents=True, exist_ok=True) + if args.mode == "append" and _OUT_PARQUET.exists(): + existing = pd.read_parquet(_OUT_PARQUET) + combined = pd.concat([existing.reset_index(), new.reset_index()]) + combined = combined.drop_duplicates(subset=["timestamp_utc", "area"], keep="last") + combined = combined.set_index("timestamp_utc").sort_index() + print(f"Merged with existing {len(existing):,} rows → {len(combined):,} total") + else: + combined = new + + combined.to_parquet(_OUT_PARQUET) + print(f"Wrote → {_OUT_PARQUET}") + + # Validation summary + a = combined["a_farquhar_umol"].dropna() + if not a.empty: + sun = combined[combined["ghi_w_m2"] > 100]["a_farquhar_umol"].dropna() + print(f"\nFarquhar A summary:") + print(f" total non-null rows : {len(a):,}") + print(f" range : {a.min():.2f} → {a.max():.2f} µmol CO2/m²/s") + print(f" daytime (GHI>100) mean : {sun.mean():.2f} median : {sun.median():.2f}") + + +if __name__ == "__main__": + main() diff --git a/scripts/create_pptx.py b/scripts/create_pptx.py new file mode 100644 index 0000000000000000000000000000000000000000..7757766b9e70cb265f8ce513f23a20d79b4af885 --- /dev/null +++ b/scripts/create_pptx.py @@ -0,0 +1,774 @@ +"""Create a PowerPoint presentation for the solar system electrical plan — v2 (Series topology).""" +from pptx import Presentation +from pptx.util import Inches, Pt, Cm, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN, MSO_ANCHOR +from pptx.enum.shapes import MSO_SHAPE +from pptx.oxml.ns import qn +import os + +prs = Presentation() +prs.slide_width = Inches(13.333) +prs.slide_height = Inches(7.5) + +# ── Color palette ── +NAVY = RGBColor(0x0C, 0x23, 0x40) +BLUE = RGBColor(0x1A, 0x52, 0x76) +GOLD = RGBColor(0xF0, 0xC0, 0x40) +WHITE = RGBColor(0xFF, 0xFF, 0xFF) +LIGHT_BG = RGBColor(0xF5, 0xF6, 0xFA) +RED = RGBColor(0xC6, 0x28, 0x28) +ORANGE = RGBColor(0xE6, 0x51, 0x00) +GREEN = RGBColor(0x2E, 0x7D, 0x32) +TEAL = RGBColor(0x00, 0x89, 0x7B) +DARK_TEXT = RGBColor(0x1A, 0x1A, 0x2E) +GRAY = RGBColor(0x55, 0x55, 0x55) +LIGHT_GOLD = RGBColor(0xFF, 0xF8, 0xE1) +LIGHT_RED = RGBColor(0xFF, 0xEB, 0xEE) +LIGHT_GREEN = RGBColor(0xE8, 0xF5, 0xE9) +LIGHT_BLUE = RGBColor(0xE3, 0xF2, 0xFD) +LIGHT_ORANGE = RGBColor(0xFF, 0xF3, 0xE0) +PURPLE = RGBColor(0x7B, 0x5E, 0xA7) + +# ── Helpers ── +def set_slide_bg(slide, color): + bg = slide.background + fill = bg.fill + fill.solid() + fill.fore_color.rgb = color + +def add_shape(slide, left, top, width, height, fill_color=None, line_color=None, shape_type=MSO_SHAPE.ROUNDED_RECTANGLE): + shape = slide.shapes.add_shape(shape_type, left, top, width, height) + shape.shadow.inherit = False + if fill_color: + shape.fill.solid() + shape.fill.fore_color.rgb = fill_color + else: + shape.fill.background() + if line_color: + shape.line.color.rgb = line_color + shape.line.width = Pt(1) + else: + shape.line.fill.background() + return shape + +def set_text(shape, text, font_size=14, color=DARK_TEXT, bold=False, alignment=PP_ALIGN.RIGHT, font_name='Arial'): + tf = shape.text_frame + tf.word_wrap = True + tf.auto_size = None + p = tf.paragraphs[0] + p.alignment = alignment + run = p.add_run() + run.text = text + run.font.size = Pt(font_size) + run.font.color.rgb = color + run.font.bold = bold + run.font.name = font_name + pPr = p._p.get_or_add_pPr() + pPr.set('rtl', '1') + return tf + +def add_text_box(slide, left, top, width, height, text, font_size=14, color=DARK_TEXT, bold=False, alignment=PP_ALIGN.RIGHT): + txBox = slide.shapes.add_textbox(left, top, width, height) + tf = txBox.text_frame + tf.word_wrap = True + p = tf.paragraphs[0] + p.alignment = alignment + pPr = p._p.get_or_add_pPr() + pPr.set('rtl', '1') + run = p.add_run() + run.text = text + run.font.size = Pt(font_size) + run.font.color.rgb = color + run.font.bold = bold + run.font.name = 'Arial' + return tf + +def add_multiline_box(slide, left, top, width, height, lines, default_size=13, default_color=DARK_TEXT): + txBox = slide.shapes.add_textbox(left, top, width, height) + tf = txBox.text_frame + tf.word_wrap = True + for i, line_data in enumerate(lines): + text = line_data[0] + size = line_data[1] if len(line_data) > 1 else default_size + color = line_data[2] if len(line_data) > 2 else default_color + bold = line_data[3] if len(line_data) > 3 else False + align = line_data[4] if len(line_data) > 4 else PP_ALIGN.RIGHT + if i == 0: + p = tf.paragraphs[0] + else: + p = tf.add_paragraph() + p.alignment = align + pPr = p._p.get_or_add_pPr() + pPr.set('rtl', '1') + p.space_after = Pt(4) + run = p.add_run() + run.text = text + run.font.size = Pt(size) + run.font.color.rgb = color + run.font.bold = bold + run.font.name = 'Arial' + return tf + +def add_table_slide(slide, left, top, width, row_height, headers, rows, header_bg=NAVY, header_fg=WHITE, highlight_rows=None, col_ratios=None): + num_rows = len(rows) + 1 + num_cols = len(headers) + table_shape = slide.shapes.add_table(num_rows, num_cols, left, top, width, Pt(row_height * num_rows)) + table = table_shape.table + if col_ratios: + total = sum(col_ratios) + for i, ratio in enumerate(col_ratios): + table.columns[i].width = int(width * ratio / total) + else: + col_width = int(width / num_cols) + for i in range(num_cols): + table.columns[i].width = col_width + for i, h in enumerate(headers): + cell = table.cell(0, i) + cell.text = h + cell.fill.solid() + cell.fill.fore_color.rgb = header_bg + for p in cell.text_frame.paragraphs: + p.alignment = PP_ALIGN.RIGHT + pPr = p._p.get_or_add_pPr() + pPr.set('rtl', '1') + for run in p.runs: + run.font.size = Pt(12) + run.font.color.rgb = header_fg + run.font.bold = True + run.font.name = 'Arial' + for r_idx, row in enumerate(rows): + for c_idx, val in enumerate(row): + cell = table.cell(r_idx + 1, c_idx) + cell.text = str(val) + if highlight_rows and r_idx in highlight_rows: + cell.fill.solid() + cell.fill.fore_color.rgb = LIGHT_GOLD + for p in cell.text_frame.paragraphs: + p.alignment = PP_ALIGN.RIGHT + pPr = p._p.get_or_add_pPr() + pPr.set('rtl', '1') + for run in p.runs: + run.font.size = Pt(11) + run.font.color.rgb = DARK_TEXT + run.font.name = 'Arial' + return table + +def add_card(slide, left, top, width, height, title, body_lines, fill=WHITE, accent=GOLD): + bar = add_shape(slide, left, top, width, Pt(4), fill_color=accent, shape_type=MSO_SHAPE.RECTANGLE) + card = add_shape(slide, left, top + Pt(4), width, height - Pt(4), fill_color=fill, line_color=RGBColor(0xE0, 0xE4, 0xEA)) + add_text_box(slide, left + Pt(10), top + Pt(10), width - Pt(20), Pt(24), title, font_size=15, color=NAVY, bold=True) + add_multiline_box(slide, left + Pt(10), top + Pt(36), width - Pt(20), height - Pt(46), body_lines, default_size=11) + +def section_header(slide, text, y=Inches(0.3)): + add_text_box(slide, Inches(0.5), y, Inches(12), Inches(0.7), text, font_size=28, color=NAVY, bold=True) + add_shape(slide, Inches(0.5), y + Inches(0.65), Inches(2), Pt(3), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) + +def add_block(slide, x, y, w, h, text, sub, fill, text_color=WHITE, sub_color=None): + shape = add_shape(slide, x, y, w, h, fill_color=fill) + tf = shape.text_frame + tf.word_wrap = True + tf.paragraphs[0].alignment = PP_ALIGN.CENTER + pPr = tf.paragraphs[0]._p.get_or_add_pPr() + pPr.set('rtl', '1') + run = tf.paragraphs[0].add_run() + run.text = text + run.font.size = Pt(12) + run.font.color.rgb = text_color + run.font.bold = True + run.font.name = 'Arial' + if sub: + p2 = tf.add_paragraph() + p2.alignment = PP_ALIGN.CENTER + pPr2 = p2._p.get_or_add_pPr() + pPr2.set('rtl', '1') + run2 = p2.add_run() + run2.text = sub + run2.font.size = Pt(9) + run2.font.color.rgb = sub_color or RGBColor(0xCC, 0xCC, 0xCC) + run2.font.name = 'Arial' + +def add_checklist_col(slide, x_start, y_start, items): + """items = list of (task, detail)""" + y = y_start + for task, detail in items: + add_text_box(slide, x_start, y, Inches(5.5), Inches(0.2), task, font_size=11, color=DARK_TEXT, bold=True) + add_text_box(slide, x_start, y + Pt(14), Inches(5.5), Inches(0.15), detail, font_size=9, color=GRAY) + y += Inches(0.4) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 1 — Title +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, NAVY) + +add_shape(slide, Inches(1), Inches(3.1), Inches(2), Pt(3), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) + +add_text_box(slide, Inches(1), Inches(1.2), Inches(11), Inches(1.5), + 'תכנית חשמלית — מערכת סולארית היברידית', font_size=40, color=WHITE, bold=True) +add_text_box(slide, Inches(1), Inches(2.4), Inches(11), Inches(0.6), + 'חוות יאיר — אלי ספרא', font_size=24, color=RGBColor(0xA8, 0xD8, 0xEA)) + +meta_items = [ + 'מרץ 2026', + 'ממיר: Solis S6-EH3P20K-H | 20kW תלת-פאזי', + 'סוללה: CNTE 18.8kWh HV | LiFePO4', + 'פאנלים: 18 x 620W = 11.16kWp', + 'Zero Export | טופולוגיה סדרתית | ללא CT', +] +add_multiline_box(slide, Inches(1), Inches(3.5), Inches(11), Inches(2.5), + [(m, 16, RGBColor(0xCD, 0xDE, 0xEE)) for m in meta_items]) + +# Bottom bar +add_shape(slide, Inches(0), Inches(7.1), Inches(13.333), Pt(30), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) +add_text_box(slide, Inches(1), Inches(7.12), Inches(11), Pt(26), + 'תכנון בלבד — לאישור חשמלאי מוסמך לפני ביצוע', font_size=12, color=NAVY, bold=True, alignment=PP_ALIGN.CENTER) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 2 — Notes (replacing Critical Warnings) +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +add_text_box(slide, Inches(0.5), Inches(0.3), Inches(12), Inches(0.7), + 'הערות חשובות לפני ביצוע', font_size=28, color=ORANGE, bold=True) +add_shape(slide, Inches(0.5), Inches(0.95), Inches(2), Pt(3), fill_color=ORANGE, shape_type=MSO_SHAPE.RECTANGLE) + +notes = [ + ('טופולוגיה סדרתית (Series)', + 'כל החשמל עובר דרך הממיר. אין CT. אין DC Isolators חיצוניים\n(מובנים בממיר ובסוללה). מפסקי C40 מספיקים.', + 'הוודא על ידי המתקין'), + ('RCD (פחת)', + 'לא נכלל כרגע — ייקבע לפי דרישת הבודק בהתאם למדדי הארקה.\nמומלץ לשקול הוספה מראש לבטיחות.', + 'נדחה לשלב בדיקה'), + ('טבעת מגנטית לכבל סוללה', + 'לפי המתקין, כבל הסוללה קצר מדי ללפף.\nנקודה פתוחה — לברר אם CNTE כולל ferrite מובנה, או להשתמש בכבל ארוך יותר.', + 'נקודה פתוחה'), +] + +y = Inches(1.3) +for title, desc, status in notes: + card = add_shape(slide, Inches(0.5), y, Inches(12), Inches(1.4), fill_color=WHITE, line_color=RGBColor(0xE0, 0xA0, 0x00)) + add_shape(slide, Inches(0.5), y, Pt(6), Inches(1.4), fill_color=ORANGE, shape_type=MSO_SHAPE.RECTANGLE) + add_text_box(slide, Inches(0.8), y + Pt(8), Inches(9), Pt(24), title, font_size=16, color=ORANGE, bold=True) + add_text_box(slide, Inches(0.8), y + Pt(34), Inches(9), Pt(60), desc, font_size=12, color=GRAY) + # Status badge on the right + badge = add_shape(slide, Inches(10), y + Pt(14), Inches(2.2), Inches(0.35), fill_color=LIGHT_GOLD) + set_text(badge, status, font_size=11, color=ORANGE, bold=True, alignment=PP_ALIGN.CENTER) + y += Inches(1.6) + +# Key info box +box = add_shape(slide, Inches(0.5), Inches(6), Inches(12), Inches(0.8), fill_color=LIGHT_GREEN) +add_multiline_box(slide, Inches(0.7), Inches(6.05), Inches(11.6), Inches(0.7), [ + ('שינויים עיקריים מגרסה קודמת: ללא DC Isolators חיצוניים (מובנים) | ללא CT (series topology) | C40 מספיק (לא C50) | Zero Export אוטומטי | 3P אחרי בורר מצבים', 12, GREEN, True, PP_ALIGN.CENTER), +]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 3 — Single Line Diagram +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '1. תרשים חד-קווי (Single Line Diagram)') + +# Series topology banner +banner = add_shape(slide, Inches(0.5), Inches(1.1), Inches(12.3), Inches(0.4), fill_color=LIGHT_GREEN) +add_text_box(slide, Inches(0.7), Inches(1.12), Inches(12), Inches(0.35), + 'טופולוגיה סדרתית — כל החשמל עובר דרך הממיר | Zero Export | ללא CT', + font_size=13, color=GREEN, bold=True, alignment=PP_ALIGN.CENTER) + +LINE_W = Pt(2.5) + +def add_line_h(slide, x, y, length, color): + """Horizontal line (thin rectangle).""" + add_shape(slide, x, y, length, LINE_W, fill_color=color, shape_type=MSO_SHAPE.RECTANGLE) + +def add_line_v(slide, x, y, length, color): + """Vertical line (thin rectangle).""" + add_shape(slide, x, y, LINE_W, length, fill_color=color, shape_type=MSO_SHAPE.RECTANGLE) + +DC_PV_COLOR = RGBColor(0xF0, 0xC0, 0x40) +DC_BATT_COLOR = TEAL +AC_GRID_COLOR = RGBColor(0x15, 0x65, 0xC0) +AC_BACKUP_COLOR = ORANGE +AC_DIST_COLOR = RGBColor(0x45, 0x5A, 0x64) +BMS_COLOR = RGBColor(0x26, 0xA6, 0x9A) + +# ── Block positions (all in inches, stored for line drawing) ── +# PV Strings +s1_x, s1_y, s1_w, s1_h = 2.0, 1.7, 2.5, 0.65 +s2_x, s2_y, s2_w, s2_h = 8.5, 1.7, 2.5, 0.65 +# Inverter +inv_x, inv_y, inv_w, inv_h = 4.5, 2.85, 4.2, 0.9 +# Battery +bat_x, bat_y, bat_w, bat_h = 0.5, 2.95, 2.3, 0.8 +# SPD +spd_x, spd_y, spd_w, spd_h = 5.1, 4.1, 1.8, 0.5 +# MCB +mcb_x, mcb_y, mcb_w, mcb_h = 7.2, 4.1, 1.5, 0.5 +# Changeover +chg_x, chg_y, chg_w, chg_h = 5.4, 4.85, 2.5, 0.55 +# Grid +grid_x, grid_y, grid_w, grid_h = 2.5, 5.75, 2.0, 0.55 +# Load +load_x, load_y, load_w, load_h = 8.5, 5.75, 2.0, 0.55 +# Backup +bkp_x, bkp_y, bkp_w, bkp_h = 10.5, 2.95, 2.2, 0.8 + +# ── Draw blocks ── +str_w_in = Inches(s1_w) +add_block(slide, Inches(s1_x), Inches(s1_y), str_w_in, Inches(s1_h), + 'String 1: 9x620W = 5,580Wp', 'Voc≈396V | Isc≈18A | MPPT1', + DC_PV_COLOR, DARK_TEXT, GRAY) +add_block(slide, Inches(s2_x), Inches(s2_y), str_w_in, Inches(s2_h), + 'String 2: 9x620W = 5,580Wp', 'Voc≈396V | Isc≈18A | MPPT2', + DC_PV_COLOR, DARK_TEXT, GRAY) + +add_text_box(slide, Inches(4.5), Inches(2.45), Inches(4), Inches(0.25), + 'DC switch מובנה בממיר — ללא DC Isolator חיצוני', + font_size=10, color=GRAY, alignment=PP_ALIGN.CENTER) + +add_block(slide, Inches(inv_x), Inches(inv_y), Inches(inv_w), Inches(inv_h), + 'Solis S6-EH3P20K-H', 'Hybrid 20kW | 3φ | IP66 | Series | DC switch + AFCI מובנים', + NAVY, WHITE, RGBColor(0xA8, 0xD8, 0xEA)) + +add_block(slide, Inches(bat_x), Inches(bat_y), Inches(bat_w), Inches(bat_h), + 'CNTE 18.8kWh', 'HV | LFP | IP66 | DC switch מובנה', + RGBColor(0xE0, 0xF2, 0xF1), DARK_TEXT, GRAY) + +add_block(slide, Inches(spd_x), Inches(spd_y), Inches(spd_w), Inches(spd_h), + 'SPD Type 2', '3P+N | 40kA', + LIGHT_RED, RED, GRAY) + +add_block(slide, Inches(mcb_x), Inches(mcb_y), Inches(mcb_w), Inches(mcb_h), + 'MCB C40 4P', 'יציאת ממיר', + RGBColor(0xED, 0xE7, 0xF6), DARK_TEXT, GRAY) + +add_block(slide, Inches(chg_x), Inches(chg_y), Inches(chg_w), Inches(chg_h), + 'בורר מצבים Hager 4P 40A', 'Grid / Solar / Off', + RGBColor(0xF3, 0xE5, 0xF5), DARK_TEXT, GRAY) + +add_block(slide, Inches(grid_x), Inches(grid_y), Inches(grid_w), Inches(grid_h), + 'MCB C40 3P → מונה יישוב', 'רשת חשמל', + RGBColor(0xEC, 0xEF, 0xF1), DARK_TEXT, GRAY) + +add_block(slide, Inches(load_x), Inches(load_y), Inches(load_w), Inches(load_h), + 'MCB C40 3P → לוח חשמלי', 'עומסי הבית', + LIGHT_GREEN, DARK_TEXT, GRAY) + +add_block(slide, Inches(bkp_x), Inches(bkp_y), Inches(bkp_w), Inches(bkp_h), + 'עומסים חיוניים', 'Backup UPS <10ms | C40 3P', + LIGHT_ORANGE, DARK_TEXT, GRAY) + +# ── Draw connecting lines ── + +# String 1 bottom center → down to merge line +s1_cx = s1_x + s1_w / 2 # 3.25 +s1_bot = s1_y + s1_h # 2.35 +add_line_v(slide, Inches(s1_cx), Inches(s1_bot), Inches(0.25), DC_PV_COLOR) + +# String 2 bottom center → down to merge line +s2_cx = s2_x + s2_w / 2 # 9.75 +s2_bot = s2_y + s2_h # 2.35 +add_line_v(slide, Inches(s2_cx), Inches(s2_bot), Inches(0.25), DC_PV_COLOR) + +# Horizontal merge line between String 1 and String 2 at y=2.6 +merge_y = 2.6 +add_line_h(slide, Inches(s1_cx), Inches(merge_y), Inches(s2_cx - s1_cx), DC_PV_COLOR) + +# Center of merge → down to inverter top +inv_cx = inv_x + inv_w / 2 # 6.6 +add_line_v(slide, Inches(inv_cx), Inches(merge_y), Inches(inv_y - merge_y), DC_PV_COLOR) + +# Battery right edge → horizontal to inverter left edge (DC HV) +bat_right = bat_x + bat_w # 2.8 +bat_cy = bat_y + bat_h / 2 # 3.35 +add_line_h(slide, Inches(bat_right), Inches(bat_cy), Inches(inv_x - bat_right), DC_BATT_COLOR) + +# BMS label +add_text_box(slide, Inches(3.0), Inches(3.05), Inches(1.3), Inches(0.2), + 'DC HV + CAN/BMS', font_size=9, color=BMS_COLOR, alignment=PP_ALIGN.CENTER) + +# ── AC path: Inverter → SPD → MCB → Changeover ── +inv_bot = inv_y + inv_h # 3.75 +spd_cx = spd_x + spd_w / 2 # 6.0 +spd_cy = spd_y + spd_h / 2 # 4.35 +spd_right = spd_x + spd_w # 6.9 +mcb_cx = mcb_x + mcb_w / 2 # 7.95 +mcb_bot = mcb_y + mcb_h # 4.6 +chg_cx = chg_x + chg_w / 2 # 6.65 +chg_top = chg_y # 4.85 + +# 1. Inv center (6.60) down short +elbow_y = inv_bot + 0.08 # 3.83 +add_line_v(slide, Inches(inv_cx), Inches(inv_bot), Inches(elbow_y - inv_bot), AC_GRID_COLOR) + +# 2. Horizontal jog from inv_cx (6.60) to spd_cx (6.00) +add_line_h(slide, Inches(spd_cx), Inches(elbow_y), Inches(inv_cx - spd_cx), AC_GRID_COLOR) + +# 3. Down from spd_cx to SPD top (6.00, 4.10) +add_line_v(slide, Inches(spd_cx), Inches(elbow_y), Inches(spd_y - elbow_y), AC_GRID_COLOR) + +# 4. SPD right → MCB left +add_line_h(slide, Inches(spd_right), Inches(spd_cy), Inches(mcb_x - spd_right), AC_GRID_COLOR) + +# 5. MCB bottom center → down +elbow2_y = mcb_bot + 0.05 # 4.65 +add_line_v(slide, Inches(mcb_cx), Inches(mcb_bot), Inches(elbow2_y - mcb_bot), AC_GRID_COLOR) + +# 6. Horizontal from mcb_cx to chg_cx +add_line_h(slide, Inches(chg_cx), Inches(elbow2_y), Inches(mcb_cx - chg_cx), AC_GRID_COLOR) + +# 7. Down from chg_cx to changeover top +add_line_v(slide, Inches(chg_cx), Inches(elbow2_y), Inches(chg_top - elbow2_y), AC_GRID_COLOR) + +# Changeover bottom → down then split left/right +chg_bot = chg_y + chg_h # 5.4 +branch_y = 5.55 +add_line_v(slide, Inches(chg_cx), Inches(chg_bot), Inches(branch_y - chg_bot), AC_DIST_COLOR) + +# Horizontal branch line +grid_cx = grid_x + grid_w / 2 # 3.5 +load_cx = load_x + load_w / 2 # 9.5 +add_line_h(slide, Inches(grid_cx), Inches(branch_y), Inches(load_cx - grid_cx), AC_DIST_COLOR) + +# Grid branch: down from branch line to grid block +add_line_v(slide, Inches(grid_cx), Inches(branch_y), Inches(grid_y - branch_y), AC_DIST_COLOR) + +# Load branch: down from branch line to load block +add_line_v(slide, Inches(load_cx), Inches(branch_y), Inches(load_y - branch_y), AC_DIST_COLOR) + +# Backup: Inverter right → horizontal to backup block left +inv_right = inv_x + inv_w # 8.7 +inv_cy = inv_y + inv_h / 2 # 3.3 +bkp_left = bkp_x # 10.5 +bkp_cy = bkp_y + bkp_h / 2 # 3.35 +# Horizontal line +add_line_h(slide, Inches(inv_right), Inches(inv_cy), Inches(bkp_left - inv_right), AC_BACKUP_COLOR) + +# Backup label +add_text_box(slide, Inches(inv_right + 0.1), Inches(inv_cy - 0.25), Inches(1.5), Inches(0.2), + 'Backup AC | UPS <10ms', font_size=9, color=AC_BACKUP_COLOR, alignment=PP_ALIGN.CENTER) + +# ── Legend with colored line samples ── +legend_y = Inches(6.55) +legend_items = [ + (0.5, DC_PV_COLOR, 'DC PV'), + (2.2, DC_BATT_COLOR, 'DC Battery'), + (4.2, AC_GRID_COLOR, 'AC Grid'), + (6.0, AC_BACKUP_COLOR, 'AC Backup'), + (8.0, AC_DIST_COLOR, 'Distribution'), + (10.2, BMS_COLOR, 'BMS'), +] +legend_bg = add_shape(slide, Inches(0.3), legend_y - Pt(4), Inches(12.7), Inches(0.4), fill_color=RGBColor(0xF5, 0xF5, 0xF5), line_color=RGBColor(0xE0, 0xE0, 0xE0)) +for lx, lcolor, ltext in legend_items: + add_shape(slide, Inches(lx), legend_y + Pt(4), Inches(0.4), Pt(3), fill_color=lcolor, shape_type=MSO_SHAPE.RECTANGLE) + add_text_box(slide, Inches(lx + 0.45), legend_y - Pt(2), Inches(1.3), Inches(0.3), + ltext, font_size=10, color=GRAY, alignment=PP_ALIGN.LEFT) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 4 — Component List (10 items) +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '2. רשימת רכיבים מפורטת') + +components = [ + ('1', 'פאנלים סולאריים', '620W — מק"ט s620', '18', 'גג', '2 סטרינגים x 9. DC switch מובנה בממיר'), + ('2', 'ממיר היברידי', 'Solis S6-EH3P20K-H', '1', 'קיר מוצל', 'IP66. DC switch + AFCI מובנים'), + ('3', 'סוללה', 'CNTE 18.8kWh HV', '1', 'ליד הממיר', 'IP66. DC switch מובנה. CAN'), + ('4', 'מגן ברקים SPD', 'Type 2, 3P+N, 40kA', '1', 'יציאת AC ממיר', 'הגנת AC'), + ('5', 'מפסק יציאת ממיר', 'ABB C40 4P', '1', 'אחרי SPD', '4P — כולל נייטרל'), + ('6', 'בורר מצבים', 'Hager 4P 40A', '1', 'לפני התפצלות', 'Grid / Solar / Off'), + ('7', 'מפסק רשת', 'ABB C40 3P', '1', 'ענף רשת', '3P — אחרי בורר'), + ('8', 'מפסק עומסים', 'ABB C40 3P', '1', 'ענף עומסים', '3P — אחרי בורר'), + ('9', 'מפסק גיבוי', 'ABB C40 3P', '1', 'Backup ממיר', '3P — עומסים חיוניים'), + ('10', 'מונה יישוב', 'דו-כיווני', '1', 'לפני הרשת', 'מסופק ע"י יישוב'), +] + +add_table_slide(slide, Inches(0.3), Inches(1.2), Inches(12.7), 30, + ['#', 'רכיב', 'דגם / מפרט', 'כמות', 'מיקום', 'הערות'], + components, highlight_rows=[3], + col_ratios=[0.5, 2, 2.5, 0.7, 1.5, 3]) + +# Note about what's NOT in the list +note = add_shape(slide, Inches(0.3), Inches(5.8), Inches(12.7), Inches(0.7), fill_color=LIGHT_BLUE) +add_multiline_box(slide, Inches(0.5), Inches(5.85), Inches(12.3), Inches(0.6), [ + ('לא נדרשים: DC Isolators חיצוניים (מובנים בממיר ובסוללה) | CT חיישן זרם (Series topology = Zero Export אוטומטי) | C50 (C40 מספיק)', 12, BLUE, True, PP_ALIGN.CENTER), +]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 5 — Cable Specifications +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '3. מפרט כבילה') + +cables = [ + ('PV String → Inverter', 'H1Z2Z2-K סולארי', '6mm²', 'לפי מיקום גג', 'ישירות לממיר, MC4, UV-resistant'), + ('Inverter ↔ Battery', 'DC גמיש', '16mm²', '~3m', 'מגיע עם הציוד. ⚠ ferrite — נקודה פתוחה'), + ('Inverter → SPD → MCB', 'NYY-J 5G AC', '10mm²', '~5m', '3L + N + PE'), + ('MCB → Switch → Grid/Load', 'NYY-J 5G AC', '10mm²', '~10m', 'לפי מרחק ללוח'), + ('Backup → MCB → Essential', 'NYY-J 5G AC', '6mm²', '~8m', '3P עומסים חיוניים'), + ('הארקה', 'ירוק-צהוב', '16mm² נחושת', '—', 'ממיר+סוללה+מבנה'), + ('BMS Communication', 'CAN מסוכך', 'שזור', '~3m', 'מגיע מלופף מראש בטבעת מגנטית'), +] + +add_table_slide(slide, Inches(0.5), Inches(1.2), Inches(12.3), 30, + ['קטע', 'סוג כבל', 'חתך', 'אורך', 'הערות'], + cables, highlight_rows=[1], + col_ratios=[2.5, 2, 1.2, 1, 3.5]) + +# Ferrite note +note = add_shape(slide, Inches(0.5), Inches(4.5), Inches(12.3), Inches(0.9), fill_color=LIGHT_GOLD) +add_multiline_box(slide, Inches(0.7), Inches(4.55), Inches(12), Inches(0.8), [ + ('טבעות מגנטיות (Ferrite Rings):', 13, ORANGE, True), + ('כבל CAN — מגיע מלופף מראש (לפי המתקין)', 12, DARK_TEXT), + ('כבל DC סוללה — המתקין מציין שהוא קצר מדי ללפף. נקודה פתוחה — לברר מול CNTE אם יש ferrite מובנה, או לספק כבל ארוך יותר', 12, ORANGE, True), +]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 6 — Installation Guidelines +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '4. הנחיות התקנה') + +card_w = Inches(5.9) +card_h = Inches(2.5) + +add_card(slide, Inches(0.5), Inches(1.2), card_w, card_h, + 'מיקום ממיר וסוללה', [ + ('• קיר מוצל — הגנה משמש ישירה', 12, DARK_TEXT), + ('• גובה מינימלי 60 ס"מ מהקרקע', 12, DARK_TEXT), + ('• מרווח אוורור: 30 ס"מ מצדדים, 50 ס"מ מלמעלה', 12, DARK_TEXT), + ('• נגיש לתחזוקה', 12, DARK_TEXT), + ('• IP66 — מתאים לחוץ', 12, GREEN), + ], accent=BLUE) + +add_card(slide, Inches(6.8), Inches(1.2), card_w, card_h, + 'הארקה', [ + ('• גוף ממיר + גוף סוללה', 12, DARK_TEXT), + ('• מבנה קונסטרוקציה', 12, DARK_TEXT), + ('• מסגרות פאנלים', 12, DARK_TEXT), + ('• חתך מינימלי: 16mm² נחושת', 12, DARK_TEXT), + ('• פס הארקה → אלקטרודה', 12, DARK_TEXT), + ], accent=GREEN) + +add_card(slide, Inches(0.5), Inches(4.0), card_w, card_h, + 'חיבור סוללה', [ + ('• כבל DC + כבל CAN מגיעים עם הציוד', 12, DARK_TEXT), + ('• כבל CAN מלופף מראש בטבעת מגנטית', 12, DARK_TEXT), + ('• כבל DC — קצר מדי ללפף (נקודה פתוחה)', 12, ORANGE, True), + ('• מומנט הידוק: 24.5 N·m', 12, DARK_TEXT), + ('• לוודא קוטביות לפני חיבור!', 12, RED, True), + ], accent=TEAL) + +add_card(slide, Inches(6.8), Inches(4.0), card_w, card_h, + 'אחריות ושירות', [ + ('• Solis — RCS Solar בע"מ', 12, DARK_TEXT), + ('• CNTE/Yoshopo — RCS Solar בע"מ', 12, DARK_TEXT), + ('• 10 שנים על ממיר וסוללה', 12, DARK_TEXT), + ('• התקנת פאנלים — באחריות הלקוח', 12, DARK_TEXT), + ], accent=GOLD) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 7 — QA Open Items +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +add_text_box(slide, Inches(0.5), Inches(0.3), Inches(12), Inches(0.7), + '5. בקרת איכות — נקודות פתוחות', font_size=28, color=ORANGE, bold=True) +add_shape(slide, Inches(0.5), Inches(0.95), Inches(2), Pt(3), fill_color=ORANGE, shape_type=MSO_SHAPE.RECTANGLE) + +open_items = [ + ('Q1', 'RCD (פחת)', 'המתקין: לא שמים כרגע. יוסיפו RCBO אם הבודק ידרוש', 'נדחה לבדיקה. מומלץ מראש'), + ('Q2', 'AFCI', 'מובנה בסוליס בצד DC, דורש הפעלה ידנית', 'לוודא activation בהתקנה'), + ('Q3', 'SPD DC חסר', 'SPD בצד AC בלבד. פאנלים חשופים לברק בצד DC', 'לשקול SPD DC 1000Vdc'), + ('Q4', 'Ferrite לכבל סוללה', 'כבל DC קצר מדי ללפף. CAN מלופף מראש', 'לברר מול CNTE — נקודה פתוחה'), +] + +add_table_slide(slide, Inches(0.5), Inches(1.2), Inches(12.3), 34, + ['#', 'ממצא', 'מצב', 'פעולה נדרשת'], + open_items, highlight_rows=[0, 1, 2, 3], + col_ratios=[0.5, 1.5, 4, 3]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 8 — QA Verified +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +add_text_box(slide, Inches(0.5), Inches(0.3), Inches(12), Inches(0.7), + '5. בקרת איכות — פריטים תקינים', font_size=28, color=GREEN, bold=True) +add_shape(slide, Inches(0.5), Inches(0.95), Inches(2), Pt(3), fill_color=GREEN, shape_type=MSO_SHAPE.RECTANGLE) + +verified = [ + ('טופולוגיה', 'סדרתית (Series) — אין CT. C40 מספיק', 'אושר ע"י מתקין ✓'), + ('Voc סטרינג', '396V < 1000V, בתוך MPPT 200–850V', '✓ תקין'), + ('Isc סטרינג', '~18A < 20A מקסימום', '✓ תקין'), + ('התאמת סוללה', 'CNTE HV 120–800V = סוליס 120–800V', '✓ תקין'), + ('זרם סוללה', '50A = סוליס 50A max', '✓ תקין'), + ('IP Rating', 'ממיר IP66 + סוללה IP66', '✓ תקין'), + ('תקשורת BMS', 'CAN/RS485 תואם', '✓ תקין'), + ('DC Switch מובנה', 'ממיר + סוללה — לא צריך חיצוני', 'אושר ע"י מתקין ✓'), + ('מפסקי C40', 'בסדרתי הממיר לא מושך מעבר לצריכה (3x40A)', 'אושר ע"י מתקין ✓'), + ('קטבים', 'יציאת ממיר: 4P. אחרי בורר: 3P. Backup: 3P', 'אושר ע"י מתקין ✓'), + ('Zero Export', 'בסדרתי — אוטומטי, ללא CT', 'אושר ע"י מתקין ✓'), + ('טעינת סוללה', 'מסולארי בלבד — לא מהרשת', 'אושר ע"י מתקין ✓'), +] + +add_table_slide(slide, Inches(0.5), Inches(1.2), Inches(12.3), 28, + ['פריט', 'בדיקה', 'תוצאה'], + verified, col_ratios=[1.5, 4, 2]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 9 — Execution Phase A+B +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '6. הנחיות ביצוע — שלב א\'+ב\'') + +# Warning +warn = add_shape(slide, Inches(0.5), Inches(1.1), Inches(12.3), Inches(0.5), fill_color=LIGHT_RED) +add_text_box(slide, Inches(0.7), Inches(1.15), Inches(12), Inches(0.4), + 'כל העבודה החשמלית חייבת להתבצע על ידי חשמלאי מוסמך. עבודה על DC גבוה (עד 800V) מסוכנת!', + font_size=12, color=RED, bold=True) + +add_text_box(slide, Inches(0.5), Inches(1.7), Inches(6), Inches(0.4), + 'שלב א\' — הכנה ורכש', font_size=16, color=NAVY, bold=True) + +add_checklist_col(slide, Inches(0.7), Inches(2.1), [ + ('☐ אישור תכנית מול חשמלאי', 'התאמה לתקנות ולדרישות היישוב'), + ('☐ רכש רכיבים חסרים', 'ABB C40 4P x1, ABB C40 3P x3, SPD AC Type 2, Hager 4P 40A'), + ('☐ רכש כבלים', 'H1Z2Z2-K 6mm², NYY-J 5G10, הארקה 16mm². DC+CAN מגיעים עם הציוד'), + ('☐ סימון מיקום', 'קיר מוצל, גובה 60+, אוורור 30/50 ס"מ, נגיש לתחזוקה'), +]) + +add_text_box(slide, Inches(6.8), Inches(1.7), Inches(6), Inches(0.4), + 'שלב ב\' — התקנה מכנית', font_size=16, color=NAVY, bold=True) + +add_checklist_col(slide, Inches(7), Inches(2.1), [ + ('☐ קונסטרוקציה על הגג', 'מסילות, יציבות רוח, שיפוע, אטימה'), + ('☐ הרכבת 18 פאנלים', '2 סטרינגים x 9, חיבור טורי, הארקת מסגרות'), + ('☐ התקנת ממיר', 'Solis S6-EH3P20K-H — תלייה + מפלס'), + ('☐ התקנת סוללה', 'CNTE 18.8kWh — חיזוק קיר (~100 ק"ג)'), + ('☐ לוח מפסקים', 'מפסקים, SPD, בורר מצבים. סימון ברור'), +]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 10 — Execution Phase C+D +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '6. הנחיות ביצוע — שלב ג\'+ד\'') + +add_text_box(slide, Inches(0.5), Inches(1.1), Inches(6), Inches(0.4), + 'שלב ג\' — כבילה וחיבורים', font_size=16, color=NAVY, bold=True) + +add_checklist_col(slide, Inches(0.7), Inches(1.5), [ + ('☐ DC פאנלים → ממיר', 'H1Z2Z2-K 6mm², MC4. ישירות לממיר. לוודא קוטביות!'), + ('☐ DC סוללה', 'כבל מגיע עם הציוד. מומנט 24.5 N·m. בדיקת קוטביות!'), + ('☐ BMS/CAN', 'מגיע מלופף מראש בטבעת מגנטית'), + ('☐ AC Grid', 'NYY-J 5G10 → SPD → MCB C40 4P → בורר → התפצלות'), + ('☐ AC Backup', 'NYY-J 5G10 → MCB C40 3P → עומסים חיוניים'), + ('☐ חיבור רשת', 'בורר → MCB C40 3P → מונה → רשת'), + ('☐ הארקה', '16mm² Cu: ממיר+סוללה+מבנה+פאנלים → אלקטרודה'), +]) + +add_text_box(slide, Inches(6.8), Inches(1.1), Inches(6), Inches(0.4), + 'שלב ד\' — בדיקות לפני הפעלה', font_size=16, color=NAVY, bold=True) + +add_checklist_col(slide, Inches(7), Inches(1.5), [ + ('☐ Voc סטרינג', '~396V ±5%, הפרש <5% בין סטרינגים'), + ('☐ Isc סטרינג', '~18A בשמש מלאה, מודד DC rated'), + ('☐ קוטביות DC', '+ ל-+, – ל-–. חיבור הפוך = הרס ממיר!'), + ('☐ בידוד DC', 'מגר: >1MΩ בין +/– לאדמה'), + ('☐ רציפות הארקה', '<0.5Ω מכל מסגרת לפס הארקה'), + ('☐ מתח סוללה', '120–800V, SOC מינימלי ~20%'), + ('☐ תקשורת BMS', 'ממיר מזהה סוללה, SOC/מתח/טמפ\''), + ('☐ מפסקים', 'הפעלה/ניתוק ידני של כל מפסק'), + ('☐ מתח AC', '~400V בין פאזות, ~230V פאזה-נייטרל'), +]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 11 — Execution Phase E+F +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, LIGHT_BG) + +section_header(slide, '6. הנחיות ביצוע — שלב ה\'+ו\'') + +add_text_box(slide, Inches(0.5), Inches(1.1), Inches(6), Inches(0.4), + 'שלב ה\' — הפעלה ראשונה (Commissioning)', font_size=16, color=NAVY, bold=True) + +add_checklist_col(slide, Inches(0.7), Inches(1.5), [ + ('☐ הפעלה לפי סדר', '1. DC switch סוללה → 2. DC switch ממיר (PV) → 3. AC → 4. ממיר'), + ('☐ הגדרות ממיר', 'BT+APP: סוג סוללה (Lithium/CAN), מצב: Zero Export, תדר, מתח'), + ('☐ הפעלת AFCI', 'activation required — הגנת קשת DC'), + ('☐ הגדרת Zero Export', 'וידוא שאין ייצוא לרשת. לוודא שממיר מוריד ייצור כשאין צריכה'), + ('☐ בדיקת Backup', 'ניתוק רשת → עומסים חיוניים עובדים <10ms'), + ('☐ WiFi/Ethernet', 'חיבור לניטור — SolisCloud'), + ('☐ ניטור 24 שעות', 'ייצור, טעינה, צריכה, ייבוא. וידוא Zero Export!'), +]) + +add_text_box(slide, Inches(6.8), Inches(1.1), Inches(6), Inches(0.4), + 'שלב ו\' — סימון ותיעוד', font_size=16, color=NAVY, bold=True) + +add_checklist_col(slide, Inches(7), Inches(1.5), [ + ('☐ סימון מפסקים', '"PV 1", "PV 2", "סוללה", "AC", "רשת", "עומסים", "Backup"'), + ('☐ שלט כיבוי חירום', '"1. כבה DC switch על ממיר וסוללה 2. נתק AC"'), + ('☐ תיעוד', 'תכנית, אישורים, סריאליים, תמונות'), + ('☐ מסירה ללקוח', 'הדרכה: אפליקציה, מצבים, חירום, תחזוקה'), +]) + +# Key differences box +box = add_shape(slide, Inches(6.8), Inches(3.4), Inches(5.9), Inches(2.8), fill_color=WHITE, line_color=NAVY) +add_multiline_box(slide, Inches(7), Inches(3.5), Inches(5.5), Inches(2.6), [ + ('הבדלים מגרסה קודמת — כיבוי חירום:', 14, NAVY, True), + ('', 6), + ('הפעלה/כיבוי דרך DC switch מובנה', 13, DARK_TEXT, True), + ('(לא DC Isolators חיצוניים)', 12, GRAY), + ('', 6), + ('1. כבה DC switch על הממיר', 13, RED, True), + ('2. כבה DC switch על הסוללה', 13, RED, True), + ('3. נתק מפסק AC', 13, RED, True), + ('', 6), + ('⚠ פאנלים ממשיכים לייצר מתח (~396V)', 12, RED), + ('כל עוד יש אור — לא לגעת ב-MC4!', 12, RED, True), +]) + +# ═══════════════════════════════════════════════════════════ +# SLIDE 12 — Closing +# ═══════════════════════════════════════════════════════════ +slide = prs.slides.add_slide(prs.slide_layouts[6]) +set_slide_bg(slide, NAVY) + +add_shape(slide, Inches(5.5), Inches(3.3), Inches(2.5), Pt(3), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) + +add_text_box(slide, Inches(1), Inches(2), Inches(11), Inches(1), + 'תכנית חשמלית — חוות יאיר', font_size=36, color=WHITE, bold=True, alignment=PP_ALIGN.CENTER) +add_text_box(slide, Inches(1), Inches(2.8), Inches(11), Inches(0.5), + 'מערכת סולארית היברידית | 11.16kWp | 18.8kWh | Zero Export', font_size=20, color=RGBColor(0xA8, 0xD8, 0xEA), alignment=PP_ALIGN.CENTER) + +add_multiline_box(slide, Inches(1), Inches(3.8), Inches(11), Inches(2), [ + ('טופולוגיה סדרתית | ללא CT | DC switch מובנה | C40', 14, GOLD, True, PP_ALIGN.CENTER), + ('', 10), + ('מסמך זה הוכן לצרכי תכנון בלבד', 14, RGBColor(0xCD, 0xDE, 0xEE), False, PP_ALIGN.CENTER), + ('ואינו מהווה תכנית חשמלית רשמית.', 14, RGBColor(0xCD, 0xDE, 0xEE), False, PP_ALIGN.CENTER), + ('יש לוודא עם חשמלאי מוסמך לפני ביצוע.', 14, RGBColor(0xCD, 0xDE, 0xEE), True, PP_ALIGN.CENTER), + ('', 10), + ('אלי ספרא | מרץ 2026', 16, GOLD, False, PP_ALIGN.CENTER), +]) + +# ── Save ── +output_path = os.path.expanduser('~/Documents/GitHub/Baseline/תכנית_חשמלית_חוות_יאיר.pptx') +prs.save(output_path) +print(f'Saved: {output_path}') +print(f'Slides: {len(prs.slides)}') diff --git a/scripts/create_sample_data.py b/scripts/create_sample_data.py new file mode 100644 index 0000000000000000000000000000000000000000..b28f3a3f4b7e018f10d4e668ad2c8b073ea83c27 --- /dev/null +++ b/scripts/create_sample_data.py @@ -0,0 +1,54 @@ +""" +One-off script: extract Stage 1 columns for growing season (May-Sep) +from sensors_wide.csv → sensors_wide_sample.csv (~2-3 MB). +""" + +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +import pandas as pd + +from config.settings import ( + GROWING_SEASON_MONTHS, + SENSORS_WIDE_PATH, +) +from src.sensor_data_loader import DEFAULT_TIMESTAMP_COL, STAGE1_COLUMNS + +SAMPLE_PATH = SENSORS_WIDE_PATH.parent / "sensors_wide_sample.csv" + +# Test plot columns (under-panel sensors) for 3D model validation +STAGE1_TEST_COLUMNS = [ + "Air2_PAR_test", + "Air2_leafTemperature_test", + "Air2_airTemperature_test", + "Air2_CO2_test", + "Air2_VPD_test", +] + + +def main(): + if not SENSORS_WIDE_PATH.exists(): + print(f"Full CSV not found: {SENSORS_WIDE_PATH}") + sys.exit(1) + + cols = [DEFAULT_TIMESTAMP_COL] + list(STAGE1_COLUMNS) + STAGE1_TEST_COLUMNS + print(f"Reading {SENSORS_WIDE_PATH} ...") + df = pd.read_csv(SENSORS_WIDE_PATH, usecols=lambda c: c in cols) + print(f" Total rows: {len(df)}") + + df[DEFAULT_TIMESTAMP_COL] = pd.to_datetime(df[DEFAULT_TIMESTAMP_COL], utc=True) + df = df[df[DEFAULT_TIMESTAMP_COL].dt.month.isin(GROWING_SEASON_MONTHS)] + df = df.sort_values(DEFAULT_TIMESTAMP_COL).reset_index(drop=True) + print(f" Growing-season rows (months {GROWING_SEASON_MONTHS}): {len(df)}") + + df.to_csv(SAMPLE_PATH, index=False) + size_mb = SAMPLE_PATH.stat().st_size / 1_000_000 + print(f"Saved {SAMPLE_PATH} ({size_mb:.1f} MB)") + + +if __name__ == "__main__": + main() diff --git a/scripts/download_ims_data.py b/scripts/download_ims_data.py new file mode 100644 index 0000000000000000000000000000000000000000..855544754e9752a5e37f617c4afe65bceda6f04f --- /dev/null +++ b/scripts/download_ims_data.py @@ -0,0 +1,123 @@ +""" +Download IMS weather data for station 43 (Sde Boker) and cache to Data/ims/. +Resamples 10min to 15min. Use --list-channels to discover channel IDs for RH, Rain, WS, BP. + +Usage: + python -m scripts.download_ims_data --list-channels + python -m scripts.download_ims_data --from 2024-01-01 --to 2024-12-31 + python -m scripts.download_ims_data --years 2 +""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +# Project root on path for config and src +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +try: + from dotenv import load_dotenv + load_dotenv(PROJECT_ROOT / ".env") +except ImportError: + pass + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Fetch IMS station 43 data and cache to Data/ims/ (15min resolution)." + ) + parser.add_argument( + "--list-channels", + action="store_true", + help="List channel IDs and names for station 43 (to find RH, Rain, WS, BP).", + ) + parser.add_argument( + "--from", + dest="from_date", + metavar="YYYY-MM-DD", + help="Start date (inclusive).", + ) + parser.add_argument( + "--to", + dest="to_date", + metavar="YYYY-MM-DD", + help="End date (inclusive).", + ) + parser.add_argument( + "--years", + type=float, + default=2, + metavar="N", + help="If --from/--to not set, fetch last N years (default: 2).", + ) + parser.add_argument( + "--chunk-days", + type=int, + default=7, + metavar="D", + help="Split range into D-day chunks (default: 7 for better API success). Use 0 to disable chunking.", + ) + args = parser.parse_args() + + from src.ims_client import IMSClient + from config import settings + + client = IMSClient() + + if args.list_channels: + try: + channels = client.list_channels(settings.IMS_STATION_ID) + except Exception as e: + print(f"Error fetching station metadata: {e}", file=sys.stderr) + sys.exit(1) + if not channels: + print("No channels returned. Check API response structure.") + sys.exit(0) + print(f"Station {settings.IMS_STATION_ID} channels:") + print("-" * 60) + for ch in sorted(channels, key=lambda x: (x.get("channelId") or 0)): + cid = ch.get("channelId", "?") + name = ch.get("name", "?") + units = ch.get("units", "") + active = ch.get("active", True) + print(f" {cid:>4} {name:<12} {units:<8} active={active}") + return + + # Determine date range + from datetime import datetime, timedelta, timezone + + end = datetime.now(timezone.utc).date() + if args.from_date and args.to_date: + start = datetime.strptime(args.from_date, "%Y-%m-%d").date() + end = datetime.strptime(args.to_date, "%Y-%m-%d").date() + elif args.from_date: + start = datetime.strptime(args.from_date, "%Y-%m-%d").date() + else: + start = end - timedelta(days=int(args.years * 365.25)) + + from_s = start.strftime("%Y-%m-%d") + to_s = end.strftime("%Y-%m-%d") + chunk_days = args.chunk_days if args.chunk_days else None + + print(f"Fetching IMS station {settings.IMS_STATION_ID} from {from_s} to {to_s} (chunk_days={chunk_days})...") + try: + df = client.fetch_and_cache(from_s, to_s, chunk_days=chunk_days) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + + if df.empty: + print("No data returned. Check token and date range.") + sys.exit(1) + + out_path = settings.IMS_CACHE_DIR / "ims_merged_15min.csv" + print(f"Saved {len(df)} rows (15min) to {out_path}") + print(f"Columns: {list(df.columns)}") + + +if __name__ == "__main__": + main() diff --git a/scripts/eda.py b/scripts/eda.py new file mode 100644 index 0000000000000000000000000000000000000000..7ac54615da16a1ba68ccb87c960c85f51f8090ff --- /dev/null +++ b/scripts/eda.py @@ -0,0 +1,91 @@ +""" +EDA helpers for Streamlit: Stage 1 (sensors + labels) and Stage 2 (IMS + merged). +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +import pandas as pd +import numpy as np + + +def get_stage1_eda(): + """Load Stage 1 data and return dict with summary, labels df, optional sensor sample for plots.""" + from config import settings + + out = {"labels": None, "labels_stats": None, "sensor_sample": None, "error": None} + labels_path = settings.PROCESSED_DIR / "stage1_labels.csv" + if not labels_path.exists(): + out["error"] = "Stage 1 labels not found. Run Stage 1 first." + return out + labels = pd.read_csv(labels_path, index_col=0, parse_dates=True) + labels.index = pd.to_datetime(labels.index, utc=True) + out["labels"] = labels + out["labels_stats"] = { + "count": len(labels), + "date_min": labels.index.min(), + "date_max": labels.index.max(), + "A_mean": labels.iloc[:, 0].mean(), + "A_std": labels.iloc[:, 0].std(), + "A_min": labels.iloc[:, 0].min(), + "A_max": labels.iloc[:, 0].max(), + } + # Optional: load a sample of sensor data for PAR/T (limit rows for speed) + sensor_path = settings.SENSORS_WIDE_PATH + if not sensor_path.exists(): + sensor_path = settings.SENSORS_WIDE_SAMPLE_PATH + if sensor_path.exists(): + try: + cols = ["time", "Air1_PAR_ref", "Air1_leafTemperature_ref", "Air1_airTemperature_ref", "Air1_CO2_ref", "Air1_VPD_ref"] + sensor = pd.read_csv(sensor_path, usecols=lambda c: c in cols, nrows=50000) + if "time" in sensor.columns: + sensor["time"] = pd.to_datetime(sensor["time"], utc=True) + sensor = sensor[sensor["Air1_PAR_ref"] > 50] + out["sensor_sample"] = sensor + except Exception: + out["sensor_sample"] = None + return out + + +def get_stage2_eda(): + """Load IMS + labels, merge, return merged df and summary for EDA.""" + from config import settings + from src.ims_client import IMSClient + from src.preprocessor import Preprocessor + + out = {"merged": None, "ims": None, "labels": None, "stats": None, "error": None} + labels_path = settings.PROCESSED_DIR / "stage1_labels.csv" + if not labels_path.exists(): + out["error"] = "Stage 1 labels not found." + return out + labels = pd.read_csv(labels_path, index_col=0, parse_dates=True) + labels.index = pd.to_datetime(labels.index, utc=True) + labels = labels.iloc[:, 0] + client = IMSClient() + ims = client.load_cached() + if ims.empty: + out["error"] = "IMS cache not found. Run download_ims_data first." + return out + preproc = Preprocessor() + merged = preproc.merge_ims_with_labels(ims, labels, timestamp_index_labels=True) + if merged.empty: + out["error"] = "No overlap between IMS and labels." + return out + merged = preproc.create_time_features(merged) + out["merged"] = merged + out["ims"] = ims + out["labels"] = labels + out["stats"] = { + "ims_rows": len(ims), + "ims_date_min": pd.to_datetime(ims["timestamp_utc"]).min(), + "ims_date_max": pd.to_datetime(ims["timestamp_utc"]).max(), + "merged_rows": len(merged), + "feature_cols": [c for c in merged.select_dtypes(include=[np.number]).columns if c not in ("A",)], + } + return out diff --git a/scripts/html_to_docx.py b/scripts/html_to_docx.py new file mode 100644 index 0000000000000000000000000000000000000000..d8e37442da6949522a91b0ab710c667fb2b4b7ca --- /dev/null +++ b/scripts/html_to_docx.py @@ -0,0 +1,602 @@ +"""Convert the solar system electrical plan HTML to a Word document.""" +from docx import Document +from docx.shared import Pt, Inches, Cm, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.table import WD_TABLE_ALIGNMENT +from docx.oxml.ns import qn +from docx.oxml import OxmlElement +import os + +doc = Document() + +# ── Helpers ────────────────────────────────────────────── +def set_rtl(paragraph): + """Set paragraph to RTL.""" + pPr = paragraph._p.get_or_add_pPr() + bidi = OxmlElement('w:bidi') + bidi.set(qn('w:val'), '1') + pPr.append(bidi) + paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT + +def set_cell_rtl(cell): + for p in cell.paragraphs: + set_rtl(p) + +def add_heading_rtl(text, level=1): + h = doc.add_heading(text, level=level) + set_rtl(h) + return h + +def add_para_rtl(text, bold=False, size=None, color=None): + p = doc.add_paragraph() + set_rtl(p) + run = p.add_run(text) + if bold: + run.bold = True + if size: + run.font.size = Pt(size) + if color: + run.font.color.rgb = color + return p + +def add_table_rtl(rows, cols, header_row=None): + table = doc.add_table(rows=rows, cols=cols, style='Table Grid') + table.alignment = WD_TABLE_ALIGNMENT.CENTER + for row in table.rows: + for cell in row.cells: + set_cell_rtl(cell) + return table + +def shade_cells(row, color_hex): + """Shade all cells in a row.""" + for cell in row.cells: + shading = OxmlElement('w:shd') + shading.set(qn('w:fill'), color_hex) + shading.set(qn('w:val'), 'clear') + cell._tc.get_or_add_tcPr().append(shading) + +def bold_cell(cell, text): + cell.text = '' + p = cell.paragraphs[0] + set_rtl(p) + run = p.add_run(text) + run.bold = True + +# ── Set default font ────────────────────────────────────── +style = doc.styles['Normal'] +font = style.font +font.name = 'Arial' +font.size = Pt(11) + +# ═══════════ HEADER ═══════════ +add_heading_rtl('תכנית חשמלית — מערכת סולארית היברידית', level=0) +add_para_rtl('חוות יאיר — אלי ספרא', bold=True, size=16) +add_para_rtl('מרץ 2026 | ממיר: Solis S6-EH3P20K-H | סוללה: CNTE 18.8kWh HV | פאנלים: 18x620W = 11.16kWp | הצעה: עוצם (אנטמן) #4027', size=10, color=RGBColor(0x55, 0x55, 0x55)) + +# ═══════════ WARNINGS ═══════════ +add_heading_rtl('אזהרות קריטיות — חובה לטפל לפני ביצוע', level=1) +warnings = [ + 'מפסק C40 קטן מדי לצד הרשת: הסוליס 20K מושך עד 45.6A מהרשת. מפסק C40 (40A) יקפוץ בעומס מלא. נדרש לפחות C50 בצד הרשת (Grid side).', + 'בורר מצבים Hager 40A: גם הבורר צריך להתאים לזרם המקסימלי — 40A עלול להיות צר מדי. יש לשקול 63A.', + 'DC Isolators חובה: מנתקי DC ייעודיים (לא MCB של AC). בצד PV: מדורג 1000Vdc/32A. בצד סוללה: מדורג 800Vdc/63A.', + 'מערך PV קטן ביחס לממיר: 11.16kWp הם רק 35% מהמומלץ ל-20K (32kWp). הממיר יעבוד, אבל לא ינצל את מלוא הפוטנציאל שלו.', + 'ההצעה לא כוללת התקנת פאנלים על הגג — באחריות הלקוח. נדרש קונסטרוקציה וביסוס.', +] +for w in warnings: + add_para_rtl(f'⚠ {w}') + +# ═══════════ 1. SYSTEM OVERVIEW ═══════════ +add_heading_rtl('1. סקירת המערכת', level=1) +add_para_rtl('מערכת סולארית היברידית תלת-פאזית עם גיבוי סוללה, המאפשרת צריכה עצמית, אגירת אנרגיה ומעבר אוטומטי למצב גיבוי (UPS) תוך פחות מ-10ms בעת הפסקת חשמל.') + +# Inverter +add_heading_rtl('ממיר היברידי — Solis S6-EH3P20K-H', level=2) +add_para_rtl( + 'הספק: 20kW תלת-פאזי\n' + 'מתח מצבר: 120–800V (High Voltage)\n' + 'MPPT: 4 כניסות, 200–850V, עד 20A לכניסה\n' + 'PV מומלץ: עד 32kWp\n' + 'יעילות: 98.5% מקסימום, 97.5% EU\n' + 'Backup: 20kW, 200% surge ל-10 שניות\n' + 'הגנת כניסה: IP66\n' + 'אחריות: 10 שנים (RCS Solar בע"מ)\n' + 'מחיר: ₪9,360 (לפני מע"מ)' +) + +# Battery +add_heading_rtl('מערכת אגירה — CNTE 18.8kWh HV', level=2) +add_para_rtl( + 'קיבולת: 18.8kWh\n' + 'סוג: LiFePO4 — High Voltage\n' + 'מתח נומינלי: טווח 120–800V\n' + 'זרם טעינה/פריקה מקסימלי: 50A\n' + 'הגנת כניסה: IP66 — מתאים לחוץ\n' + 'תקשורת: CAN / RS485 אל הממיר\n' + 'אחריות: 10 שנים\n' + 'מחיר: ₪15,080 (לפני מע"מ)' +) + +# Panels +add_heading_rtl('פאנלים סולאריים — 18 x 620W', level=2) +add_para_rtl( + 'הספק כולל: 11,160Wp (11.16kWp)\n' + 'חלוקה: 2 סטרינגים x 9 פאנלים\n' + 'Voc לסטרינג: ~396V (בטווח MPPT)\n' + 'Isc לסטרינג: ~18A (מתחת ל-20A מקסימום)\n' + 'חיבור: MC4\n' + 'מחיר ליחידה: ₪345\n' + 'מחיר כולל: ₪6,210 (לפני מע"מ)' +) + +# ═══════════ 2. SINGLE LINE DIAGRAM ═══════════ +add_heading_rtl('2. תרשים חד-קווי (Single Line Diagram)', level=1) +add_para_rtl('מבנה המערכת מהפאנלים ועד ללוח החשמלי:') +add_para_rtl('[התרשים הגרפי SVG לא ניתן להמרה ל-Word — ראה קובץ HTML המקורי לתרשים המלא]', size=10, color=RGBColor(0x99, 0x99, 0x99)) +add_para_rtl( + 'String 1: 9x620W = 5,580Wp (Voc≈396V, Isc≈18A, MPPT1)\n' + 'String 2: 9x620W = 5,580Wp (Voc≈396V, Isc≈18A, MPPT2)\n' + '↓ DC Isolator 1000Vdc/32A (x2)\n' + '↓ DC PV Input\n' + '→ Solis S6-EH3P20K-H (Hybrid Inverter, 20kW, 3φ, IP66)\n' + ' ← DC HV → DC Isolator 800Vdc/63A → CNTE 18.8kWh Battery (CAN/BMS)\n' + ' → Backup AC (UPS <10ms) → ABB C40 3P → עומסים חיוניים\n' + '↓ AC Grid Out\n' + '→ CT Sensor → SPD Type 2 (3P+N, 40kA) → MCB ABB C50 4P\n' + '→ Hager 4P 40A (בורר מצבים)\n' + ' ├→ MCB ABB C50 4P (Grid) → מונה יישוב → רשת חשמל → הארקה\n' + ' └→ MCB ABB C40 4P (Load) → לוח חשמלי (עומסי הבית)' +) + +# ═══════════ 3. COMPONENT LIST ═══════════ +add_heading_rtl('3. רשימת רכיבים מפורטת', level=1) + +components = [ + ('1', 'פאנלים סולאריים', '620W — מק"ט s620', '18', 'גג', '2 סטרינגים x 9'), + ('2', 'DC Isolator — PV', '1000Vdc / 32A, 2-pole', '2', 'ליד הפאנלים / כניסת ממיר', 'אחד לכל סטרינג'), + ('3', 'ממיר היברידי', 'Solis S6-EH3P20K-H', '1', 'קיר חיצוני מוצל', 'IP66 — מוגן מגשם. להגן משמש ישירה'), + ('4', 'DC Isolator — סוללה', '800Vdc / 63A, 2-pole', '1', 'בין ממיר לסוללה', 'מדורג DC!'), + ('5', 'סוללה', 'CNTE 18.8kWh HV (cnte18.8)', '1', 'ליד הממיר, קיר מוצל', 'IP66 — חיצוני. תקשורת CAN'), + ('6', 'חיישן זרם CT', 'Split-core CT, 3-פאזי', '1', 'ביציאת AC של הממיר', 'לניטור ו-zero export'), + ('7', 'מגן ברקים SPD', 'Type 2, 3P+N, 40kA', '1', 'אחרי CT, לפני מפסק ראשי', 'הגנה על קו יציאת ממיר'), + ('8', 'מפסק יציאת ממיר', 'ABB C50 4-Pole ⚠', '1', 'אחרי SPD', 'מקורי בהצעה C40 — לא מספיק!'), + ('9', 'בורר מצבים', 'Hager 4P 40A', '1', 'לפני ההתפצלות', 'Grid / Solar / Off'), + ('10', 'מפסק רשת', 'ABB C50 4-Pole ⚠', '1', 'ענף רשת', 'צריך C50 לזרם 45.6A'), + ('11', 'מפסק עומסים', 'ABB C40 4-Pole', '1', 'ענף עומסי הבית', 'C40 מספיק כאן'), + ('12', 'מפסק גיבוי', 'ABB C40 3-Pole', '1', 'יציאת Backup של ממיר', '3P — עומסים חיוניים בלבד'), + ('13', 'מונה יישוב', 'מונה דו-כיווני (מסופק ע"י היישוב)', '1', 'לפני הרשת', '—'), +] + +table = add_table_rtl(len(components) + 1, 6) +headers = ['#', 'רכיב', 'דגם / מפרט', 'כמות', 'מיקום בתרשים', 'הערות'] +for i, h in enumerate(headers): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) + +for row_idx, comp in enumerate(components): + for col_idx, val in enumerate(comp): + table.rows[row_idx + 1].cells[col_idx].text = val + set_cell_rtl(table.rows[row_idx + 1].cells[col_idx]) + +# ═══════════ 4. CABLE SPEC ═══════════ +add_heading_rtl('4. מפרט כבילה', level=1) + +cables = [ + ('PV String → DC Isolator', 'כבל סולארי H1Z2Z2-K', '6mm² (או 4mm²)', 'לפי מיקום גג', 'UV-resistant, DC rated, MC4'), + ('DC Isolator → Inverter (PV)', 'כבל סולארי H1Z2Z2-K', '6mm²', '~5m', '+ / – לכל סטרינג'), + ('Inverter ↔ Battery', 'כבל DC גמיש', '16mm²', '~3m', '50A מקסימום. דרך טבעת מגנטית x 2 ליפופים'), + ('Inverter → CT → SPD → MCB', 'כבל AC NYY-J 5G', '10mm²', '~5m', '3L + N + PE, תלת-פאזי'), + ('MCB → Changeover → Grid/Load', 'כבל AC NYY-J 5G', '10mm²', '~10m', 'לפי מרחק ללוח'), + ('Backup Output → MCB → Essential', 'כבל AC NYY-J 5G', '6mm²', '~8m', '3P ללוח עומסים חיוניים'), + ('הארקה', 'ירוק-צהוב', '16mm² (נחושת)', '—', 'חובה — ממיר + סוללה + מבנה'), + ('BMS Communication', 'כבל CAN מסוכך', 'שזור', '~3m', 'דרך טבעת מגנטית x 4 ליפופים'), +] + +table = add_table_rtl(len(cables) + 1, 5) +cable_headers = ['קטע', 'סוג כבל', 'חתך', 'אורך מוערך', 'הערות'] +for i, h in enumerate(cable_headers): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) + +for row_idx, cable in enumerate(cables): + for col_idx, val in enumerate(cable): + table.rows[row_idx + 1].cells[col_idx].text = val + set_cell_rtl(table.rows[row_idx + 1].cells[col_idx]) + +add_para_rtl('שים לב: כבל הסוללה ותקשורת BMS חייבים לעבור דרך טבעות מגנטיות (ferrite rings) כפי שמופיע במפרט הסוליס — 2 ליפופים לכבל חשמל, 4 ליפופים לכבל תקשורת.', bold=True) + +# ═══════════ 5. FLOW DESCRIPTION ═══════════ +add_heading_rtl('5. תיאור מסלול הזרם', level=1) + +add_heading_rtl('מצב יום — ייצור סולארי', level=2) +day_flow = [ + ('☀ פאנלים סולאריים (2 x 9 = 18 פאנלים)', 'מייצרים זרם DC במתח ~360V לכל סטרינג, דרך חיבורי MC4'), + ('🔌 DC Isolators (2 יח\')', 'מנתקי בטיחות DC — מאפשרים ניתוק כל סטרינג בנפרד לתחזוקה'), + ('INV — Solis 20K — המרה DC→AC', '4 כניסות MPPT (200-850V). ממיר את הזרם ל-AC תלת-פאזי 400V/50Hz. במקביל טוען את הסוללה מעודפי ייצור'), + ('CT חיישן זרם', 'מודד את הזרם ביציאה לצורך ניטור, איזון פאזות ומניעת הזרמה לרשת (zero export אם נדרש)'), + ('⚡ SPD מגן ברקים Type 2', 'הגנת נחשולי מתח (surge) על קו AC היוצא מהממיר. 3P+N, עד 40kA'), + ('🔄 בורר מצבים Hager 4P 40A', 'מאפשר מעבר ידני בין: רשת + סולארי | סולארי בלבד | ניתוק מלא'), + ('🏠 לוח חשמלי הבית', 'עומסי הבית מקבלים חשמל מהסולארי. עודפים → סוללה → רשת (לפי הגדרה)'), +] +for title, desc in day_flow: + p = doc.add_paragraph() + set_rtl(p) + run = p.add_run(f'{title}: ') + run.bold = True + p.add_run(desc) + +add_heading_rtl('מצב לילה / הפסקת חשמל', level=2) +night_flow = [ + ('🔋 CNTE 18.8kWh', 'הסוללה מספקת זרם DC HV לממיר'), + ('INV — Solis 20K — המרה DC→AC', 'ממיר ל-AC ומספק לעומסים. מעבר UPS אוטומטי תוך <10ms'), + ('🏠 עומסים חיוניים (Backup port)', 'מקרר, תאורה, ראוטר — ממוזנים ישירות מיציאת ה-Backup ללא הפסקה'), +] +for title, desc in night_flow: + p = doc.add_paragraph() + set_rtl(p) + run = p.add_run(f'{title}: ') + run.bold = True + p.add_run(desc) + +# ═══════════ 6. INVERTER SPECS ═══════════ +add_heading_rtl('6. מפרט ממיר Solis S6-EH3P20K-H', level=1) + +specs_sections = [ + ('כניסת DC — פוטו-וולטאי', [ + ('PV מומלץ מקסימלי', '32kWp'), + ('מתח מקסימלי', '1000V'), + ('טווח MPPT', '200–850V'), + ('זרם מקסימלי לכניסה', '20A x 4'), + ('מספר MPPT / סטרינגים', '4/4'), + ('הספק מקסימלי ל-MPPT', '9kW'), + ]), + ('כניסת / יציאת סוללה', [ + ('סוג', 'Li-ion (High Voltage)'), + ('טווח מתח', '120–800V'), + ('הספק טעינה/פריקה מקסימלי', '20kW'), + ('זרם מקסימלי', '50A'), + ('תקשורת', 'CAN / RS485'), + ]), + ('יציאת AC — רשת', [ + ('הספק יציאה', '20kW / 20kVA'), + ('מתח', '3/N/PE, 380V/400V'), + ('זרם יציאה מקסימלי', '30.4A / 28.9A'), + ('Power Factor', '>0.99'), + ('THDi', '<3%'), + ]), + ('כניסת AC — רשת', [ + ('הספק כניסה מקסימלי', '30kW'), + ('זרם כניסה', '45.6A ⚠'), + ('מתח', '3/N/PE, 380V/400V'), + ('תדר', '50Hz / 60Hz'), + ]), + ('יציאת Backup', [ + ('הספק', '20kW'), + ('Surge', '200% למשך 10 שניות (40kW!)'), + ('זמן מעבר', '<10ms'), + ('מתח', '3/N/PE, 380V/400V'), + ]), + ('כללי', [ + ('יעילות מקסימלית', '98.5%'), + ('יעילות EU', '97.5%'), + ('הגנת כניסה', 'IP66'), + ('טמפרטורת עבודה', '-25°C עד +60°C'), + ('מידות', '563x546x235 מ"מ'), + ('קירור', 'מאוורר אינטליגנטי כפול'), + ]), +] + +for section_title, specs in specs_sections: + add_heading_rtl(section_title, level=2) + table = add_table_rtl(len(specs), 2) + for row_idx, (key, val) in enumerate(specs): + bold_cell(table.rows[row_idx].cells[0], key) + table.rows[row_idx].cells[1].text = val + set_cell_rtl(table.rows[row_idx].cells[1]) + +# ═══════════ 7. PRICING ═══════════ +add_heading_rtl('7. פירוט עלויות — הצעת עוצם (אנטמן) #4027', level=1) + +pricing = [ + ('ממיר Solis 20kW', 'solis20k', '1', '₪9,360', '₪9,360'), + ('קיט בטריות CNTE 18.8kWh', 'cnte18.8', '1', '₪15,080', '₪15,080'), + ('לוח סולארי 620W', 's620', '18', '₪345', '₪6,210'), + ('התקנה לממיר ומצברים', '—', '1', '₪5,800', '₪5,800'), +] + +table = add_table_rtl(len(pricing) + 4, 5) +price_headers = ['פריט', 'מק"ט', 'כמות', 'מחיר יחידה', 'סה"כ'] +for i, h in enumerate(price_headers): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) + +for row_idx, item in enumerate(pricing): + for col_idx, val in enumerate(item): + table.rows[row_idx + 1].cells[col_idx].text = val + set_cell_rtl(table.rows[row_idx + 1].cells[col_idx]) + +# Subtotal +subtotal_row = len(pricing) + 1 +bold_cell(table.rows[subtotal_row].cells[0], 'סה"כ לפני מע"מ') +table.rows[subtotal_row].cells[0].merge(table.rows[subtotal_row].cells[3]) +bold_cell(table.rows[subtotal_row].cells[4], '₪36,450') +shade_cells(table.rows[subtotal_row], 'F0F4FF') + +# VAT +vat_row = subtotal_row + 1 +table.rows[vat_row].cells[0].text = 'מע"מ 18%' +set_cell_rtl(table.rows[vat_row].cells[0]) +table.rows[vat_row].cells[0].merge(table.rows[vat_row].cells[3]) +table.rows[vat_row].cells[4].text = '₪6,561' +set_cell_rtl(table.rows[vat_row].cells[4]) + +# Total +total_row = vat_row + 1 +bold_cell(table.rows[total_row].cells[0], 'סה"כ כולל מע"מ') +table.rows[total_row].cells[0].merge(table.rows[total_row].cells[3]) +bold_cell(table.rows[total_row].cells[4], '₪43,011') +shade_cells(table.rows[total_row], '0C2340') +for cell in [table.rows[total_row].cells[0], table.rows[total_row].cells[4]]: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) + run.font.size = Pt(14) + +add_para_rtl('לא כלול בהצעה: התקנה פיזית של הפאנלים על הגג (קונסטרוקציה, הגבהות, ביסוס) — באחריות הלקוח או קבלן נוסף.', bold=True, color=RGBColor(0xC6, 0x28, 0x28)) + +# ═══════════ 8. INSTALLATION NOTES ═══════════ +add_heading_rtl('8. הנחיות התקנה', level=1) + +add_heading_rtl('מיקום ממיר וסוללה', level=2) +add_para_rtl('שני הרכיבים (Solis + CNTE) בעלי דירוג IP66 ומתאימים להתקנה חיצונית. יש למקם אותם:') +for item in [ + 'על קיר מוצל — באחריות הלקוח להגן מפני שמש ישירה (כפי שמצוין בהצעה)', + 'גובה מינימלי 60 ס"מ מהקרקע (הצפה, מזיקים)', + 'מרווח אוורור: לפחות 30 ס"מ מכל צד, 50 ס"מ מלמעלה', + 'נגיש לתחזוקה — DC Isolators בהישג יד', +]: + add_para_rtl(f'• {item}') + +add_heading_rtl('הארקה', level=2) +add_para_rtl('חובה לבצע הארקה תקנית לכל הרכיבים: גוף הממיר, גוף הסוללה, מבנה הקונסטרוקציה של הפאנלים, ומסגרות הפאנלים עצמם. חתך מינימלי: 16mm² נחושת.') + +add_heading_rtl('חיבור סוללה', level=2) +add_para_rtl('כבל DC לסוללה חייב לעבור דרך טבעת מגנטית (ferrite ring) עם 2 ליפופים. כבל תקשורת CAN/BMS — דרך טבעת מגנטית עם 4 ליפופים. מומנט הידוק למחבר: 24.5 N·m.') + +add_heading_rtl('אחריות ושירות', level=2) +add_para_rtl('לפי הצעת עוצם (אנטמן):') +for item in [ + 'Solis — שירות ואחריות: אר סי אס סולאר בע"מ (RCS Solar)', + 'CNTE / Yoshopo — שירות ואחריות: אר סי אס סולאר בע"מ', + 'אחריות: 10 שנים על ממיר וסוללה', +]: + add_para_rtl(f'• {item}') + +# ═══════════ 9. QA REVIEW ═══════════ +add_heading_rtl('9. בקרת איכות — ממצאים ותיקונים', level=1) +add_para_rtl('סקירה מקצועית של התכנית זיהתה את הנקודות הבאות. יש לטפל בכולן לפני תחילת ביצוע:') + +# Critical findings +add_heading_rtl('ממצאים קריטיים (חובה לתקן)', level=2) + +critical = [ + ('Q1', 'דירוג מפסקי AC', 'Solis 20K — זרם כניסה מרשת עד 45.6A. מפסק C40 (40A) יקפוץ בעומס מלא. הגנה לא תקינה', 'להחליף ל-C50 (50A) בצד יציאת ממיר ובצד הרשת. מפסק עומסים (C40) — תקין'), + ('Q2', 'בורר מצבים — דירוג זרם', 'Hager 40A עלול להיות קטן מדי. זרם מקסימלי עובר דרכו (עד 45.6A מרשת + ייצור סולארי)', 'לשקול שדרוג ל-Hager 63A 4P, או לוודא שתרחיש העומס המקסימלי לא חורג מ-40A'), + ('Q3', 'הגנת פחת (RCD/RCBO) חסרה', 'התכנית לא כוללת הגנת פחת — זליגת זרם לגוף אדם לא תגרום לניתוק', 'להוסיף RCD Type A בדירוג 30mA בצד AC, לפני לוח העומסים. חלק מהממירים Transformerless דורשים RCD Type B — לוודא מול מפרט הסוליס'), + ('Q4', 'מפסק Backup — מספר קטבים', 'מפסק 3P (3 קטבים) לא מגן על Neutral. יציאת Backup של הסוליס היא 3/N/PE', 'להחליף ל-ABB C40 4P (4 קטבים) גם בענף ה-Backup'), +] + +table = add_table_rtl(len(critical) + 1, 4) +for i, h in enumerate(['#', 'ממצא', 'בעיה', 'תיקון נדרש']): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) +for row_idx, item in enumerate(critical): + for col_idx, val in enumerate(item): + table.rows[row_idx + 1].cells[col_idx].text = val + set_cell_rtl(table.rows[row_idx + 1].cells[col_idx]) + shade_cells(table.rows[row_idx + 1], 'FFF8E1') + +# Important findings +add_heading_rtl('ממצאים חשובים (מומלץ לתקן)', level=2) + +important = [ + ('Q5', 'AFCI — הגנת קשת חשמלית', 'הסוליס כולל AFCI מובנה בצד DC, אך דורש הפעלה ידנית (activation required)', 'לוודא שהחשמלאי מפעיל את AFCI בהגדרות הממיר בעת ההתקנה'), + ('Q6', 'SPD בצד DC חסר', 'התכנית כוללת SPD בצד AC בלבד. פאנלים על הגג חשופים לפגיעת ברק ישירה בצד DC', 'להוסיף SPD Type 2 DC מדורג 1000Vdc בין הפאנלים ל-DC Isolator, או ליד כניסת PV בממיר'), + ('Q7', 'חתך כבל AC — מרווח צר', 'כבל NYY-J 5G10 מדורג ל-~57A באוויר. עבור 45.6A זהו ניצול של 80% — תקין, אך ללא מרווח לעליית טמפרטורה', 'אם מסלול הכבל חם (צינור בשמש, ריכוז כבלים) — לשקול שדרוג ל-5G16. אחרת, 5G10 מספיק'), + ('Q8', 'טבעות מגנטיות (Ferrite) חסרות מרשימת רכיבים', 'מוזכרות בהנחיות כבילה אך לא ברשימת הרכיבים — עלולות להישכח ברכש', 'להוסיף לרשימה: 2 טבעות מגנטיות — אחת לכבל DC סוללה, אחת לכבל BMS'), + ('Q9', 'חסר: הגדרת מצב עבודה — net metering / zero export', 'התכנית לא מציינת אם המערכת עובדת במצב net metering (הזרמה לרשת) או zero export. זה משפיע על תצורת CT', 'להגדיר מול היישוב: האם מותר למכור חשמל לרשת? אם לא — להגדיר CT למצב zero export בממיר'), +] + +table = add_table_rtl(len(important) + 1, 4) +for i, h in enumerate(['#', 'ממצא', 'בעיה', 'תיקון נדרש']): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) +for row_idx, item in enumerate(important): + for col_idx, val in enumerate(item): + table.rows[row_idx + 1].cells[col_idx].text = val + set_cell_rtl(table.rows[row_idx + 1].cells[col_idx]) + +# Verified OK +add_heading_rtl('תקין — אומת', level=2) + +verified = [ + ('Voc סטרינג', '9 x ~44V = 396V < 1000V (מקסימום), בתוך 200–850V (MPPT)', 'תקין ✓'), + ('Isc סטרינג', '~18A < 20A (מקסימום לכניסת MPPT), < 30A (קצר)', 'תקין ✓'), + ('התאמת סוללה', 'CNTE HV — טווח 120–800V תואם לסוליס (120–800V)', 'תקין ✓'), + ('זרם סוללה', '50A מקסימום — תואם לסוליס (50A max charge/discharge)', 'תקין ✓'), + ('IP Rating', 'ממיר IP66 + סוללה IP66 — מתאים להתקנה חיצונית בחוות יאיר', 'תקין ✓'), + ('תקשורת BMS', 'CAN/RS485 — תואם בין CNTE לסוליס', 'תקין ✓'), + ('מפסק עומסים', 'C40 בענף עומסי הבית — תקין (זרם יציאת ממיר 30.4A)', 'תקין ✓'), + ('DC Switch מובנה', 'הסוליס כולל DC Switch מובנה (integrated) — תואם לתקן', 'תקין ✓'), + ('מומנט הידוק סוללה', '24.5 N·m — תואם מפרט (M8)', 'תקין ✓'), + ('חישוב עלויות', '₪36,450 + 18% = ₪43,011', 'תקין ✓'), +] + +table = add_table_rtl(len(verified) + 1, 3) +for i, h in enumerate(['פריט', 'בדיקה', 'תוצאה']): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) +for row_idx, item in enumerate(verified): + for col_idx, val in enumerate(item): + table.rows[row_idx + 1].cells[col_idx].text = val + set_cell_rtl(table.rows[row_idx + 1].cells[col_idx]) + +# ═══════════ 10. EXECUTION GUIDELINES ═══════════ +add_heading_rtl('10. הנחיות ביצוע — שלב אחר שלב', level=1) +add_para_rtl('כלל ברזל: כל העבודה החשמלית חייבת להתבצע על ידי חשמלאי מוסמך בעל רישיון בתוקף. עבודה על מתח DC גבוה (עד 800V) מסוכנת — לא לגעת בלי ציוד מגן מתאים.', bold=True, color=RGBColor(0xC6, 0x28, 0x28)) + +# Phase A +def add_checklist_table(title, items): + add_heading_rtl(title, level=2) + table = add_table_rtl(len(items) + 1, 3) + for i, h in enumerate(['☐', 'משימה', 'פירוט']): + bold_cell(table.rows[0].cells[i], h) + shade_cells(table.rows[0], '0C2340') + for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) + for row_idx, (task, detail) in enumerate(items): + table.rows[row_idx + 1].cells[0].text = '☐' + set_cell_rtl(table.rows[row_idx + 1].cells[0]) + bold_cell(table.rows[row_idx + 1].cells[1], task) + table.rows[row_idx + 1].cells[2].text = detail + set_cell_rtl(table.rows[row_idx + 1].cells[2]) + +add_checklist_table('שלב א\' — הכנה ורכש (לפני תחילת עבודה)', [ + ('אישור תכנית מול חשמלאי', 'להעביר תכנית זו לחשמלאי מוסמך לאישור. לוודא התאמה לתקנות חשמל ישראליות ולדרישות היישוב'), + ('בירור מול היישוב', 'האם מותר net metering (מכירת חשמל)? מהם דרישות החיבור? האם נדרש אישור ועדת תכנון?'), + ('רכש רכיבים חסרים', 'מפסקי ABB C50 4P (x2), ABB C40 4P (x2 — עומסים + backup), SPD AC Type 2, SPD DC Type 2, DC Isolators (x3), RCD Type A 30mA, טבעות מגנטיות (x2), בורר מצבים Hager 63A 4P'), + ('רכש כבלים', 'כבל סולארי H1Z2Z2-K 6mm² (לפי מדידת אורך), NYY-J 5G10 (או 5G16), כבל DC 16mm² לסוללה, כבל CAN מסוכך, כבל הארקה 16mm² ירוק-צהוב'), + ('הכנת תשתית גג', 'קונסטרוקציה, ביסוס, הגבהות — בתיאום עם קבלן שלד (לא כלול בהצעת אנטמן)'), + ('סימון מיקום ממיר וסוללה', 'קיר חיצוני מוצל, גובה 60+ ס"מ, מרווח אוורור 30 ס"מ מצדדים, 50 ס"מ מלמעלה. נגיש לתחזוקה'), +]) + +add_checklist_table('שלב ב\' — התקנה מכנית', [ + ('התקנת קונסטרוקציה על הגג', 'ביסוס מסילות לפי תכנית גג. וידוא יציבות רוחות, שיפוע ניקוז, ואטימת חדירות גג'), + ('הרכבת פאנלים', '18 פאנלים x 620W. חלוקה: סטרינג 1 (9 יח\') וסטרינג 2 (9 יח\'). חיבור טורי בכל סטרינג. הארקת מסגרות'), + ('התקנת ממיר על הקיר', 'Solis S6-EH3P20K-H — תלייה עם בורגי הרחבה מתאימים. וידוא מפלס'), + ('התקנת סוללה', 'CNTE 18.8kWh — ליד הממיר. וידוא יציבות, חיזוק לקיר אם נדרש (משקל ~100 ק"ג)'), + ('התקנת לוח מפסקים', 'לוח ייעודי או תוספת ללוח קיים: מפסקים, SPD, בורר מצבים, RCD. סימון ברור על כל מפסק'), +]) + +add_checklist_table('שלב ג\' — כבילה וחיבורים חשמליים', [ + ('כבילת DC — פאנלים לממיר', 'H1Z2Z2-K 6mm², MC4 connectors. סטרינג 1 → MPPT1, סטרינג 2 → MPPT2. לוודא קוטביות! + ל-+, – ל-–'), + ('DC Isolators — PV', 'התקנת 2 DC Isolators (1000Vdc/32A) — אחד לכל סטרינג. ליד כניסת הממיר או ליד הפאנלים'), + ('כבילת DC — סוללה', 'כבל 16mm² דרך DC Isolator (800Vdc/63A). להעביר דרך טבעת מגנטית x 2 ליפופים. מומנט הידוק: 24.5 N·m. בדיקת קוטביות לפני חיבור!'), + ('כבל BMS/CAN', 'כבל CAN מסוכך מהסוללה לממיר. להעביר דרך טבעת מגנטית x 4 ליפופים.'), + ('כבילת AC — יציאת Grid', 'NYY-J 5G10 (3L+N+PE) מיציאת Grid של הממיר → CT → SPD AC → MCB C50 → בורר מצבים → התפצלות'), + ('כבילת AC — Backup', 'NYY-J 5G6 מיציאת Backup של הממיר → MCB C40 4P → לוח עומסים חיוניים'), + ('חיבור לרשת היישוב', 'מענף הרשת בבורר → MCB C50 → מונה יישוב → רשת'), + ('הארקה', 'כבל 16mm² נחושת ירוק-צהוב: ממיר + סוללה + קונסטרוקציה + מסגרות פאנלים → פס הארקה → אלקטרודה'), +]) + +# Phase D - tests +add_heading_rtl('שלב ד\' — בדיקות לפני הפעלה', level=2) +tests = [ + ('מדידת Voc לכל סטרינג', '~396V (±5%). הפרש בין סטרינגים: לא יותר מ-5%'), + ('מדידת Isc לכל סטרינג', '~18A בשמש מלאה. לבדוק עם מודד DC rated'), + ('בדיקת קוטביות DC', '+ ל-+ ו-– ל-– בכל נקודת חיבור. חיבור הפוך הורס את הממיר!'), + ('בדיקת בידוד DC', 'מגר: >1MΩ בין + לאדמה, ובין – לאדמה'), + ('בדיקת רציפות הארקה', '<0.5Ω בין כל מסגרת פאנל / גוף ממיר לפס הארקה'), + ('בדיקת מתח סוללה', 'מתח תקין בטווח 120–800V. SOC מינימלי ~20% לפני הפעלה ראשונה'), + ('בדיקת תקשורת BMS', 'וידוא שהממיר מזהה את הסוללה ומציג SOC, מתח, טמפרטורה'), + ('בדיקת מפסקים ו-RCD', 'הפעלה וניתוק ידני של כל מפסק. בדיקת RCD עם כפתור TEST'), + ('בדיקת AC — מתח בין פאזות', '~400V בין פאזות, ~230V בין פאזה לנייטרל'), +] +table = add_table_rtl(len(tests) + 1, 3) +for i, h in enumerate(['☐', 'בדיקה', 'ערך צפוי / קריטריון']): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], '0C2340') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) +for row_idx, (test, expected) in enumerate(tests): + table.rows[row_idx + 1].cells[0].text = '☐' + set_cell_rtl(table.rows[row_idx + 1].cells[0]) + bold_cell(table.rows[row_idx + 1].cells[1], test) + table.rows[row_idx + 1].cells[2].text = expected + set_cell_rtl(table.rows[row_idx + 1].cells[2]) + +# Phase E - commissioning +add_checklist_table('שלב ה\' — הפעלה ראשונה (Commissioning)', [ + ('הפעלה לפי סדר', '1. סגור DC Isolator של סוללה → 2. סגור DC Isolators של PV → 3. סגור מפסק AC → 4. הפעל ממיר'), + ('הגדרות ממיר', 'דרך Bluetooth + APP: הגדרת סוג סוללה (Lithium/CAN), מצב עבודה (Self-use / Feed-in / Zero Export), שעות טעינה/פריקה, תדר רשת (50Hz), מתח רשת (400V)'), + ('הפעלת AFCI', 'בהגדרות הממיר — activation required. הגנת קשת חשמלית בצד DC'), + ('הגדרת CT', 'כיוון CT (חץ לכיוון הרשת). הגדרת zero export אם נדרש. בדיקה: כשהמערכת מייצרת, CT צריך להראות ערך שלילי (ייצוא)'), + ('בדיקת Backup', 'ניתוק מפסק רשת ידנית → וידוא שעומסים חיוניים ממשיכים לעבוד תוך <10ms → חיבור מחדש'), + ('חיבור WiFi/Ethernet', 'חיבור הממיר לרשת לצורך ניטור מרחוק דרך אפליקציית Solis. הגדרת חשבון ב-SolisCloud'), + ('ניטור 24 שעות', 'מעקב ביום הראשון: ייצור PV, טעינת סוללה, צריכה, ייצוא/ייבוא מרשת. וידוא שאין שגיאות'), +]) + +# Phase F - labeling +add_checklist_table('שלב ו\' — סימון ותיעוד', [ + ('סימון מפסקים', 'תווית ברורה על כל מפסק: "PV String 1", "PV String 2", "סוללה DC", "AC ממיר", "רשת", "עומסים", "Backup", "SPD"'), + ('סימון DC Isolators', 'תווית אדומה: "זהירות — מתח DC גבוה עד 800V" על כל DC Isolator'), + ('שלט כיבוי חירום', 'שלט ליד הממיר: "כיבוי חירום — 1. נתק DC Isolators (PV + סוללה) 2. נתק מפסק AC"'), + ('תיעוד', 'לשמור עותק של: תכנית חשמלית, אישורי בדיקה, מספרים סידוריים (ממיר + סוללה + פאנלים), תמונות התקנה'), + ('מסירה ללקוח', 'הדרכת שימוש: אפליקציה, מצבי עבודה, כיבוי חירום, תחזוקה שוטפת (ניקוי פאנלים כל 3 חודשים)'), +]) + +# ═══════════ 11. EMERGENCY SHUTDOWN ═══════════ +add_heading_rtl('11. נוהל כיבוי חירום', level=1) +add_para_rtl('במקרה של שריפה, הצפה, נזק פיזי לציוד, או כל מצב חירום:') + +emergency_steps = [ + ('1', 'נתק DC — סוללה', 'DC Isolator של הסוללה → מצב OFF'), + ('2', 'נתק DC — פאנלים', 'שני DC Isolators של PV → מצב OFF'), + ('3', 'נתק AC — ממיר', 'מפסק יציאת ממיר (C50) → מצב OFF'), + ('4', 'נתק רשת', 'מפסק רשת (C50) → מצב OFF'), +] + +table = add_table_rtl(len(emergency_steps) + 1, 3) +for i, h in enumerate(['שלב', 'פעולה', 'פירוט']): + bold_cell(table.rows[0].cells[i], h) +shade_cells(table.rows[0], 'C62828') +for cell in table.rows[0].cells: + for p in cell.paragraphs: + for run in p.runs: + run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) +for row_idx, (step, action, detail) in enumerate(emergency_steps): + bold_cell(table.rows[row_idx + 1].cells[0], step) + bold_cell(table.rows[row_idx + 1].cells[1], action) + table.rows[row_idx + 1].cells[2].text = detail + set_cell_rtl(table.rows[row_idx + 1].cells[2]) + shade_cells(table.rows[row_idx + 1], 'FFEBEE') + +add_para_rtl('') +add_para_rtl('⚠ זהירות: גם לאחר ניתוק כל המפסקים, הפאנלים עצמם ממשיכים לייצר מתח כל עוד יש אור. מתח מעגל פתוח: ~396V לסטרינג. אין לגעת בחיבורי MC4 או בכבלי DC ללא ציוד מגן מתאים ובדיקה עם מודד.', bold=True, color=RGBColor(0xC6, 0x28, 0x28)) + +# ═══════════ FOOTER ═══════════ +add_para_rtl('') +p = add_para_rtl('מסמך זה הוכן לצרכי תכנון בלבד ואינו מהווה תכנית חשמלית רשמית. יש לוודא עם חשמלאי מוסמך לפני ביצוע.', size=10, color=RGBColor(0x99, 0x99, 0x99)) +add_para_rtl('חוות יאיר — אלי ספרא | מרץ 2026', size=10, color=RGBColor(0x99, 0x99, 0x99)) + +# ── Save ── +output_path = os.path.expanduser('~/Documents/GitHub/Baseline/תכנית_חשמלית_חוות_יאיר.docx') +doc.save(output_path) +print(f'Saved to: {output_path}') diff --git a/scripts/import_layout.py b/scripts/import_layout.py new file mode 100644 index 0000000000000000000000000000000000000000..bff77828800772858303bc815b4259b1825d0690 --- /dev/null +++ b/scripts/import_layout.py @@ -0,0 +1,224 @@ +#!/usr/bin/env python3 +""" +import_layout.py — Spatial asset registration for SolarWine. + +Reads site geometry from config/settings.py and the ThingsBoard device +registry, assigns 3D coordinates to every asset (panels, vine rows, +sensors), and writes ``Data/layout.json`` for the ShadowModel and +dashboard map view. + +Usage: + python -m scripts.import_layout # write Data/layout.json + python -m scripts.import_layout --print # dump to stdout instead + +The output schema: +{ + "site": { lat, lon, altitude, timezone }, + "panel_geometry": { width, height, row_spacing, row_azimuth_deg }, + "canopy_geometry": { height, width, n_vertical_zones, lai_distribution }, + "rows": [ + { "row_id": 501, "type": "treatment", "devices": [...], + "panel_center_x_m": ..., "panel_center_y_m": ... }, + ... + ], + "devices": { + "Air1": { uuid, area, row, label, position_m: [x, y, z] }, + ... + } +} +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +# Add project root to path so we can import config/src +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(_PROJECT_ROOT)) + +from config.settings import ( + CANOPY_HEIGHT, + CANOPY_WIDTH, + PANEL_HEIGHT, + PANEL_WIDTH, + ROW_SPACING, + SITE_ALTITUDE, + SITE_LATITUDE, + SITE_LONGITUDE, +) + + +def _load_device_registry() -> dict: + """Import device registry from ThingsBoard client (extended with `position`).""" + from src.data.thingsboard_client import DEVICE_REGISTRY + devices = {} + for name, info in DEVICE_REGISTRY.items(): + devices[name] = { + "uuid": info.uuid, + "area": info.area.value, + "row": info.row, + "label": info.label, + "position": info.position, + } + return devices + + +# Row layout (2026): +# Reference: row 202 (single row, open sky, lat ~30.9791) +# Treatment: rows 501/502/503/504/509 (under solar panels, lat ~30.9794) +# Reference plot sits ~30 m south of the treatment plot; modelled as a +# negative Y offset on a separate block. +_TREATMENT_ROWS = [501, 502, 503, 504, 509] +_REFERENCE_ROWS = [202] + + +def _assign_row_positions(devices: dict) -> list[dict]: + """Assign 3D positions to every vine row that has at least one device. + + X-axis = row-perpendicular (panel rows are stacked along X). + Y-axis = along the row. + Z-axis: ground = 0, panel top = PANEL_HEIGHT. + """ + row_types: dict[int, str] = {r: "treatment" for r in _TREATMENT_ROWS} + row_types.update({r: "reference" for r in _REFERENCE_ROWS}) + + rows = [] + for i, row_id in enumerate(_TREATMENT_ROWS): + x = i * ROW_SPACING + row_devices = [name for name, d in devices.items() if d.get("row") == row_id] + rows.append({ + "row_id": row_id, + "type": row_types[row_id], + "panel_center_x_m": round(x, 2), + "panel_center_y_m": 0.0, + "panel_height_m": PANEL_HEIGHT, + "devices": sorted(row_devices), + }) + + for row_id in _REFERENCE_ROWS: + row_devices = [name for name, d in devices.items() if d.get("row") == row_id] + rows.append({ + "row_id": row_id, + "type": "reference", + "panel_center_x_m": 0.0, + "panel_center_y_m": -30.0, # ~30 m south of treatment block + "panel_height_m": 0.0, # reference has no panel + "devices": sorted(row_devices), + }) + + return rows + + +# Map `position` strings → (y_offset_m, x_offset_m) relative to row center. +# Y runs along the row (north positive), X is cross-row (east positive). +_POSITION_OFFSETS = { + "north": (+5.0, 0.0), + "south": (-5.0, 0.0), + "center": ( 0.0, 0.0), + "east": ( 0.0, +0.5), + "west": ( 0.0, -0.5), + "north-east": (+5.0, +0.5), + "north-west": (+5.0, -0.5), + "south-east": (-5.0, +0.5), + "south-west": (-5.0, -0.5), + "center-east": ( 0.0, +0.5), + "center-west": ( 0.0, -0.5), +} + + +def _assign_device_positions(devices: dict, rows: list[dict]) -> dict: + """Assign approximate 3D positions to each device. + + Z by device family: + Crop_2Soil : 0.6 m (fruiting zone — IRT/leaf temp/spectrometer/NDVI) + Thermocouples: PANEL_HEIGHT (panel surface) + Tracker : PANEL_HEIGHT (panel pivot) + """ + row_center = {r["row_id"]: (r["panel_center_x_m"], r["panel_center_y_m"]) for r in rows} + + positioned = {} + for name, d in devices.items(): + row = d.get("row") + x0, y0 = row_center.get(row, (0.0, 0.0)) if row else (0.0, 0.0) + dy, dx = _POSITION_OFFSETS.get((d.get("position") or "").strip().lower(), (0.0, 0.0)) + x = x0 + dx + y = y0 + dy + + if name.startswith("Crop_2Soil"): + z = 0.6 + elif name.startswith("Thermocouples"): + z = PANEL_HEIGHT + elif name.startswith("Tracker"): + z = PANEL_HEIGHT + else: + z = 0.0 + + positioned[name] = { + **d, + "position_m": [round(x, 3), round(y, 3), round(z, 3)], + } + + return positioned + + +def build_layout() -> dict: + """Build the complete site layout dictionary.""" + devices = _load_device_registry() + rows = _assign_row_positions(devices) + positioned_devices = _assign_device_positions(devices, rows) + + layout = { + "site": { + "latitude": SITE_LATITUDE, + "longitude": SITE_LONGITUDE, + "altitude_m": SITE_ALTITUDE, + "timezone": "Asia/Jerusalem", + "name": "Sde Boker Agrivoltaic Research Site", + }, + "panel_geometry": { + "width_m": PANEL_WIDTH, + "height_m": PANEL_HEIGHT, + "row_spacing_m": ROW_SPACING, + "row_azimuth_deg": 315.0, + "tilt_axis": "single_axis_NS", + }, + "canopy_geometry": { + "height_m": CANOPY_HEIGHT, + "width_m": CANOPY_WIDTH, + "trellis_type": "VSP", + "n_vertical_zones": 3, + "zone_labels": ["basal_trunk", "fruiting_zone", "apical_canopy"], + "zone_heights_m": [0.2, 0.6, 1.0], + "lai_distribution": [0.15, 0.35, 0.50], + }, + "rows": rows, + "devices": positioned_devices, + } + + return layout + + +def main(): + parser = argparse.ArgumentParser(description="Generate Data/layout.json") + parser.add_argument("--print", action="store_true", help="Print to stdout instead of writing file") + parser.add_argument("--output", type=str, default=None, help="Custom output path") + args = parser.parse_args() + + layout = build_layout() + json_str = json.dumps(layout, indent=2, ensure_ascii=False) + + if args.print: + print(json_str) + else: + out_path = Path(args.output) if args.output else _PROJECT_ROOT / "Data" / "layout.json" + out_path.parent.mkdir(parents=True, exist_ok=True) + out_path.write_text(json_str, encoding="utf-8") + print(f"Layout written to {out_path}") + print(f" {len(layout['rows'])} rows, {len(layout['devices'])} devices") + + +if __name__ == "__main__": + main() diff --git a/scripts/load_test.py b/scripts/load_test.py new file mode 100644 index 0000000000000000000000000000000000000000..ed60a906177d128cdd81922baf4d62f50e54c0fc --- /dev/null +++ b/scripts/load_test.py @@ -0,0 +1,101 @@ +""" +Load test for SolarWine API using Locust. + +Usage: + pip install locust + locust -f scripts/load_test.py --host https://solarwine-api.hf.space + + # Quick headless run (10 users, 5 min): + locust -f scripts/load_test.py --host https://solarwine-api.hf.space \ + --users 10 --spawn-rate 2 --run-time 5m --headless + + # Full stress test (50 users, 5 min): + locust -f scripts/load_test.py --host https://solarwine-api.hf.space \ + --users 50 --spawn-rate 5 --run-time 5m --headless +""" + +from locust import HttpUser, task, between + + +class SolarWineUser(HttpUser): + """Simulates a frontend user browsing the SolarWine dashboard.""" + + wait_time = between(1, 5) + + # ── High-frequency endpoints (dashboard polling) ── + + @task(10) + def health(self): + self.client.get("/api/health") + + @task(8) + def weather_current(self): + self.client.get("/api/weather/current") + + @task(6) + def sensor_snapshot(self): + self.client.get("/api/sensors/snapshot") + + @task(5) + def energy_current(self): + self.client.get("/api/energy/current") + + @task(4) + def data_sources(self): + self.client.get("/api/health/data-sources") + + # ── Medium-frequency endpoints (page navigations) ── + + @task(3) + def energy_daily(self): + from datetime import date + self.client.get(f"/api/energy/daily/{date.today()}") + + @task(3) + def weather_history(self): + from datetime import date, timedelta + end = date.today() + start = end - timedelta(days=7) + self.client.get(f"/api/weather/history?start_date={start}&end_date={end}&format=rows") + + @task(2) + def photosynthesis_current(self): + self.client.get("/api/photosynthesis/current") + + @task(2) + def biology_rules(self): + self.client.get("/api/biology/rules") + + @task(2) + def control_status(self): + self.client.get("/api/control/status") + + @task(2) + def control_trackers(self): + self.client.get("/api/control/trackers") + + @task(1) + def phenology(self): + self.client.get("/api/biology/phenology") + + @task(1) + def chill_units(self): + self.client.get("/api/biology/chill-units?season_start=2025-11-01") + + # ── Low-frequency endpoints (heavier operations) ── + + @task(1) + def photosynthesis_forecast(self): + self.client.get("/api/photosynthesis/forecast") + + @task(1) + def control_plan(self): + self.client.get("/api/control/plan") + + @task(1) + def sensor_soil(self): + self.client.get("/api/sensors/soil-moisture?hours=168") + + @task(1) + def sensor_rain(self): + self.client.get("/api/sensors/rain?hours=168") diff --git a/scripts/refresh_energy_data.py b/scripts/refresh_energy_data.py new file mode 100644 index 0000000000000000000000000000000000000000..6e5a0967c72b02343f4063d1fac30f981238bb04 --- /dev/null +++ b/scripts/refresh_energy_data.py @@ -0,0 +1,242 @@ +"""Refresh Data/energy_weather_merged.csv by joining TB Plant production +with IMS station-43 weather. + +Pulls hourly `production` (Wh) from the TB Plant asset over the requested +date range, resamples the cached IMS CSV to hourly, joins on UTC timestamp, +and adds the time / solar-geometry features the EnergyPredictor consumes. + +Usage: + python -m scripts.refresh_energy_data # Dec 2025 → today + python -m scripts.refresh_energy_data --from 2026-01-01 --to 2026-05-18 + +Replaces the legacy Air1-sourced workflow — that device no longer exists +in the 2026 fleet. +""" + +from __future__ import annotations + +import argparse +import sys +from datetime import datetime, timedelta, timezone +from pathlib import Path + +import numpy as np +import pandas as pd + +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(_PROJECT_ROOT)) + +try: + from dotenv import load_dotenv + load_dotenv(_PROJECT_ROOT / ".env") +except ImportError: + pass + +from src.data.thingsboard_client import ThingsBoardClient + +_LAT_RAD = np.radians(30.85) # Sde Boker +_IMS_CSV = _PROJECT_ROOT / "Data" / "ims" / "ims_merged_15min.csv" +_OUT_CSV = _PROJECT_ROOT / "Data" / "energy_weather_merged.csv" + + +def _solar_sin_elevation(doy: int, hour_utc: int) -> float: + dec = np.radians(23.45 * np.sin(np.radians(360 / 365 * (doy - 81)))) + ha = np.radians(15 * (hour_utc + 2 - 12)) # UTC+2 ≈ local solar + return float(max(0.0, np.sin(_LAT_RAD) * np.sin(dec) + + np.cos(_LAT_RAD) * np.cos(dec) * np.cos(ha))) + + +_TRACKER_DEVICES = ["Tracker501", "Tracker502", "Tracker503", "Tracker509"] + + +def fetch_tb_tracker_angles(start: datetime, end: datetime) -> pd.DataFrame: + """Pull hourly mean tracker angle across the 4 trackers. + + Adds two columns: + - tracker_angle_mean : mean angle (°) across reporting trackers + - tracker_angle_std : std dev across trackers (fleet disagreement) + — proxy for "one tracker stowed for intervention" + """ + client = ThingsBoardClient() + step = timedelta(days=7) + per_tracker: dict[str, pd.DataFrame] = {} + + for name in _TRACKER_DEVICES: + frames = [] + cursor = start + while cursor < end: + cursor_end = min(cursor + step, end) + try: + df = client.get_timeseries( + name, ["angle"], + start=cursor, end=cursor_end, + limit=10_000, interval_ms=3_600_000, agg="AVG", + ) + except Exception: + df = pd.DataFrame() + if not df.empty: + frames.append(df) + cursor = cursor_end + if frames: + tdf = pd.concat(frames).sort_index() + tdf.index = pd.to_datetime(tdf.index, utc=True).floor("h") + tdf = tdf[~tdf.index.duplicated(keep="last")] + per_tracker[name] = tdf.rename(columns={"angle": name}) + + if not per_tracker: + # No tracker data — return empty so the join becomes a no-op. + return pd.DataFrame(columns=["tracker_angle_mean", "tracker_angle_std"]) + + wide = pd.concat(per_tracker.values(), axis=1) + return pd.DataFrame({ + "tracker_angle_mean": wide.mean(axis=1, skipna=True), + "tracker_angle_std": wide.std(axis=1, skipna=True).fillna(0.0), + }, index=wide.index) + + +def fetch_tb_production(start: datetime, end: datetime) -> pd.DataFrame: + """Pull hourly Plant production (Wh, summed) from ThingsBoard. + + The Plant asset emits `production` every ~5 min as the energy generated + in that interval. We sum to hourly buckets via TB's SUM aggregation + (NOT AVG — AVG of 5-min samples is ~12× smaller than the hourly total). + + Returns a DataFrame indexed by hourly UTC timestamp with column + `production` in Wh. + """ + client = ThingsBoardClient() + frames = [] + cursor = start + step = timedelta(days=7) + while cursor < end: + cursor_end = min(cursor + step, end) + df = client.get_asset_timeseries( + "Plant", + keys=["production"], + start=cursor, + end=cursor_end, + limit=10_000, + interval_ms=3_600_000, + agg="SUM", + ) + if not df.empty: + frames.append(df) + cursor = cursor_end + + if not frames: + raise RuntimeError(f"No Plant production data returned for {start} → {end}") + + combined = pd.concat(frames).sort_index() + combined.index = pd.to_datetime(combined.index, utc=True) + # TB returns bucket-center timestamps (e.g. 12:30 for the 12:00 hour); + # floor to hour so we join cleanly against IMS. Dedupe by index after + # the floor (not by column values — many zero-production hours would + # otherwise be collapsed to a single row). + combined.index = combined.index.floor("h") + combined = combined[~combined.index.duplicated(keep="last")] + return combined + + +def load_ims_hourly() -> pd.DataFrame: + """Load the cached IMS 15-min CSV and resample to hourly.""" + if not _IMS_CSV.exists(): + raise FileNotFoundError( + f"{_IMS_CSV} not found. Run scripts.download_ims_data first." + ) + df = pd.read_csv(_IMS_CSV) + df["timestamp_utc"] = pd.to_datetime(df["timestamp_utc"], utc=True) + df = df.set_index("timestamp_utc").sort_index() + hourly = df.resample("1h").mean() + return hourly + + +def build_merged(production: pd.DataFrame, weather: pd.DataFrame, + trackers: pd.DataFrame | None = None) -> pd.DataFrame: + """Inner-join production and weather on hourly timestamp and add features. + + TB SUM aggregation omits zero-production hours; we reindex to a contiguous + hourly span and fill missing production with 0 so the model learns the + "GHI=0 → production=0" mapping for nighttime. + """ + # Reindex production to contiguous hourly grid (nighttime → 0 kWh) + full_idx = pd.date_range(production.index.min(), production.index.max(), + freq="1h", tz="UTC") + production = production.reindex(full_idx).fillna(0.0) + production.index.name = "timestamp_utc" + + merged = production.join(weather, how="inner") + if trackers is not None and not trackers.empty: + merged = merged.join(trackers, how="left") + # Backfill short gaps then forward-fill so brief telemetry holes don't + # introduce NaN; long gaps remain NaN and get dropped at training. + merged[["tracker_angle_mean", "tracker_angle_std"]] = ( + merged[["tracker_angle_mean", "tracker_angle_std"]].bfill(limit=2).ffill(limit=2) + ) + + # Rename IMS columns to match the legacy EnergyPredictor feature names. + merged = merged.rename(columns={ + "air_temperature_c": "airTemperature", + "ghi_w_m2": "GSR", + "wind_speed_ms": "windSpeed", + "rh_percent": "airHumidity", + }) + + # Time features + merged["hour"] = merged.index.hour + merged["month"] = merged.index.month + merged["day_of_year"] = merged.index.dayofyear + merged["hour_sin"] = np.sin(2 * np.pi * merged["hour"] / 24) + merged["hour_cos"] = np.cos(2 * np.pi * merged["hour"] / 24) + merged["doy_sin"] = np.sin(2 * np.pi * merged["day_of_year"] / 365) + merged["doy_cos"] = np.cos(2 * np.pi * merged["day_of_year"] / 365) + + # Solar geometry + merged["sin_elevation"] = [ + _solar_sin_elevation(int(doy), int(h)) + for doy, h in zip(merged["day_of_year"], merged["hour"]) + ] + merged["clearness"] = np.where( + merged["sin_elevation"] > 0.05, + np.minimum(merged["GSR"] / (merged["sin_elevation"] * 1000), 1.5), + 0.0, + ) + + # Target: kWh per hour + merged["production_kwh"] = merged["production"] / 1000.0 + + return merged + + +def main() -> None: + p = argparse.ArgumentParser(description="Refresh Data/energy_weather_merged.csv from TB + IMS.") + p.add_argument("--from", dest="from_date", default="2025-12-01") + p.add_argument("--to", dest="to_date", default=None, + help="End date (UTC, inclusive). Default: today.") + args = p.parse_args() + + start = datetime.fromisoformat(args.from_date).replace(tzinfo=timezone.utc) + end = (datetime.fromisoformat(args.to_date).replace(tzinfo=timezone.utc) + if args.to_date else datetime.now(tz=timezone.utc)) + + print(f"Pulling TB Plant production {start.date()} → {end.date()} ...") + production = fetch_tb_production(start, end) + print(f" {len(production):,} hourly rows from TB Plant asset") + + print("Pulling TB tracker angles ...") + trackers = fetch_tb_tracker_angles(start, end) + print(f" {len(trackers):,} hourly rows from {len(_TRACKER_DEVICES)} trackers") + + print("Loading IMS weather ...") + weather = load_ims_hourly() + print(f" {len(weather):,} hourly rows from IMS") + + merged = build_merged(production, weather, trackers) + merged.index.name = "timestamp_utc" + merged.to_csv(_OUT_CSV) + print(f"\nWrote {len(merged):,} rows × {len(merged.columns)} cols → {_OUT_CSV}") + print(f" range: {merged.index.min()} → {merged.index.max()}") + print(f" non-null production_kwh: {merged['production_kwh'].notna().sum():,}") + + +if __name__ == "__main__": + main() diff --git a/scripts/run_chatbot_qa.py b/scripts/run_chatbot_qa.py new file mode 100644 index 0000000000000000000000000000000000000000..810fd97bfff0ea4882dbb0e4a7d066d8cdc19577 --- /dev/null +++ b/scripts/run_chatbot_qa.py @@ -0,0 +1,48 @@ +""" +Quick QA harness for VineyardChatbot. + +Runs a fixed set of questions and prints the responses so we can sanity-check +behaviour before deploy. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + +from src.vineyard_chatbot import VineyardChatbot + + +def main() -> None: + bot = VineyardChatbot(verbose=True) + + questions = [ + "What is the state of the vines today?", + "What was the state of the vines one month ago?", + "What will be the state of the vines one month from now?", + "What will be the state of the vines two months from now?", + "Given today's conditions, what is your shading recommendation for today?", + "What is your irrigation recommendation for today?", + "What is your fertiliser recommendation for today?", + ] + + for i, q in enumerate(questions, 1): + print("\n" + "=" * 80) + print(f"Q{i}: {q}") + try: + resp = bot.chat(q) + print("A:", resp.message) + except Exception as exc: # noqa: BLE001 + import traceback + + print("ERROR:", exc) + traceback.print_exc() + + +if __name__ == "__main__": + main() + diff --git a/scripts/run_chronos_long_training.py b/scripts/run_chronos_long_training.py new file mode 100644 index 0000000000000000000000000000000000000000..b99ac431e87c989f924fcb9c09c8bb1a441f1e85 --- /dev/null +++ b/scripts/run_chronos_long_training.py @@ -0,0 +1,186 @@ +""" +Long Chronos-2 LoRA fine-tuning with large context window, tuned for local +CPU/memory. Single training run (Chronos does not support resuming LoRA fit). + +Usage (from project root): + PYTHONPATH=. python scripts/run_chronos_long_training.py [--device cpu] [--num-steps 4000] + +Uses: context_days=28, batch_size=16 by default. Set --num-steps for total steps. +""" + +from __future__ import annotations + +import os +import sys +import threading +from datetime import datetime, timezone +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +# Limit CPU threads to avoid oversubscription (set before importing torch) +if "OMP_NUM_THREADS" not in os.environ: + try: + import multiprocessing + n = multiprocessing.cpu_count() + os.environ["OMP_NUM_THREADS"] = str(min(n, 10)) + except Exception: + pass + +from config.settings import OUTPUTS_DIR +from src.chronos_forecaster import ( + ChronosForecaster, + STEPS_PER_DAY, +) +from sklearn.metrics import mean_absolute_error +import numpy as np +import pandas as pd + + +def _quick_val_mae(forecaster: ChronosForecaster, df: pd.DataFrame, train_ratio: float, n_windows: int = 5) -> float: + """Compute MAE on first n_windows test windows (daytime-only) for convergence check.""" + sparse = forecaster.load_sparse_data() + daytime_ts = set(sparse["timestamp_utc"]) + split_idx = int(len(df) * train_ratio) + test_starts = list(range(split_idx, len(df) - STEPS_PER_DAY, STEPS_PER_DAY))[:n_windows] + actual_list, pred_list = [], [] + for start_idx in test_starts: + f = forecaster.forecast_day(df, start_idx, STEPS_PER_DAY, covariate_mode="all") + actual_slice = df.iloc[start_idx : start_idx + STEPS_PER_DAY] + daytime_mask = actual_slice["timestamp_utc"].isin(daytime_ts).values[:len(f)] + if daytime_mask.sum() < 5: + continue + actual_list.append(actual_slice["A"].values[:len(f)][daytime_mask]) + pred_list.append(np.clip(f["median"].values[daytime_mask], 0, None)) + if not actual_list: + return float("nan") + return float(mean_absolute_error(np.concatenate(actual_list), np.concatenate(pred_list))) + + +def main() -> None: + import argparse + parser = argparse.ArgumentParser(description="Chronos-2 long LoRA training (single run)") + parser.add_argument("--device", default="cpu", help="torch device (cpu or mps)") + parser.add_argument("--context-days", type=int, default=28, help="context window in days") + parser.add_argument("--batch-size", type=int, default=16, help="batch size (safe for 32GB RAM)") + parser.add_argument("--num-steps", type=int, default=4000, help="total training steps") + parser.add_argument("--learning-rate", type=float, default=1e-5, help="learning rate") + parser.add_argument("--progress-minutes", type=int, default=10, help="print timestamp and progress every N minutes") + parser.add_argument("--output-dir", type=str, default=None, help="output dir for checkpoints") + args = parser.parse_args() + + output_dir = args.output_dir or str(OUTPUTS_DIR / "chronos_finetuned_long") + OUTPUTS_DIR.mkdir(parents=True, exist_ok=True) + + print("Loading data...") + forecaster = ChronosForecaster(device=args.device, context_days=args.context_days) + df = forecaster.load_data() + print(f" Grid: {len(df)} rows, context={args.context_days}d ({forecaster.context_steps} steps)") + train_ratio = 0.75 + split_idx = int(len(df) * train_ratio) + + print("\nBaseline (zero-shot) validation MAE (5 windows)...") + baseline_mae = _quick_val_mae(forecaster, df, train_ratio, n_windows=5) + print(f" {baseline_mae:.4f}") + + print(f"\nLoRA fine-tuning: {args.num_steps} steps, batch_size={args.batch_size}, lr={args.learning_rate}...") + stop_event = threading.Event() + interval_sec = max(1, args.progress_minutes * 60) + + def _progress_reporter(): + while True: + if stop_event.wait(interval_sec): + break + ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + print(f"[{ts}] Chronos LoRA training still in progress ({args.num_steps} steps total)...", flush=True) + + progress_thread = threading.Thread(target=_progress_reporter, daemon=True) + progress_thread.start() + try: + forecaster.finetune( + df, + train_ratio=train_ratio, + covariate_mode="all", + num_steps=args.num_steps, + learning_rate=args.learning_rate, + batch_size=args.batch_size, + output_dir=output_dir, + ) + finally: + stop_event.set() + progress_thread.join(timeout=interval_sec + 5) + + print("\nValidation MAE after training (5 windows)...") + val_mae = _quick_val_mae(forecaster, df, train_ratio, n_windows=5) + print(f" {val_mae:.4f} (baseline {baseline_mae:.4f})") + + # Full benchmark with finetuned model (append lora row to CSV) + print("\nRunning full walk-forward benchmark (finetuned model, mode=all)...") + sparse = forecaster.load_sparse_data() + daytime_ts = set(sparse["timestamp_utc"]) + test_starts = list(range(split_idx, len(df) - STEPS_PER_DAY, STEPS_PER_DAY)) + all_actual, all_pred = [], [] + for start_idx in test_starts: + f = forecaster.forecast_day(df, start_idx, STEPS_PER_DAY, covariate_mode="all") + actual_slice = df.iloc[start_idx : start_idx + STEPS_PER_DAY] + daytime_mask = actual_slice["timestamp_utc"].isin(daytime_ts).values[:len(f)] + if daytime_mask.sum() < 5: + continue + all_actual.append(actual_slice["A"].values[:len(f)][daytime_mask]) + all_pred.append(np.clip(f["median"].values[daytime_mask], 0, None)) + lora_mae = None + if all_actual: + from sklearn.metrics import mean_squared_error, r2_score + a = np.concatenate(all_actual) + p = np.concatenate(all_pred) + lora_mae = float(mean_absolute_error(a, p)) + lora_rmse = float(np.sqrt(mean_squared_error(a, p))) + lora_r2 = float(r2_score(a, p)) + print(f" LoRA / all: MAE={lora_mae:.4f} RMSE={lora_rmse:.4f} R²={lora_r2:.4f} ({len(all_actual)} windows, {len(a)} steps)") + + # Load existing benchmark CSV, append lora row, save + bench_path = OUTPUTS_DIR / "chronos_benchmark.csv" + if bench_path.exists(): + existing = pd.read_csv(bench_path) + lora_row = pd.DataFrame([{ + "mode": "lora / all", + "MAE": lora_mae, + "RMSE": lora_rmse, + "R2": lora_r2, + "n_windows": len(all_actual), + "n_steps": len(a), + }]) + combined = pd.concat([existing, lora_row], ignore_index=True) + combined.to_csv(bench_path, index=False) + print(f" Appended lora row → {bench_path}") + else: + pd.DataFrame([{ + "mode": "lora / all", "MAE": lora_mae, "RMSE": lora_rmse, "R2": lora_r2, + "n_windows": len(all_actual), "n_steps": len(a), + }]).to_csv(bench_path, index=False) + + # Sample forecast plot + print("\nGenerating sample forecast plot...") + forecaster.plot_sample_forecast(df) + + # Summary and next steps + print("\n" + "=" * 60) + print("TRAINING COMPLETE — Next steps") + print("=" * 60) + print(f" Checkpoints: {output_dir}") + print(f" Benchmark: {OUTPUTS_DIR / 'chronos_benchmark.csv'} (lora / all row appended)") + print(f" Plot: {OUTPUTS_DIR / 'chronos_forecast_sample.png'} (from finetuned model)") + print(" • Refresh the Streamlit app: Prediction Accuracy tab will show LoRA / all in the table.") + print(" • Sample forecast image is from the finetuned model.") + if lora_mae is not None: + zs_mae = 3.91 # typical zero-shot 'all' on this eval + delta = (zs_mae - lora_mae) / zs_mae * 100 + print(f" • LoRA MAE {lora_mae:.2f} vs zero-shot ~{zs_mae:.2f} ({delta:+.0f}% change).") + print("=" * 60) + print("Done.") + + +if __name__ == "__main__": + main() diff --git a/scripts/run_control_simulation.py b/scripts/run_control_simulation.py new file mode 100644 index 0000000000000000000000000000000000000000..9ce8acf1df0c76fc491052b41354e1e14dfcbc89 --- /dev/null +++ b/scripts/run_control_simulation.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +""" +Historical replay simulation through the full control loop. + +Reads IMS weather history and replays it through the control pipeline: + DayAheadPlanner → ControlLoop.tick() → log results + +Usage +----- + # Replay a hot July week (default) + python scripts/run_control_simulation.py + + # Specify dates + python scripts/run_control_simulation.py --start 2025-07-01 --end 2025-07-07 + + # Dry run with verbose logging + python scripts/run_control_simulation.py --verbose +""" + +from __future__ import annotations + +import argparse +import json +import logging +import sys +from datetime import date, datetime, timedelta, timezone +from pathlib import Path + +import pandas as pd + +# Ensure project root is importable +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from config.settings import ( + DP_SLOT_DURATION_MIN, + SIMULATION_LOG_DIR, +) + +logger = logging.getLogger("simulation") + + +# --------------------------------------------------------------------------- +# Simulation runner +# --------------------------------------------------------------------------- + +class ControlSimulation: + """Replay historical weather through the control pipeline. + + Parameters + ---------- + start_date : date + First day to simulate. + end_date : date + Last day to simulate (inclusive). + """ + + def __init__(self, start_date: date, end_date: date): + self.start_date = start_date + self.end_date = end_date + self.results: list[dict] = [] + + def run(self) -> list[dict]: + """Run the full simulation.""" + from src.control_loop import ControlLoop + + loop = ControlLoop(dry_run=True) + + current = self.start_date + day_count = 0 + + while current <= self.end_date: + day_count += 1 + logger.info("=== Day %d: %s ===", day_count, current) + + # Load/generate plan for this day + plan = loop.load_plan(current) + if plan is None: + logger.warning("No plan for %s — skipping", current) + current += timedelta(days=1) + continue + + n_slots = len(plan.get("slots", [])) + logger.info("Plan loaded: %d slots, stage=%s", + n_slots, plan.get("stage_id", "?")) + + # Simulate each 15-min slot + for slot_idx in range(96): + hour = slot_idx // 4 + minute = (slot_idx % 4) * DP_SLOT_DURATION_MIN + ts = datetime( + current.year, current.month, current.day, + hour, minute, 0, + tzinfo=timezone.utc, + ) + + try: + result = loop.tick(timestamp=ts) + entry = result.to_dict() + entry["sim_day"] = str(current) + self.results.append(entry) + except Exception as exc: + logger.error("Tick failed at %s: %s", ts, exc) + self.results.append({ + "timestamp": ts.isoformat(), + "slot_index": slot_idx, + "sim_day": str(current), + "error": str(exc), + }) + + # Summary for this day + day_ticks = [r for r in self.results if r.get("sim_day") == str(current)] + interventions = sum( + 1 for r in day_ticks + if (r.get("plan_offset_deg") or 0) > 0 + ) + overrides = sum(1 for r in day_ticks if r.get("live_override")) + logger.info( + "Day %s: %d ticks, %d interventions, %d live overrides", + current, len(day_ticks), interventions, overrides, + ) + + current += timedelta(days=1) + + logger.info("Simulation complete: %d total ticks over %d days", + len(self.results), day_count) + return self.results + + def save(self, path: Path | None = None) -> Path: + """Save results to JSON.""" + if path is None: + SIMULATION_LOG_DIR.mkdir(parents=True, exist_ok=True) + path = SIMULATION_LOG_DIR / ( + f"sim_{self.start_date}_{self.end_date}.json" + ) + path.parent.mkdir(parents=True, exist_ok=True) + with open(path, "w") as f: + json.dump(self.results, f, indent=2, default=str) + logger.info("Saved %d results to %s", len(self.results), path) + return path + + def print_summary(self) -> None: + """Print a human-readable summary.""" + if not self.results: + print("No results to summarise.") + return + + total = len(self.results) + errors = sum(1 for r in self.results if "error" in r) + interventions = sum( + 1 for r in self.results + if (r.get("plan_offset_deg") or 0) > 0 + ) + overrides = sum(1 for r in self.results if r.get("live_override")) + dispatched = sum(1 for r in self.results if r.get("dispatch")) + + print(f"\n{'='*60}") + print(f"Simulation: {self.start_date} → {self.end_date}") + print(f"{'='*60}") + print(f"Total ticks: {total}") + print(f"Errors: {errors}") + print(f"Interventions: {interventions} ({interventions/total*100:.1f}%)") + print(f"Live overrides: {overrides}") + print(f"Dispatched: {dispatched}") + + # Temperature stats + temps = [r["air_temp_c"] for r in self.results + if r.get("air_temp_c") is not None] + if temps: + print(f"\nTemperature: {min(temps):.1f}°C – {max(temps):.1f}°C " + f"(mean {sum(temps)/len(temps):.1f}°C)") + + # Per-day breakdown + days = sorted(set(r.get("sim_day", "") for r in self.results)) + print(f"\nPer-day breakdown:") + print(f"{'Date':<12} {'Ticks':>6} {'Interv':>7} {'Override':>9} {'MaxOff':>7}") + for day in days: + day_r = [r for r in self.results if r.get("sim_day") == day] + d_interv = sum(1 for r in day_r if (r.get("plan_offset_deg") or 0) > 0) + d_override = sum(1 for r in day_r if r.get("live_override")) + offsets = [r.get("plan_offset_deg", 0) or 0 for r in day_r] + max_off = max(offsets) if offsets else 0 + print(f"{day:<12} {len(day_r):>6} {d_interv:>7} {d_override:>9} {max_off:>6.0f}°") + + print(f"{'='*60}\n") + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + +def main(): + parser = argparse.ArgumentParser( + description="Replay historical weather through the agrivoltaic control loop." + ) + _today = date.today() + _default_start = (_today - timedelta(days=7)).isoformat() + _default_end = _today.isoformat() + parser.add_argument( + "--start", type=str, default=_default_start, + help=f"Start date (YYYY-MM-DD). Default: {_default_start} (today − 7 d)", + ) + parser.add_argument( + "--end", type=str, default=_default_end, + help=f"End date (YYYY-MM-DD). Default: {_default_end} (today)", + ) + parser.add_argument( + "--output", type=str, default=None, + help="Output JSON path (default: Data/simulation_logs/sim__.json)", + ) + parser.add_argument( + "--verbose", "-v", action="store_true", + help="Enable debug logging", + ) + args = parser.parse_args() + + level = logging.DEBUG if args.verbose else logging.INFO + logging.basicConfig( + level=level, + format="%(asctime)s %(name)-15s %(levelname)-7s %(message)s", + datefmt="%H:%M:%S", + ) + + start = date.fromisoformat(args.start) + end = date.fromisoformat(args.end) + + sim = ControlSimulation(start, end) + sim.run() + sim.print_summary() + + out_path = Path(args.output) if args.output else None + saved = sim.save(out_path) + print(f"Results saved to: {saved}") + + +if __name__ == "__main__": + main() diff --git a/scripts/run_pipeline.py b/scripts/run_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..6cbe46c4f07bb840afb7a23343994c5d3720f7ca --- /dev/null +++ b/scripts/run_pipeline.py @@ -0,0 +1,244 @@ +""" +Run full pipeline: Stage 1 (sensors -> Farquhar -> A labels), validation, Stage 2 (IMS + labels -> train/eval), plots. +Requires: Data/Seymour/sensors_wide.csv, Data/ims/ims_merged_15min.csv (or run download_ims_data first). + +Usage: + python -m scripts.run_pipeline +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +try: + from dotenv import load_dotenv + load_dotenv(PROJECT_ROOT / ".env") +except ImportError: + pass + +import pandas as pd + + +def run_stage1(): + """Load sensors, filter daytime, compute A with Farquhar, save labels. Returns (df_sensor, labels).""" + from config import settings + from src.sensor_data_loader import SensorDataLoader + from src.farquhar_model import FarquharModel + + settings.PROCESSED_DIR.mkdir(parents=True, exist_ok=True) + loader = SensorDataLoader() + df = loader.load() + df = loader.filter_daytime(df, par_threshold=50.0) + # Keep growing season only (May–September); vine dormant Oct–April, no photosynthesis + ts_col = "time" if "time" in df.columns else df.columns[0] + t = pd.to_datetime(df[ts_col], utc=True) + df = df.loc[t.dt.month.isin(settings.GROWING_SEASON_MONTHS)].copy() + if df.empty: + return None, None + model = FarquharModel() + A = model.compute_all(df) + # Index labels by timestamp; round to 15min and aggregate to align with IMS for Stage 2 merge + ts_col = "time" if "time" in df.columns else df.columns[0] + t = pd.to_datetime(df[ts_col], utc=True) + A = A.copy() + A.index = t.dt.floor("15min") + A = A.groupby(level=0).mean() + A.name = "A" + path = settings.PROCESSED_DIR / "stage1_labels.csv" + A.to_csv(path) + print(f"Stage 1: saved {len(A)} labels to {path}") + return df, A + + +def validate_stage1(df_sensor, labels, outputs_dir: Path): + """Sanity check A (0–25 typical), diurnal plot, correlation with PAR and T.""" + import numpy as np + import pandas as pd + + if labels is None or labels.empty: + return + outputs_dir.mkdir(parents=True, exist_ok=True) + A = labels.dropna() + stats = {"count": len(A), "mean": A.mean(), "std": A.std(), "min": A.min(), "max": A.max()} + print("Stage 1 validation – A (umol m-2 s-1):", stats) + if A.max() > 50 or A.min() < -5: + print(" Note: typical grapevine A is 0–25; check inputs if out of range.") + try: + import matplotlib.pyplot as plt + fig, axes = plt.subplots(2, 1, figsize=(10, 8)) + # Diurnal: A vs hour + ts = pd.to_datetime(A.index, utc=True) + hour = ts.hour + ts.minute / 60 + axes[0].scatter(hour, A.values, alpha=0.3, s=5) + axes[0].set_xlabel("Hour (UTC)") + axes[0].set_ylabel("A (umol m-2 s-1)") + axes[0].set_title("Diurnal pattern (Stage 1)") + axes[0].set_xlim(0, 24) + if df_sensor is not None and not df_sensor.empty and "Air1_PAR_ref" in df_sensor.columns: + ts_col = "time" if "time" in df_sensor.columns else df_sensor.columns[0] + par_series = df_sensor.set_index(ts_col)["Air1_PAR_ref"] + common = A.reindex(par_series.index).dropna() + par = par_series.reindex(common.index).dropna() + common = common.reindex(par.index).dropna() + if len(par) > 10: + axes[1].scatter(par.values, common.values, alpha=0.3, s=5) + axes[1].set_xlabel("PAR (umol m-2 s-1)") + axes[1].set_ylabel("A (umol m-2 s-1)") + axes[1].set_title("A vs PAR") + plt.tight_layout() + plt.savefig(outputs_dir / "stage1_validation.png", dpi=150) + plt.close() + print(f" Saved {outputs_dir / 'stage1_validation.png'}") + except Exception as e: + print(" Plot skip:", e) + + +def run_stage2(outputs_dir: Path): + """Load IMS + stage1 labels, preprocess, train, evaluate, save metrics and plots.""" + from config import settings + from src.ims_client import IMSClient + from src.preprocessor import Preprocessor + from src.predictor import PhotosynthesisPredictor + import pandas as pd + import numpy as np + + path_labels = settings.PROCESSED_DIR / "stage1_labels.csv" + if not path_labels.exists(): + print("Stage 2: no stage1_labels.csv; run Stage 1 first.") + return + labels = pd.read_csv(path_labels, index_col=0, parse_dates=True).iloc[:, 0] + labels.index = pd.to_datetime(labels.index, utc=True) + labels = labels.dropna() + + client = IMSClient() + ims_df = client.load_cached() + if ims_df.empty: + print("Stage 2: no IMS cache; run download_ims_data first.") + return + + preproc = Preprocessor() + merged = preproc.merge_ims_with_labels(ims_df, labels, timestamp_index_labels=True) + if merged.empty: + print("Stage 2: no overlap between IMS and labels. Ensure IMS cache covers sensor date range (e.g. run download_ims_data --from YYYY-MM-DD --to YYYY-MM-DD for that range).") + return + merged = preproc.create_time_features(merged) + X_train, y_train, X_test, y_test = preproc.temporal_split(merged) + if X_train.empty or X_test.empty: + print("Stage 2: insufficient data after split.") + return + X_train_s = preproc.fit_transform_train(X_train) + X_test_s = preproc.transform_test(X_test) + # Ensure no sensor columns in features + assert "A" not in X_train_s.columns and "timestamp_utc" not in X_train_s.columns + + predictor = PhotosynthesisPredictor() + predictor.train(X_train_s, y_train) + eval_df = predictor.evaluate(X_test_s, y_test) + print("Stage 2 metrics:") + print(eval_df.to_string(index=False)) + eval_df.to_csv(outputs_dir / "stage2_metrics.csv", index=False) + + predictor.plot_results(y_test, save_path=outputs_dir / "stage2_predictions.png") + imp = predictor.get_feature_importance() + if not imp.empty: + imp.to_csv(outputs_dir / "stage2_feature_importance.csv", index=False) + try: + import matplotlib.pyplot as plt + imp.set_index("feature")["importance"].plot(kind="barh", legend=False, figsize=(8, 4)) + plt.tight_layout() + plt.savefig(outputs_dir / "stage2_feature_importance.png", dpi=150) + plt.close() + except Exception: + pass + print(f" Saved metrics and plots to {outputs_dir}") + + +def run_stage2_timeseries(outputs_dir: Path): + """Load merged IMS+labels, build lag features, train/eval per horizon.""" + from config import settings + from src.ims_client import IMSClient + from src.preprocessor import Preprocessor + from src.ts_predictor import TimeSeriesPredictor + import pandas as pd + + path_labels = settings.PROCESSED_DIR / "stage1_labels.csv" + if not path_labels.exists(): + print("TS: no stage1_labels.csv; run Stage 1 first.") + return + labels = pd.read_csv(path_labels, index_col=0, parse_dates=True).iloc[:, 0] + labels.index = pd.to_datetime(labels.index, utc=True) + labels = labels.dropna() + + client = IMSClient() + ims_df = client.load_cached() + if ims_df.empty: + print("TS: no IMS cache; run download_ims_data first.") + return + + preproc = Preprocessor() + merged = preproc.merge_ims_with_labels(ims_df, labels, timestamp_index_labels=True) + if merged.empty: + print("TS: no overlap between IMS and labels.") + return + merged = preproc.create_time_features(merged) + + ts_pred = TimeSeriesPredictor() + merged = ts_pred.assign_season(merged) + merged = ts_pred.identify_sessions(merged) + merged = ts_pred.create_lag_features(merged) + + print("Training time-series models per horizon (per season)...") + ts_metrics = ts_pred.train_all_horizons(merged) + + # Save full per-season breakdown + ts_metrics.to_csv(outputs_dir / "ts_per_season_metrics.csv", index=False) + + # Load cross-sectional baseline for comparison (overall only) + baseline_path = outputs_dir / "stage2_metrics.csv" + if baseline_path.exists(): + baseline = pd.read_csv(baseline_path) + comparison = ts_pred.get_comparison_with_baseline(baseline) + else: + comparison = ts_metrics[ts_metrics["season"] == "all"].copy() + + out_path = outputs_dir / "ts_horizon_comparison.csv" + comparison.to_csv(out_path, index=False) + print(f" Saved {out_path}") + print(f" Saved {outputs_dir / 'ts_per_season_metrics.csv'}") + + +def main(): + from config import settings + + outputs_dir = settings.OUTPUTS_DIR + outputs_dir.mkdir(parents=True, exist_ok=True) + + print("Running Stage 1 (sensors -> Farquhar -> labels)...") + try: + df_sensor, labels = run_stage1() + except FileNotFoundError as e: + print(f"Stage 1 skipped (missing data): {e}") + df_sensor, labels = None, None + except Exception as e: + print(f"Stage 1 error: {e}") + raise + + if labels is not None: + print("Stage 1 validation...") + validate_stage1(df_sensor, labels, outputs_dir) + + print("Running Stage 2 (IMS + labels -> train/eval)...") + run_stage2(outputs_dir) + + print("Running Stage 2 time-series forecasting...") + run_stage2_timeseries(outputs_dir) + print("Done.") + + +if __name__ == "__main__": + main() diff --git a/scripts/shadow_mode_test.py b/scripts/shadow_mode_test.py new file mode 100644 index 0000000000000000000000000000000000000000..910a812263cd8318553afb6bf8427d6ea77d06fb --- /dev/null +++ b/scripts/shadow_mode_test.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +""" +Shadow mode validation: run the full upgraded pipeline over a historical week. + +Validates three properties: + 1. Sensor errors caught by LLM-generated filters + 2. Baseline predictor (FvCB+ML hybrid) generates valid day-ahead A profiles + 3. Routing agent switches to ML during high-stress and FvCB during cool conditions + +Usage +----- + python scripts/shadow_mode_test.py + python scripts/shadow_mode_test.py --start 2025-07-20 --end 2025-07-26 -v +""" + +from __future__ import annotations + +import argparse +import logging +import math +import sys +from datetime import date, datetime, timedelta, timezone +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from config.settings import ( + DP_SLOT_DURATION_MIN, + SEMILLON_TRANSITION_TEMP_C, + SIMULATION_LOG_DIR, +) + +logger = logging.getLogger("shadow_mode") + + +# --------------------------------------------------------------------------- +# Test 1: LLM Data Cleaning Filters +# --------------------------------------------------------------------------- + +def test_data_cleaning_filters() -> tuple[bool, str]: + """Verify that LLM-generated data filters catch sensor anomalies.""" + try: + from src.llm_data_engineer import LLMDataEngineer + import pandas as pd + import numpy as np + + # Create synthetic data with known anomalies + n = 100 + rng = np.random.default_rng(42) + df = pd.DataFrame({ + "PAR_Den_Avg": np.clip(rng.normal(800, 200, n), 0, 2000), + "VPD_kPa": np.clip(rng.normal(1.5, 0.5, n), 0, 5), + "CO2_ppm": np.clip(rng.normal(400, 20, n), 350, 500), + }) + + # Inject anomalies + df.loc[5, "PAR_Den_Avg"] = -50.0 # negative PAR + df.loc[10, "PAR_Den_Avg"] = 5000.0 # impossibly high PAR + df.loc[20, "VPD_kPa"] = -1.0 # negative VPD + df.loc[30, "CO2_ppm"] = 10.0 # impossibly low CO2 + + engineer = LLMDataEngineer() + cleaned = engineer.apply_cleaning(df) + + # Check that anomalies were handled + issues = [] + if cleaned.loc[5, "PAR_Den_Avg"] < 0: + issues.append("negative PAR not clipped") + if cleaned.loc[10, "PAR_Den_Avg"] > 2500: + issues.append("impossibly high PAR not clipped") + if cleaned.loc[20, "VPD_kPa"] < 0: + issues.append("negative VPD not clipped") + + if issues: + return False, f"Filter gaps: {'; '.join(issues)}" + + removed = (df.isna().sum().sum() != cleaned.isna().sum().sum()) or \ + (df.values != cleaned.values).any() + return True, f"Data cleaning active: {removed}" + + except ImportError as exc: + return True, f"LLM data engineer not available (OK in test): {exc}" + except Exception as exc: + return False, f"Data cleaning failed: {exc}" + + +# --------------------------------------------------------------------------- +# Test 2: Baseline Predictor Validation +# --------------------------------------------------------------------------- + +def test_baseline_predictor() -> tuple[bool, str]: + """Verify BaselinePredictor generates valid day-ahead A profiles.""" + from src.baseline_predictor import BaselinePredictor + + predictor = BaselinePredictor() + + # Hot July day in Sde Boker + temps = [] + ghis = [] + for slot in range(96): + hour = slot * 0.25 + t = 25.0 + 13.0 * max(0, math.sin(math.pi * (hour - 5) / 14)) \ + if 5 <= hour <= 19 else 25.0 + temps.append(t) + g = max(0, 950 * math.sin(math.pi * (hour - 4) / 12)) \ + if 4 <= hour <= 16 else 0.0 + ghis.append(g) + + predictions = predictor.predict_day(temps, ghis) + issues = [] + + if len(predictions) != 96: + issues.append(f"expected 96 slots, got {len(predictions)}") + + # Should have non-zero A during daylight + daylight_a = [predictions[i] for i in range(96) if ghis[i] > 100] + if not daylight_a or max(daylight_a) == 0: + issues.append("all daylight A predictions are zero") + + # A should be in reasonable range (0-40 µmol/m²/s) + if max(predictions) > 50: + issues.append(f"max A={max(predictions):.1f} > 50 (unrealistic)") + + # Nighttime should be zero + night_a = [predictions[i] for i in range(96) if ghis[i] < 10] + non_zero_night = sum(1 for a in night_a if a > 0) + if non_zero_night > 0: + issues.append(f"{non_zero_night} non-zero nighttime predictions") + + # A should peak during morning-midday (not late afternoon) + # Note: at Sde Boker in July, midday temps >35°C cause Rubisco limitation + # so peak A is biologically correct in the cooler morning hours + morning_midday = predictions[24:48] # 6:00-12:00 UTC (local ~9:00-15:00) + late_afternoon = predictions[56:64] # 14:00-16:00 UTC + if morning_midday and late_afternoon and all(a == 0 for a in morning_midday): + issues.append("all morning-midday A predictions are zero") + + if issues: + return False, "; ".join(issues) + + peak_a = max(predictions) + peak_slot = predictions.index(peak_a) + daylight_mean = sum(daylight_a) / len(daylight_a) if daylight_a else 0 + return True, ( + f"Valid: peak A={peak_a:.1f} at slot {peak_slot} " + f"({peak_slot // 4:02d}:{(peak_slot % 4) * 15:02d}), " + f"daylight mean={daylight_mean:.1f}" + ) + + +# --------------------------------------------------------------------------- +# Test 3: Routing Agent Behaviour +# --------------------------------------------------------------------------- + +def test_routing_agent() -> tuple[bool, str]: + """Verify routing agent switches between FvCB and ML correctly.""" + from src.chatbot.routing_agent import RoutingAgent + + agent = RoutingAgent() + issues = [] + + # Cool morning → should route to FvCB + cool = agent.route({ + "temp_c": 22.0, "ghi_w_m2": 350.0, "cwsi": 0.15, "vpd": 0.8, "hour": 8, + }) + if cool != "fvcb": + issues.append(f"cool morning routed to {cool}, expected fvcb") + + # Hot afternoon, high stress → should route to ML + hot = agent.route({ + "temp_c": 38.0, "ghi_w_m2": 950.0, "cwsi": 0.72, "vpd": 3.5, "hour": 14, + }) + if hot != "ml": + issues.append(f"hot afternoon routed to {hot}, expected ml") + + # Moderate conditions → transition zone (fvcb or ml both acceptable) + moderate = agent.route({ + "temp_c": 29.5, "ghi_w_m2": 680.0, "cwsi": 0.35, "vpd": 1.8, "hour": 11, + }) + if moderate not in ("fvcb", "ml"): + issues.append(f"moderate conditions routed to {moderate}, expected fvcb or ml") + + # Very high VPD → ML + high_vpd = agent.route({ + "temp_c": 28.0, "ghi_w_m2": 500.0, "cwsi": 0.2, "vpd": 3.0, "hour": 12, + }) + if high_vpd != "ml": + issues.append(f"high VPD routed to {high_vpd}, expected ml") + + # Night → FvCB (no stress) + night = agent.route({ + "temp_c": 18.0, "ghi_w_m2": 0.0, "hour": 22, + }) + if night != "fvcb": + issues.append(f"night routed to {night}, expected fvcb") + + if issues: + return False, "; ".join(issues) + + return True, f"Routing correct: cool→{cool}, hot→{hot}, moderate→{moderate}, vpd→{high_vpd}, night→{night}" + + +# --------------------------------------------------------------------------- +# Test 4: Full pipeline shadow mode simulation +# --------------------------------------------------------------------------- + +def test_shadow_mode_simulation( + start: date, end: date, +) -> tuple[bool, str]: + """Run the control loop in shadow mode over a date range.""" + from src.control_loop import ControlLoop + + loop = ControlLoop(dry_run=True) + issues = [] + total_ticks = 0 + errors = 0 + routes = {"fvcb": 0, "ml": 0, "": 0} + overrides = 0 + + current = start + while current <= end: + plan = loop.load_plan(current) + if plan is None: + logger.warning("No plan for %s — skipping", current) + current += timedelta(days=1) + continue + + for slot_idx in range(96): + hour = slot_idx // 4 + minute = (slot_idx % 4) * DP_SLOT_DURATION_MIN + ts = datetime( + current.year, current.month, current.day, + hour, minute, 0, tzinfo=timezone.utc, + ) + + try: + result = loop.tick(timestamp=ts) + total_ticks += 1 + + route = result.model_route or "" + routes[route] = routes.get(route, 0) + 1 + + if result.live_override: + overrides += 1 + + except Exception as exc: + errors += 1 + if errors <= 5: + logger.error("Tick error at %s: %s", ts, exc) + + current += timedelta(days=1) + + if total_ticks == 0: + issues.append("no ticks executed") + if errors > total_ticks * 0.1: + issues.append(f"{errors} errors out of {total_ticks} ticks (>{10}%)") + + # Should have a mix of FvCB and ML routes during daytime + # (nighttime all goes to fvcb) + fvcb_pct = routes.get("fvcb", 0) / max(total_ticks, 1) * 100 + ml_pct = routes.get("ml", 0) / max(total_ticks, 1) * 100 + + if issues: + return False, "; ".join(issues) + + return True, ( + f"Shadow mode OK: {total_ticks} ticks, {errors} errors, " + f"routes: fvcb={fvcb_pct:.0f}% ml={ml_pct:.0f}%, " + f"overrides={overrides}" + ) + + +# --------------------------------------------------------------------------- +# Runner +# --------------------------------------------------------------------------- + +def main(): + parser = argparse.ArgumentParser( + description="Shadow mode validation of the full agrivoltaic pipeline." + ) + parser.add_argument( + "--start", type=str, default="2025-07-01", + help="Start date for shadow simulation", + ) + parser.add_argument( + "--end", type=str, default="2025-07-07", + help="End date for shadow simulation", + ) + parser.add_argument( + "--verbose", "-v", action="store_true", + help="Enable debug logging", + ) + args = parser.parse_args() + + level = logging.DEBUG if args.verbose else logging.INFO + logging.basicConfig( + level=level, + format="%(asctime)s %(name)-15s %(levelname)-7s %(message)s", + datefmt="%H:%M:%S", + ) + + start = date.fromisoformat(args.start) + end = date.fromisoformat(args.end) + + tests = [ + ("1. Data Cleaning Filters", test_data_cleaning_filters), + ("2. Baseline Predictor", test_baseline_predictor), + ("3. Routing Agent", test_routing_agent), + ("4. Shadow Mode Simulation", lambda: test_shadow_mode_simulation(start, end)), + ] + + print(f"\nShadow Mode Validation: {start} → {end}") + print("=" * 60) + + all_passed = True + for name, test_fn in tests: + print(f"\n{name}...") + try: + passed, msg = test_fn() + status = "PASS" if passed else "FAIL" + print(f" [{status}] {msg}") + if not passed: + all_passed = False + except Exception as exc: + print(f" [ERROR] {exc}") + all_passed = False + + print(f"\n{'=' * 60}") + print(f"Overall: {'ALL PASSED' if all_passed else 'SOME FAILED'}") + print(f"{'=' * 60}\n") + + sys.exit(0 if all_passed else 1) + + +if __name__ == "__main__": + main() diff --git a/scripts/smoke_test.py b/scripts/smoke_test.py new file mode 100644 index 0000000000000000000000000000000000000000..f1013b5565e4ad020e5cbb132ca006492274eeb7 --- /dev/null +++ b/scripts/smoke_test.py @@ -0,0 +1,107 @@ +""" +End-to-end smoke test for the production API. + +Usage: + python scripts/smoke_test.py # test local (localhost:7860) + python scripts/smoke_test.py https://my-space.hf.space # test remote +""" + +from __future__ import annotations + +import json +import sys +import time + +import requests + + +def smoke_test(base_url: str) -> bool: + """Run smoke tests against the API. Returns True if all pass.""" + base = base_url.rstrip("/") + passed = 0 + failed = 0 + results = [] + + def check(name: str, method: str, path: str, expected_keys=None, body=None): + nonlocal passed, failed + url = f"{base}{path}" + try: + if method == "GET": + resp = requests.get(url, timeout=15) + else: + resp = requests.post(url, json=body, timeout=30) + + if resp.status_code == 200: + data = resp.json() + if expected_keys: + missing = [k for k in expected_keys if k not in data] + if missing: + results.append(f" WARN {name}: missing keys {missing}") + passed += 1 # partial pass + return + results.append(f" PASS {name}") + passed += 1 + else: + results.append(f" FAIL {name}: HTTP {resp.status_code} — {resp.text[:100]}") + failed += 1 + except Exception as exc: + results.append(f" FAIL {name}: {exc}") + failed += 1 + + print(f"\nSmoke testing: {base}\n{'='*60}") + + check("Health check", + "GET", "/api/health", + expected_keys=["status", "uptime_seconds"]) + + check("Weather current", + "GET", "/api/weather/current", + expected_keys=["air_temperature_c", "ghi_w_m2"]) + + check("Weather history", + "GET", "/api/weather/history") + + check("Sensor snapshot", + "GET", "/api/sensors/snapshot") + + check("Energy current", + "GET", "/api/energy/current") + + check("Energy daily", + "GET", "/api/energy/daily/2026-03-17") + + check("Photosynthesis current", + "GET", "/api/photosynthesis/current") + + check("Control status", + "GET", "/api/control/status") + + check("Control plan", + "GET", "/api/control/plan") + + check("Biology rules", + "GET", "/api/biology/rules", + expected_keys=["rules"]) + + check("Biology phenology", + "GET", "/api/biology/phenology") + + check("Chatbot message", + "POST", "/api/chatbot/message", + expected_keys=["message"], + body={"message": "What is the current temperature?", "session_id": "smoke-test"}) + + # Print results + print() + for r in results: + print(r) + print(f"\n{'='*60}") + print(f"Results: {passed} passed, {failed} failed out of {passed + failed}") + + return failed == 0 + + +if __name__ == "__main__": + url = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:7860" + ok = smoke_test(url) + sys.exit(0 if ok else 1) diff --git a/scripts/train_2026_photosynthesis.py b/scripts/train_2026_photosynthesis.py new file mode 100644 index 0000000000000000000000000000000000000000..5d4355706500f07e007fd2bb78031b798c607dc5 --- /dev/null +++ b/scripts/train_2026_photosynthesis.py @@ -0,0 +1,195 @@ +"""Experimental Stage-2 photosynthesis ML training on the 2026-schema parquet. + +This is an exploratory smoke test on ~10 days of data — **not** a production +model. The goal is to (a) validate the training pipeline end-to-end, (b) see +whether the 2026-fleet sensor signals (NDVI, PRI, PSRI, soil moisture, leaf +temp) carry information beyond IMS weather, and (c) establish a baseline that +we can revisit once enough growing-season data accumulates (~Aug 2026). + +Two feature sets are trained side by side: + + Model A — forecast-grade + Features: IMS weather only (ghi, air_temp, rh, wind) + Use case: day-ahead forecasting (no on-site data needed at inference) + + Model B — full + Features: Model A + 2026 canopy state (leaf_temp, NDVI, PRI, PSRI, + soil_moisture_shallow, soil_temp_shallow) + Use case: nowcasting / control-loop input + +Excluded from both: + par_umol_derived, vpd_kpa_derived, cwsi_proxy — these feed the Farquhar + equation that generates the label, so including them reduces ML to + reverse-engineering. The whole point of Stage-2 ML is to predict A from + signals the Farquhar inputs are derived from. + +Honest expectation: with 964 daytime rows and a 2-day hold-out, both models +will likely look very good on this hold-out (the test conditions are close +to training) and the contrast between A and B may not be statistically +meaningful. Treat numbers as directional. + +Usage:: + + python -m scripts.train_2026_photosynthesis + python -m scripts.train_2026_photosynthesis --holdout-days 2 +""" + +from __future__ import annotations + +import argparse +import pickle +import sys +from datetime import datetime, timezone +from pathlib import Path + +import numpy as np +import pandas as pd + +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(_PROJECT_ROOT)) + +_PARQUET = _PROJECT_ROOT / "Data" / "2026" / "sensor_history.parquet" +_OUT_PKL = _PROJECT_ROOT / "Data" / "2026" / "photosynthesis_model.pkl" + +_TARGET = "a_farquhar_umol" +_FEATURES_A = ["ghi_w_m2", "air_temperature_c", "rh_percent", "wind_speed_ms"] +_FEATURES_B = _FEATURES_A + [ + "leaf_temperature", "ndvi", "pri", "psri", + "soil_moisture_shallow_pct", "soil_temp_shallow_c", +] + + +def _load_daytime() -> pd.DataFrame: + if not _PARQUET.exists(): + raise FileNotFoundError( + f"{_PARQUET} not found. Run scripts.collect_2026_training_data first." + ) + df = pd.read_parquet(_PARQUET) + # Daytime only — A is 0 at night by construction, includes those would + # inflate R² without testing model skill. + df = df[df["ghi_w_m2"] > 50].copy() + df = df.dropna(subset=_FEATURES_B + [_TARGET]) + df = df.sort_index() + return df + + +def _train_and_eval(name: str, X_tr, y_tr, X_te, y_te, model): + from sklearn.metrics import mean_absolute_error, r2_score + model.fit(X_tr, y_tr) + pred_tr = model.predict(X_tr) + pred_te = model.predict(X_te) + mae_tr = mean_absolute_error(y_tr, pred_tr) + mae_te = mean_absolute_error(y_te, pred_te) + r2_tr = r2_score(y_tr, pred_tr) + r2_te = r2_score(y_te, pred_te) + print(f" {name:<22} MAE train={mae_tr:.3f} test={mae_te:.3f} " + f"R² train={r2_tr:.3f} test={r2_te:.3f}") + return model, mae_te, r2_te + + +def main() -> None: + p = argparse.ArgumentParser(description="Train an exploratory 2026 PS model.") + p.add_argument("--holdout-days", type=int, default=2) + args = p.parse_args() + + from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor + from sklearn.linear_model import LinearRegression + + df = _load_daytime() + print(f"Loaded {len(df):,} daytime rows " + f"{df.index.min()} → {df.index.max()}") + + # Temporal split — last N days as hold-out + split = df.index.max() - pd.Timedelta(days=args.holdout_days) + train = df[df.index < split] + test = df[df.index >= split] + print(f"Train: {len(train):,} rows Hold-out: {len(test):,} rows " + f"(split at {split})") + if len(test) < 50: + raise RuntimeError("Hold-out window too small — collect more days first.") + + y_tr = train[_TARGET].to_numpy() + y_te = test[_TARGET].to_numpy() + + naive_mean = float(y_tr.mean()) + naive_mae = float(np.abs(y_te - naive_mean).mean()) + print(f"\nNaive 'predict training-mean' baseline: MAE = {naive_mae:.3f} " + f"(model has to beat this to be useful)") + + results: dict[str, dict] = {} + + for set_name, feats in [("A_ims_only", _FEATURES_A), ("B_ims+canopy", _FEATURES_B)]: + print(f"\n=== Feature set {set_name} ({len(feats)} features) ===") + print(f" features: {feats}") + X_tr = train[feats].to_numpy() + X_te = test[feats].to_numpy() + + lr, lr_mae, lr_r2 = _train_and_eval("LinearRegression", X_tr, y_tr, X_te, y_te, + LinearRegression()) + rf, rf_mae, rf_r2 = _train_and_eval("RandomForest", X_tr, y_tr, X_te, y_te, + RandomForestRegressor( + n_estimators=300, + max_depth=8, + min_samples_leaf=4, + random_state=42, + n_jobs=-1, + )) + gbr, gbr_mae, gbr_r2 = _train_and_eval("GradientBoosting", X_tr, y_tr, X_te, y_te, + GradientBoostingRegressor( + n_estimators=300, + max_depth=4, + learning_rate=0.05, + random_state=42, + )) + + # Feature importances from RF (most interpretable) + imp = pd.Series(rf.feature_importances_, index=feats).sort_values(ascending=False) + print(" RF feature importances:") + for k, v in imp.items(): + print(f" {k:<28} {v:.3f}") + + results[set_name] = { + "features": feats, + "lr": {"model": lr, "mae": lr_mae, "r2": lr_r2}, + "rf": {"model": rf, "mae": rf_mae, "r2": rf_r2}, + "gbr": {"model": gbr, "mae": gbr_mae, "r2": gbr_r2}, + "feature_importances": imp.to_dict(), + } + + # ---------- Summary ---------- + print("\n=== Summary (hold-out MAE / R²) ===") + print(f" Naive baseline MAE = {naive_mae:.3f}") + for set_name, r in results.items(): + for mname in ("lr", "rf", "gbr"): + d = r[mname] + print(f" {set_name:<14} {mname:<4} MAE = {d['mae']:.3f} R² = {d['r2']:.3f}") + + # Save the best Model B variant for downstream consumption. + best_b = min(("lr", "rf", "gbr"), key=lambda m: results["B_ims+canopy"][m]["mae"]) + bundle = { + "model_a_features": _FEATURES_A, + "model_a_rf": results["A_ims_only"]["rf"]["model"], + "model_b_features": _FEATURES_B, + "model_b_best": results["B_ims+canopy"][best_b]["model"], + "model_b_best_name": best_b, + "test_mae_b": results["B_ims+canopy"][best_b]["mae"], + "test_r2_b": results["B_ims+canopy"][best_b]["r2"], + "test_mae_a": results["A_ims_only"]["rf"]["mae"], + "naive_mae": naive_mae, + "train_rows": int(len(train)), + "test_rows": int(len(test)), + "train_range": (str(train.index.min()), str(train.index.max())), + "test_range": (str(test.index.min()), str(test.index.max())), + "trained_at": datetime.now(tz=timezone.utc).isoformat(), + "schema": "2026", + "source": str(_PARQUET.relative_to(_PROJECT_ROOT)), + "feature_importances_b": results["B_ims+canopy"]["rf"]["feature_importances"], + } + _OUT_PKL.parent.mkdir(parents=True, exist_ok=True) + with open(_OUT_PKL, "wb") as f: + pickle.dump(bundle, f) + print(f"\nSaved bundle → {_OUT_PKL}") + + +if __name__ == "__main__": + main() diff --git a/scripts/train_energy_predictor.py b/scripts/train_energy_predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..64109b5aae231d8f317c909c2e61fc88eeeea10b --- /dev/null +++ b/scripts/train_energy_predictor.py @@ -0,0 +1,174 @@ +"""Train the EnergyPredictor (XGBoost + LR fallback) from +``Data/energy_weather_merged.csv`` and write the bundle to +``Data/energy_predictor_model.pkl``. + +The bundle schema matches what ``src/energy_predictor.py:EnergyPredictor.__init__`` +loads with pickle: + - xgb_model : fitted xgboost.XGBRegressor + - xgb_features : list of feature column names + - lr_fallback : fitted sklearn.linear_model.LinearRegression + - lr_features : list of feature column names + - test_mape_pct, test_mae_kwh, train_rows, test_rows, trained_at, source + +Temporal hold-out: last ``--holdout-days`` of the merged CSV (default 14). + +Usage: + python -m scripts.train_energy_predictor + python -m scripts.train_energy_predictor --holdout-days 21 +""" + +from __future__ import annotations + +import argparse +import pickle +import sys +from datetime import datetime, timezone +from pathlib import Path + +import numpy as np +import pandas as pd + +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(_PROJECT_ROOT)) + +_DATA_CSV = _PROJECT_ROOT / "Data" / "energy_weather_merged.csv" +_OUT_PKL = _PROJECT_ROOT / "Data" / "energy_predictor_model.pkl" + +# Features must match what EnergyPredictor.predict_hourly constructs at inference. +# Tracker features were trialed but worsened the May hold-out bias from +50% +# to +75% because the training distribution (Dec-Apr, avg tracker -15°) is +# operationally different from the hold-out (May, avg tracker -51° due to +# active shading interventions). Reverted until 2026 growing-season data +# accumulates — see 2026-bigml-tracker-feature in context/3_todo.md. +_XGB_FEATURES = ["GSR", "airTemperature", "sin_elevation", "hour", "clearness", "windSpeed"] +_LR_FEATURES = ["GSR", "airTemperature"] +_TARGET = "production_kwh" + + +def _load() -> pd.DataFrame: + if not _DATA_CSV.exists(): + raise FileNotFoundError( + f"{_DATA_CSV} not found. Run scripts.refresh_energy_data first." + ) + df = pd.read_csv(_DATA_CSV) + df["timestamp_utc"] = pd.to_datetime(df["timestamp_utc"], utc=True) + df = df.set_index("timestamp_utc").sort_index() + + # Derived helper kept for future re-enabling of tracker features. + if "tracker_angle_mean" in df.columns: + df["abs_tracker_angle"] = df["tracker_angle_mean"].abs() + + needed = set(_XGB_FEATURES) | {_TARGET} + missing = needed - set(df.columns) + if missing: + raise ValueError(f"Merged CSV is missing columns: {sorted(missing)}") + df = df.dropna(subset=list(needed)) + return df + + +def _mape(y_true: np.ndarray, y_pred: np.ndarray, floor_kwh: float = 1.0) -> float: + """Mean absolute percentage error, excluding hours below `floor_kwh` + (nighttime / very low production where small absolute errors blow up %).""" + mask = y_true >= floor_kwh + if not mask.any(): + return float("nan") + return float(np.mean(np.abs(y_pred[mask] - y_true[mask]) / y_true[mask]) * 100) + + +def main() -> None: + p = argparse.ArgumentParser(description="Train the EnergyPredictor.") + p.add_argument("--holdout-days", type=int, default=14, + help="Last N days held out for validation (default 14).") + p.add_argument("--n-estimators", type=int, default=400) + p.add_argument("--max-depth", type=int, default=6) + p.add_argument("--learning-rate", type=float, default=0.05) + args = p.parse_args() + + from sklearn.ensemble import GradientBoostingRegressor + from sklearn.linear_model import LinearRegression + from sklearn.metrics import mean_absolute_error + + # XGBoost requires libomp on macOS which isn't installed in this venv; + # GradientBoostingRegressor has the same fit/predict API and is bundled + # into the same `xgb_model` slot for backward compatibility with + # EnergyPredictor.__init__. + + df = _load() + print(f"Loaded {len(df):,} hourly rows {df.index.min()} → {df.index.max()}") + + split = df.index.max() - pd.Timedelta(days=args.holdout_days) + train_df = df.loc[df.index < split] + test_df = df.loc[df.index >= split] + print(f"Train: {len(train_df):,} rows Hold-out: {len(test_df):,} rows " + f"(split at {split})") + + if len(test_df) < 24: + raise RuntimeError("Hold-out window too small. Increase --holdout-days " + "or refresh more recent data.") + + # ---------- Gradient Boosting (stored under xgb_model slot) ---------- + xgb = GradientBoostingRegressor( + n_estimators=args.n_estimators, + max_depth=args.max_depth, + learning_rate=args.learning_rate, + random_state=42, + ) + xgb.fit(train_df[_XGB_FEATURES], train_df[_TARGET]) + pred_test = np.clip(xgb.predict(test_df[_XGB_FEATURES]), 0, None) + + mae_xgb = mean_absolute_error(test_df[_TARGET], pred_test) + mape_xgb = _mape(test_df[_TARGET].to_numpy(), pred_test) + + # ---------- Linear fallback ---------- + lr = LinearRegression() + lr.fit(train_df[_LR_FEATURES], train_df[_TARGET]) + pred_test_lr = np.clip(lr.predict(test_df[_LR_FEATURES]), 0, None) + mae_lr = mean_absolute_error(test_df[_TARGET], pred_test_lr) + mape_lr = _mape(test_df[_TARGET].to_numpy(), pred_test_lr) + + print("\n=== Hold-out validation ===") + print(f" XGBoost MAE = {mae_xgb:.3f} kWh MAPE (>1 kWh) = {mape_xgb:.2f}%") + print(f" Linear MAE = {mae_lr:.3f} kWh MAPE (>1 kWh) = {mape_lr:.2f}%") + + # Sanity: daily totals (filter days where actual is <10 kWh — likely partial) + test_daily = test_df.assign(pred=pred_test).resample("1D").agg( + actual_kwh=(_TARGET, "sum"), + predicted_kwh=("pred", "sum"), + ) + test_daily = test_daily[test_daily["actual_kwh"] >= 10] + test_daily["err_pct"] = ( + (test_daily["predicted_kwh"] - test_daily["actual_kwh"]) / test_daily["actual_kwh"] * 100 + ) + print("\n=== Daily hold-out (XGBoost, actual ≥ 10 kWh) ===") + print(test_daily.round(1).to_string()) + if len(test_daily) > 0: + mean_abs_err = float(test_daily["err_pct"].abs().mean()) + mean_signed_err = float(test_daily["err_pct"].mean()) + print(f"\nMean abs daily error: {mean_abs_err:.1f}% " + f"(signed: {mean_signed_err:+.1f}% — positive = over-prediction)") + else: + mean_abs_err = mean_signed_err = float("nan") + + bundle = { + "xgb_model": xgb, + "xgb_features": _XGB_FEATURES, + "lr_fallback": lr, + "lr_features": _LR_FEATURES, + "test_mape_pct": round(mape_xgb, 3), + "test_mae_kwh": round(mae_xgb, 3), + "daily_mae_pct": (round(mean_abs_err, 1) if mean_abs_err == mean_abs_err else None), + "daily_signed_err_pct": (round(mean_signed_err, 1) if mean_signed_err == mean_signed_err else None), + "train_rows": int(len(train_df)), + "test_rows": int(len(test_df)), + "train_range": (str(train_df.index.min()), str(train_df.index.max())), + "test_range": (str(test_df.index.min()), str(test_df.index.max())), + "trained_at": datetime.now(tz=timezone.utc).isoformat(), + "source": str(_DATA_CSV.relative_to(_PROJECT_ROOT)), + } + with open(_OUT_PKL, "wb") as f: + pickle.dump(bundle, f) + print(f"\nSaved bundle → {_OUT_PKL}") + + +if __name__ == "__main__": + main() diff --git a/scripts/validate_control_system.py b/scripts/validate_control_system.py new file mode 100644 index 0000000000000000000000000000000000000000..1a21a02e97116d4dd021c188e38fa2e88caf008b --- /dev/null +++ b/scripts/validate_control_system.py @@ -0,0 +1,451 @@ +#!/usr/bin/env python3 +""" +Validate control system invariants against simulation results. + +Three invariants: + 1. validate-budget: cumulative sacrifice never exceeds max_energy_reduction_pct + 2. validate-gates: no interventions in no-shade windows (May, mornings, low stress) + 3. validate-dose: average intervention offset < 10°, top canopy > 70% sunlit + +Usage +----- + # Validate existing simulation log + python scripts/validate_control_system.py --log Data/simulation_logs/sim_2025-07-01_2025-07-07.json + + # Run a fresh simulation and validate + python scripts/validate_control_system.py --start 2025-07-01 --end 2025-07-07 + + # Verbose output + python scripts/validate_control_system.py --log -v +""" + +from __future__ import annotations + +import argparse +import json +import logging +import sys +from datetime import date, datetime +from pathlib import Path +from typing import Optional + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from config.settings import ( + MAX_ENERGY_REDUCTION_PCT, + NO_SHADE_BEFORE_HOUR, + NO_SHADE_MONTHS, + SEMILLON_TRANSITION_TEMP_C, + SHADE_ELIGIBLE_GHI_ABOVE, +) + +logger = logging.getLogger("validate") + + +# --------------------------------------------------------------------------- +# Validation results +# --------------------------------------------------------------------------- + +class ValidationResult: + """Tracks pass/fail for a single invariant.""" + + def __init__(self, name: str, description: str): + self.name = name + self.description = description + self.passed = True + self.violations: list[str] = [] + self.stats: dict = {} + + def fail(self, message: str) -> None: + self.passed = False + self.violations.append(message) + + def report(self) -> str: + status = "PASS" if self.passed else "FAIL" + lines = [f"[{status}] {self.name}: {self.description}"] + for k, v in self.stats.items(): + lines.append(f" {k}: {v}") + if self.violations: + lines.append(f" Violations ({len(self.violations)}):") + for v in self.violations[:20]: + lines.append(f" - {v}") + if len(self.violations) > 20: + lines.append(f" ... and {len(self.violations) - 20} more") + return "\n".join(lines) + + +# --------------------------------------------------------------------------- +# Invariant 1: Budget ceiling +# --------------------------------------------------------------------------- + +def validate_budget(results: list[dict]) -> ValidationResult: + """Verify cumulative energy sacrifice never exceeds the annual ceiling.""" + vr = ValidationResult( + "validate-budget", + f"Cumulative sacrifice <= {MAX_ENERGY_REDUCTION_PCT}% of annual potential", + ) + + # Compute annual potential (simplified — same as EnergyBudgetPlanner analytical) + from src.energy_budget import EnergyBudgetPlanner + planner = EnergyBudgetPlanner() + + # Get the year from results + years = set() + for r in results: + ts = r.get("timestamp", "") + if isinstance(ts, str) and len(ts) >= 4: + try: + years.add(int(ts[:4])) + except ValueError: + pass + if not years: + vr.fail("No valid timestamps in results") + return vr + + for year in sorted(years): + annual = planner.compute_annual_plan(year) + total_potential = annual["total_potential_kWh"] + total_budget = annual["total_budget_kWh"] + + # Sum actual energy costs from results for this year + year_results = [ + r for r in results + if r.get("timestamp", "").startswith(str(year)) + ] + cumulative = 0.0 + peak_cumulative = 0.0 + peak_slot = "" + + for r in year_results: + cost = r.get("energy_cost_kwh", 0) or 0 + # Only count slots where an offset was actually applied (not overridden) + if r.get("live_override"): + continue + offset = r.get("plan_offset_deg", 0) or 0 + if offset > 0: + cumulative += cost + if cumulative > peak_cumulative: + peak_cumulative = cumulative + peak_slot = r.get("timestamp", "?") + + pct_used = (cumulative / total_potential * 100) if total_potential > 0 else 0 + + vr.stats[f"{year}_potential_kWh"] = f"{total_potential:.2f}" + vr.stats[f"{year}_budget_kWh"] = f"{total_budget:.2f}" + vr.stats[f"{year}_spent_kWh"] = f"{cumulative:.4f}" + vr.stats[f"{year}_pct_used"] = f"{pct_used:.3f}%" + vr.stats[f"{year}_peak_at"] = peak_slot + + if cumulative > total_budget: + vr.fail( + f"{year}: spent {cumulative:.4f} kWh > budget {total_budget:.2f} kWh " + f"({pct_used:.2f}% > {MAX_ENERGY_REDUCTION_PCT}%)" + ) + + return vr + + +# --------------------------------------------------------------------------- +# Invariant 2: No-shade windows +# --------------------------------------------------------------------------- + +def validate_gates(results: list[dict]) -> ValidationResult: + """Verify no interventions occur in prohibited windows.""" + vr = ValidationResult( + "validate-gates", + "No interventions in May, before 10:00, or when temp < transition / GHI < threshold", + ) + + total_interventions = 0 + may_violations = 0 + morning_violations = 0 + temp_violations = 0 + ghi_violations = 0 + + for r in results: + offset = r.get("plan_offset_deg", 0) or 0 + if offset <= 0: + continue + # This slot has a planned intervention — was it actually applied? + if r.get("live_override"): + continue # override blocked it, that's correct + + total_interventions += 1 + ts = r.get("timestamp", "") + + # Parse timestamp + try: + if isinstance(ts, str): + dt = datetime.fromisoformat(ts) + else: + dt = ts + except (ValueError, TypeError): + continue + + month = dt.month + hour = dt.hour + + # Check: no interventions in May + if month in NO_SHADE_MONTHS: + may_violations += 1 + vr.fail(f"May intervention at {ts}: offset={offset}°") + + # Check: no interventions before 10:00 + if hour < NO_SHADE_BEFORE_HOUR: + morning_violations += 1 + vr.fail(f"Morning intervention at {ts} (hour={hour}): offset={offset}°") + + # Check: temperature below transition + temp = r.get("air_temp_c") + if temp is not None and temp < SEMILLON_TRANSITION_TEMP_C: + temp_violations += 1 + vr.fail( + f"Low-temp intervention at {ts}: temp={temp:.1f}°C < " + f"{SEMILLON_TRANSITION_TEMP_C}°C, offset={offset}°" + ) + + # Check: GHI below threshold + ghi = r.get("ghi_w_m2") + if ghi is not None and ghi < SHADE_ELIGIBLE_GHI_ABOVE: + ghi_violations += 1 + vr.fail( + f"Low-GHI intervention at {ts}: GHI={ghi:.0f} < " + f"{SHADE_ELIGIBLE_GHI_ABOVE}, offset={offset}°" + ) + + vr.stats["total_interventions"] = total_interventions + vr.stats["may_violations"] = may_violations + vr.stats["morning_violations"] = morning_violations + vr.stats["temp_violations"] = temp_violations + vr.stats["ghi_violations"] = ghi_violations + + return vr + + +# --------------------------------------------------------------------------- +# Invariant 3: Dose limits +# --------------------------------------------------------------------------- + +def validate_dose(results: list[dict]) -> ValidationResult: + """Verify intervention offsets are minimal (average < 10°).""" + vr = ValidationResult( + "validate-dose", + "Average intervention offset < 10°; interventions are minimum-dose", + ) + + offsets = [] + for r in results: + offset = r.get("plan_offset_deg", 0) or 0 + if offset > 0 and not r.get("live_override"): + offsets.append(offset) + + if not offsets: + vr.stats["intervention_count"] = 0 + vr.stats["note"] = "No interventions to validate" + return vr + + avg_offset = sum(offsets) / len(offsets) + max_offset = max(offsets) + total_slots = len(results) + intervention_rate = len(offsets) / total_slots * 100 if total_slots > 0 else 0 + + vr.stats["intervention_count"] = len(offsets) + vr.stats["intervention_rate"] = f"{intervention_rate:.1f}%" + vr.stats["avg_offset_deg"] = f"{avg_offset:.1f}°" + vr.stats["max_offset_deg"] = f"{max_offset:.0f}°" + vr.stats["median_offset_deg"] = f"{sorted(offsets)[len(offsets)//2]:.0f}°" + + # Offset distribution + brackets = [(0, 5), (5, 10), (10, 15), (15, 20), (20, 60)] + for lo, hi in brackets: + count = sum(1 for o in offsets if lo < o <= hi) + vr.stats[f"offsets_{lo}-{hi}deg"] = count + + if avg_offset >= 10.0: + vr.fail( + f"Average offset {avg_offset:.1f}° >= 10° limit " + f"(should be minimum-dose interventions)" + ) + + if max_offset > 20: + vr.fail( + f"Max offset {max_offset:.0f}° > 20° " + f"(unusually large for minimum-dose strategy)" + ) + + # Check intervention rate isn't too high (should be rare) + if intervention_rate > 30: + vr.fail( + f"Intervention rate {intervention_rate:.1f}% > 30% " + f"(interventions should be rare, not the norm)" + ) + + return vr + + +# --------------------------------------------------------------------------- +# Runner +# --------------------------------------------------------------------------- + +def load_results(log_path: Path) -> list[dict]: + """Load simulation results from JSON.""" + with open(log_path) as f: + return json.load(f) + + +def run_simulation(start: date, end: date) -> list[dict]: + """Run a fresh simulation and return results.""" + from scripts.run_control_simulation import ControlSimulation + sim = ControlSimulation(start, end) + return sim.run() + + +def main(): + parser = argparse.ArgumentParser( + description="Validate control system invariants." + ) + parser.add_argument( + "--log", type=str, default=None, + help="Path to existing simulation log JSON", + ) + parser.add_argument( + "--start", type=str, default="2025-07-01", + help="Start date for fresh simulation (if no --log)", + ) + parser.add_argument( + "--end", type=str, default="2025-07-07", + help="End date for fresh simulation (if no --log)", + ) + parser.add_argument( + "--verbose", "-v", action="store_true", + help="Enable debug logging", + ) + args = parser.parse_args() + + level = logging.DEBUG if args.verbose else logging.INFO + logging.basicConfig( + level=level, + format="%(asctime)s %(name)-15s %(levelname)-7s %(message)s", + datefmt="%H:%M:%S", + ) + + # Load or generate results + if args.log: + log_path = Path(args.log) + if not log_path.exists(): + print(f"Error: log file not found: {log_path}") + sys.exit(1) + print(f"Loading results from: {log_path}") + results = load_results(log_path) + else: + start = date.fromisoformat(args.start) + end = date.fromisoformat(args.end) + print(f"Running simulation: {start} → {end}") + results = run_simulation(start, end) + + print(f"\nValidating {len(results)} tick results...\n") + + # Run all three validations + validations = [ + validate_budget(results), + validate_gates(results), + validate_dose(results), + ] + + all_passed = True + for v in validations: + print(v.report()) + print() + if not v.passed: + all_passed = False + + # Summary + n_pass = sum(1 for v in validations if v.passed) + n_fail = sum(1 for v in validations if not v.passed) + print(f"{'='*60}") + print(f"Results: {n_pass} passed, {n_fail} failed out of {len(validations)}") + print(f"{'='*60}") + + sys.exit(0 if all_passed else 1) + + +def selftest(): + """Run validators against synthetic data with deliberate violations.""" + print("Running self-test with synthetic violations...\n") + + # Synthetic tick: May intervention (gate violation) + may_tick = { + "timestamp": "2025-05-15T12:00:00+00:00", + "slot_index": 48, + "plan_offset_deg": 10.0, + "live_override": False, + "air_temp_c": 35.0, + "ghi_w_m2": 800.0, + "energy_cost_kwh": 0.5, + } + # Morning intervention (gate violation) + morning_tick = { + "timestamp": "2025-07-10T07:00:00+00:00", + "slot_index": 28, + "plan_offset_deg": 5.0, + "live_override": False, + "air_temp_c": 32.0, + "ghi_w_m2": 500.0, + "energy_cost_kwh": 0.1, + } + # Cold-temp intervention (gate violation) + cold_tick = { + "timestamp": "2025-07-10T13:00:00+00:00", + "slot_index": 52, + "plan_offset_deg": 8.0, + "live_override": False, + "air_temp_c": 22.0, + "ghi_w_m2": 700.0, + "energy_cost_kwh": 0.2, + } + # Large-offset intervention (dose violation) + big_tick = { + "timestamp": "2025-07-10T14:00:00+00:00", + "slot_index": 56, + "plan_offset_deg": 25.0, + "live_override": False, + "air_temp_c": 38.0, + "ghi_w_m2": 900.0, + "energy_cost_kwh": 1.0, + } + # Normal valid tick (no offset) + normal_tick = { + "timestamp": "2025-07-10T11:00:00+00:00", + "slot_index": 44, + "plan_offset_deg": 0.0, + "live_override": False, + "air_temp_c": 33.0, + "ghi_w_m2": 800.0, + "energy_cost_kwh": 0.0, + } + + test_results = [may_tick, morning_tick, cold_tick, big_tick, normal_tick] + + v_gates = validate_gates(test_results) + assert not v_gates.passed, "validate-gates should FAIL on synthetic data" + assert v_gates.stats["may_violations"] == 1 + assert v_gates.stats["morning_violations"] == 1 + assert v_gates.stats["temp_violations"] == 1 + print(f" validate-gates: correctly caught {len(v_gates.violations)} violations") + + v_dose = validate_dose(test_results) + assert not v_dose.passed, "validate-dose should FAIL (avg > 10° and max > 20°)" + print(f" validate-dose: correctly caught {len(v_dose.violations)} violations") + + v_budget = validate_budget(test_results) + assert v_budget.passed, "validate-budget should PASS (small amounts)" + print(f" validate-budget: correctly passed (small spend)") + + print("\nSelf-test PASSED: all validators correctly detect violations.\n") + + +if __name__ == "__main__": + if "--selftest" in sys.argv: + selftest() + else: + main() diff --git a/scripts/verify_control_system.py b/scripts/verify_control_system.py new file mode 100644 index 0000000000000000000000000000000000000000..e53daa03526f007c5e68ee27651cacc2d615d297 --- /dev/null +++ b/scripts/verify_control_system.py @@ -0,0 +1,853 @@ +#!/usr/bin/env python3 +""" +SolarWine Control System Verification Script +============================================= + +10-step manual verification comparing DayAheadPlanner output +against actual tracker behavior from ThingsBoard over the last N days. + +Steps: + 1. Pull actual tracker angles from ThingsBoard + 2. Pull actual energy production from Plant asset + 3. Pull historical IMS weather (or use TB ambient sensor) + 4. Run DayAheadPlanner for each day (with real weather as "perfect forecast") + 5. Compute astronomical tracking angles for comparison + 6. Compare planned angles vs actual angles (MAE, max deviation) + 7. Validate InterventionGate decisions against conditions + 8. Verify energy budget compliance + 9. Cross-validate FvCB model outputs + 10. Generate summary report / scorecard + +Usage +----- + # Default: last 10 days + python scripts/verify_control_system.py + + # Custom range + python scripts/verify_control_system.py --days 7 + + # Save detailed JSON report + python scripts/verify_control_system.py --output Data/verification_report.json +""" + +from __future__ import annotations + +import json +import logging +import math +import os +import sys +from datetime import date, datetime, timedelta, timezone +from pathlib import Path + +import numpy as np +import pandas as pd + +# Ensure project root is importable +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from config.settings import ( + CANDIDATE_OFFSETS, + NO_SHADE_BEFORE_HOUR, + SEMILLON_TRANSITION_TEMP_C, + SHADE_ELIGIBLE_GHI_ABOVE, + SHADE_ELIGIBLE_TLEAF_ABOVE, + SITE_LATITUDE, + SITE_LONGITUDE, + SYSTEM_CAPACITY_KW, + TRACKER_ID_MAP, +) + +logger = logging.getLogger("verification") + + +# --------------------------------------------------------------------------- +# ThingsBoard connection +# --------------------------------------------------------------------------- + +def get_tb_client(): + """Create a ThingsBoard client with prod credentials.""" + from src.data.thingsboard_client import ThingsBoardClient, ThingsBoardConfig + + config = ThingsBoardConfig( + host=os.environ.get("THINGSBOARD_HOST", "https://web.seymouragri.com/"), + username=os.environ.get("THINGSBOARD_USERNAME"), + password=os.environ.get("THINGSBOARD_PASSWORD"), + ) + return ThingsBoardClient(config) + + +# --------------------------------------------------------------------------- +# Step 1: Pull actual tracker angles +# --------------------------------------------------------------------------- + +def step1_tracker_angles(tb, start: datetime, end: datetime) -> dict[str, pd.DataFrame]: + """Fetch tracker angle timeseries for all 4 trackers.""" + print("\n[Step 1] Pulling actual tracker angles from ThingsBoard...") + tracker_data = {} + for tid, tname in TRACKER_ID_MAP.items(): + try: + df = tb.get_timeseries( + tname, ["angle"], start, end, + limit=10000, agg="NONE", + ) + if not df.empty: + tracker_data[tname] = df + print(f" {tname}: {len(df)} records, " + f"angle range [{df['angle'].min():.1f}, {df['angle'].max():.1f}]°") + else: + print(f" {tname}: no data") + except Exception as e: + print(f" {tname}: ERROR - {e}") + return tracker_data + + +# --------------------------------------------------------------------------- +# Step 2: Pull actual energy production +# --------------------------------------------------------------------------- + +def step2_energy_production(tb, start: datetime, end: datetime) -> pd.DataFrame: + """Fetch Plant asset energy production.""" + print("\n[Step 2] Pulling actual energy production from Plant asset...") + try: + df = tb.get_asset_timeseries( + "Plant", ["production"], + start, end, + limit=10000, + interval_ms=3_600_000, # hourly aggregation + agg="SUM", + ) + if not df.empty: + # production is in Wh, convert to kWh + daily = df.resample("D").sum() / 1000.0 + for idx, row in daily.iterrows(): + print(f" {idx.strftime('%Y-%m-%d')}: {row.get('production', 0):.1f} kWh") + else: + print(" No energy data available") + return df + except Exception as e: + print(f" ERROR: {e}") + return pd.DataFrame() + + +# --------------------------------------------------------------------------- +# Step 3: Pull historical weather (IMS or TB ambient sensor) +# --------------------------------------------------------------------------- + +def step3_weather_data(tb, start: datetime, end: datetime) -> pd.DataFrame: + """Fetch weather data from Air1 ambient sensor (temp, PAR for GHI proxy).""" + print("\n[Step 3] Pulling weather data from Air1 (ambient sensor)...") + keys = ["airTemperature", "PAR", "windSpeed"] + try: + df = tb.get_timeseries("Air1", keys, start, end, limit=10000, agg="NONE") + if not df.empty: + # Resample to 15-min + df = df.resample("15min").mean() + print(f" {len(df)} records (15-min resampled)") + if "airTemperature" in df.columns: + temps = df["airTemperature"].dropna() + if len(temps): + print(f" Temperature: {temps.min():.1f}–{temps.max():.1f}°C " + f"(mean {temps.mean():.1f}°C)") + if "PAR" in df.columns: + par = df["PAR"].dropna() + if len(par): + # PAR (µmol/m²/s) → GHI proxy: GHI ≈ PAR / 2.1 + print(f" PAR: {par.min():.0f}–{par.max():.0f} µmol/m²/s " + f"(GHI proxy: {par.max()/2.1:.0f} W/m²)") + else: + print(" No weather data from Air1") + return df + except Exception as e: + print(f" ERROR: {e}") + return pd.DataFrame() + + +# --------------------------------------------------------------------------- +# Step 4: Run DayAheadPlanner for each day +# --------------------------------------------------------------------------- + +def step4_run_planner(weather_df: pd.DataFrame, start_date: date, end_date: date) -> dict[str, dict]: + """Run DayAheadPlanner for each day using real weather as forecast.""" + print("\n[Step 4] Running DayAheadPlanner for each day...") + from src.day_ahead_planner import DayAheadPlanner + from src.energy_budget import EnergyBudgetPlanner + + planner = DayAheadPlanner() + budget_planner = EnergyBudgetPlanner() + + # Get annual plan for budget allocation + year = start_date.year + try: + annual = budget_planner.compute_annual_plan(year) + month_budget = annual.get("monthly_budgets", {}) + except Exception: + month_budget = {} + + plans = {} + current = start_date + while current <= end_date: + day_str = str(current) + + # Extract 96 temperature and GHI values for this day + day_start = pd.Timestamp(current, tz="UTC") + day_end = day_start + pd.Timedelta(hours=24) - pd.Timedelta(minutes=15) + day_times = pd.date_range(day_start, periods=96, freq="15min") + + temps = [25.0] * 96 + ghis = [0.0] * 96 + + if not weather_df.empty: + day_weather = weather_df.loc[ + (weather_df.index >= day_start) & (weather_df.index < day_start + pd.Timedelta(days=1)) + ] + for i, ts in enumerate(day_times): + # Find closest weather record + if len(day_weather) > 0: + idx = day_weather.index.get_indexer([ts], method="nearest")[0] + if idx >= 0 and idx < len(day_weather): + row = day_weather.iloc[idx] + if "airTemperature" in row and pd.notna(row["airTemperature"]): + temps[i] = float(row["airTemperature"]) + if "PAR" in row and pd.notna(row["PAR"]): + # PAR → GHI proxy + ghis[i] = float(row["PAR"]) / 2.1 + + # Daily budget: use monthly allocation / 30 as simple estimate + month = current.month + monthly_kwh = month_budget.get(month, 0.5) + import calendar + days_in_month = calendar.monthrange(current.year, current.month)[1] + daily_budget = monthly_kwh / days_in_month if monthly_kwh > 0 else 0.5 + + try: + plan = planner.plan_day( + target_date=current, + forecast_temps=temps, + forecast_ghi=ghis, + daily_budget_kwh=daily_budget, + ) + plans[day_str] = plan.to_dict() + n_interv = plan.n_intervention_slots + print(f" {day_str}: {len(plan.slots)} slots, " + f"{n_interv} interventions, " + f"cost {plan.total_energy_cost_kwh:.4f}/{daily_budget:.4f} kWh " + f"({plan.budget_utilisation_pct:.1f}%)") + except Exception as e: + print(f" {day_str}: PLANNER ERROR - {e}") + plans[day_str] = {"error": str(e)} + + current += timedelta(days=1) + + return plans + + +# --------------------------------------------------------------------------- +# Step 5: Compute astronomical tracking angles +# --------------------------------------------------------------------------- + +def step5_astronomical_angles(start_date: date, end_date: date) -> pd.DataFrame: + """Compute expected astronomical tracking angles for each 15-min slot.""" + print("\n[Step 5] Computing astronomical tracking angles...") + from src.shading.solar_geometry import ShadowModel + + shadow = ShadowModel() + records = [] + + current = start_date + while current <= end_date: + day_start = pd.Timestamp(current, tz="UTC") + times = pd.date_range(day_start, periods=96, freq="15min") + solar_pos = shadow.get_solar_position(times) + + for i, ts in enumerate(times): + elev = float(solar_pos.iloc[i]["solar_elevation"]) + azim = float(solar_pos.iloc[i]["solar_azimuth"]) + + if elev > 2: + tracker = shadow.compute_tracker_tilt(azim, elev) + astro_angle = float(tracker["tracker_theta"]) + else: + astro_angle = 0.0 # night — stowed + + records.append({ + "timestamp": ts, + "date": str(current), + "solar_elevation": elev, + "solar_azimuth": azim, + "astro_angle": astro_angle, + }) + + current += timedelta(days=1) + + df = pd.DataFrame(records).set_index("timestamp") + daylight = df[df["solar_elevation"] > 2] + print(f" {len(daylight)} daylight slots computed") + if len(daylight): + print(f" Astro angle range: [{daylight['astro_angle'].min():.1f}, " + f"{daylight['astro_angle'].max():.1f}]°") + return df + + +# --------------------------------------------------------------------------- +# Step 6: Compare planned vs actual angles +# --------------------------------------------------------------------------- + +def step6_compare_angles( + plans: dict, + tracker_data: dict[str, pd.DataFrame], + astro_df: pd.DataFrame, +) -> pd.DataFrame: + """Compare planned offsets + astronomical angles against actual tracker angles.""" + print("\n[Step 6] Comparing planned vs actual tracker angles...") + + if not tracker_data: + print(" No tracker data available — skipping comparison") + return pd.DataFrame() + + # Use first available tracker for comparison + tracker_name = next(iter(tracker_data)) + actual_df = tracker_data[tracker_name].copy() + print(f" Using {tracker_name} for comparison ({len(actual_df)} records)") + + comparisons = [] + for day_str, plan in plans.items(): + if "error" in plan: + continue + slots = plan.get("slots", []) + for slot in slots: + time_str = slot["time"] + offset = slot["offset_deg"] + + # Build timestamp + ts = pd.Timestamp(f"{day_str} {time_str}", tz="UTC") + + # Get astronomical angle + if ts in astro_df.index: + astro = astro_df.loc[ts, "astro_angle"] + else: + # Find nearest + idx = astro_df.index.get_indexer([ts], method="nearest")[0] + astro = astro_df.iloc[idx]["astro_angle"] if idx >= 0 else 0.0 + + planned_angle = astro + offset + + # Find nearest actual angle + actual_angle = None + if not actual_df.empty and "angle" in actual_df.columns: + nearest_idx = actual_df.index.get_indexer([ts], method="nearest") + if nearest_idx[0] >= 0: + actual_row = actual_df.iloc[nearest_idx[0]] + time_diff = abs((actual_df.index[nearest_idx[0]] - ts).total_seconds()) + if time_diff < 1800: # within 30 min + actual_angle = float(actual_row["angle"]) + + comparisons.append({ + "timestamp": ts, + "date": day_str, + "time": time_str, + "astro_angle": astro, + "planned_offset": offset, + "planned_angle": planned_angle, + "actual_angle": actual_angle, + "gate_passed": slot["gate_passed"], + "deviation": abs(planned_angle - actual_angle) if actual_angle is not None else None, + }) + + comp_df = pd.DataFrame(comparisons) + if comp_df.empty: + print(" No comparison data generated") + return comp_df + + valid = comp_df.dropna(subset=["deviation"]) + if len(valid): + mae = valid["deviation"].mean() + max_dev = valid["deviation"].max() + within_2 = (valid["deviation"] <= 2.0).sum() + print(f" Matched records: {len(valid)}") + print(f" Mean Absolute Error: {mae:.2f}°") + print(f" Max deviation: {max_dev:.2f}°") + print(f" Within ±2° tolerance: {within_2}/{len(valid)} " + f"({within_2/len(valid)*100:.0f}%)") + + # Per-day breakdown + print(f"\n {'Date':<12} {'Slots':>6} {'MAE':>7} {'MaxDev':>7} {'Within2°':>9}") + for day, grp in valid.groupby("date"): + d_mae = grp["deviation"].mean() + d_max = grp["deviation"].max() + d_ok = (grp["deviation"] <= 2.0).sum() + print(f" {day:<12} {len(grp):>6} {d_mae:>6.2f}° {d_max:>6.2f}° " + f"{d_ok:>4}/{len(grp):<4}") + else: + print(" No matched actual vs planned angle data") + + return comp_df + + +# --------------------------------------------------------------------------- +# Step 7: Validate InterventionGate decisions +# --------------------------------------------------------------------------- + +def step7_validate_gate(plans: dict, weather_df: pd.DataFrame) -> list[dict]: + """Check gate decisions against weather conditions.""" + print("\n[Step 7] Validating InterventionGate decisions...") + violations = [] + + for day_str, plan in plans.items(): + if "error" in plan: + continue + + for slot in plan.get("slots", []): + time_str = slot["time"] + offset = slot["offset_deg"] + gate = slot["gate_passed"] + tags = slot.get("tags", []) + + ts = pd.Timestamp(f"{day_str} {time_str}", tz="UTC") + hour = ts.hour + ts.minute / 60.0 + + # Get weather at this slot + temp_c = None + ghi = None + if not weather_df.empty: + idx = weather_df.index.get_indexer([ts], method="nearest") + if idx[0] >= 0: + row = weather_df.iloc[idx[0]] + time_diff = abs((weather_df.index[idx[0]] - ts).total_seconds()) + if time_diff < 1800: + temp_c = row.get("airTemperature") + par = row.get("PAR") + if par is not None and pd.notna(par): + ghi = par / 2.1 + if temp_c is not None and pd.notna(temp_c): + temp_c = float(temp_c) + + # Check violations + if gate and offset > 0: + # Intervention was allowed — verify conditions + if hour < NO_SHADE_BEFORE_HOUR: + violations.append({ + "date": day_str, "time": time_str, + "type": "SHADE_BEFORE_10", + "detail": f"Shading at {hour:.1f}h (before {NO_SHADE_BEFORE_HOUR}:00)", + "severity": "CRITICAL", + }) + if temp_c is not None and temp_c < SHADE_ELIGIBLE_TLEAF_ABOVE: + violations.append({ + "date": day_str, "time": time_str, + "type": "SHADE_BELOW_TEMP", + "detail": f"Shading at {temp_c:.1f}°C (threshold: {SHADE_ELIGIBLE_TLEAF_ABOVE}°C)", + "severity": "WARNING", + }) + if ghi is not None and ghi < SHADE_ELIGIBLE_GHI_ABOVE: + violations.append({ + "date": day_str, "time": time_str, + "type": "SHADE_LOW_GHI", + "detail": f"Shading at GHI {ghi:.0f} W/m² (threshold: {SHADE_ELIGIBLE_GHI_ABOVE})", + "severity": "WARNING", + }) + + elif not gate and offset == 0: + # Gate blocked — verify it SHOULD have been blocked + if temp_c is not None and temp_c >= SHADE_ELIGIBLE_TLEAF_ABOVE and \ + ghi is not None and ghi >= SHADE_ELIGIBLE_GHI_ABOVE and \ + hour >= NO_SHADE_BEFORE_HOUR: + # Conditions seem favorable but gate blocked — might be CWSI + # Not necessarily a violation (CWSI proxy could block) + pass + + if violations: + critical = [v for v in violations if v["severity"] == "CRITICAL"] + warnings = [v for v in violations if v["severity"] == "WARNING"] + print(f" {len(critical)} CRITICAL violations, {len(warnings)} warnings") + for v in critical: + print(f" !! {v['date']} {v['time']}: {v['detail']}") + for v in warnings[:5]: + print(f" ? {v['date']} {v['time']}: {v['detail']}") + if len(warnings) > 5: + print(f" ... and {len(warnings) - 5} more warnings") + else: + print(" No gate violations found — all decisions are consistent") + + return violations + + +# --------------------------------------------------------------------------- +# Step 8: Verify energy budget compliance +# --------------------------------------------------------------------------- + +def step8_budget_compliance(plans: dict) -> list[dict]: + """Check that no plan exceeds its daily budget.""" + print("\n[Step 8] Verifying energy budget compliance...") + results = [] + + for day_str, plan in plans.items(): + if "error" in plan: + continue + + budget = plan.get("daily_budget_kwh", 0) + cost = plan.get("total_energy_cost_kwh", 0) + util = plan.get("budget_utilisation_pct", 0) + exceeded = cost > budget + + result = { + "date": day_str, + "budget_kwh": budget, + "cost_kwh": cost, + "utilisation_pct": util, + "exceeded": exceeded, + } + results.append(result) + + if exceeded: + print(f" !! {day_str}: BUDGET EXCEEDED — cost {cost:.4f} > budget {budget:.4f} kWh") + + if results: + total_budget = sum(r["budget_kwh"] for r in results) + total_cost = sum(r["cost_kwh"] for r in results) + any_exceeded = any(r["exceeded"] for r in results) + print(f" Total budget: {total_budget:.4f} kWh, total cost: {total_cost:.4f} kWh " + f"({total_cost/total_budget*100:.1f}%)" if total_budget > 0 else " No budget data") + if not any_exceeded: + print(" All days within budget — PASS") + return results + + +# --------------------------------------------------------------------------- +# Step 9: Cross-validate FvCB model +# --------------------------------------------------------------------------- + +def step9_fvcb_validation(weather_df: pd.DataFrame) -> list[dict]: + """Run FvCB model on available weather data and check consistency.""" + print("\n[Step 9] Cross-validating FvCB model outputs...") + + try: + from src.models.farquhar_model import FarquharModel + except ImportError: + try: + from src.farquhar_model import FarquharModel + except ImportError: + print(" FarquharModel not importable — skipping") + return [] + + model = FarquharModel() + results = [] + + if weather_df.empty: + print(" No weather data for FvCB validation") + return results + + # Sample some daylight records + daylight = weather_df.between_time("05:00", "17:00") + if daylight.empty: + # Timestamps are UTC — Sde Boker is UTC+2/+3, so daylight is ~03:00–15:00 UTC + daylight = weather_df[ + (weather_df.index.hour >= 4) & (weather_df.index.hour <= 16) + ] + + sample = daylight.dropna(subset=["airTemperature"]).head(50) + + for ts, row in sample.iterrows(): + temp = float(row["airTemperature"]) + par = float(row.get("PAR", 500)) if pd.notna(row.get("PAR")) else 500.0 + + try: + result = model.calc_photosynthesis_semillon( + PAR=par, + Tleaf=temp, + CO2=400.0, + VPD=2.0, + Tair=temp, + ) + if isinstance(result, tuple) and len(result) >= 3: + A, limiting, shading_helps = result[0], result[1], result[2] + else: + A = result + limiting = "unknown" + shading_helps = temp >= SEMILLON_TRANSITION_TEMP_C + + # Consistency checks + issues = [] + if A < 0: + issues.append("negative_A") + if A > 40: + issues.append("A_too_high") + if temp < SEMILLON_TRANSITION_TEMP_C and shading_helps: + issues.append("shading_helps_below_transition") + if temp >= SEMILLON_TRANSITION_TEMP_C and not shading_helps and limiting == "rubisco": + issues.append("rubisco_limited_but_shading_not_helpful") + + results.append({ + "timestamp": str(ts), + "temp_c": temp, + "par": par, + "A": round(A, 2), + "limiting": str(limiting), + "shading_helps": bool(shading_helps), + "issues": issues, + }) + except Exception as e: + results.append({ + "timestamp": str(ts), + "temp_c": temp, + "par": par, + "error": str(e), + }) + + valid = [r for r in results if "error" not in r] + issues_found = [r for r in valid if r.get("issues")] + + if valid: + a_values = [r["A"] for r in valid] + print(f" {len(valid)} slots evaluated") + print(f" A range: {min(a_values):.2f}–{max(a_values):.2f} µmol/m²/s " + f"(mean {sum(a_values)/len(a_values):.2f})") + + shading_count = sum(1 for r in valid if r["shading_helps"]) + print(f" Shading helps: {shading_count}/{len(valid)} slots") + + if issues_found: + print(f" {len(issues_found)} consistency issues found:") + for r in issues_found[:5]: + print(f" {r['timestamp']}: {r['issues']} " + f"(T={r['temp_c']:.1f}°C, A={r['A']:.2f})") + else: + print(" No FvCB consistency issues — PASS") + + errors = [r for r in results if "error" in r] + if errors: + print(f" {len(errors)} FvCB computation errors") + for r in errors[:3]: + print(f" {r['timestamp']}: {r['error']}") + + return results + + +# --------------------------------------------------------------------------- +# Step 10: Summary scorecard +# --------------------------------------------------------------------------- + +def step10_scorecard( + plans: dict, + comp_df: pd.DataFrame, + violations: list[dict], + budget_results: list[dict], + fvcb_results: list[dict], + tracker_data: dict, + energy_df: pd.DataFrame, +) -> dict: + """Generate and print the final verification scorecard.""" + print("\n" + "=" * 70) + print(" VERIFICATION SCORECARD") + print("=" * 70) + + scorecard = { + "generated_at": datetime.now(timezone.utc).isoformat(), + "days_analyzed": len(plans), + "checks": {}, + } + + # 1. Data availability + has_trackers = bool(tracker_data) + has_energy = not energy_df.empty + has_plans = any("error" not in p for p in plans.values()) + print(f"\n Data Availability:") + print(f" Tracker telemetry: {'YES' if has_trackers else 'NO'}") + print(f" Energy production: {'YES' if has_energy else 'NO'}") + print(f" Planner output: {'YES' if has_plans else 'NO'}") + scorecard["checks"]["data_availability"] = { + "trackers": has_trackers, "energy": has_energy, "plans": has_plans, + } + + # 2. Angle alignment + if not comp_df.empty: + valid = comp_df.dropna(subset=["deviation"]) + if len(valid): + mae = valid["deviation"].mean() + within_2 = (valid["deviation"] <= 2.0).mean() * 100 + status = "PASS" if mae < 5.0 else "WARN" if mae < 15.0 else "FAIL" + print(f"\n Angle Alignment ({status}):") + print(f" MAE: {mae:.2f}°") + print(f" Within ±2° tolerance: {within_2:.0f}%") + scorecard["checks"]["angle_alignment"] = { + "status": status, "mae_deg": round(mae, 2), + "within_tolerance_pct": round(within_2, 1), + } + + # 3. Gate compliance + critical = [v for v in violations if v["severity"] == "CRITICAL"] + warnings = [v for v in violations if v["severity"] == "WARNING"] + gate_status = "PASS" if not critical else "FAIL" + print(f"\n Gate Compliance ({gate_status}):") + print(f" Critical violations: {len(critical)}") + print(f" Warnings: {len(warnings)}") + scorecard["checks"]["gate_compliance"] = { + "status": gate_status, + "critical": len(critical), + "warnings": len(warnings), + } + + # 4. Budget compliance + exceeded = [r for r in budget_results if r.get("exceeded")] + budget_status = "PASS" if not exceeded else "FAIL" + print(f"\n Budget Compliance ({budget_status}):") + print(f" Days exceeding budget: {len(exceeded)}/{len(budget_results)}") + if budget_results: + total_cost = sum(r["cost_kwh"] for r in budget_results) + total_budget = sum(r["budget_kwh"] for r in budget_results) + print(f" Total spend: {total_cost:.4f} / {total_budget:.4f} kWh") + scorecard["checks"]["budget_compliance"] = { + "status": budget_status, "days_exceeded": len(exceeded), + } + + # 5. FvCB consistency + fvcb_issues = [r for r in fvcb_results if r.get("issues")] + fvcb_errors = [r for r in fvcb_results if "error" in r] + fvcb_status = "PASS" if not fvcb_issues and not fvcb_errors else "WARN" if not fvcb_errors else "FAIL" + print(f"\n FvCB Model ({fvcb_status}):") + print(f" Consistency issues: {len(fvcb_issues)}") + print(f" Computation errors: {len(fvcb_errors)}") + scorecard["checks"]["fvcb_model"] = { + "status": fvcb_status, + "issues": len(fvcb_issues), + "errors": len(fvcb_errors), + } + + # 6. Overall + all_statuses = [c.get("status", "PASS") for c in scorecard["checks"].values() if isinstance(c, dict)] + if "FAIL" in all_statuses: + overall = "FAIL" + elif "WARN" in all_statuses: + overall = "WARN" + else: + overall = "PASS" + + print(f"\n {'=' * 40}") + print(f" OVERALL: {overall}") + print(f" {'=' * 40}") + scorecard["overall"] = overall + + return scorecard + + +# --------------------------------------------------------------------------- +# Per-day scorecard table +# --------------------------------------------------------------------------- + +def print_daily_table(plans, comp_df, violations, budget_results): + """Print the per-day scorecard table from Step 10.""" + print("\n Per-Day Scorecard:") + print(f" {'Date':<12} {'Interv':>7} {'Budget%':>8} {'MAE°':>6} " + f"{'GateViol':>9} {'Status':>8}") + print(f" {'-'*60}") + + days = sorted(plans.keys()) + for day in days: + plan = plans[day] + if "error" in plan: + print(f" {day:<12} {'ERROR':>7}") + continue + + n_interv = plan.get("n_intervention_slots", 0) + util = plan.get("budget_utilisation_pct", 0) + + # MAE for this day + if not comp_df.empty: + day_comp = comp_df[comp_df["date"] == day].dropna(subset=["deviation"]) + mae = day_comp["deviation"].mean() if len(day_comp) else float("nan") + else: + mae = float("nan") + + # Gate violations for this day + day_viol = [v for v in violations if v["date"] == day and v["severity"] == "CRITICAL"] + + status = "PASS" + if day_viol: + status = "FAIL" + elif mae > 10: + status = "WARN" + + mae_str = f"{mae:.1f}" if not math.isnan(mae) else "N/A" + print(f" {day:<12} {n_interv:>7} {util:>7.1f}% {mae_str:>6} " + f"{len(day_viol):>9} {status:>8}") + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +def main(): + import argparse + + parser = argparse.ArgumentParser(description="SolarWine control system verification") + parser.add_argument("--days", type=int, default=10, help="Number of days to verify (default: 10)") + parser.add_argument("--output", type=str, help="Save JSON report to this path") + parser.add_argument("--verbose", "-v", action="store_true") + args = parser.parse_args() + + level = logging.DEBUG if args.verbose else logging.INFO + logging.basicConfig( + level=level, + format="%(asctime)s %(name)-15s %(levelname)-7s %(message)s", + datefmt="%H:%M:%S", + ) + + end_date = date.today() - timedelta(days=1) # yesterday + start_date = end_date - timedelta(days=args.days - 1) + + print("=" * 70) + print(f" SolarWine Control System Verification") + print(f" Period: {start_date} → {end_date} ({args.days} days)") + print("=" * 70) + + # Connect to ThingsBoard + tb = get_tb_client() + + start_dt = datetime(start_date.year, start_date.month, start_date.day, tzinfo=timezone.utc) + end_dt = datetime(end_date.year, end_date.month, end_date.day, 23, 59, 59, tzinfo=timezone.utc) + + # Steps 1-3: Data collection + tracker_data = step1_tracker_angles(tb, start_dt, end_dt) + energy_df = step2_energy_production(tb, start_dt, end_dt) + weather_df = step3_weather_data(tb, start_dt, end_dt) + + # Steps 4-5: Planning & astronomy + plans = step4_run_planner(weather_df, start_date, end_date) + astro_df = step5_astronomical_angles(start_date, end_date) + + # Steps 6-9: Analysis + comp_df = step6_compare_angles(plans, tracker_data, astro_df) + violations = step7_validate_gate(plans, weather_df) + budget_results = step8_budget_compliance(plans) + fvcb_results = step9_fvcb_validation(weather_df) + + # Step 10: Final scorecard + scorecard = step10_scorecard( + plans, comp_df, violations, budget_results, fvcb_results, + tracker_data, energy_df, + ) + print_daily_table(plans, comp_df, violations, budget_results) + + # Save report + if args.output: + report = { + "scorecard": scorecard, + "plans": plans, + "violations": violations, + "budget_results": budget_results, + "fvcb_results": fvcb_results, + "comparison_summary": { + "total_records": len(comp_df) if not comp_df.empty else 0, + "matched_records": len(comp_df.dropna(subset=["deviation"])) if not comp_df.empty else 0, + }, + } + Path(args.output).parent.mkdir(parents=True, exist_ok=True) + with open(args.output, "w") as f: + json.dump(report, f, indent=2, default=str) + print(f"\nDetailed report saved to: {args.output}") + + print("\nVerification complete.") + + +if __name__ == "__main__": + main() diff --git a/src/data/thingsboard_client.py b/src/data/thingsboard_client.py index b7a2cd4510b31f8b30702b317b5d9cf8264e8e14..5776c1472d76f6c7cd8c20c55bd40d71ae961bbe 100644 --- a/src/data/thingsboard_client.py +++ b/src/data/thingsboard_client.py @@ -2,22 +2,28 @@ ThingsBoardClient: live telemetry client for the Seymour vineyard at web.seymouragri.com. -Device layout -------------- -TREATMENT area (rows 501–502, under solar panels): - Air2, Air3, Air4 — microclimate sensors under the panels - Crop3, Crop5, Crop6, Crop7 — fruiting-zone crop sensors (per panel position) - Soil1, Soil3, Soil5, Soil6 — root-zone soil probes - Irrigation1 — irrigation flow/volume/quality logger - Thermocouples-1 — panel surface temperature (4 positions) - -REFERENCE area (rows 503–504, open sky, no panels): - Crop1, Crop2, Crop4 — fruiting-zone crop sensors (no shading) - Soil2, Soil4, Soil7, Soil9 — root-zone soil probes - Thermocouples-2 — structural/ambient thermocouple reference - -AMBIENT (site-level outdoor baseline): - Air1 — outdoor climate station (above canopy, no panel) +2026 device layout (clean replacement of the 2024-25 sensor fleet) +------------------------------------------------------------------ +TREATMENT area — rows 501 / 502 / 503 / 504 / 509, under solar panels. +Each row hosts one or more Crop_2Soil sensors at cardinal positions +(north / south / east / center). Per-device payload: dual soil profile +(shallow + deep), leaf temp, IR ambient, NDVI, 17-band spectrometer, +17 vegetation indices, 32-point ToF canopy distance grid. + +REFERENCE area — row 202, open sky (no panels). Mirrors treatment with +~7 Crop_2Soil sensors carrying the same payload. + +PANEL SURFACE TEMPERATURE — 12 four-channel thermocouple devices +(Thermocouples1-12) attached to panels (installation in progress; +only a subset are active at any time). + +TRACKERS — 4 controllers (Tracker501/502/503/509) carrying angle + mode +telemetry, addressable via shared attributes (setAngle/setMode). + +PLANT ASSET — "Yeruham Vineyard" carries plant-level energy (power, production). + +AMBIENT — there is no longer an on-site outdoor station; ambient weather +comes from the IMS Sde Boker station 43 client (see ``ims_client.py``). Credentials (env vars or .env): THINGSBOARD_HOST — default https://web.seymouragri.com @@ -62,100 +68,143 @@ class DeviceInfo: area: VineArea row: Optional[int] label: str + position: Optional[str] = None # "north", "south", "center", "south-east", etc. -#: Full device registry mapping short name → DeviceInfo. -#: UUIDs are from devices.csv in the Research/PV_Vine_Tradeoff repository. +#: 2026 device registry mapping short name → DeviceInfo. +#: Source: TB prod entity groups "Crop 2Soil 2026" and "Thermocouples 2026" +#: (discovered 2026-05-18). The 2024-25 fleet (Air1-4, Crop1-7, Soil1-9, +#: Irrigation1, Thermocouples1-2) was decommissioned in the 2026 refresh. DEVICE_REGISTRY: Dict[str, DeviceInfo] = { - "Air1": DeviceInfo( - uuid="373041f0-089a-11ef-9126-b746c27d34bd", device_id=4, - area=VineArea.AMBIENT, row=None, label="Outdoor Climate (ambient baseline)", - ), - "Air2": DeviceInfo( - uuid="37bf89a0-089a-11ef-9126-b746c27d34bd", device_id=5, - area=VineArea.TREATMENT, row=501, label="Indoor Climate Row 501 (under panels)", + # ---------- Crop_2Soil — TREATMENT (rows 501/502/503/504/509) ---------- + "Crop_2Soil11": DeviceInfo( + uuid="a4cfc5c0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=501, label="501 north", position="north", ), - "Air3": DeviceInfo( - uuid="3860aba0-089a-11ef-9126-b746c27d34bd", device_id=6, - area=VineArea.TREATMENT, row=502, label="Indoor Climate Row 502 (under panels)", + "Crop_2Soil8": DeviceInfo( + uuid="933b7f70-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=501, label="501 south", position="south", ), - "Air4": DeviceInfo( - uuid="04452660-7114-11ef-9360-f1ed9d9dc643", device_id=7, - area=VineArea.TREATMENT, row=502, label="Treatment Row 502 North (under panels)", + "Crop_2Soil1": DeviceInfo( + uuid="38437e20-2b63-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=502, label="502 north", position="north", ), - "Crop1": DeviceInfo( - uuid="39224df0-089a-11ef-9126-b746c27d34bd", device_id=8, - area=VineArea.REFERENCE, row=503, label="Reference crop Row 503", + "Crop_2Soil17": DeviceInfo( + uuid="d232bae0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=502, label="502 south", position="south", ), - "Crop2": DeviceInfo( - uuid="aa0d9970-7113-11ef-9360-f1ed9d9dc643", device_id=9, - area=VineArea.REFERENCE, row=503, label="Control crop Row 503", + "Crop_2Soil6": DeviceInfo( + uuid="8766eef0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=502, label="502 south-east", position="south-east", ), - "Crop3": DeviceInfo( - uuid="859b3ce0-29dd-11f0-96bc-55874793181d", device_id=10, - area=VineArea.TREATMENT, row=502, label="Treatment 502 – West Bottom", + "Crop_2Soil13": DeviceInfo( # currently inactive + uuid="bafcce10-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=503, label="503", position=None, ), - "Crop4": DeviceInfo( - uuid="889765e0-29dd-11f0-96bc-55874793181d", device_id=11, - area=VineArea.REFERENCE, row=502, label="Control crop Row 502 (reference vine)", + "Crop_2Soil7": DeviceInfo( + uuid="8d965680-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=504, label="504 north", position="north", ), - "Crop5": DeviceInfo( - uuid="8b092930-29dd-11f0-96bc-55874793181d", device_id=12, - area=VineArea.TREATMENT, row=502, label="Treatment 502 – East Upper", + "Crop_2Soil19": DeviceInfo( + uuid="dde80390-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=504, label="504 center", position="center", ), - "Crop6": DeviceInfo( - uuid="8cce31c0-29dd-11f0-96bc-55874793181d", device_id=13, - area=VineArea.TREATMENT, row=502, label="Treatment 502 – East Bottom", + "Crop_2Soil20": DeviceInfo( + uuid="e44b2550-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=504, label="504 center-east", position="center-east", ), - "Crop7": DeviceInfo( - uuid="8e7440a0-29dd-11f0-96bc-55874793181d", device_id=14, - area=VineArea.TREATMENT, row=502, label="Treatment 502 – West Upper", + "Crop_2Soil9": DeviceInfo( + uuid="9908c9d0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=509, label="509 south", position="south", ), - "Soil1": DeviceInfo( - uuid="3586b0a0-089a-11ef-9126-b746c27d34bd", device_id=16, - area=VineArea.TREATMENT, row=502, label="Soil Row 502 (treatment)", + # ---------- Crop_2Soil — REFERENCE (row 202, open sky) ---------- + "Crop_2Soil4": DeviceInfo( + uuid="7bea6980-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 north (ref)", position="north", ), - "Soil2": DeviceInfo( - uuid="35cda4b0-089a-11ef-9126-b746c27d34bd", device_id=17, - area=VineArea.REFERENCE, row=503, label="Soil Row 503 (reference)", + "Crop_2Soil3": DeviceInfo( + uuid="7362e120-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 north", position="north", ), - "Soil3": DeviceInfo( - uuid="3634caf0-089a-11ef-9126-b746c27d34bd", device_id=18, - area=VineArea.TREATMENT, row=501, label="Soil Row 501 (treatment)", + "Crop_2Soil18": DeviceInfo( + uuid="d7b8ea20-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 north-east", position="north-east", ), - "Soil4": DeviceInfo( - uuid="36a4cad0-089a-11ef-9126-b746c27d34bd", device_id=19, - area=VineArea.REFERENCE, row=504, label="Soil Row 504 Control", + "Crop_2Soil2": DeviceInfo( # currently inactive + uuid="79a26ac0-2b63-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 center (ref)", position="center", ), - "Soil5": DeviceInfo( - uuid="77d55280-70e7-11ef-9360-f1ed9d9dc643", device_id=20, - area=VineArea.TREATMENT, row=502, label="Treatment Row 502 South", + "Crop_2Soil5": DeviceInfo( + uuid="81a95c00-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 center", position="center", ), - "Soil6": DeviceInfo( - uuid="7e4e4630-70e7-11ef-9360-f1ed9d9dc643", device_id=21, - area=VineArea.TREATMENT, row=502, label="Treatment Row 502 North", + "Crop_2Soil14": DeviceInfo( + uuid="c05cd7b0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 south", position="south", ), - "Soil7": DeviceInfo( - uuid="842e5540-70e7-11ef-9360-f1ed9d9dc643", device_id=22, - area=VineArea.REFERENCE, row=504, label="Control 504 South", + "Crop_2Soil10": DeviceInfo( + uuid="9f4047b0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.REFERENCE, row=202, label="202 south (ref)", position="south", ), - "Soil9": DeviceInfo( - uuid="91e44ff0-70e7-11ef-9360-f1ed9d9dc643", device_id=23, - area=VineArea.REFERENCE, row=504, label="Control 504 South (2nd probe)", + # Unlabeled / unallocated (kept for completeness; currently inactive) + "Crop_2Soil12": DeviceInfo( + uuid="aa114ae0-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=None, label="unallocated", ), - "Irrigation1": DeviceInfo( - uuid="3a066c60-089a-11ef-9126-b746c27d34bd", device_id=15, - area=VineArea.TREATMENT, row=502, label="Irrigation Row 502", + "Crop_2Soil15": DeviceInfo( + uuid="c6574c90-2b64-11f1-b902-5ff1ea8c4cf9", device_id=0, + area=VineArea.TREATMENT, row=None, label="unallocated", ), + # ---------- Thermocouples — panel surface temps (installation in progress) ---------- "Thermocouples1": DeviceInfo( - uuid="72ce88f0-c548-11ef-8bc2-fdab9f3349b7", device_id=2, - area=VineArea.TREATMENT, row=502, label="Panel surface temps Treatment 502", + uuid="d172ffe0-4fac-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 1", ), "Thermocouples2": DeviceInfo( - uuid="03e40ba0-cc0e-11ef-a2e9-55874793181d", device_id=3, - area=VineArea.REFERENCE, row=None, label="Panel/structure surface temps Reference", + uuid="e0d87f50-4fac-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 2", + ), + "Thermocouples3": DeviceInfo( + uuid="e737d080-4fac-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 3", + ), + "Thermocouples4": DeviceInfo( + uuid="ed4901b0-4fac-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 4", + ), + "Thermocouples5": DeviceInfo( + uuid="f3f07f70-4fac-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 5", + ), + "Thermocouples6": DeviceInfo( + uuid="faa591c0-4fac-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 6", + ), + "Thermocouples7": DeviceInfo( + uuid="0095a660-4fad-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 7", ), - # Tracker controllers (panel angle + mode) + "Thermocouples8": DeviceInfo( + uuid="07168950-4fad-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 8", + ), + "Thermocouples9": DeviceInfo( + uuid="0e69fe80-4fad-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 9", + ), + "Thermocouples10": DeviceInfo( + uuid="14e36760-4fad-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 10", + ), + "Thermocouples11": DeviceInfo( + uuid="1b513780-4fad-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 11", + ), + "Thermocouples12": DeviceInfo( + uuid="2121dd40-4fad-11f1-829c-09d61d29d108", device_id=0, + area=VineArea.TREATMENT, row=None, label="Panel surface thermocouples 12", + ), + # ---------- Tracker controllers (panel angle + mode) ---------- "Tracker501": DeviceInfo( uuid="aac06e50-f769-11f0-b902-5ff1ea8c4cf9", device_id=0, area=VineArea.TREATMENT, row=501, label="Tracker row 501", @@ -174,6 +223,23 @@ DEVICE_REGISTRY: Dict[str, DeviceInfo] = { ), } + +# Convenience subsets — derived once at import time. +CROP_2SOIL_DEVICES: List[str] = [ + n for n, d in DEVICE_REGISTRY.items() if n.startswith("Crop_2Soil") +] +THERMOCOUPLE_DEVICES: List[str] = [ + n for n in DEVICE_REGISTRY if n.startswith("Thermocouples") +] +TREATMENT_DEVICES: List[str] = [ + n for n, d in DEVICE_REGISTRY.items() + if d.area == VineArea.TREATMENT and n.startswith("Crop_2Soil") and d.row is not None +] +REFERENCE_DEVICES: List[str] = [ + n for n, d in DEVICE_REGISTRY.items() + if d.area == VineArea.REFERENCE and n.startswith("Crop_2Soil") +] + # --------------------------------------------------------------------------- # Asset registry (non-device entities — e.g. the plant-level energy asset) # --------------------------------------------------------------------------- @@ -197,31 +263,30 @@ TRACKER_KEYS: List[str] = ["angle", "manualMode", "setAngle", "setMode"] # Telemetry key sets per device type # --------------------------------------------------------------------------- -AIR_KEYS: List[str] = [ - "airTemperature", "leafTemperature", "VPD", "CO2", "PAR", "DLI", - "airHumidity", "windSpeed", "windAngle", "rain", "airPressure", - "dewTemperature", "NDVI", "PRI", "airLeafDeltaT", -] - -CROP_KEYS: List[str] = [ - "PAR", "leafTemperature", "NDVI", "PRI", "DLI", "PARAvg1H", "PARAvg24H", -] - -SOIL_KEYS: List[str] = [ - "soilMoisture", "soilMoisture2", - "soilTemperature", "soilTemperature2", - "soilBulkEC", "soilpH", -] - -IRRIGATION_KEYS: List[str] = [ - "irrigationVolume", "irrigationMinutes", "irrigationFlowRate", - "irrigationEC", "irrigationPH", "waterTemperature", - "irrigationCycleVolume", "irrigationCycleMinutes", +# Core subset of the 2026 Crop_2Soil 118-key payload — chosen to keep VineSnapshot +# size sane while covering every field downstream code reads. Extend as needed. +CROP_2SOIL_KEYS: List[str] = [ + # canopy / leaf + "leafTemperature", "ambientTemperatureIRT", "NDVI", "leafWetnessErr", + # soil profile 1 (shallow) + "soilTemperature", "soilDielectric", "soilBulkEC", + "soilMoisture", "soilPoreWaterEC", + # soil profile 2 (deep) + "soilTemperature2", "soilDielectric2", "soilBulkEC2", + "soilMoisture2", "soilPoreWaterEC2", + # vegetation indices (subset surfaced via VineSnapshot) + "PRI", "PSRI", "SIPI", "GCI", "LCI", + # UV stress proxy + "DUVI", + # health + "batteryPercentage", "rssi", ] +# 4 thermocouple channels per device; "internalTemperature_n" is the cold-junction reference. THERMOCOUPLE_KEYS: List[str] = [ "thermocoupleTemperature_1", "thermocoupleTemperature_2", "thermocoupleTemperature_3", "thermocoupleTemperature_4", + "batteryPercentage", "rssi", ] @@ -232,164 +297,179 @@ THERMOCOUPLE_KEYS: List[str] = [ @dataclass class VineSnapshot: """ - Aggregated real-time vine state from all ThingsBoard sensors. + Aggregated real-time vine state from the 2026 ThingsBoard fleet. Fields are grouped by area: - - ambient : Air1 (outdoor climate, site-level baseline) - - treatment : under solar panels (rows 501–502) - - reference : open sky / no panels (rows 503–504) + - ambient : reserved (None — sourced from IMS, not from TB) + - treatment : under solar panels (rows 501/502/503/504/509) + - reference : open sky / no panels (row 202) - None means the sensor did not return a value. + None means no sensor returned a value (or no sensor exists for that field). """ snapshot_ts: datetime staleness_minutes: float - # --- Ambient (Air1, outdoor baseline) --- + # --- Ambient (reserved — sourced from IMS Sde Boker, not TB) --- ambient_temp_c: Optional[float] = None ambient_humidity_pct: Optional[float] = None ambient_wind_speed_ms: Optional[float] = None ambient_wind_angle_deg: Optional[float] = None ambient_rain_mm: Optional[float] = None - # --- Treatment microclimate (avg of Air2 / Air3 / Air4) --- - treatment_air_temp_c: Optional[float] = None - treatment_leaf_temp_c: Optional[float] = None - treatment_vpd_kpa: Optional[float] = None - treatment_co2_ppm: Optional[float] = None - treatment_par_umol: Optional[float] = None - treatment_dli_mol_m2: Optional[float] = None - treatment_ndvi: Optional[float] = None - treatment_pri: Optional[float] = None - treatment_air_leaf_delta_t: Optional[float] = None + # --- Treatment microclimate (now derived from Crop_2Soil IRT + leaf temp) --- + treatment_air_temp_c: Optional[float] = None # avg ambientTemperatureIRT + treatment_leaf_temp_c: Optional[float] = None # avg leafTemperature + treatment_vpd_kpa: Optional[float] = None # None — no dedicated VPD sensor + treatment_co2_ppm: Optional[float] = None # None — no CO2 sensor in 2026 fleet + treatment_air_leaf_delta_t: Optional[float] = None # derived = leaf - irt - # --- Treatment crop (avg of Crop3 / Crop5 / Crop6 / Crop7) --- - treatment_crop_par_umol: Optional[float] = None - treatment_crop_leaf_temp_c: Optional[float] = None + # --- Treatment crop (avg over treatment Crop_2Soil devices) --- treatment_crop_ndvi: Optional[float] = None - treatment_crop_dli_mol_m2: Optional[float] = None - treatment_crop_par_avg1h: Optional[float] = None - # Per-panel-position readings {position_label: {par, leaf_temp, ndvi}} + treatment_crop_pri: Optional[float] = None + treatment_crop_psri: Optional[float] = None + treatment_crop_sipi: Optional[float] = None + treatment_crop_gci: Optional[float] = None + treatment_crop_lci: Optional[float] = None + treatment_crop_duvi: Optional[float] = None + treatment_leaf_wetness_err: Optional[float] = None + # Per-position readings keyed by "row-position" (e.g. "502-north") treatment_crop_by_position: Dict[str, Dict[str, Optional[float]]] = field(default_factory=dict) - # --- Reference crop (avg of Crop1 / Crop2 / Crop4) --- - reference_crop_par_umol: Optional[float] = None - reference_crop_leaf_temp_c: Optional[float] = None + # --- Reference crop (avg over reference Crop_2Soil devices) --- reference_crop_ndvi: Optional[float] = None - reference_crop_dli_mol_m2: Optional[float] = None + reference_crop_pri: Optional[float] = None + reference_crop_psri: Optional[float] = None + reference_crop_sipi: Optional[float] = None + reference_crop_leaf_temp_c: Optional[float] = None + reference_air_temp_c: Optional[float] = None reference_crop_by_position: Dict[str, Dict[str, Optional[float]]] = field(default_factory=dict) - # --- PAR shading ratio: treatment_crop_par / reference_crop_par --- - par_shading_ratio: Optional[float] = None # <1 = panels are shading - - # --- Treatment soil (avg of Soil1 / Soil3 / Soil5 / Soil6) --- - treatment_soil_moisture_pct: Optional[float] = None - treatment_soil_temp_c: Optional[float] = None - treatment_soil_ec_ds_m: Optional[float] = None - treatment_soil_ph: Optional[float] = None - - # --- Reference soil (avg of Soil2 / Soil4 / Soil7 / Soil9) --- + # --- Index ratios (treatment / reference) — proxy for shading benefit/cost --- + ndvi_ratio: Optional[float] = None # <1 = panels reduce greenness + par_shading_ratio: Optional[float] = None # placeholder — no PAR sensor in 2026 fleet + + # --- Treatment soil (avg over treatment Crop_2Soil; dual profile) --- + treatment_soil_moisture_pct: Optional[float] = None # shallow avg + treatment_soil_moisture_deep_pct: Optional[float] = None # deep avg + treatment_soil_temp_c: Optional[float] = None # shallow avg + treatment_soil_temp_deep_c: Optional[float] = None + treatment_soil_ec_ds_m: Optional[float] = None # bulk EC, shallow + treatment_soil_pore_water_ec: Optional[float] = None # pore water EC, shallow + treatment_soil_pore_water_ec_deep: Optional[float] = None # pore water EC, deep + treatment_soil_ph: Optional[float] = None # None — no pH in 2026 + + # --- Reference soil --- reference_soil_moisture_pct: Optional[float] = None + reference_soil_moisture_deep_pct: Optional[float] = None reference_soil_temp_c: Optional[float] = None + reference_soil_pore_water_ec: Optional[float] = None + reference_soil_pore_water_ec_deep: Optional[float] = None - # --- Irrigation (Irrigation1, row 502 treatment) --- + # --- Irrigation (no dedicated device in 2026 — kept None; see soil moisture trends) --- irrigation_last_volume_l: Optional[float] = None irrigation_last_minutes: Optional[float] = None irrigation_ec: Optional[float] = None irrigation_ph: Optional[float] = None water_temp_c: Optional[float] = None - # --- Panel surface temperatures --- - treatment_panel_temp_c: Optional[float] = None # avg Thermocouples1 positions 1-4 - reference_panel_temp_c: Optional[float] = None # avg Thermocouples2 positions 1-4 + # --- Panel surface temperatures (avg across all active Thermocouples1-12) --- + treatment_panel_temp_c: Optional[float] = None + panel_temp_active_count: int = 0 # how many of the 12 devices reported + reference_panel_temp_c: Optional[float] = None # always None — no reference TC in 2026 + + # --- Compatibility shims for downstream consumers -------------------- + # The 2024-25 schema exposed PAR/DLI fields. The 2026 fleet has no PAR + # sensor; we expose Nones here so consumers don't crash. New deployments + # should consume NDVI/PRI/PSRI directly. + treatment_par_umol: Optional[float] = None + treatment_dli_mol_m2: Optional[float] = None + treatment_ndvi: Optional[float] = None # alias of treatment_crop_ndvi + treatment_pri: Optional[float] = None # alias of treatment_crop_pri + treatment_crop_par_umol: Optional[float] = None + treatment_crop_leaf_temp_c: Optional[float] = None + treatment_crop_dli_mol_m2: Optional[float] = None + treatment_crop_par_avg1h: Optional[float] = None + reference_crop_par_umol: Optional[float] = None + reference_crop_dli_mol_m2: Optional[float] = None def to_advisor_text(self) -> str: """Format snapshot for inclusion in an AI advisory prompt.""" - age = f"{self.staleness_minutes:.0f}" if self.staleness_minutes < 120 else ">{:.0f}".format(self.staleness_minutes) - lines = [f"VINE STATE (ThingsBoard sensors, ~{age} min ago):"] + age = f"{self.staleness_minutes:.0f}" if self.staleness_minutes < 120 else f">{self.staleness_minutes:.0f}" + lines = [f"VINE STATE (ThingsBoard 2026 sensors, ~{age} min ago):"] - lines.append(" TREATMENT area (rows 501-502, under solar panels):") + lines.append(" TREATMENT area (rows 501/502/503/504/509, under solar panels):") if self.treatment_air_temp_c is not None: - lines.append(f" Air temperature: {self.treatment_air_temp_c:.1f} C") + lines.append(f" Air temperature (IRT): {self.treatment_air_temp_c:.1f} C") if self.treatment_leaf_temp_c is not None: - lines.append(f" Leaf temperature: {self.treatment_leaf_temp_c:.1f} C") + lines.append(f" Leaf temperature: {self.treatment_leaf_temp_c:.1f} C") if self.treatment_air_leaf_delta_t is not None: - lines.append(f" Air-leaf delta-T: {self.treatment_air_leaf_delta_t:+.1f} C (proxy for heat stress)") - if self.treatment_vpd_kpa is not None: - lines.append(f" VPD: {self.treatment_vpd_kpa:.2f} kPa") - if self.treatment_co2_ppm is not None: - lines.append(f" CO2: {self.treatment_co2_ppm:.0f} ppm") - if self.treatment_crop_par_umol is not None: - lines.append(f" Fruiting-zone PAR: {self.treatment_crop_par_umol:.0f} umol/m2/s (avg of Crop3/5/6/7)") - if self.treatment_crop_dli_mol_m2 is not None: - lines.append(f" DLI today so far: {self.treatment_crop_dli_mol_m2:.1f} mol/m2/day") + lines.append(f" Leaf-air delta-T: {self.treatment_air_leaf_delta_t:+.1f} C (proxy for heat stress)") if self.treatment_crop_ndvi is not None: - lines.append(f" Canopy NDVI: {self.treatment_crop_ndvi:.3f}") + lines.append(f" NDVI: {self.treatment_crop_ndvi:.3f}") + if self.treatment_crop_pri is not None: + lines.append(f" PRI: {self.treatment_crop_pri:.3f} (light-use efficiency)") + if self.treatment_crop_psri is not None: + lines.append(f" PSRI: {self.treatment_crop_psri:.3f} (senescence)") if self.treatment_soil_moisture_pct is not None: - lines.append(f" Soil moisture: {self.treatment_soil_moisture_pct:.1f}% (avg Soil1/3/5/6)") + line = f" Soil moisture (shallow): {self.treatment_soil_moisture_pct:.1f}%" + if self.treatment_soil_moisture_deep_pct is not None: + line += f" / deep {self.treatment_soil_moisture_deep_pct:.1f}%" + lines.append(line) if self.treatment_soil_temp_c is not None: - lines.append(f" Soil temperature: {self.treatment_soil_temp_c:.1f} C") + lines.append(f" Soil temperature: {self.treatment_soil_temp_c:.1f} C") + if self.treatment_soil_pore_water_ec is not None: + lines.append(f" Soil pore-water EC: {self.treatment_soil_pore_water_ec:.2f} dS/m") if self.treatment_panel_temp_c is not None: - lines.append(f" Panel surface temp: {self.treatment_panel_temp_c:.1f} C") + lines.append( + f" Panel surface temp: {self.treatment_panel_temp_c:.1f} C " + f"({self.panel_temp_active_count}/12 thermocouples)" + ) if self.treatment_crop_by_position: - lines.append(" Per-position PAR (Crop sensors):") + lines.append(" Per-position readings:") for pos, vals in self.treatment_crop_by_position.items(): - par = vals.get("par") - lt = vals.get("leaf_temp") - par_str = f"{par:.0f} umol/m2/s" if par is not None else "N/A" - lt_str = f" | leaf {lt:.1f} C" if lt is not None else "" - lines.append(f" {pos}: PAR {par_str}{lt_str}") + tl = vals.get("leaf_temp") + nv = vals.get("ndvi") + sm = vals.get("soil_moisture") + tl_s = f"leaf {tl:.1f} C" if tl is not None else "leaf N/A" + nv_s = f" | NDVI {nv:.2f}" if nv is not None else "" + sm_s = f" | soil {sm:.1f}%" if sm is not None else "" + lines.append(f" {pos}: {tl_s}{nv_s}{sm_s}") lines.append("") - lines.append(" REFERENCE area (rows 503-504, open sky, no panels):") - if self.reference_crop_par_umol is not None: - lines.append(f" Fruiting-zone PAR: {self.reference_crop_par_umol:.0f} umol/m2/s (avg of Crop1/2/4)") + lines.append(" REFERENCE area (row 202, open sky, no panels):") + if self.reference_air_temp_c is not None: + lines.append(f" Air temperature (IRT): {self.reference_air_temp_c:.1f} C") if self.reference_crop_leaf_temp_c is not None: - lines.append(f" Leaf temperature: {self.reference_crop_leaf_temp_c:.1f} C") + lines.append(f" Leaf temperature: {self.reference_crop_leaf_temp_c:.1f} C") if self.reference_crop_ndvi is not None: - lines.append(f" Canopy NDVI: {self.reference_crop_ndvi:.3f}") + lines.append(f" NDVI: {self.reference_crop_ndvi:.3f}") + if self.reference_crop_pri is not None: + lines.append(f" PRI: {self.reference_crop_pri:.3f}") if self.reference_soil_moisture_pct is not None: - lines.append(f" Soil moisture: {self.reference_soil_moisture_pct:.1f}% (avg Soil2/4/7/9)") + line = f" Soil moisture (shallow): {self.reference_soil_moisture_pct:.1f}%" + if self.reference_soil_moisture_deep_pct is not None: + line += f" / deep {self.reference_soil_moisture_deep_pct:.1f}%" + lines.append(line) + if self.reference_crop_by_position: - lines.append(" Per-position PAR (Crop sensors):") + lines.append(" Per-position readings:") for pos, vals in self.reference_crop_by_position.items(): - par = vals.get("par") - par_str = f"{par:.0f} umol/m2/s" if par is not None else "N/A" - lines.append(f" {pos}: PAR {par_str}") - - if self.par_shading_ratio is not None: - reduction_pct = (1 - self.par_shading_ratio) * 100 + tl = vals.get("leaf_temp") + nv = vals.get("ndvi") + tl_s = f"leaf {tl:.1f} C" if tl is not None else "leaf N/A" + nv_s = f" | NDVI {nv:.2f}" if nv is not None else "" + lines.append(f" {pos}: {tl_s}{nv_s}") + + if self.ndvi_ratio is not None: + reduction_pct = (1 - self.ndvi_ratio) * 100 lines.append("") - lines.append(f" PAR shading ratio (treatment/reference): {self.par_shading_ratio:.2f}" - f" ({reduction_pct:.0f}% reduction by panels)") - - if self.ambient_temp_c is not None: - lines.append("") - lines.append(" AMBIENT (outdoor baseline, Air1):") - lines.append(f" Air temperature: {self.ambient_temp_c:.1f} C") - if self.ambient_wind_speed_ms is not None: - lines.append(f" Wind speed: {self.ambient_wind_speed_ms:.1f} m/s") - if self.ambient_rain_mm is not None and self.ambient_rain_mm > 0: - lines.append(f" Rain: {self.ambient_rain_mm:.1f} mm") - - any_irrigation = any(v is not None for v in [ - self.irrigation_last_volume_l, self.irrigation_last_minutes, - self.irrigation_ec, self.irrigation_ph, - ]) - if any_irrigation: - lines.append("") - lines.append(" IRRIGATION (Irrigation1, row 502):") - if self.irrigation_last_volume_l is not None: - lines.append(f" Last cycle volume: {self.irrigation_last_volume_l:.0f} L") - if self.irrigation_last_minutes is not None: - lines.append(f" Duration: {self.irrigation_last_minutes:.0f} min") - if self.irrigation_ec is not None: - lines.append(f" EC: {self.irrigation_ec:.2f} dS/m") - if self.irrigation_ph is not None: - lines.append(f" pH: {self.irrigation_ph:.1f}") - if self.water_temp_c is not None: - lines.append(f" Water temperature: {self.water_temp_c:.1f} C") + direction = "below" if reduction_pct >= 0 else "above" + lines.append( + f" NDVI ratio (treatment/reference): {self.ndvi_ratio:.2f}" + f" ({abs(reduction_pct):.0f}% {direction} reference)" + ) return "\n".join(lines) @@ -398,24 +478,44 @@ class VineSnapshot: out: Dict[str, Any] = { "snapshot_ts": self.snapshot_ts.isoformat(), "staleness_minutes": round(self.staleness_minutes, 1), + "panel_temp_active_count": self.panel_temp_active_count, } for attr in ( + # ambient (None until IMS bridge wired) "ambient_temp_c", "ambient_humidity_pct", "ambient_wind_speed_ms", "ambient_wind_angle_deg", "ambient_rain_mm", + # treatment air/leaf "treatment_air_temp_c", "treatment_leaf_temp_c", "treatment_vpd_kpa", - "treatment_co2_ppm", "treatment_par_umol", "treatment_dli_mol_m2", - "treatment_ndvi", "treatment_pri", "treatment_air_leaf_delta_t", - "treatment_crop_par_umol", "treatment_crop_leaf_temp_c", - "treatment_crop_ndvi", "treatment_crop_dli_mol_m2", "treatment_crop_par_avg1h", - "reference_crop_par_umol", "reference_crop_leaf_temp_c", - "reference_crop_ndvi", "reference_crop_dli_mol_m2", - "par_shading_ratio", - "treatment_soil_moisture_pct", "treatment_soil_temp_c", - "treatment_soil_ec_ds_m", "treatment_soil_ph", - "reference_soil_moisture_pct", "reference_soil_temp_c", + "treatment_co2_ppm", "treatment_air_leaf_delta_t", + # treatment indices + "treatment_crop_ndvi", "treatment_crop_pri", "treatment_crop_psri", + "treatment_crop_sipi", "treatment_crop_gci", "treatment_crop_lci", + "treatment_crop_duvi", "treatment_leaf_wetness_err", + # reference indices + "reference_crop_ndvi", "reference_crop_pri", "reference_crop_psri", + "reference_crop_sipi", "reference_crop_leaf_temp_c", "reference_air_temp_c", + # ratios + "ndvi_ratio", "par_shading_ratio", + # treatment soil + "treatment_soil_moisture_pct", "treatment_soil_moisture_deep_pct", + "treatment_soil_temp_c", "treatment_soil_temp_deep_c", + "treatment_soil_ec_ds_m", + "treatment_soil_pore_water_ec", "treatment_soil_pore_water_ec_deep", + "treatment_soil_ph", + # reference soil + "reference_soil_moisture_pct", "reference_soil_moisture_deep_pct", + "reference_soil_temp_c", + "reference_soil_pore_water_ec", "reference_soil_pore_water_ec_deep", + # irrigation (None until re-instrumented) "irrigation_last_volume_l", "irrigation_last_minutes", "irrigation_ec", "irrigation_ph", "water_temp_c", + # panels "treatment_panel_temp_c", "reference_panel_temp_c", + # legacy shims (None on 2026 hardware) + "treatment_par_umol", "treatment_dli_mol_m2", "treatment_ndvi", "treatment_pri", + "treatment_crop_par_umol", "treatment_crop_leaf_temp_c", + "treatment_crop_dli_mol_m2", "treatment_crop_par_avg1h", + "reference_crop_par_umol", "reference_crop_dli_mol_m2", ): val = getattr(self, attr) out[attr] = round(val, 3) if val is not None else None @@ -740,54 +840,33 @@ class ThingsBoardClient: # High-level vine snapshot # ------------------------------------------------------------------ - # Dashboard-only: 4 devices for farmer view (temp, soil, irrigation) + # Dashboard-only: one treatment + one reference Crop_2Soil for farmer view. _DASHBOARD_FETCH_PLAN: Dict[str, List[str]] = { - "Air1": AIR_KEYS, # ambient weather - "Air2": AIR_KEYS, # treatment air - "Soil1": SOIL_KEYS, # treatment soil - "Irrigation1": IRRIGATION_KEYS, + "Crop_2Soil1": CROP_2SOIL_KEYS, # 502 north (treatment) + "Crop_2Soil4": CROP_2SOIL_KEYS, # 202 north reference } - # Light mode: 6 devices (adds crop PAR for chatbot/detailed view) + # Light mode: a couple per area + one thermocouple for the chatbot. _LIGHT_FETCH_PLAN: Dict[str, List[str]] = { - "Air1": AIR_KEYS, # ambient - "Air2": AIR_KEYS, # treatment air (one representative) - "Crop1": CROP_KEYS, # reference crop - "Crop3": CROP_KEYS, # treatment crop - "Soil1": SOIL_KEYS, # treatment soil - "Irrigation1": IRRIGATION_KEYS, + "Crop_2Soil1": CROP_2SOIL_KEYS, + "Crop_2Soil11": CROP_2SOIL_KEYS, + "Crop_2Soil4": CROP_2SOIL_KEYS, + "Crop_2Soil10": CROP_2SOIL_KEYS, + "Thermocouples3": THERMOCOUPLE_KEYS, } + # Full mode: every Crop_2Soil with a known row + every thermocouple. _FULL_FETCH_PLAN: Dict[str, List[str]] = { - "Air1": AIR_KEYS, - "Air2": AIR_KEYS, - "Air3": AIR_KEYS, - "Air4": AIR_KEYS, - "Crop1": CROP_KEYS, - "Crop2": CROP_KEYS, - "Crop3": CROP_KEYS, - "Crop4": CROP_KEYS, - "Crop5": CROP_KEYS, - "Crop6": CROP_KEYS, - "Crop7": CROP_KEYS, - "Soil1": SOIL_KEYS, - "Soil2": SOIL_KEYS, - "Soil3": SOIL_KEYS, - "Soil4": SOIL_KEYS, - "Soil5": SOIL_KEYS, - "Soil6": SOIL_KEYS, - "Soil7": SOIL_KEYS, - "Soil9": SOIL_KEYS, - "Irrigation1": IRRIGATION_KEYS, - "Thermocouples1": THERMOCOUPLE_KEYS, - "Thermocouples2": THERMOCOUPLE_KEYS, + **{n: CROP_2SOIL_KEYS for n in TREATMENT_DEVICES + REFERENCE_DEVICES}, + **{n: THERMOCOUPLE_KEYS for n in THERMOCOUPLE_DEVICES}, } def get_vine_snapshot(self, light: bool = False, mode: Optional[str] = None) -> VineSnapshot: """ - Fetch latest telemetry from all relevant devices and return an - aggregated VineSnapshot distinguishing treatment vs reference areas. + Fetch latest telemetry from the 2026 Crop_2Soil + thermocouple fleet + and return an aggregated VineSnapshot distinguishing treatment vs + reference areas. Uses a thread pool to parallelise HTTP requests. Individual device failures are silently skipped (returns None fields). @@ -795,9 +874,9 @@ class ThingsBoardClient: Parameters ---------- light : bool - If True, fetch only ~6 key devices instead of all 21. + If True, fetch a 5-device subset instead of the full fleet. mode : str, optional - "dashboard" = 4 devices only (air + soil + irrigation). + "dashboard" = 2 devices (one treatment, one reference). Overrides `light` when set. """ if mode == "dashboard": @@ -834,165 +913,134 @@ class ThingsBoardClient: if newest_ts_overall else float("nan") ) - # ---------- Ambient (Air1) ---------- - air1 = raw_results.get("Air1", {}) - - # ---------- Treatment microclimate (Air2/3/4) ---------- - treatment_air = [raw_results.get(d, {}) for d in ("Air2", "Air3", "Air4")] - - # ---------- Treatment crop by position ---------- - position_labels = { - "Crop3": "502-west-bottom", - "Crop5": "502-east-upper", - "Crop6": "502-east-bottom", - "Crop7": "502-west-upper", - } - treatment_crop_devs = { - label: raw_results.get(dev, {}) - for dev, label in position_labels.items() - } - treatment_crop_by_pos: Dict[str, Dict[str, Optional[float]]] = { - label: { - "par": v.get("PAR"), - "leaf_temp": v.get("leafTemperature"), - "ndvi": v.get("NDVI"), - "dli": v.get("DLI"), - } - for label, v in treatment_crop_devs.items() - } - - # ---------- Reference crop by position ---------- - ref_position_labels = { - "Crop1": "503-ref", - "Crop2": "503-control", - "Crop4": "502-control", - } - reference_crop_devs = { - label: raw_results.get(dev, {}) - for dev, label in ref_position_labels.items() - } - reference_crop_by_pos: Dict[str, Dict[str, Optional[float]]] = { - label: { - "par": v.get("PAR"), - "leaf_temp": v.get("leafTemperature"), - "ndvi": v.get("NDVI"), - "dli": v.get("DLI"), + # ---------- Bucket results by area + collect per-position rows ---------- + treatment_devs: List[Dict[str, Any]] = [] + reference_devs: List[Dict[str, Any]] = [] + treatment_by_pos: Dict[str, Dict[str, Optional[float]]] = {} + reference_by_pos: Dict[str, Dict[str, Optional[float]]] = {} + + for name, values in raw_results.items(): + if not name.startswith("Crop_2Soil"): + continue + info = DEVICE_REGISTRY.get(name) + if info is None or not values: + continue + pos_key = ( + f"{info.row}-{info.position}" + if info.row is not None and info.position + else (str(info.row) if info.row is not None else name) + ) + row_summary = { + "leaf_temp": values.get("leafTemperature"), + "air_temp_irt": values.get("ambientTemperatureIRT"), + "ndvi": values.get("NDVI"), + "pri": values.get("PRI"), + "psri": values.get("PSRI"), + "soil_moisture": values.get("soilMoisture"), + "soil_temp": values.get("soilTemperature"), } - for label, v in reference_crop_devs.items() - } - - # ---------- Soil averages ---------- - treatment_soil_devs = [raw_results.get(d, {}) for d in ("Soil1", "Soil3", "Soil5", "Soil6")] - reference_soil_devs = [raw_results.get(d, {}) for d in ("Soil2", "Soil4", "Soil7", "Soil9")] - - def _avg_soil_moisture(devs: List[Dict]) -> Optional[float]: - all_vals = [] - for d in devs: - for k in ("soilMoisture", "soilMoisture2"): - if d.get(k) is not None: - all_vals.append(d[k]) - lo, hi = _BOUNDS["soil_moisture"] - return _bounded_avg(lo, hi, *all_vals) if all_vals else None - - def _avg_soil_temp(devs: List[Dict]) -> Optional[float]: - all_vals = [] - for d in devs: - for k in ("soilTemperature", "soilTemperature2"): - if d.get(k) is not None: - all_vals.append(d[k]) - lo, hi = _BOUNDS["soil_temp"] - return _bounded_avg(lo, hi, *all_vals) if all_vals else None - - # ---------- Panel temps ---------- - tc1 = raw_results.get("Thermocouples1", {}) - tc2 = raw_results.get("Thermocouples2", {}) - - irr = raw_results.get("Irrigation1", {}) - - # ---------- PAR shading ratio (bounded to reject sensor faults) ---------- - t_par = _bounded_avg(*_BOUNDS["par"], *[v.get("PAR") for v in treatment_crop_devs.values()]) - r_par = _bounded_avg(*_BOUNDS["par"], *[v.get("PAR") for v in reference_crop_devs.values()]) - par_ratio: Optional[float] = None - if t_par is not None and r_par is not None and r_par > 0: - par_ratio = t_par / r_par + if info.area == VineArea.TREATMENT: + treatment_devs.append(values) + treatment_by_pos[pos_key] = row_summary + elif info.area == VineArea.REFERENCE: + reference_devs.append(values) + reference_by_pos[pos_key] = row_summary + + # ---------- Helpers to average a key across devices, with bounds ---------- + def _avg(devs: List[Dict[str, Any]], key: str, bounds: Tuple[float, float]) -> Optional[float]: + return _bounded_avg(*bounds, *[d.get(key) for d in devs]) + + def _avg_soil_layer(devs: List[Dict[str, Any]], keys: Tuple[str, ...], + bounds: Tuple[float, float]) -> Optional[float]: + vals = [d.get(k) for d in devs for k in keys if d.get(k) is not None] + return _bounded_avg(*bounds, *vals) if vals else None + + # ---------- Air / leaf ---------- + t_leaf = _avg(treatment_devs, "leafTemperature", _BOUNDS["leaf_temp"]) + t_irt = _avg(treatment_devs, "ambientTemperatureIRT", _BOUNDS["air_temp"]) + r_leaf = _avg(reference_devs, "leafTemperature", _BOUNDS["leaf_temp"]) + r_irt = _avg(reference_devs, "ambientTemperatureIRT", _BOUNDS["air_temp"]) + t_delta = (t_leaf - t_irt) if (t_leaf is not None and t_irt is not None) else None + + # ---------- NDVI ratio (treatment / reference) ---------- + t_ndvi = _avg(treatment_devs, "NDVI", _BOUNDS["ndvi"]) + r_ndvi = _avg(reference_devs, "NDVI", _BOUNDS["ndvi"]) + t_pri = _avg(treatment_devs, "PRI", _BOUNDS["pri"]) + ndvi_ratio: Optional[float] = None + if t_ndvi is not None and r_ndvi is not None and r_ndvi > 0: + ndvi_ratio = t_ndvi / r_ndvi + + # ---------- Panel surface temps (avg over active thermocouples) ---------- + tc_vals: List[float] = [] + tc_active_count = 0 + for name in THERMOCOUPLE_DEVICES: + tc = raw_results.get(name, {}) + channels = [tc.get(k) for k in THERMOCOUPLE_KEYS if k.startswith("thermocoupleTemperature_")] + if any(v is not None for v in channels): + tc_active_count += 1 + tc_vals.extend(channels) + t_panel_temp = _bounded_avg(*_BOUNDS["panel_temp"], *tc_vals) if tc_vals else None snapshot = VineSnapshot( snapshot_ts=now, staleness_minutes=staleness, - # Ambient — apply bounds to catch single-device faults too - ambient_temp_c=_bounded_avg(*_BOUNDS["air_temp"], air1.get("airTemperature")), - ambient_humidity_pct=_bounded_avg(0, 100, air1.get("airHumidity")), - ambient_wind_speed_ms=_bounded_avg(0, 60, air1.get("windSpeed")), - ambient_wind_angle_deg=_bounded_avg(0, 360, air1.get("windAngle")), - ambient_rain_mm=_bounded_avg(0, 500, air1.get("rain")), - - # Treatment climate — bounded to reject sensor faults - treatment_air_temp_c=_bounded_avg(*_BOUNDS["air_temp"], *[d.get("airTemperature") for d in treatment_air]), - treatment_leaf_temp_c=_bounded_avg(*_BOUNDS["leaf_temp"], *[d.get("leafTemperature") for d in treatment_air]), - treatment_vpd_kpa=_bounded_avg(*_BOUNDS["vpd"], *[d.get("VPD") for d in treatment_air]), - treatment_co2_ppm=_bounded_avg(*_BOUNDS["co2"], *[d.get("CO2") for d in treatment_air]), - treatment_par_umol=_bounded_avg(*_BOUNDS["par"], *[d.get("PAR") for d in treatment_air]), - treatment_dli_mol_m2=_bounded_avg(*_BOUNDS["dli"], *[d.get("DLI") for d in treatment_air]), - treatment_ndvi=_bounded_avg(*_BOUNDS["ndvi"], *[d.get("NDVI") for d in treatment_air]), - treatment_pri=_bounded_avg(*_BOUNDS["pri"], *[d.get("PRI") for d in treatment_air]), - treatment_air_leaf_delta_t=_bounded_avg(-20, 20, *[d.get("airLeafDeltaT") for d in treatment_air]), - - # Treatment crop - treatment_crop_par_umol=t_par, - treatment_crop_leaf_temp_c=_bounded_avg( - *_BOUNDS["leaf_temp"], *[v.get("leafTemperature") for v in treatment_crop_devs.values()] - ), - treatment_crop_ndvi=_bounded_avg( - *_BOUNDS["ndvi"], *[v.get("NDVI") for v in treatment_crop_devs.values()] - ), - treatment_crop_dli_mol_m2=_bounded_avg( - *_BOUNDS["dli"], *[v.get("DLI") for v in treatment_crop_devs.values()] - ), - treatment_crop_par_avg1h=_bounded_avg( - *_BOUNDS["par"], *[v.get("PARAvg1H") for v in treatment_crop_devs.values()] - ), - treatment_crop_by_position=treatment_crop_by_pos, - - # Reference crop - reference_crop_par_umol=r_par, - reference_crop_leaf_temp_c=_bounded_avg( - *_BOUNDS["leaf_temp"], *[v.get("leafTemperature") for v in reference_crop_devs.values()] - ), - reference_crop_ndvi=_bounded_avg( - *_BOUNDS["ndvi"], *[v.get("NDVI") for v in reference_crop_devs.values()] + # Ambient — reserved (sourced from IMS, not TB) + + # Treatment climate (now derived from Crop_2Soil IRT + leaf) + treatment_air_temp_c=t_irt, + treatment_leaf_temp_c=t_leaf, + treatment_air_leaf_delta_t=t_delta, + + # Treatment crop indices + treatment_crop_ndvi=t_ndvi, + treatment_crop_pri=t_pri, + treatment_crop_psri=_avg(treatment_devs, "PSRI", _BOUNDS["psri"]), + treatment_crop_sipi=_avg(treatment_devs, "SIPI", _BOUNDS["sipi"]), + treatment_crop_gci=_avg(treatment_devs, "GCI", _BOUNDS["gci"]), + treatment_crop_lci=_avg(treatment_devs, "LCI", _BOUNDS["lci"]), + treatment_crop_duvi=_avg(treatment_devs, "DUVI", _BOUNDS["duvi"]), + treatment_leaf_wetness_err=_avg( + treatment_devs, "leafWetnessErr", _BOUNDS["leaf_wetness"] ), - reference_crop_dli_mol_m2=_bounded_avg( - *_BOUNDS["dli"], *[v.get("DLI") for v in reference_crop_devs.values()] - ), - reference_crop_by_position=reference_crop_by_pos, - - par_shading_ratio=par_ratio, - - # Treatment soil - treatment_soil_moisture_pct=_avg_soil_moisture(treatment_soil_devs), - treatment_soil_temp_c=_avg_soil_temp(treatment_soil_devs), - treatment_soil_ec_ds_m=_safe_avg(*[d.get("soilBulkEC") for d in treatment_soil_devs]), - treatment_soil_ph=_safe_avg(*[d.get("soilpH") for d in treatment_soil_devs]), + treatment_crop_by_position=treatment_by_pos, + + # Reference crop indices + reference_crop_ndvi=r_ndvi, + reference_crop_pri=_avg(reference_devs, "PRI", _BOUNDS["pri"]), + reference_crop_psri=_avg(reference_devs, "PSRI", _BOUNDS["psri"]), + reference_crop_sipi=_avg(reference_devs, "SIPI", _BOUNDS["sipi"]), + reference_crop_leaf_temp_c=r_leaf, + reference_air_temp_c=r_irt, + reference_crop_by_position=reference_by_pos, + + # Ratios (par_shading_ratio is None — no PAR sensor in 2026 fleet) + ndvi_ratio=ndvi_ratio, + + # Treatment soil — dual profile (shallow + deep are physically distinct layers) + treatment_soil_moisture_pct=_avg_soil_layer(treatment_devs, ("soilMoisture",), _BOUNDS["soil_moisture"]), + treatment_soil_moisture_deep_pct=_avg_soil_layer(treatment_devs, ("soilMoisture2",), _BOUNDS["soil_moisture"]), + treatment_soil_temp_c=_avg_soil_layer(treatment_devs, ("soilTemperature",), _BOUNDS["soil_temp"]), + treatment_soil_temp_deep_c=_avg_soil_layer(treatment_devs, ("soilTemperature2",), _BOUNDS["soil_temp"]), + treatment_soil_ec_ds_m=_avg_soil_layer(treatment_devs, ("soilBulkEC",), _BOUNDS["soil_ec"]), + treatment_soil_pore_water_ec=_avg_soil_layer(treatment_devs, ("soilPoreWaterEC",), _BOUNDS["soil_ec"]), + treatment_soil_pore_water_ec_deep=_avg_soil_layer(treatment_devs, ("soilPoreWaterEC2",), _BOUNDS["soil_ec"]), # Reference soil - reference_soil_moisture_pct=_avg_soil_moisture(reference_soil_devs), - reference_soil_temp_c=_avg_soil_temp(reference_soil_devs), - - # Irrigation - irrigation_last_volume_l=irr.get("irrigationCycleVolume") or irr.get("irrigationVolume"), - irrigation_last_minutes=irr.get("irrigationCycleMinutes") or irr.get("irrigationMinutes"), - irrigation_ec=irr.get("irrigationEC"), - irrigation_ph=irr.get("irrigationPH"), - water_temp_c=irr.get("waterTemperature"), + reference_soil_moisture_pct=_avg_soil_layer(reference_devs, ("soilMoisture",), _BOUNDS["soil_moisture"]), + reference_soil_moisture_deep_pct=_avg_soil_layer(reference_devs, ("soilMoisture2",), _BOUNDS["soil_moisture"]), + reference_soil_temp_c=_avg_soil_layer(reference_devs, ("soilTemperature",), _BOUNDS["soil_temp"]), + reference_soil_pore_water_ec=_avg_soil_layer(reference_devs, ("soilPoreWaterEC",), _BOUNDS["soil_ec"]), + reference_soil_pore_water_ec_deep=_avg_soil_layer(reference_devs, ("soilPoreWaterEC2",), _BOUNDS["soil_ec"]), # Panel temps - treatment_panel_temp_c=_bounded_avg( - *_BOUNDS["panel_temp"], *[tc1.get(k) for k in THERMOCOUPLE_KEYS] - ), - reference_panel_temp_c=_bounded_avg( - *_BOUNDS["panel_temp"], *[tc2.get(k) for k in THERMOCOUPLE_KEYS] - ), + treatment_panel_temp_c=t_panel_temp, + panel_temp_active_count=tc_active_count, + + # Legacy shims (None — 2026 fleet has no PAR/DLI/CO2 sensors) + treatment_ndvi=t_ndvi, + treatment_pri=t_pri, + treatment_crop_leaf_temp_c=t_leaf, ) return snapshot @@ -1032,11 +1080,18 @@ _BOUNDS = { "leaf_temp": (-5.0, 60.0), # °C — leaves can exceed air under direct sun "soil_temp": (-2.0, 45.0), # °C — soil in Negev "soil_moisture": (0.0, 100.0), # % + "soil_ec": (0.0, 10.0), # dS/m — bulk + pore water "par": (0.0, 3000.0), # µmol m⁻² s⁻¹ "vpd": (0.0, 10.0), # kPa "co2": (300.0, 2000.0), # ppm "ndvi": (-1.0, 1.0), "pri": (-1.0, 1.0), + "psri": (-1.0, 1.0), + "sipi": (-1.0, 2.0), # SIPI typical 0..2 (no upper saturation) + "gci": (0.0, 30.0), # GCI ranges 0 .. ~25 for healthy canopy + "lci": (0.0, 1.0), + "duvi": (0.0, 30.0), # daily UV index + "leaf_wetness": (0.0, 1.0), # error flag, normalised "dli": (0.0, 80.0), # mol m⁻² day⁻¹ "panel_temp": (-10.0, 100.0), # °C — panel surface } diff --git a/src/energy_predictor.py b/src/energy_predictor.py index d56c063f24fd7226c204e96be0b2e10b04672b3e..ab9b362e646d328469a593801e8c2a500d280b25 100644 --- a/src/energy_predictor.py +++ b/src/energy_predictor.py @@ -231,13 +231,17 @@ class EnergyPredictor: ) -> pd.DataFrame: """Compare ML predictions vs actual production for recent days. + Reads weather from IMS station 43 (the 2026 fleet has no on-site Air + sensor) and actual production from the TB Plant asset. + Returns DataFrame with columns: date, actual_kwh, predicted_kwh, error_kwh, error_pct. """ - from datetime import timezone as tz import pytz + from src.data.ims_client import IMSClient utc = pytz.UTC + ims = IMSClient() rows = [] now = datetime.now(tz=utc) @@ -246,7 +250,7 @@ class EnergyPredictor: day_start = utc.localize(datetime(day.year, day.month, day.day)) day_end = day_start + timedelta(days=1) - # Actual production + # Actual production from TB try: actual_df = tb_client.get_asset_timeseries( "Plant", ["production"], @@ -260,15 +264,17 @@ class EnergyPredictor: if actual_kwh < 10: continue - # Weather for that day → prediction + # Weather from IMS (station 43, Sde Boker) try: - wx = tb_client.get_timeseries( - "Air1", ["GSR", "airTemperature", "windSpeed"], - start=day_start, end=day_end, - limit=100, interval_ms=3_600_000, agg="AVG", - ) - if wx.empty: + wx = ims.fetch_range(day_start.date(), day_end.date()) + if wx is None or wx.empty: continue + # Rename IMS columns to the predictor's expected names + wx = wx.rename(columns={ + "ghi_w_m2": "GSR", + "air_temperature_c": "airTemperature", + "wind_speed_ms": "windSpeed", + }) pred = self.predict_day_from_weather_df( day_start.strftime("%Y-%m-%d"), wx, ) diff --git a/src/proxy_a_score.py b/src/proxy_a_score.py new file mode 100644 index 0000000000000000000000000000000000000000..49f5688ffc855ba337056b7861d6cf8793182ae8 --- /dev/null +++ b/src/proxy_a_score.py @@ -0,0 +1,141 @@ +"""proxy_a_score — composite photosynthesis-health metric, 0..1. + +LiCor (direct A measurement) is not available this season, so the control +loop and chatbot need a single scalar that says "how healthy is the canopy +right now" from the sensors we already collect. This module produces that +scalar by combining 5 already-streamed metrics on Crop_2Soil devices: + + - PRI (Photochemical Reflectance Index — light-use efficiency) + - PSRI (Plant Senescence Reflectance Index — inverted) + - leaf-air ΔT (transpiration cooling — inverted) + - shallow soil moisture (water availability) + - NDVI (greenness baseline) + +Each metric is mapped linearly from its `stress`→`healthy` bound into +[0, 1] (clipped), then combined as a weighted average. Weights and bounds +live in `config/settings.py` (`PROXY_A_WEIGHTS`, `PROXY_A_BOUNDS`) so they +can be tuned after the null-intervention baseline period without code change. + +Higher score = healthier / more productive canopy. The control loop should +prefer interventions that *don't* drop the score by more than ε. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Dict, Optional + +from config import settings + + +@dataclass +class ProxyAScore: + """Composite photosynthesis-health metric, plus per-term breakdown. + + Attributes + ---------- + score : float + Weighted average of the per-metric sub-scores, in [0, 1]. + NaN if no metrics were available. + contributions : dict[str, float] + Per-metric sub-score in [0, 1] (only metrics that had data). + weights_used : dict[str, float] + Per-metric weight actually applied (renormalised over available + metrics so missing inputs don't bias the score downward). + """ + + score: float + contributions: Dict[str, float] + weights_used: Dict[str, float] + + +def _linear_score(value: float, stress: float, healthy: float) -> float: + """Map a raw measurement into [0, 1] given its stress/healthy bounds. + + Works whether `healthy > stress` (PRI, NDVI, soil — higher is better) + or `healthy < stress` (PSRI, ΔT — lower is better). + """ + if stress == healthy: + return 0.5 # degenerate config, neutral + raw = (value - stress) / (healthy - stress) + return max(0.0, min(1.0, raw)) + + +def compute_proxy_a( + pri: Optional[float] = None, + psri: Optional[float] = None, + delta_t: Optional[float] = None, + soil_moisture_pct: Optional[float] = None, + ndvi: Optional[float] = None, +) -> ProxyAScore: + """Compute the proxy-A score from any subset of the 5 input metrics. + + Missing metrics are dropped and the weights for the remaining metrics + are renormalised so they sum to 1. If all metrics are missing, the + score is NaN. + """ + raw_inputs: Dict[str, Optional[float]] = { + "pri": pri, + "psri": psri, + "delta_t": delta_t, + "soil": soil_moisture_pct, + "ndvi": ndvi, + } + + contributions: Dict[str, float] = {} + weights_used: Dict[str, float] = {} + + for key, val in raw_inputs.items(): + if val is None: + continue + b = settings.PROXY_A_BOUNDS.get(key) + w = settings.PROXY_A_WEIGHTS.get(key, 0.0) + if b is None or w <= 0: + continue + contributions[key] = _linear_score(val, b["stress"], b["healthy"]) + weights_used[key] = w + + if not weights_used: + return ProxyAScore(score=float("nan"), contributions={}, weights_used={}) + + total_w = sum(weights_used.values()) + renormalised = {k: w / total_w for k, w in weights_used.items()} + score = sum(contributions[k] * renormalised[k] for k in contributions) + return ProxyAScore( + score=round(score, 3), + contributions={k: round(v, 3) for k, v in contributions.items()}, + weights_used=renormalised, + ) + + +def compute_from_snapshot(snapshot: dict) -> ProxyAScore: + """Convenience: pull the 5 inputs from a VineSnapshot.to_dict().""" + return compute_proxy_a( + pri=snapshot.get("treatment_crop_pri"), + psri=snapshot.get("treatment_crop_psri"), + delta_t=snapshot.get("treatment_air_leaf_delta_t"), + soil_moisture_pct=snapshot.get("treatment_soil_moisture_pct"), + ndvi=snapshot.get("treatment_crop_ndvi"), + ) + + +def slot_cost( + *, + energy_value_ils: float, + proxy_a: ProxyAScore, + proxy_a_floor: float = 0.5, + proxy_a_weight: float = 5.0, +) -> float: + """Slot-level cost for the tracker control loop. + + Combines instantaneous energy revenue with a penalty for any drop of + `proxy_a.score` below `proxy_a_floor`. Higher = better. + + cost = energy_value_ils − proxy_a_weight × max(0, floor − score) + + Tune `proxy_a_weight` from the calibration period so that the penalty + at the 95th-percentile stress reading equals roughly half a mid-day + hour of energy revenue. + """ + shortfall = max(0.0, proxy_a_floor - proxy_a.score) + return round(energy_value_ils - proxy_a_weight * shortfall, 3) diff --git a/src/season_ground_truth.py b/src/season_ground_truth.py new file mode 100644 index 0000000000000000000000000000000000000000..301f802d796a183ea13212ab84f38cf1e42e7165 --- /dev/null +++ b/src/season_ground_truth.py @@ -0,0 +1,191 @@ +"""Manual ground-truth observations log for the 2026 season. + +Replaces what LiCor measurements would have provided. One row per manual +measurement event (SPAD chlorophyll, refractometer brix, lab anthocyanin, +yield, pruning weight, etc.), keyed by `(date, row, position, metric)` so +multiple metrics on the same day/row append cleanly. + +Append-only, version-controlled, schema-validated. CSV (not parquet) so +agronomists can edit in Excel or Google Sheets if needed. + +Usage:: + + from src.season_ground_truth import ( + Observation, append_observation, load_observations, + ) + + append_observation(Observation( + date="2026-06-10", row=502, position="north", + phenology="fruit-set", observer="ES", + spad=42.3, notes="post-irrigation", + )) + + df = load_observations(row=502) # filter to one row + df = load_observations(date_from="2026-08-01") # filter by date range +""" + +from __future__ import annotations + +import csv +from dataclasses import asdict, dataclass, field, fields +from datetime import date, datetime, timezone +from pathlib import Path +from typing import Iterable, List, Optional + +from config import settings + + +# All optional float / int columns default to None; only date+row are mandatory. +@dataclass +class Observation: + """Single ground-truth measurement event. + + Mandatory: + date ISO date string (YYYY-MM-DD) + row int — vineyard row id (501/502/503/504/509/202) + + Recommended: + position cardinal/composite (north/south/center-east/...) + phenology free text BBCH stage or label + observer initials of the agronomist + + Per-metric (any subset; leave others None): + spad SPAD-502 chlorophyll units + brix °Brix from handheld refractometer + ta_g_l titratable acidity, g/L (lab) + ph must pH (lab) + yield_kg kg / vine, harvest day + berry_count berries per cluster (sample) + berry_weight_g avg single berry weight, g + cluster_count clusters per vine + anthocyanin_mg_g mg / g skin, lab assay + phenolics_mg_g total phenolics, mg / g + sunburn_pct % of clusters with visible damage + pruning_weight_kg dormant pruning, kg / vine + lai leaf area index (LAI-2200 / hemiphoto) + notes free text + photo_url optional reference to a photo (local path or URL) + """ + + date: str + row: int + + position: Optional[str] = None + phenology: Optional[str] = None + observer: Optional[str] = None + + spad: Optional[float] = None + brix: Optional[float] = None + ta_g_l: Optional[float] = None + ph: Optional[float] = None + + yield_kg: Optional[float] = None + berry_count: Optional[int] = None + berry_weight_g: Optional[float] = None + cluster_count: Optional[int] = None + + anthocyanin_mg_g: Optional[float] = None + phenolics_mg_g: Optional[float] = None + sunburn_pct: Optional[float] = None + pruning_weight_kg: Optional[float] = None + lai: Optional[float] = None + + notes: Optional[str] = None + photo_url: Optional[str] = None + + recorded_at: str = field( + default_factory=lambda: datetime.now(timezone.utc).isoformat(timespec="seconds"), + ) + + +# --------------------------------------------------------------------------- +# CSV column order (stable, append-friendly) +# --------------------------------------------------------------------------- +_COLUMNS: List[str] = [f.name for f in fields(Observation)] + + +def _validate(obs: Observation) -> None: + """Cheap structural checks. Range / sanity checks live in load.""" + try: + date.fromisoformat(obs.date) + except (TypeError, ValueError) as e: + raise ValueError(f"Observation.date must be ISO YYYY-MM-DD: {obs.date!r}") from e + + valid_rows = {202, 501, 502, 503, 504, 509} + if obs.row not in valid_rows: + raise ValueError(f"Observation.row {obs.row} not in {sorted(valid_rows)}") + + +def append_observation(obs: Observation, path: Optional[Path] = None) -> Path: + """Append a single Observation to the CSV. Creates the file + header on + first call. Returns the path written to. + """ + _validate(obs) + path = path or settings.MANUAL_OBSERVATIONS_PATH + path.parent.mkdir(parents=True, exist_ok=True) + + write_header = not path.exists() or path.stat().st_size == 0 + with path.open("a", newline="", encoding="utf-8") as f: + writer = csv.DictWriter(f, fieldnames=_COLUMNS, extrasaction="ignore") + if write_header: + writer.writeheader() + writer.writerow({k: v if v is not None else "" for k, v in asdict(obs).items()}) + return path + + +def append_many(observations: Iterable[Observation], path: Optional[Path] = None) -> Path: + """Bulk-append helper. Same validation per-row.""" + path = path or settings.MANUAL_OBSERVATIONS_PATH + for obs in observations: + append_observation(obs, path) + return path + + +def load_observations( + path: Optional[Path] = None, + *, + row: Optional[int] = None, + date_from: Optional[str] = None, + date_to: Optional[str] = None, +): + """Load observations into a pandas DataFrame. Optional filters. + + Returns an empty DataFrame (typed columns) if the file doesn't exist + or is empty. + """ + import pandas as pd + + path = path or settings.MANUAL_OBSERVATIONS_PATH + if not path.exists() or path.stat().st_size == 0: + return pd.DataFrame(columns=_COLUMNS) + + df = pd.read_csv(path) + df["date"] = pd.to_datetime(df["date"]).dt.date + + if row is not None: + df = df[df["row"] == row] + if date_from is not None: + df = df[df["date"] >= date.fromisoformat(date_from)] + if date_to is not None: + df = df[df["date"] <= date.fromisoformat(date_to)] + + return df.reset_index(drop=True) + + +def summary(path: Optional[Path] = None) -> dict: + """Quick stats: total rows, rows per metric, date range.""" + df = load_observations(path) + if df.empty: + return {"rows": 0, "per_metric": {}, "date_range": None} + counts = { + col: int(df[col].notna().sum()) + for col in _COLUMNS + if col not in {"date", "row", "position", "phenology", "observer", + "notes", "photo_url", "recorded_at"} + } + return { + "rows": int(len(df)), + "per_metric": {k: v for k, v in counts.items() if v > 0}, + "date_range": (str(df["date"].min()), str(df["date"].max())), + "rows_observed": sorted(df["row"].unique().tolist()), + } diff --git a/tracker/README.md b/tracker/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2c2f5f081018bd2c2037f3ac2081b05034d0b28c --- /dev/null +++ b/tracker/README.md @@ -0,0 +1 @@ +# tracker \ No newline at end of file diff --git a/tracker/tracking_plans/day-east.json b/tracker/tracking_plans/day-east.json new file mode 100644 index 0000000000000000000000000000000000000000..f59cbda3ad56db7bc7e5c411efd8a2c4b0b2b338 --- /dev/null +++ b/tracker/tracking_plans/day-east.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "east_on", + "angle": null + }, + { + "start": "sunset", + "mode": "tracking", + "angle": null + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/day-max.json b/tracker/tracking_plans/day-max.json new file mode 100644 index 0000000000000000000000000000000000000000..a039873e42e48dcf8b17f902978a346bdeba4ef9 --- /dev/null +++ b/tracker/tracking_plans/day-max.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "fixed_angle", + "angle": 180 + }, + { + "start": "sunset", + "mode": "tracking", + "angle": null + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/day-mid.json b/tracker/tracking_plans/day-mid.json new file mode 100644 index 0000000000000000000000000000000000000000..d9941473c8b54334721200fe2742beec45d7daa2 --- /dev/null +++ b/tracker/tracking_plans/day-mid.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "fixed_angle", + "angle": 90 + }, + { + "start": "sunset", + "mode": "tracking", + "angle": null + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/day-west.json b/tracker/tracking_plans/day-west.json new file mode 100644 index 0000000000000000000000000000000000000000..8eae41f3a20ee1eff0302a69d5fc8faf63b5a1c9 --- /dev/null +++ b/tracker/tracking_plans/day-west.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "west_on", + "angle": null + }, + { + "start": "sunset", + "mode": "tracking", + "angle": null + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/night-east.json b/tracker/tracking_plans/night-east.json new file mode 100644 index 0000000000000000000000000000000000000000..ec03e728fccef3bf08b72d09a07bd25c48daee76 --- /dev/null +++ b/tracker/tracking_plans/night-east.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "tracking", + "angle": null + }, + { + "start": "sunset", + "mode": "east_on", + "angle": null + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/night-max.json b/tracker/tracking_plans/night-max.json new file mode 100644 index 0000000000000000000000000000000000000000..3d8608e511e669c6e9b4bfb5b3f4704c14478e93 --- /dev/null +++ b/tracker/tracking_plans/night-max.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "tracking", + "angle": null + }, + { + "start": "sunset", + "mode": "fixed_angle", + "angle": 180 + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/night-mid.json b/tracker/tracking_plans/night-mid.json new file mode 100644 index 0000000000000000000000000000000000000000..15e4ae0163e8db1c742bcd7fdf763c447f18d9ef --- /dev/null +++ b/tracker/tracking_plans/night-mid.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "tracking", + "angle": null + }, + { + "start": "sunset", + "mode": "fixed_angle", + "angle": 90 + } + ] +} \ No newline at end of file diff --git a/tracker/tracking_plans/night-west.json b/tracker/tracking_plans/night-west.json new file mode 100644 index 0000000000000000000000000000000000000000..13d36ea173992acfb7a85aa2ce334860c768132e --- /dev/null +++ b/tracker/tracking_plans/night-west.json @@ -0,0 +1,14 @@ +{ + "timeline": [ + { + "start": "sunrise", + "mode": "tracking", + "angle": null + }, + { + "start": "sunset", + "mode": "west_on", + "angle": null + } + ] +} \ No newline at end of file diff --git a/ui/__init__.py b/ui/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5292820a7f031ec610f926bd802473c49f84502e --- /dev/null +++ b/ui/__init__.py @@ -0,0 +1,3 @@ +""" +UI package: tab modules and shared bootstrap helpers for the SolarWine Streamlit app. +""" diff --git a/ui/bootstrap.py b/ui/bootstrap.py new file mode 100644 index 0000000000000000000000000000000000000000..ab2b07c3f31b907856a756ad68330f4fa1d248ea --- /dev/null +++ b/ui/bootstrap.py @@ -0,0 +1,158 @@ +""" +Shared bootstrap helpers for the SolarWine Streamlit app. +Cached data loaders, AI/IMS health checks, and common utilities. +""" + +from __future__ import annotations + +import base64 +import threading + +import streamlit as st + +_BRAND_GREEN = "#00BD3E" +_BRAND_DARK = "#1A1A1A" + +try: + import plotly.express + import plotly.graph_objects + from plotly.subplots import make_subplots + _HAS_PLOTLY = True +except ImportError: + _HAS_PLOTLY = False + +from pathlib import Path + +import pandas as pd + +# Threading state for IMS background refresh (shared with app.py via module-level vars) +_IMS_REFRESH_LOCK = threading.Lock() +_IMS_REFRESH_STARTED = False +_IMS_REFRESH_STATUS: dict = {"ok": None, "error": None, "running": False} + + +@st.cache_data +def load_labels(path: str) -> pd.DataFrame: + return pd.read_csv(path, index_col=0, parse_dates=True) + + +@st.cache_data +def load_metrics(path: str) -> pd.DataFrame: + return pd.read_csv(path) + + +def _check_ai_health_impl() -> dict: + """Actual Gemini ping; cached so we only run once.""" + from src.genai_utils import get_genai_client + + try: + client = get_genai_client() + except Exception as exc: # noqa: BLE001 + return {"ok": False, "error": f"client init failed: {exc}"} + try: + resp = client.models.generate_content( + model="gemini-2.5-flash", + contents="ping", + ) + text = getattr(resp, "text", "") or "" + return {"ok": bool(text.strip()), "error": None} + except Exception as exc: # noqa: BLE001 + return {"ok": False, "error": f"generate_content failed: {exc}"} + + +@st.cache_resource(show_spinner=False) +def _cached_ai_ping() -> dict: + """Cached Gemini health check (used by check_ai_health with timeout).""" + return _check_ai_health_impl() + + +def check_ai_health(timeout_seconds: float = 1.5) -> dict: + """ + Lightweight startup validation that Gemini is reachable. + Waits at most timeout_seconds so app load stays under ~5s. + + Returns a dict with: + - ok: bool + - error: str | None + """ + from concurrent.futures import ThreadPoolExecutor, TimeoutError as FuturesTimeoutError + + with ThreadPoolExecutor(max_workers=1) as pool: + future = pool.submit(_cached_ai_ping) + try: + return future.result(timeout=timeout_seconds) + except FuturesTimeoutError: + return {"ok": False, "error": "Health check timed out. Try refreshing."} + + +def _run_ims_refresh(days: int = 7) -> None: + """Background worker to refresh IMS cache without blocking the UI.""" + from datetime import date, timedelta + + from src.ims_client import IMSClient + + global _IMS_REFRESH_STATUS + + try: + ims = IMSClient() + except Exception as exc: # noqa: BLE001 + _IMS_REFRESH_STATUS = { + "ok": False, + "error": f"IMS init failed: {exc}", + "running": False, + } + return + + try: + today = date.today() + start = (today - timedelta(days=days)).strftime("%Y-%m-%d") + end = today.strftime("%Y-%m-%d") + df = ims.fetch_and_cache(start, end) + if df.empty: + _IMS_REFRESH_STATUS = { + "ok": False, + "error": "IMS returned no data for the requested range.", + "running": False, + } + else: + _IMS_REFRESH_STATUS = {"ok": True, "error": None, "running": False} + except Exception as exc: # noqa: BLE001 + _IMS_REFRESH_STATUS = { + "ok": False, + "error": f"IMS fetch_and_cache failed: {exc}", + "running": False, + } + + +def ensure_ims_refresh_background(days: int = 7) -> dict: + """ + Kick off IMS cache refresh in a background thread if not already started. + + Returns the latest known status dict without blocking page load. + """ + global _IMS_REFRESH_STARTED, _IMS_REFRESH_STATUS + with _IMS_REFRESH_LOCK: + if not _IMS_REFRESH_STARTED: + _IMS_REFRESH_STARTED = True + _IMS_REFRESH_STATUS = {"ok": None, "error": None, "running": True} + t = threading.Thread(target=_run_ims_refresh, args=(days,), daemon=True) + t.start() + return dict(_IMS_REFRESH_STATUS) + + +def img_to_base64(path: Path) -> str: + return base64.b64encode(path.read_bytes()).decode() + + +def now_israel(): + from datetime import datetime + + try: + from zoneinfo import ZoneInfo + + tz = ZoneInfo("Asia/Jerusalem") + except ImportError: + import datetime as _dt + + tz = _dt.timezone(_dt.timedelta(hours=2)) # fallback UTC+2 + return datetime.now(tz) diff --git a/ui/tab_advisor.py b/ui/tab_advisor.py new file mode 100644 index 0000000000000000000000000000000000000000..fb7e756b601320c8cb8afcec3091818a860ff6d0 --- /dev/null +++ b/ui/tab_advisor.py @@ -0,0 +1,1233 @@ +""" +Vineyard Advisor tab — farmer-friendly dashboard + AI chatbot. + +Loading strategy: + - Static sections render instantly (vine stage, shading text) + - Group A (IMS-only, ~200ms): weather, forecast, last rain + - Group B (network, ~1-2s): TB sensors, irrigation, energy — fills in async + +Sections: + 1. Vine stage — phenological stage + countdown to next + 2. Weather forecast — week-ahead daily highs, rain/wind events + 3. Panel shading — current conditions assessment + 4. Tomorrow's plan — day-ahead DP trajectory with explanation + 5. Energy generation — yesterday / today / tomorrow kWh + 6. Irrigation — last water, soil status, when next needed + 7. Chatbot — AI advisor +""" + +from __future__ import annotations + +import logging +import math +import threading +from datetime import date as _date_cls, timedelta as _td + +import pandas as pd +import streamlit as st + +from ui.bootstrap import ensure_ims_refresh_background, now_israel as _now_israel + +def _get_plotly(): + """Lazy-load plotly only when a chart is actually rendered.""" + try: + import plotly.express as px + return px + except ImportError: + return None + + +# --------------------------------------------------------------------------- +# Helpers — farmer-friendly formatting +# --------------------------------------------------------------------------- + +def _temp_word(t: float) -> str: + if t >= 40: return "extreme heat" + if t >= 35: return "very hot" + if t >= 30: return "hot" + if t >= 25: return "warm" + if t >= 15: return "mild" + if t >= 5: return "cool" + return "cold" + + +def _soil_word(pct: float) -> str: + if pct < 12: return "very dry" + if pct < 18: return "dry" + if pct < 25: return "adequate" + if pct < 35: return "moist" + return "wet" + + +def _hours_ago_str(h: float) -> str: + if h < 1: return "less than 1 hour ago" + if h < 24: return f"{h:.0f} hours ago" + days = h / 24 + if days < 2: return "yesterday" + return f"{days:.0f} days ago" + + +# --------------------------------------------------------------------------- +# Shared DataHub +# --------------------------------------------------------------------------- + +def _vs_hub(): + if "vs_hub" not in st.session_state: + from src.data_providers import DataHub + st.session_state["vs_hub"] = DataHub.default() + return st.session_state["vs_hub"] + + +# --------------------------------------------------------------------------- +# Shading gate assessment (uses same logic as control loop) +# --------------------------------------------------------------------------- + +def _run_intervention_gate( + stage_id: str, + temp_c: float, + ghi: float | None, + hour: int, +) -> dict: + """Run the InterventionGate logic and return a farmer-friendly result. + + Returns dict with 'status' ("dormant", "blocked", "passed") and 'reason'. + Uses the same thresholds as the real-time control loop. + """ + from config.settings import ( + NO_SHADE_BEFORE_HOUR, + SEMILLON_TRANSITION_TEMP_C, + SHADE_ELIGIBLE_CWSI_ABOVE, + SHADE_ELIGIBLE_GHI_ABOVE, + ) + + # Dormant — no canopy, shading is irrelevant (not harmful, just pointless) + if stage_id == "winter_dormancy": + return {"status": "dormant", "reason": "vine dormant"} + + # Before allowed hour — morning light is critical for carbon fixation + if hour < NO_SHADE_BEFORE_HOUR: + return { + "status": "blocked", + "reason": ( + f"morning light (before {NO_SHADE_BEFORE_HOUR}:00) is critical " + f"for carbon fixation. No shading before {NO_SHADE_BEFORE_HOUR}:00" + ), + } + + # Night / overcast — no meaningful sun + if ghi is not None and ghi < 100: + return { + "status": "blocked", + "reason": f"low radiation ({ghi:.0f} W/m²) — no meaningful sunlight to shade from", + } + + # Below Rubisco transition — vine is light-limited (RuBP regime) + if temp_c < SEMILLON_TRANSITION_TEMP_C: + return { + "status": "blocked", + "reason": ( + f"at {temp_c:.0f}°C the vine is light-limited (below {SEMILLON_TRANSITION_TEMP_C:.0f}°C " + f"Rubisco transition). Every photon helps — shading would reduce photosynthesis" + ), + } + + # GHI below stress threshold — not enough radiation to cause heat damage + if ghi is not None and ghi < SHADE_ELIGIBLE_GHI_ABOVE: + return { + "status": "blocked", + "reason": ( + f"radiation ({ghi:.0f} W/m²) is below stress threshold " + f"({SHADE_ELIGIBLE_GHI_ABOVE:.0f} W/m²). Panels at full tracking" + ), + } + + # Heat stress proxy from air temperature (not true CWSI — no leaf temp available here) + heat_stress = max(0.0, min(1.0, (temp_c - 30.0) / 10.0)) + if heat_stress < SHADE_ELIGIBLE_CWSI_ABOVE: + return { + "status": "blocked", + "reason": ( + f"at {temp_c:.0f}°C, heat stress is moderate (index {heat_stress:.2f} " + f"< {SHADE_ELIGIBLE_CWSI_ABOVE:.2f}). Panels at full tracking" + ), + } + + # All conditions met — gate passes + return { + "status": "passed", + "reason": ( + f"temperature {temp_c:.0f}°C above Rubisco transition, " + f"radiation {ghi:.0f} W/m², heat stress index {heat_stress:.2f}" + ), + } + + +# --------------------------------------------------------------------------- +# Tomorrow's plan computation +# --------------------------------------------------------------------------- + +def _compute_tomorrow_plan(tomorrow: _date_cls) -> dict: + """Run DayAheadPlanner on tomorrow using IMS data for forecast proxy. + + Uses last available day's temperature/GHI profile as a naive forecast + (persistence forecast). Returns dict with 'plan' key or 'error'. + """ + try: + hub = _vs_hub() + ims_df = hub.weather.get_dataframe() + if ims_df.empty: + return {"error": "No IMS data available."} + + df = ims_df.copy() + if "timestamp_utc" in df.columns: + df["timestamp_utc"] = pd.to_datetime(df["timestamp_utc"], utc=True) + df = df.set_index("timestamp_utc") + + # Use last full day as forecast proxy (persistence forecast) + last_day = df.index.max().normalize() + day_data = df[df.index.normalize() == last_day] + if len(day_data) < 10: + # Try day before + last_day = last_day - pd.Timedelta(days=1) + day_data = df[df.index.normalize() == last_day] + + if len(day_data) < 10: + return {"error": "Not enough recent data for forecast."} + + # Build 96-slot arrays from the proxy day + temps = [25.0] * 96 + ghis = [0.0] * 96 + for _, row in day_data.iterrows(): + slot = row.name.hour * 4 + row.name.minute // 15 + if 0 <= slot < 96: + if "air_temperature_c" in day_data.columns: + t = row.get("air_temperature_c") + if pd.notna(t): + temps[slot] = float(t) + if "ghi_w_m2" in day_data.columns: + g = row.get("ghi_w_m2") + if pd.notna(g): + ghis[slot] = float(g) + + # Compute daily budget (simplified: use typical daily allocation) + from src.energy_budget import EnergyBudgetPlanner + planner_budget = EnergyBudgetPlanner() + annual = planner_budget.compute_annual_plan(tomorrow.year) + month_budget = annual["monthly_budgets"].get(tomorrow.month, 0.5) + daily_budget = month_budget / 30.0 # approximate daily share + + # Run the day-ahead planner + from src.day_ahead_planner import DayAheadPlanner + planner = DayAheadPlanner() + plan = planner.plan_day( + target_date=tomorrow, + forecast_temps=temps, + forecast_ghi=ghis, + daily_budget_kwh=max(daily_budget, 0.1), + ) + return {"plan": plan} + except Exception as exc: + return {"error": str(exc)} + + +# --------------------------------------------------------------------------- +# Group A: Fast data (IMS CSV only, ~200ms, no network) +# --------------------------------------------------------------------------- + +def _fetch_group_a(today: _date_cls) -> dict: + """Weather current + week view + last rain. All from cached IMS CSV.""" + hub = _vs_hub() + ims_df = hub.weather.get_dataframe() # disk read (~100ms first time, cached after) + + result: dict = {} + + # Current weather + result["weather"] = hub.weather.get_current() + + # Week view (last 7 days as proxy) + try: + if ims_df.empty: + result["week_forecast"] = {"error": "No IMS data."} + else: + df = ims_df + if "timestamp_utc" in df.columns: + df = df.copy() + df["timestamp_utc"] = pd.to_datetime(df["timestamp_utc"], utc=True) + df = df.set_index("timestamp_utc") + end = df.index.max() + start = end - pd.Timedelta(days=7) + week = df.loc[start:end] + if week.empty: + result["week_forecast"] = {"error": "Not enough data."} + else: + temp_col = next((c for c in week.columns if "temp" in c.lower() and "dew" not in c.lower() and "soil" not in c.lower()), None) + rain_col = next((c for c in week.columns if "rain" in c.lower()), None) + wind_col = next((c for c in week.columns if "wind" in c.lower() and "angle" not in c.lower()), None) + days_out = [] + for day_date, day_data in week.resample("1D"): + if day_data.empty: + continue + d = {"date": day_date.strftime("%a %d/%m")} + if temp_col: + d["high"] = round(float(day_data[temp_col].max()), 1) + d["low"] = round(float(day_data[temp_col].min()), 1) + d["label"] = _temp_word(d["high"]) + if rain_col: + total_rain = float(day_data[rain_col].sum()) + if total_rain > 0.5: + d["rain_mm"] = round(total_rain, 1) + if wind_col: + max_wind = float(day_data[wind_col].max()) + if max_wind > 8: + d["wind_ms"] = round(max_wind, 1) + days_out.append(d) + result["week_forecast"] = {"days": days_out, "note": "Based on recent IMS measurements (last 7 days)."} + except Exception as exc: + result["week_forecast"] = {"error": str(exc)} + + # Last rain + try: + if not ims_df.empty: + df = ims_df + if "timestamp_utc" in df.columns: + df = df.copy() + df["timestamp_utc"] = pd.to_datetime(df["timestamp_utc"], utc=True) + df = df.set_index("timestamp_utc") + rain_col = next((c for c in df.columns if "rain" in c.lower()), None) + if rain_col: + rain = df[df[rain_col] > 0.2] + if not rain.empty: + last_ts = rain.index.max() + result["last_rain"] = { + "mm": round(float(rain.loc[last_ts, rain_col]), 1), + "hours_ago": round((pd.Timestamp.now(tz="UTC") - last_ts).total_seconds() / 3600, 1), + } + except Exception: + pass + + return result + + +# --------------------------------------------------------------------------- +# Group B: Slow data (ThingsBoard + energy, ~1-2s network) +# --------------------------------------------------------------------------- + +def _fetch_group_b(today: _date_cls) -> dict: + """TB sensors + irrigation + energy predictions. Network-bound.""" + from concurrent.futures import ThreadPoolExecutor, as_completed + + hub = _vs_hub() + + # Pre-load IMS DF once for all 3 energy predictions (avoids 3x CSV re-read) + ims_df = hub.weather.get_dataframe() + + yesterday = str(today - _td(days=1)) + today_str = str(today) + tomorrow = str(today + _td(days=1)) + + tasks = { + "sensors": lambda: hub.vine_sensors.get_snapshot(mode="dashboard"), + "energy_yesterday": lambda: hub.energy.predict(yesterday), + "energy_today": lambda: hub.energy.predict(today_str), + "energy_tomorrow": lambda: hub.energy.predict(tomorrow, ims_df=ims_df), + } + + # Irrigation history from ThingsBoard + def _fetch_irrigation(): + from datetime import datetime as _dt, timezone as _tz + from src.thingsboard_client import IRRIGATION_KEYS + try: + tb = hub.vine_sensors._client() + end = _dt.now(tz=_tz.utc) + start = end - _td(hours=48) + df = tb.get_timeseries("Irrigation1", IRRIGATION_KEYS, start, end) + if df.empty: + return {"error": "No irrigation data in last 48 hours."} + vol_col = next((c for c in df.columns if "volume" in c.lower()), None) + flow_col = next((c for c in df.columns if "flow" in c.lower()), None) + check_col = vol_col or flow_col + last_event = None + if check_col: + nonzero = df[df[check_col] > 0] + if not nonzero.empty: + last_ts = nonzero.index.max() + last_event = { + "hours_ago": round((pd.Timestamp.now(tz="UTC") - last_ts).total_seconds() / 3600, 1), + } + if vol_col and pd.notna(nonzero.loc[last_ts, vol_col]): + last_event["volume_l"] = round(float(nonzero.loc[last_ts, vol_col]), 1) + return {"last_event": last_event} + except Exception as exc: + return {"error": str(exc)} + + tasks["irrigation"] = _fetch_irrigation + + results = {} + with ThreadPoolExecutor(max_workers=6) as pool: + futures = {pool.submit(fn): name for name, fn in tasks.items()} + for f in as_completed(futures): + name = futures[f] + try: + results[name] = f.result() + except Exception as exc: + results[name] = {"error": str(exc)} + return results + + +# --------------------------------------------------------------------------- +# Main render function +# --------------------------------------------------------------------------- + +# --------------------------------------------------------------------------- +# Control System Verification section (folded) +# --------------------------------------------------------------------------- + +def _render_verification_section() -> None: + """Render the control-system verification report as a folded expander.""" + import json + from pathlib import Path + + report_path = Path(__file__).resolve().parent.parent / "Data" / "verification_report.json" + + with st.expander("Control System Verification Report", expanded=False): + # ── Methodology explanation ────────────────────────────── + st.markdown(""" +**What this report does** + +The verification script (`scripts/verify_control_system.py`) compares what the +DayAheadPlanner *would have commanded* against what the trackers *actually did* +over the last 10 days. It runs 10 automated checks: + +| Step | Check | Data source | +|------|-------|-------------| +| 1 | Pull actual tracker angles | ThingsBoard Tracker501-509 | +| 2 | Pull actual energy production | ThingsBoard Plant asset (Wh) | +| 3 | Pull historical weather | Air1 ambient sensor (temp, PAR) | +| 4 | Run DayAheadPlanner per day | Real weather as perfect forecast | +| 5 | Compute astronomical angles | pvlib solar position model | +| 6 | Compare planned vs actual angles | MAE, max deviation, % within 2 deg | +| 7 | Validate InterventionGate decisions | No shade before 10:00, temp/GHI thresholds | +| 8 | Verify energy budget compliance | Daily cost <= daily budget ceiling | +| 9 | Cross-validate FvCB photosynthesis | A range, shading_helps consistency | +| 10 | Generate scorecard | Per-day and overall PASS/WARN/FAIL | + +**How to interpret the results** + +- **Angle alignment**: the MAE between the astronomical model and the real tracker. + Deviations > 2 deg are mostly at sunrise/sunset where the model clips at +/-60 deg + but the physical tracker can reach +/-73 deg. +- **Gate compliance**: verifies that no shading was triggered when it should not + have been (before 10:00, below 30 deg C, low GHI, May). +- **Budget compliance**: the planner must never exceed the daily energy ceiling. +- **FvCB consistency**: the Farquhar model must return physically plausible A values + and the `shading_helps` flag must agree with the temperature-based transition rule. +""") + st.markdown("---") + + # ── Load and display report ────────────────────────────── + if not report_path.exists(): + st.info( + "No verification report found. Run the verification script to generate one:\n\n" + "```\npython scripts/verify_control_system.py --days 10 " + "--output Data/verification_report.json\n```" + ) + return + + try: + report = json.loads(report_path.read_text()) + except Exception as exc: + st.error(f"Failed to load report: {exc}") + return + + sc = report.get("scorecard", {}) + checks = sc.get("checks", {}) + overall = sc.get("overall", "N/A") + generated = sc.get("generated_at", "unknown") + days = sc.get("days_analyzed", 0) + + # ── Overall badge ──────────────────────────────────────── + _badge_colors = {"PASS": "green", "WARN": "orange", "FAIL": "red"} + _badge_emoji = {"PASS": "white_check_mark", "WARN": "warning", "FAIL": "x"} + badge_color = _badge_colors.get(overall, "gray") + badge_emoji = _badge_emoji.get(overall, "question") + + st.markdown( + f"### Overall: :{badge_emoji}: **{overall}**\n\n" + f"*{days} days analyzed — generated {generated[:16].replace('T', ' ')} UTC*" + ) + + # ── Per-check results ──────────────────────────────────── + cols = st.columns(len(checks)) + for col, (name, info) in zip(cols, checks.items()): + if not isinstance(info, dict): + continue + status = info.get("status", "N/A") + color = _badge_colors.get(status, "gray") + emoji = _badge_emoji.get(status, "question") + label = name.replace("_", " ").title() + with col: + st.markdown(f"**{label}**") + st.markdown(f":{emoji}: {status}") + # Show key metric + if "mae_deg" in info: + st.caption(f"MAE {info['mae_deg']}deg, {info.get('within_tolerance_pct', 0):.0f}% within 2deg") + elif "critical" in info: + st.caption(f"{info['critical']} critical, {info['warnings']} warn") + elif "days_exceeded" in info: + st.caption(f"{info['days_exceeded']} days exceeded") + elif "issues" in info: + st.caption(f"{info['issues']} issues, {info.get('errors', 0)} errors") + + # ── Per-day table ──────────────────────────────────────── + plans = report.get("plans", {}) + violations = report.get("violations", []) + budget_results = report.get("budget_results", []) + + if plans: + st.markdown("#### Per-Day Breakdown") + rows = [] + budget_lookup = {r["date"]: r for r in budget_results} + for day_str in sorted(plans.keys()): + plan = plans[day_str] + if "error" in plan: + rows.append({ + "Date": day_str, "Interventions": "ERR", + "Budget Used (%)": "-", "Gate Violations": "-", + }) + continue + n_interv = plan.get("n_intervention_slots", 0) + util = plan.get("budget_utilisation_pct", 0) + day_viol = sum(1 for v in violations + if v.get("date") == day_str and v.get("severity") == "CRITICAL") + rows.append({ + "Date": day_str, + "Interventions": n_interv, + "Budget Used (%)": f"{util:.1f}", + "Gate Violations": day_viol, + }) + st.dataframe(pd.DataFrame(rows), hide_index=True, use_container_width=True) + + # ── Angle alignment detail ─────────────────────────────── + comp_summary = report.get("comparison_summary", {}) + angle_info = checks.get("angle_alignment", {}) + if angle_info: + st.markdown("#### Angle Alignment Detail") + st.markdown( + f"Compared **{comp_summary.get('matched_records', 0)}** planned slots " + f"against actual Tracker501 telemetry.\n\n" + f"- **MAE**: {angle_info.get('mae_deg', 'N/A')} deg\n" + f"- **Within +/-2 deg tolerance**: {angle_info.get('within_tolerance_pct', 'N/A')}%\n\n" + f"*Large deviations (>50 deg) are concentrated at sunrise/sunset slots " + f"where the pvlib model clips at +/-60 deg but the physical tracker " + f"reaches +/-73 deg. Midday alignment is typically within 1-2 deg.*" + ) + + # ── Re-run button ──────────────────────────────────────── + st.markdown("---") + st.caption( + "To refresh this report, run from the terminal:\n\n" + "`python scripts/verify_control_system.py --days 10 " + "--output Data/verification_report.json`" + ) + + +def render_tab_advisor() -> None: + today = _date_cls.today() + _now_vs = st.session_state.get("current_time_israel") or _now_israel() + + st.header("Vineyard Advisor") + + # ── Session state ───────────────────────────────────────────────── + if "chat_history" not in st.session_state: + st.session_state.chat_history = [] + if "chatbot" not in st.session_state: + st.session_state.chatbot = None + if "chatbot_available" not in st.session_state: + st.session_state.chatbot_available = None + + _GRP_A = "vs_grp_a" + _GRP_B = "vs_grp_b" + for k in (_GRP_A, _GRP_B): + if k not in st.session_state: + st.session_state[k] = None + + # ── Pre-warm chatbot in background ──────────────────────────────── + if "chatbot_warmup_started" not in st.session_state: + st.session_state.chatbot_warmup_started = True + def _warmup(): + try: + from src.vineyard_chatbot import VineyardChatbot + bot = VineyardChatbot(hub=_vs_hub()) + st.session_state.chatbot = bot + st.session_state.chatbot_available = True + # Try to warm up Gemini client (may fail without API key — that's OK) + if bot.has_api_key: + _ = bot.client + except Exception: + pass + threading.Thread(target=_warmup, daemon=True).start() + + # ══════════════════════════════════════════════════════════════════ + # 1. VINE STAGE (instant — no IO) + # ══════════════════════════════════════════════════════════════════ + + from src.phenology import estimate_stage_for_date, next_stage_for_date + stage = estimate_stage_for_date(today) + next_label, _, days_until = next_stage_for_date(today) + + # ── Live vineyard camera + vine stage side by side ──────────── + _cam_col, _stage_col = st.columns([1.2, 1]) + + with _cam_col: + import streamlit.components.v1 as _components + _components.html( + """ + + Vineyard live view + + """, + height=300, + ) + st.caption("Live picture from our site in Yeruham. Vine: Chenin Blanc. Energy capacity: 100 kW.") + + with _stage_col: + st.subheader(f"Vine stage: {stage.label}") + st.markdown(stage.description) + if days_until > 0: + st.caption(f"Next stage: **{next_label}** in ~{days_until} days") + st.caption(f"{_now_vs.strftime('%A %d %B %Y, %H:%M')} Israel time") + + st.divider() + + # ══════════════════════════════════════════════════════════════════ + # GROUP A: Weather + Forecast (fast, ~200ms from cached CSV) + # ══════════════════════════════════════════════════════════════════ + + if st.session_state[_GRP_A] is None: + st.session_state[_GRP_A] = _fetch_group_a(today) + + a = st.session_state[_GRP_A] + _wx = a.get("weather", {}) + + # Auto-refresh stale IMS data (>60 min) — at most once per session + _wx_age = _wx.get("age_minutes") + if _wx_age is not None and _wx_age > 60: + _ims_status = ensure_ims_refresh_background(days=3) + if _ims_status.get("running"): + st.info(f"Weather data is {_wx_age:.0f} min old — refreshing...") + elif _ims_status.get("ok") and not st.session_state.get("vs_ims_refreshed"): + st.session_state["vs_ims_refreshed"] = True + _vs_hub().weather._df_cache.invalidate("ims") + st.session_state[_GRP_A] = None + st.session_state[_GRP_B] = None + st.rerun() + elif _wx_age > 60: + st.caption(f"Weather data is {_wx_age:.0f} min old (IMS refresh attempted).") + + # ── 2. WEATHER FORECAST ─────────────────────────────────────────── + + st.subheader("Weather — recent week") + _forecast = a.get("week_forecast", {}) + if "error" in _forecast: + st.caption(f"Weather: {_forecast['error']}") + else: + days_list = _forecast.get("days", []) + if days_list: + n_cols = min(len(days_list), 7) + cols = st.columns(n_cols) + for i, day in enumerate(days_list[:7]): + with cols[i]: + st.markdown(f"**{day['date']}**") + high = day.get("high") + low = day.get("low") + if high is not None: + st.metric("High", f"{high:.0f} C", label_visibility="collapsed") + st.caption(f"{low:.0f}–{high:.0f} C ({day.get('label', '')})") + events = [] + if day.get("rain_mm"): + events.append(f"Rain {day['rain_mm']} mm") + if day.get("wind_ms"): + events.append(f"Wind {day['wind_ms']:.0f} m/s") + if events: + st.caption(" | ".join(events)) + if _forecast.get("note"): + st.caption(_forecast["note"]) + + # Current conditions — compact one-liner + # Extract once — used later in irrigation VPD calc + _rh = _wx.get("rh_percent") if "error" not in _wx else None + + if "error" not in _wx: + _t = _wx.get("air_temperature_c") + _ws = _wx.get("wind_speed_ms") + parts = [] + if _t is not None: + parts.append(f"**{_t:.0f} C** ({_temp_word(_t)})") + if _rh is not None: + parts.append(f"Humidity {_rh:.0f}%") + if _ws is not None: + parts.append(f"Wind {_ws:.1f} m/s") + age_str = f" — {_wx_age:.0f} min ago" if _wx_age else "" + if parts: + st.markdown("Now: " + " | ".join(parts) + age_str) + + st.divider() + + # ══════════════════════════════════════════════════════════════════ + # 5. SHADING (instant — uses InterventionGate, same logic as control loop) + # ══════════════════════════════════════════════════════════════════ + + st.subheader("Panel shading") + _shading_assessed = False + + if "error" not in _wx: + _t_now = _wx.get("air_temperature_c") + _ghi_now = _wx.get("ghi_w_m2") + _rh_now = _wx.get("rh_percent") + _wind_now = _wx.get("wind_speed_ms") + + if _t_now is not None: + _shading_assessed = True + _gate_result = _run_intervention_gate( + stage_id=stage.id, temp_c=_t_now, ghi=_ghi_now, hour=_now_israel().hour, + ) + + if _gate_result["status"] == "dormant": + st.markdown( + "Panels at **full tracking** — maximum energy generation. " + "The vine is dormant (no leaves, no canopy) so panel position " + "has no effect on the plant. All energy goes to the grid." + ) + elif _gate_result["status"] == "blocked": + reason = _gate_result["reason"] + st.markdown(f"Panels at **full tracking** — {reason}") + else: + # Gate passed — stress conditions met + st.markdown( + f"**Stress conditions detected** — " + f"{_gate_result['reason']}. " + f"The system may activate minimum-dose shading to protect " + f"the fruiting zone while preserving top-canopy productivity." + ) + + # Wind stow check + if _wind_now is not None: + from src.command_arbiter import CommandArbiter + wind_override = CommandArbiter.check_wind_stow(_wind_now) + if wind_override: + st.warning( + f"Wind stow active: {_wind_now:.1f} m/s — " + f"panels flat (0°) for structural safety. " + f"Overrides all other commands." + ) + + # Detailed gate explanation + with st.expander("How shading decisions work"): + st.markdown( + "Panels **always default to full astronomical tracking** " + "(following the sun for maximum energy). Shading is a rare, " + "minimum-dose intervention that activates only when **all** " + "of these conditions are true simultaneously:\n\n" + f"| Condition | Threshold | Current |\n" + f"|---|---|---|\n" + f"| Sunlight (GHI) | ≥ 400 W/m² | {_ghi_now:.0f} W/m² {'✓' if _ghi_now and _ghi_now >= 400 else '✗'} |\n" + f"| Leaf temperature | ≥ 30°C (Rubisco transition) | {_t_now:.0f}°C {'✓' if _t_now >= 30 else '✗'} |\n" + f"| Water stress (CWSI) | ≥ 0.4 | estimated from temp |\n" + f"| Morning light | After 10:00 | {'✓' if _now_israel().hour >= 10 else '✗'} |\n" + f"| Biology (FvCB model) | Shading helps photosynthesis | {'✓' if _t_now >= 30 and (_ghi_now or 0) >= 400 else '✗'} |\n\n" + "**Why?** Below 30°C, the vine is RuBP-limited — light is the " + "bottleneck, so reducing light (shading) hurts photosynthesis. " + "Above 30°C, the vine becomes Rubisco-limited — the enzyme is the " + "bottleneck, and reducing excess light can actually help by " + "lowering heat load on the fruiting zone." + ) + + if not _shading_assessed: + st.caption("No weather data available — cannot assess shading conditions.") + + st.divider() + + # ══════════════════════════════════════════════════════════════════ + # 5b. TOMORROW'S PLAN (computed from IMS forecast + DayAheadPlanner) + # ══════════════════════════════════════════════════════════════════ + + st.subheader("Tomorrow's plan") + _tomorrow = today + _td(days=1) + _PLAN_KEY = "vs_tomorrow_plan" + try: + if _PLAN_KEY not in st.session_state: + st.session_state[_PLAN_KEY] = _compute_tomorrow_plan(_tomorrow) + _plan = st.session_state[_PLAN_KEY] + if _plan and "error" not in _plan: + plan_obj = _plan["plan"] + + # Summary sentence + if plan_obj.n_intervention_slots == 0: + st.markdown( + f"**Full tracking all day** — panels follow the sun for maximum energy. " + f"No heat stress expected (forecast peak below shading threshold)." + ) + else: + # Find intervention time window + int_slots = [s for s in plan_obj.slots if s.offset_deg > 0] + first_time = int_slots[0].time + last_time = int_slots[-1].time + avg_offset = sum(s.offset_deg for s in int_slots) / len(int_slots) + st.markdown( + f"**{plan_obj.n_intervention_slots} slots with shade** " + f"({first_time}–{last_time} UTC), " + f"average {avg_offset:.0f}° offset from tracking. " + f"Energy cost: {plan_obj.total_energy_cost_kwh:.3f} kWh " + f"({plan_obj.budget_utilisation_pct:.1f}% of daily budget)." + ) + + # Why this plan? + with st.expander("Why this plan?"): + st.markdown( + "The day-ahead planner uses dynamic programming to find the " + "optimal panel tilt trajectory for tomorrow. It balances two goals:\n\n" + "1. **Maximise energy** — panels track the sun (default)\n" + "2. **Protect the vine** — tilt panels to shade the fruiting zone " + "when heat stress is forecast\n\n" + "The planner only activates shading when **all** conditions are met:\n" + f"- Air temperature ≥ 30°C (Rubisco transition)\n" + f"- Solar radiation ≥ 400 W/m² (meaningful heat load)\n" + f"- Water stress indicator (CWSI) above threshold\n" + f"- Before 10:00 — no shading (morning light is critical)\n\n" + f"**Vine stage:** {plan_obj.stage_id.replace('_', ' ').title()}\n\n" + f"**Budget:** {plan_obj.daily_budget_kwh:.2f} kWh available " + f"(from hierarchical Year → Month → Week → Day allocation)" + ) + + # Slot-level detail + if plan_obj.slots: + slot_data = [] + for s in plan_obj.slots: + if s.gate_passed or s.offset_deg > 0: + slot_data.append({ + "Time (UTC)": s.time, + "Offset": f"{s.offset_deg:.0f}°", + "Energy cost": f"{s.energy_cost_kwh:.4f} kWh", + "Status": "Shade" if s.offset_deg > 0 else "Track", + }) + if slot_data: + st.dataframe(pd.DataFrame(slot_data), hide_index=True) + else: + st.caption("All slots at full tracking — no interventions needed.") + else: + _err = _plan.get("error", "Could not compute plan.") if _plan else "No IMS data for planning." + st.caption(f"Plan unavailable: {_err}") + except Exception as _exc: + st.caption(f"Plan unavailable: {_exc}") + + st.divider() + + # ══════════════════════════════════════════════════════════════════ + # GROUP B: Energy + Irrigation + Sensors (slow, ~1-2s network) + # ══════════════════════════════════════════════════════════════════ + + if st.session_state[_GRP_B] is None: + with st.spinner("Loading energy & irrigation data..."): + st.session_state[_GRP_B] = _fetch_group_b(today) + + b = st.session_state[_GRP_B] + _sns = b.get("sensors", {}) + + # ── 3. ENERGY GENERATION ────────────────────────────────────────── + + st.subheader("Energy generation") + _en_y = b.get("energy_yesterday", {}) + _en_t = b.get("energy_today", {}) + _en_m = b.get("energy_tomorrow", {}) + + en_cols = st.columns(3) + for col, label, data in [ + (en_cols[0], "Yesterday", _en_y), + (en_cols[1], "Today (so far)", _en_t), + (en_cols[2], "Tomorrow (est.)", _en_m), + ]: + with col: + st.markdown(f"**{label}**") + kwh = data.get("daily_kwh") + if kwh is None: + st.caption(data.get("error", "No data")) + else: + peak = data.get("peak_hour", "?") + st.metric("kWh", f"{kwh:.1f}") + st.caption(f"Peak at {peak}:00") + + px = _get_plotly() + if px is not None: + chart_data = [] + for label, data in [("Yesterday", _en_y), ("Today", _en_t), ("Tomorrow", _en_m)]: + kwh = data.get("daily_kwh") + if kwh is not None: + chart_data.append({"Day": label, "kWh": kwh}) + if chart_data: + fig = px.bar(pd.DataFrame(chart_data), x="Day", y="kWh", + color_discrete_sequence=["#FF9800"]) + fig.update_layout(height=200, margin=dict(t=10, b=10, l=40, r=10), showlegend=False) + st.plotly_chart(fig, use_container_width=True) + + # Source attribution + src_y = _en_y.get("source", "") + src_t = _en_t.get("source", "") + if "ThingsBoard" in src_t: + st.caption("Source: live inverter data (ThingsBoard).") + else: + st.caption("Source: analytical estimate (48 kW system).") + st.caption("No energy was lost to shading today — panels at full tracking.") + + st.divider() + + # ── 4. IRRIGATION ───────────────────────────────────────────────── + + st.subheader("Irrigation") + irr_cols = st.columns(3) + + with irr_cols[0]: + st.markdown("**Last water**") + _irr = b.get("irrigation", {}) + _last_rain = a.get("last_rain") + _irr_event = _irr.get("last_event") if isinstance(_irr, dict) and "error" not in _irr else None + + if _irr_event: + ago = _irr_event.get("hours_ago", 0) + vol = _irr_event.get("volume_l") + vol_str = f" ({vol:.0f} L)" if vol else "" + st.markdown(f"Irrigated **{_hours_ago_str(ago)}**{vol_str}") + else: + st.caption("No irrigation in last 48 hours") + + if _last_rain: + st.markdown(f"Rain **{_hours_ago_str(_last_rain['hours_ago'])}** ({_last_rain['mm']} mm)") + else: + st.caption("No recent rain") + + with irr_cols[1]: + st.markdown("**Soil now**") + soil_m = _sns.get("treatment_soil_moisture_pct") if isinstance(_sns, dict) and "error" not in _sns else None + if soil_m is not None: + st.metric("Soil moisture", f"{soil_m:.0f}%") + st.caption(_soil_word(soil_m)) + else: + st.caption("No soil data") + + if _t_now is not None and _rh is not None: + es = 0.6108 * math.exp(17.27 * _t_now / (_t_now + 237.3)) + vpd = max(es * (1 - _rh / 100), 0.0) + if vpd > 3.0: + st.caption("Air is **very dry** — high evaporation") + elif vpd > 2.0: + st.caption("Air is dry — moderate evaporation") + + with irr_cols[2]: + st.markdown("**When next?**") + if soil_m is not None: + tomorrow_high = None + forecast_days = _forecast.get("days", []) if isinstance(_forecast, dict) else [] + if forecast_days: + tomorrow_high = forecast_days[-1].get("high") + + if soil_m < 12: + st.markdown("**Now** — soil is very dry") + elif soil_m < 18: + if tomorrow_high and tomorrow_high > 33: + st.markdown("**Tomorrow morning** — soil drying + hot weather ahead") + else: + st.markdown("**1-2 days** — soil getting dry") + elif soil_m < 25: + if tomorrow_high and tomorrow_high > 36: + st.markdown("**Tomorrow** possible — extreme heat forecast") + else: + st.markdown("**Not yet** — soil is fine") + else: + st.markdown("**Not needed** — soil is well-watered") + else: + st.caption("Cannot estimate — no soil data") + + st.divider() + + # ── REFRESH ─────────────────────────────────────────────────────── + + if st.button("Refresh all data", key="vs_refresh_all"): + st.session_state[_GRP_A] = None + st.session_state[_GRP_B] = None + st.session_state.pop("vs_ims_refreshed", None) + st.rerun() + + st.divider() + + # ══════════════════════════════════════════════════════════════════ + # 6. CHATBOT + # ══════════════════════════════════════════════════════════════════ + + st.subheader("Ask the advisor") + st.markdown( + "Ask about shading decisions, vine health, weather, or irrigation. " + "The advisor uses live sensor data and models." + ) + + _qa_cols = st.columns(4) + with _qa_cols[0]: + if st.button("Should I shade?", key="qa_shade_now"): + st.session_state.chat_history.append( + {"role": "user", "content": "Should I shade right now? Check the current weather and tell me."}) + with _qa_cols[1]: + if st.button("Tomorrow's outlook", key="qa_forecast"): + st.session_state.chat_history.append( + {"role": "user", "content": "What does tomorrow look like for the vineyard? Should I prepare for anything?"}) + with _qa_cols[2]: + if st.button("Irrigation advice", key="qa_irrigation"): + st.session_state.chat_history.append( + {"role": "user", "content": "Check the soil moisture and weather. When should I irrigate next?"}) + with _qa_cols[3]: + if st.button("Clear chat", key="qa_clear"): + st.session_state.chat_history = [] + st.rerun() + + st.divider() + + # Lazy-init chatbot + def _ensure_chatbot(): + if "chatbot" not in st.session_state: + st.session_state.chatbot = None + if "chatbot_available" not in st.session_state: + st.session_state.chatbot_available = None + if st.session_state.chatbot is not None: + return st.session_state.chatbot + try: + from src.vineyard_chatbot import VineyardChatbot + st.session_state.chatbot = VineyardChatbot(hub=_vs_hub()) + st.session_state.chatbot_available = True + return st.session_state.chatbot + except Exception: + st.session_state.chatbot = None + st.session_state.chatbot_available = False + return None + + def _render_tool_data(data: dict) -> None: + """Farmer-friendly rendering — no 3D scenes, DLI, or technical charts.""" + if not data or "error" in data: + return + # Energy prediction — simple metric + if "daily_kwh" in data and data["daily_kwh"] is not None: + st.metric("Daily energy", f"{data['daily_kwh']:.1f} kWh") + return + # Stress advisory summary + if "stress_profile" in data and data["stress_profile"].get("summary"): + st.info(data["stress_profile"]["summary"]) + return + # Shading comparison — plain numbers, no technical labels + if "A_unshaded" in data and "A_shaded" in data: + change = data.get("A_change_pct", 0) + if change < -5: + st.warning(f"Shading would reduce vine activity by {abs(change):.0f}%") + elif change > 5: + st.success(f"Shading would help — vine activity improves by {change:.0f}%") + else: + st.info("Shading makes little difference right now.") + return + # Schedule table (e.g. irrigation schedule) + if "schedule" in data and isinstance(data["schedule"], list): + st.dataframe(pd.DataFrame(data["schedule"]), hide_index=True) + return + # Tabular data + if "rows" in data and isinstance(data["rows"], list) and data["rows"]: + st.dataframe(pd.DataFrame(data["rows"]), hide_index=True) + return + # Skip 3D scenes, DLI charts, angle sweeps, heatmaps — not farmer-friendly + if "scene_3d_html" in data or "angles" in data: + return + # Data summary + if "summarised" in data and data.get("columns"): + rows = [{"Column": k, **v} for k, v in data["columns"].items()] + if rows: + st.dataframe(pd.DataFrame(rows), hide_index=True) + return + + def _render_grounding_metadata(entry: dict, msg_index: int = -1) -> None: + """Render confidence badge, sources, caveats, and feedback under a response.""" + confidence = entry.get("confidence", "") + sources = entry.get("sources", []) + caveats = entry.get("caveats", []) + violations = entry.get("rule_violations", []) + response_mode = entry.get("response_mode", "info") + + # Dual-channel mode indicator + if response_mode == "advisory": + st.caption(":orange[Advisory — recommendation with reasoning]") + elif response_mode == "info" and confidence: + st.caption(":blue[Information — factual data]") + + # Confidence badge + if confidence: + badge_colors = { + "high": "green", + "medium": "orange", + "low": "red", + "insufficient_data": "red", + } + color = badge_colors.get(confidence, "gray") + label = confidence.replace("_", " ").title() + st.caption(f":{color}[Confidence: {label}]") + + # Sources + if sources: + st.caption(f"Source: {', '.join(sources)}") + + # Caveats + for caveat in caveats: + st.caption(f"Note: {caveat}") + + # Rule violations (warnings only — blocks replace the message) + for v in violations: + if v.get("severity") == "warn": + st.caption(f"Rule check ({v.get('rule', '?')}): {v.get('message', '')}") + + # Feedback buttons + if msg_index >= 0: + _render_feedback_buttons(entry, msg_index) + + def _render_feedback_buttons(entry: dict, msg_index: int) -> None: + """Render thumbs up/down and flag buttons for a response.""" + fb_key = f"fb_{msg_index}" + # Check if already rated + if entry.get("_feedback"): + fb = entry["_feedback"] + label = {"thumbs_up": "Helpful", "thumbs_down": "Not helpful", "flag_incorrect": "Flagged"} + st.caption(f"Feedback: {label.get(fb, fb)}") + return + + cols = st.columns([1, 1, 1, 7]) + with cols[0]: + if st.button("👍", key=f"{fb_key}_up", help="Helpful"): + _submit_feedback(entry, msg_index, "thumbs_up") + with cols[1]: + if st.button("👎", key=f"{fb_key}_down", help="Not helpful"): + _submit_feedback(entry, msg_index, "thumbs_down") + with cols[2]: + if st.button("🚩", key=f"{fb_key}_flag", help="Flag as incorrect"): + _submit_feedback(entry, msg_index, "flag_incorrect") + + def _submit_feedback(entry: dict, msg_index: int, feedback_type: str) -> None: + """Log feedback and mark the message as rated.""" + try: + from src.chatbot.feedback import log_feedback + + # Find the preceding user message + query = "" + if msg_index > 0: + for i in range(msg_index - 1, -1, -1): + prev = st.session_state.chat_history[i] + if prev.get("role") == "user": + query = prev.get("content", "") + break + + log_feedback( + query=query, + response=entry.get("content", ""), + feedback=feedback_type, + confidence=entry.get("confidence", ""), + sources=entry.get("sources", []), + tool_calls=entry.get("tool_calls", []), + rule_violations=entry.get("rule_violations", []), + response_mode=entry.get("response_mode", ""), + ) + except Exception as exc: + logging.getLogger(__name__).warning("Failed to log feedback: %s", exc) + + # Mark as rated in session state + st.session_state.chat_history[msg_index]["_feedback"] = feedback_type + st.rerun() + + # Display chat history + for _msg_idx, entry in enumerate(st.session_state.chat_history): + role = entry.get("role", "user") + with st.chat_message(role): + st.markdown(entry.get("content", "")) + if role == "assistant": + if entry.get("data"): + _render_tool_data(entry["data"]) + _render_grounding_metadata(entry, msg_index=_msg_idx) + + # Process pending message + _needs_response = ( + st.session_state.chat_history + and st.session_state.chat_history[-1].get("role") == "user" + ) + + if _needs_response: + last_msg = st.session_state.chat_history[-1]["content"] + _hist_for_bot = st.session_state.chat_history[:-1] + + with st.chat_message("assistant"): + import time as _time + t0 = _time.perf_counter() + spinner_msg = "Loading advisor..." if st.session_state.chatbot is None else "Thinking..." + try: + with st.spinner(spinner_msg): + chatbot = _ensure_chatbot() + resp = chatbot.chat(last_msg, history=_hist_for_bot) if chatbot else None + except Exception as _chat_exc: + resp = None + st.error(f"Advisor error: {_chat_exc}") + elapsed = _time.perf_counter() - t0 + st.caption(f"{elapsed:.1f}s") + + if resp is None: + st.markdown("Could not load the advisor. Check that a Google API key is set, or ask about vine biology rules.") + st.session_state.chat_history.append({ + "role": "assistant", + "content": "Could not load the advisor. Check that a Google API key is set, or ask about vine biology rules.", + "data": {}, "tool_calls": [], + "confidence": "insufficient_data", "sources": [], "caveats": [], + }) + else: + st.markdown(resp.message) + if resp.data: + _render_tool_data(resp.data) + _render_grounding_metadata({ + "confidence": resp.confidence, + "sources": resp.sources, + "caveats": resp.caveats, + "rule_violations": resp.rule_violations, + }) + st.session_state.chat_history.append({ + "role": "assistant", "content": resp.message, + "data": resp.data if resp.data else {}, + "tool_calls": resp.tool_calls, + "confidence": resp.confidence, + "sources": resp.sources, + "caveats": resp.caveats, + "rule_violations": resp.rule_violations, + "response_mode": getattr(resp, "response_mode", "info"), + }) + st.rerun() + + _user_input = st.chat_input("Ask the vineyard advisor...") + if _user_input: + st.session_state.chat_history.append({"role": "user", "content": _user_input}) + st.rerun() + + # ══════════════════════════════════════════════════════════════════ + # CONTROL SYSTEM VERIFICATION (folded section at bottom) + # ══════════════════════════════════════════════════════════════════ + + st.divider() + _render_verification_section() diff --git a/ui/tab_data.py b/ui/tab_data.py new file mode 100644 index 0000000000000000000000000000000000000000..2adb48992a02a2f4dfc9966c86f157b650f47993 --- /dev/null +++ b/ui/tab_data.py @@ -0,0 +1,1654 @@ +""" +Data tab. +""" + +from __future__ import annotations + +import streamlit as st +import pandas as pd +import numpy as np + +from config import settings +from ui.bootstrap import _BRAND_GREEN, _HAS_PLOTLY, load_labels, load_metrics + +if _HAS_PLOTLY: + import plotly.graph_objects as go + from plotly.subplots import make_subplots + + + +def render_tab_data() -> None: + _data_section = st.radio( + + "Section", + + ["Farquhar Model", "Model Validation", "Data Explorer"], + + horizontal=True, + + ) + + + if _data_section == "Farquhar Model": + + st.header("How we measure vine photosynthesis") + + st.markdown( + + "Before we can predict photosynthesis, we need to **measure** it. " + + "On-site sensors record light, temperature, humidity, and CO2 every " + + "15 minutes. A well-established plant biology model (Farquhar et al., 1980) " + + "converts these readings into the photosynthesis rate **A** — " + + "how fast the vine is converting sunlight into sugar. " + + "This tab shows the results of that calculation." + + ) + + with st.expander("How does the Farquhar model work?"): + + st.markdown( + + "Uses the **Farquhar et al. (1980)** mechanistic model with " + + "**Greer & Weedon (2012)** grapevine parameters to compute the net leaf " + + "photosynthesis rate **A** (\u00b5mol CO\u2082 m\u207b\u00b2 s\u207b\u00b9) from on-site sensor readings " + + "(PAR, leaf temperature, air temperature, CO\u2082, VPD). Only daytime rows " + + "(PAR > 50) during the growing season (May\u2013Sep) are used. " + + "Temperature dependencies use **Bernacchi et al. (2001)** kinetic constants.\n\n" + + "The core computation:\n\n" + + "1. **Rubisco-limited rate:** Ac = Vcmax \u00b7 (ci \u2212 \u0393*) / (ci + Kc \u00b7 (1 + O\u1d62 / Ko))\n" + + "2. **RuBP-limited rate:** Aj = J \u00b7 (ci \u2212 \u0393*) / (4\u00b7ci + 8\u00b7\u0393*)\n" + + "3. **Net assimilation:** A = min(Ac, Aj) \u2212 Rd\n\n" + + "Where Vcmax and Jmax follow temperature-dependent Arrhenius curves " + + "(peak at 39\u00b0C and 36\u00b0C respectively for Semillon), J is solved from the " + + "light-response quadratic, and ci (intercellular CO\u2082) is derived from " + + "ambient CO\u2082 scaled by stomatal conductance (reduced by VPD and CWSI).\n\n" + + "#### How VPD and CWSI reduce photosynthesis\n\n" + + "Both VPD and CWSI act on photosynthesis through the same bottleneck: " + + "**stomatal conductance (gs)**. Stomata are the pores on the leaf surface " + + "that let CO\u2082 in for photosynthesis \u2014 but also let water vapor out.\n\n" + + "**VPD (Vapor Pressure Deficit)** measures how dry the air is. " + + "When VPD is high (hot, dry air), the leaf would lose water too fast, " + + "so the vine partially closes its stomata to conserve water. " + + "Less open stomata = less CO\u2082 enters the leaf = lower ci = lower A. " + + "The model applies an exponential decay: " + + "`gs_scale = exp(\u22120.3 \u00b7 max(0, VPD \u2212 1.0))`, " + + "so the effect kicks in above 1 kPa and intensifies with drier air.\n\n" + + "**CWSI (Crop Water Stress Index)** is computed from the leaf\u2013air " + + "temperature difference: `CWSI = (Tleaf \u2212 Tair \u2212 \u0394Tmin) / (\u0394Tmax \u2212 \u0394Tmin)`, " + + "clipped to [0, 1]. A well-watered vine transpires freely, keeping its " + + "leaves cooler than the air (CWSI \u2248 0). A stressed vine closes stomata, " + + "transpiration drops, and leaves heat up (CWSI \u2192 1). " + + "The model reduces stomatal conductance by `(1 \u2212 0.5 \u00b7 CWSI)`, " + + "so at full stress (CWSI = 1) stomatal opening is halved.\n\n" + + "Combined effect on ci: " + + "`ci = CO\u2082 \u00b7 (1 \u2212 1 / (1.6 \u00b7 gs_factor))` where " + + "`gs_factor = 1.2 \u00b7 VPD_scale \u00b7 (1 \u2212 0.5 \u00b7 CWSI)`\n\n" + + "This means on a hot, dry Negev afternoon (VPD > 3 kPa, CWSI > 0.5), " + + "ci drops sharply and photosynthesis can fall even when light is abundant " + + "\u2014 the vine has plenty of energy but cannot get enough CO\u2082 through " + + "its closed stomata.\n\n" + + "**Key references:**\n" + + "- [Farquhar, von Caemmerer & Berry (1980)](https://doi.org/10.1007/BF00386231) \u2014 " + + "Biochemical model of photosynthetic CO\u2082 assimilation\n" + + "- [Greer & Weedon (2012)](https://doi.org/10.1111/j.1365-3040.2011.02471.x) \u2014 " + + "Modelling photosynthetic responses to temperature of grapevine\n" + + "- [Bernacchi et al. (2001)](https://doi.org/10.1046/j.1365-3040.2001.00668.x) \u2014 " + + "Temperature dependence of Kc, Ko, and \u0393*" + + ) + + + st.subheader("Sensor inputs") + + st.markdown("The Farquhar model uses **6 columns** from the Air1 reference station, " + + "sampled every 15 minutes:") + + used_sensors_tab = pd.DataFrame([ + + {"Column": "Air1_PAR_ref", "Measurement": "Photosynthetically Active Radiation", "Units": "\u00b5mol m\u207b\u00b2 s\u207b\u00b9", "Used in": "Farquhar: electron transport (J)", "Notes": "Primary light input driving photosynthesis rate"}, + + {"Column": "Air1_leafTemperature_ref", "Measurement": "Leaf temperature", "Units": "\u00b0C", "Used in": "Farquhar: Vcmax, Jmax, Kc, Ko, \u0393*; CWSI", "Notes": "Controls enzyme kinetics; also used to compute CWSI"}, + + {"Column": "Air1_airTemperature_ref", "Measurement": "Air temperature", "Units": "\u00b0C", "Used in": "CWSI computation", "Notes": "Tleaf \u2212 Tair drives the water stress index"}, + + {"Column": "Air1_CO2_ref", "Measurement": "Ambient CO\u2082 concentration", "Units": "ppm", "Used in": "Farquhar: intercellular CO\u2082 (ci)", "Notes": "Substrate for carbon fixation by Rubisco (\u00d70.7 correction applied)"}, + + {"Column": "Air1_VPD_ref", "Measurement": "Vapor Pressure Deficit", "Units": "kPa", "Used in": "Farquhar: stomatal conductance \u2192 ci", "Notes": "High VPD closes stomata, reducing ci and thus A"}, + + {"Column": "Air1_airHumidity_ref", "Measurement": "Relative humidity", "Units": "%", "Used in": "Loaded but not consumed", "Notes": "VPD already encodes humidity; column is redundant"}, + + ]) + + st.dataframe(used_sensors_tab, hide_index=True) + + + labels_path = settings.PROCESSED_DIR / "stage1_labels.csv" + + validation_img = settings.OUTPUTS_DIR / "stage1_validation.png" + + + if labels_path.exists(): + + df_labels = load_labels(str(labels_path)) + + df_labels.index = pd.to_datetime(df_labels.index, utc=True) + + + # Metrics row + + c1, c2, c3, c4 = st.columns(4) + + c1.metric("Observations", f"{len(df_labels):,}") + + c2.metric("Avg photosynthesis rate", f"{df_labels.iloc[:, 0].mean():.1f}", + + help="Higher values mean the vine is growing faster. Typical range: 5-20.") + + c3.metric("Date from", df_labels.index.min().strftime("%Y-%m-%d")) + + c4.metric("Date to", df_labels.index.max().strftime("%Y-%m-%d")) + + + with st.expander("What does this table show?"): + + st.markdown( + + "Descriptive statistics (count, mean, std, min, quartiles, max) of the " + + "computed photosynthesis rate **A**. Typical grapevine values are 0\u201325 " + + "\u00b5mol CO\u2082 m\u207b\u00b2 s\u207b\u00b9. Values outside this range may indicate sensor issues." + + ) + + st.dataframe(df_labels.describe()) + + st.caption( + + "This table summarizes the photosynthesis measurements. The 'mean' row shows " + + "the average rate across all observations. Values between 5-20 are typical " + + "for healthy grapevines during the growing season." + + ) + + + st.download_button( + + "Download labels CSV", + + df_labels.to_csv(), + + file_name="stage1_labels.csv", + + mime="text/csv", + + ) + + + if validation_img.exists(): + + with st.expander("How to read the validation plots"): + + st.markdown( + + "**Top panel \u2014 Diurnal pattern:** A vs. hour of day (UTC). Expect a bell curve " + + "peaking mid-morning to early afternoon when light and temperature are optimal.\n\n" + + "**Bottom panel \u2014 A vs PAR:** Photosynthesis rate plotted against Photosynthetically " + + "Active Radiation. A should increase with PAR and saturate at high light levels, " + + "forming a characteristic light-response curve." + + ) + + st.image(str(validation_img), width='stretch') + + else: + + st.info("No pre-computed photosynthesis labels found. Run `python scripts/run_pipeline.py` to generate them.") + + + # --------------------------------------------------------------------------- + + + if _data_section == "Model Validation": + + st.header("FvCB Model Validation") + + st.markdown( + + "Comparison of our Farquhar-von Caemmerer-Berry (FvCB) photosynthesis model " + + "against measured data from " + + "[Greer & Weedon (2012)](https://doi.org/10.1111/j.1365-3040.2011.02471.x) " + + "for field-grown *Vitis vinifera* cv. **Semillon** in a hot climate " + + "(Riverina, NSW, Australia)." + + ) + + + # --- Reference data from Greer & Weedon (2012) --- + + _val_temps = [20, 25, 30, 35, 40] + + + # Fig 5a: Light-saturated Amax at ambient CO2 (389 ppm) + + _paper_amax = {20: 12.0, 25: 16.9, 30: 19.9, 35: 15.3, 40: 12.0} + + _paper_amax_se = {20: 1.5, 25: 1.3, 30: 1.8, 35: 1.2, 40: 1.5} + + + # Fig 11: Vcmax and Jmax (from Arrhenius fit to A/Ci curves) + + _paper_vcmax = {20: 20, 25: 38.5, 30: 58, 35: 85, 40: 110} + + _paper_jmax = {20: 60, 25: 98.3, 30: 135, 35: 165, 40: 170} + + + # Table 1: Stomatal limitation (%) + + _paper_stom_lim = {20: 13, 25: 20, 30: 25, 35: 31, 40: 34} + + + from src.farquhar_model import FarquharModel as _FMVal + + _val_model = _FMVal() + + + # ---- Section 1: Light Response Curves ---- + + st.subheader("1. Photosynthetic light response at different temperatures") + + st.markdown( + + "Light response curves (A vs PFD) at five leaf temperatures. " + + "Model run at ambient CO$_2$ = 389 ppm, VPD = 1.5 kPa." + + ) + + + _val_vpd = st.slider( + + "VPD for model curves (kPa)", 0.5, 3.0, 1.5, 0.1, + + key="val_vpd" + + ) + + _val_pfds = np.arange(0, 2100, 25) + + + if _HAS_PLOTLY: + + _lr_fig = go.Figure() + + _temp_colors = {20: "#1f77b4", 25: "#2ca02c", 30: "#d62728", + + 35: "#9467bd", 40: "#ff7f0e"} + + for t in _val_temps: + + # Model curve + + _a_vals = [_val_model.calc_photosynthesis( + + PAR=float(p), Tleaf=t, CO2=389, VPD=_val_vpd, Tair=t + + ) for p in _val_pfds] + + _lr_fig.add_trace(go.Scatter( + + x=_val_pfds, y=_a_vals, mode="lines", + + name=f"{t} °C (model)", + + line=dict(color=_temp_colors[t]), + + )) + + # Paper reference point (Amax) + + _lr_fig.add_trace(go.Scatter( + + x=[1800], y=[_paper_amax[t]], + + mode="markers", + + name=f"{t} °C (Greer & Weedon)", + + marker=dict(color=_temp_colors[t], size=12, symbol="star", + + line=dict(width=1, color="black")), + + error_y=dict(type="data", array=[_paper_amax_se[t]], visible=True), + + showlegend=True, + + )) + + _lr_fig.update_layout( + + xaxis_title="PFD [µmol photons m⁻² s⁻¹]", + + yaxis_title="A [µmol CO₂ m⁻² s⁻¹]", + + height=500, + + legend=dict(font=dict(size=10)), + + ) + + st.plotly_chart(_lr_fig) + + else: + + st.info("Install plotly for interactive charts.") + + + # ---- Section 2: A comparison table ---- + + st.subheader("2. Light-saturated A: Model vs Paper") + + _rows = [] + + for t in _val_temps: + + a_model = _val_model.calc_photosynthesis( + + PAR=2000, Tleaf=t, CO2=389, VPD=_val_vpd, Tair=t + + ) + + _rows.append({ + + "T_leaf (°C)": t, + + "A_model": round(a_model, 1), + + f"A_paper (Greer & Weedon)": _paper_amax[t], + + "Difference (%)": round((a_model - _paper_amax[t]) / _paper_amax[t] * 100, 0), + + "Limitation": "RuBP regen." if t <= 30 else "Rubisco", + + }) + + st.dataframe(pd.DataFrame(_rows), hide_index=True) + + + # ---- Section 3: Vcmax / Jmax temperature response ---- + + st.subheader("3. Vcmax and Jmax temperature response") + + st.markdown( + + "Temperature dependence of maximum carboxylation rate (Vcmax) and " + + "electron transport capacity (Jmax). Model uses modified Arrhenius " + + "(Medlyn et al. 2002) with Greer & Weedon (2012) activation/deactivation " + + "energies. Topt(Vcmax) = 39 °C, Topt(Jmax) = 36 °C." + + ) + + + _t_range = np.arange(15, 50, 0.5) + + _vcmax_curve = [_val_model.calc_Vcmax(t + 273.15) for t in _t_range] + + _jmax_curve = [_val_model.calc_Jmax(t + 273.15) for t in _t_range] + + + # Scale paper's Cc-based Vcmax/Jmax to our Ci-based values for comparison + + _scale_v = _val_model.params["k25_vcmax"] / 38.5 # ratio Ci-based/Cc-based + + _scale_j = _val_model.params["k25_jmax"] / 98.3 + + _paper_vcmax_scaled = {t: v * _scale_v for t, v in _paper_vcmax.items()} + + _paper_jmax_scaled = {t: j * _scale_j for t, j in _paper_jmax.items()} + + + if _HAS_PLOTLY: + + _vj_fig = make_subplots(rows=1, cols=2, + + subplot_titles=("Vcmax", "Jmax")) + + _vj_fig.add_trace(go.Scatter( + + x=list(_t_range), y=_vcmax_curve, mode="lines", + + name="Vcmax (model)", line=dict(color="#d62728"), + + ), row=1, col=1) + + _vj_fig.add_trace(go.Scatter( + + x=list(_paper_vcmax_scaled.keys()), + + y=list(_paper_vcmax_scaled.values()), + + mode="markers", name="Vcmax (paper, scaled)", + + marker=dict(color="#d62728", size=10, symbol="star", + + line=dict(width=1, color="black")), + + ), row=1, col=1) + + _vj_fig.add_trace(go.Scatter( + + x=list(_t_range), y=_jmax_curve, mode="lines", + + name="Jmax (model)", line=dict(color="#1f77b4"), + + ), row=1, col=2) + + _vj_fig.add_trace(go.Scatter( + + x=list(_paper_jmax_scaled.keys()), + + y=list(_paper_jmax_scaled.values()), + + mode="markers", name="Jmax (paper, scaled)", + + marker=dict(color="#1f77b4", size=10, symbol="star", + + line=dict(width=1, color="black")), + + ), row=1, col=2) + + _vj_fig.update_xaxes(title_text="Leaf temperature (°C)") + + _vj_fig.update_yaxes(title_text="µmol m⁻² s⁻¹") + + _vj_fig.update_layout(height=400) + + st.plotly_chart(_vj_fig) + + else: + + st.info("Install plotly for interactive charts.") + + + # ---- Section 4: Limitation regime ---- + + st.subheader("4. RuBP regeneration vs Rubisco carboxylation limitation") + + st.markdown( + + "The paper's key finding: **below 30 °C**, photosynthesis is limited by " + + "RuBP regeneration (electron transport / light reactions). " + + "**Above 30 °C**, Rubisco carboxylation becomes limiting due to " + + "declining CO$_2$ affinity and increased photorespiration.\n\n" + + "This 30 °C transition is critical for shading decisions:\n" + + "- **Below 30 °C**: shading reduces light and hurts photosynthesis (RuBP-limited)\n" + + "- **Above 30 °C**: shading may help by reducing heat stress on Rubisco" + + ) + + + if _HAS_PLOTLY: + + _ac_vals = [] + + _aj_vals = [] + + _t_lim = np.arange(15, 46, 0.5) + + for t in _t_lim: + + Tk = t + 273.15 + + Vcmax = _val_model.calc_Vcmax(Tk) + + Jmax = _val_model.calc_Jmax(Tk) + + J = _val_model.calc_electron_transport(2000, Jmax) + + gamma = _val_model.calc_gamma_star(Tk) + + Kc = _val_model.calc_Kc(Tk) + + Ko = _val_model.calc_Ko(Tk) + + ci = _val_model._ci_from_ca(389, 1.5, 0.0) + + Ac = Vcmax * (ci - gamma) / (ci + Kc * (1 + 210.0 / Ko)) + + Aj = J * (ci - gamma) / (4 * ci + 8 * gamma) + + Rd = 0.015 * Vcmax + + _ac_vals.append(Ac - Rd) + + _aj_vals.append(Aj - Rd) + + + _lim_fig = go.Figure() + + _lim_fig.add_trace(go.Scatter( + + x=list(_t_lim), y=_ac_vals, mode="lines", + + name="Ac (Rubisco-limited)", + + line=dict(color="#d62728", dash="dash"), + + )) + + _lim_fig.add_trace(go.Scatter( + + x=list(_t_lim), y=_aj_vals, mode="lines", + + name="Aj (RuBP-limited)", + + line=dict(color="#1f77b4", dash="dash"), + + )) + + # Actual A = min(Ac, Aj) + + _a_net = [max(0, min(ac, aj)) for ac, aj in zip(_ac_vals, _aj_vals)] + + _lim_fig.add_trace(go.Scatter( + + x=list(_t_lim), y=_a_net, mode="lines", + + name="A_net = min(Ac, Aj)", + + line=dict(color="black", width=3), + + )) + + _lim_fig.add_vline(x=30, line_dash="dot", line_color="gray", + + annotation_text="30 °C transition") + + _lim_fig.update_layout( + + xaxis_title="Leaf temperature (°C)", + + yaxis_title="A [µmol CO₂ m⁻² s⁻¹]", + + height=450, + + ) + + st.plotly_chart(_lim_fig) + + + # ---- Section 5: Key findings ---- + + st.subheader("5. Key findings from validation") + + st.markdown(""" + + **Agreement with Greer & Weedon (2012):** + + - Temperature ranking of Amax matches: 30 °C > 25 °C > 35 °C > 20 °C > 40 °C + + - RuBP/Rubisco limitation transition occurs at ~30-32 °C (paper: 30 °C) + + - Vcmax peaks at 39 °C, Jmax peaks at 36 °C (exact match with paper) + + - Quantitative match within 2-15% at 20-35 °C + + - Jmax/Vcmax ratio declines from ~2.4 at 20 °C to ~1.1 at 45 °C (paper: 3.0 to 1.5) + + + **Known limitations:** + + - At 40 °C, model underestimates A by ~12% due to Bernacchi (2001) Rubisco kinetics + + being parameterised for tobacco, not heat-adapted grapevine + + - Stomatal response to temperature is modelled via VPD only; the paper shows + + direct temperature effects on gs (Table 1: 0.199 at 20 °C to 0.140 at 40 °C) + + - The model uses Ci-based (intercellular CO2) calculations; the paper uses + + Cc-based (chloroplast CO2) with mesophyll conductance gm = 5-10 µmol m⁻² s⁻¹ Pa⁻¹ + + + **Reference:** + + Greer, D.H. & Weedon, M.M. (2012) Modelling photosynthetic responses to temperature + + of grapevine (*Vitis vinifera* cv. Semillon) leaves on vines grown in a hot climate. + + *Plant, Cell & Environment*, 35, 1050-1064. + + [DOI: 10.1111/j.1365-3040.2011.02471.x](https://doi.org/10.1111/j.1365-3040.2011.02471.x) + + """) + + + # --------------------------------------------------------------------------- + + + if _data_section == "Data Explorer": + + st.header("Data Explorer") + + st.markdown( + + "This tab lets you explore the **raw data** behind the predictions. " + + "Choose a data source below:\n\n" + + "- **Vineyard sensors** \u2014 Photosynthesis rate **A**, PAR, leaf/air temperature, and \u0394T from on-site crop sensors.\n" + + "- **Weather station data** \u2014 IMS station 43 (Sde Boker) and the merged dataset used for ML training.\n" + + "- **AI Data Engineering** \u2014 **Gemini-powered** sensor anomaly detection (Z-score/IQR + physical bounds) and engineered features " + + "(cyclical time encodings, Stress Risk Score). Run the pipeline and inspect thresholds, cleaning summary, and the daytime stress profile." + + ) + + eda_stage = st.radio( + + "Data source", + + ["Vineyard sensors", "Weather station data", "AI Data Engineering"], + + horizontal=True, + + label_visibility="visible", + + ) + + + if eda_stage == "Vineyard sensors": + + st.subheader("Vineyard sensor data") + + with st.expander("About this data"): + + st.markdown( + + "Shows the distribution and temporal patterns of the computed photosynthesis " + + "rate **A**, plus the raw sensor inputs used to calculate it. " + + "This helps verify that the model produces physiologically plausible values." + + ) + + try: + + from scripts.eda import get_stage1_eda + + s1 = get_stage1_eda() + + except Exception as e: + + st.error(str(e)) + + s1 = {"error": str(e)} + + + if s1.get("error"): + + st.warning(s1["error"]) + + else: + + stats = s1["labels_stats"] + + c1, c2, c3, c4 = st.columns(4) + + c1.metric("Observations", stats["count"]) + + c2.metric("Mean A", f"{stats['A_mean']:.2f}") + + c3.metric("Std A", f"{stats['A_std']:.2f}") + + c4.metric("Range", f"{stats['A_min']:.1f} \u2013 {stats['A_max']:.1f}") + + st.caption(f"Date range: {stats['date_min']} to {stats['date_max']}") + + + if _HAS_PLOTLY and s1.get("labels") is not None: + + A = s1["labels"].iloc[:, 0] + + with st.expander("About: Distribution of A"): + + st.markdown( + + "Histogram of all computed A values. A right-skewed distribution is typical: " + + "many low-A values (early/late day, cloudy) with a tail of high-A values " + + "(midday, full sun). The peak should be between 5\u201315 \u00b5mol m\u207b\u00b2 s\u207b\u00b9 for grapevines." + + ) + + fig = px.histogram(x=A[A >= 1].dropna(), nbins=50, title="Distribution of A (Stage 1 labels, A \u2265 1)") + + fig.update_layout(xaxis_title="A (\u00b5mol m\u207b\u00b2 s\u207b\u00b9)", xaxis_range=[1, None]) + + st.plotly_chart(fig) + + + with st.expander("About: A over time"): + + st.markdown( + + "Time series of A across the dataset. Only the **growing season** " + + "(May\u2013Sep) is included \u2014 the gaps between clusters represent the " + + "dormant months (Oct\u2013Apr) when the vine does not photosynthesize " + + "and no data is collected. Within each season, look for diurnal " + + "oscillations and any anomalous spikes that may indicate sensor issues." + + ) + + # Resample to daily mean to compress gaps and smooth diurnal noise + + A_daily = A.resample("D").mean().dropna() + + fig2 = go.Figure() + + fig2.add_trace(go.Scatter( + + x=A_daily.index, y=A_daily.values, mode="lines", + + name="A (daily mean)", line=dict(width=1.5, color=_BRAND_GREEN), + + connectgaps=False, + + )) + + fig2.update_layout( + + title="A over time (daily mean)", + + xaxis_title="Time", yaxis_title="A (\u00b5mol m\u207b\u00b2 s\u207b\u00b9)", + + ) + + st.plotly_chart(fig2) + + + if s1.get("sensor_sample") is not None and not s1["sensor_sample"].empty and _HAS_PLOTLY: + + df = s1["sensor_sample"] + + st.subheader("Sensor distributions (daytime PAR > 50)") + + with st.expander("About sensor distributions"): + + st.markdown( + + "Histograms of the main sensor inputs used in the Farquhar model, filtered " + + "to daytime only (PAR > 50 \u00b5mol m\u207b\u00b2 s\u207b\u00b9).\n\n" + + "- **PAR:** Light energy for photosynthesis (400\u2013700 nm). " + + "Values above 2500 are sensor artifacts and are excluded.\n" + + "- **Leaf Temp:** Leaf surface temperature (\u00b0C).\n" + + "- **Air Temp:** Ambient temperature near the canopy (\u00b0C)." + + ) + + sensor_cols = [c for c in ["Air1_PAR_ref", "Air1_leafTemperature_ref", "Air1_airTemperature_ref"] if c in df.columns] + + if sensor_cols: + + cols = st.columns(len(sensor_cols)) + + for col_st, col_name in zip(cols, sensor_cols): + + with col_st: + + series = df[col_name].dropna() + + # Remove PAR outliers (sensor artifacts above 2500) + + if col_name == "Air1_PAR_ref": + + series = series[series <= 2500] + + fig = px.histogram(series, nbins=40, title=col_name.replace("Air1_", "").replace("_ref", "")) + + fig.update_layout(height=300) + + st.plotly_chart(fig) + + + # --- Air-Leaf Temperature Delta --- + + if "Air1_leafTemperature_ref" in df.columns and "Air1_airTemperature_ref" in df.columns: + + st.subheader("Leaf\u2013Air temperature difference (\u0394T)") + + with st.expander("Why is \u0394T important?"): + + st.markdown( + + "The difference between leaf and air temperature " + + "(**\u0394T = T_leaf \u2212 T_air**) is a direct indicator of " + + "**plant water stress**.\n\n" + + "- **\u0394T < 0** (leaf cooler than air): the vine is transpiring " + + "normally \u2014 evaporative cooling keeps the leaf below air " + + "temperature. The stomata are open and photosynthesis is active.\n" + + "- **\u0394T \u2248 0**: transpiration is slowing down.\n" + + "- **\u0394T > 0** (leaf warmer than air): the vine has partially " + + "or fully closed its stomata due to water stress or extreme VPD. " + + "Transpiration has stopped cooling the leaf, so it heats up " + + "above ambient. Photosynthesis is severely limited.\n\n" + + "This is the basis of the **Crop Water Stress Index (CWSI)** " + + "used in the Farquhar model. In agrivoltaics, a rising \u0394T is " + + "the signal that the vine would benefit from tracker shading: " + + "the extra light cannot be used anyway because the stomata " + + "are shut." + + ) + + delta_t = df["Air1_leafTemperature_ref"] - df["Air1_airTemperature_ref"] + + delta_t = delta_t.dropna() + + col_hist, col_time = st.columns(2) + + with col_hist: + + fig_dt = px.histogram( + + delta_t, nbins=50, + + title="\u0394T distribution (daytime)", + + color_discrete_sequence=[_BRAND_GREEN], + + ) + + fig_dt.update_layout( + + xaxis_title="\u0394T = T_leaf \u2212 T_air (\u00b0C)", + + yaxis_title="Count", + + height=350, + + ) + + fig_dt.add_vline(x=0, line_dash="dash", line_color="red", + + annotation_text="T_leaf = T_air") + + st.plotly_chart(fig_dt) + + with col_time: + + if "time" in df.columns: + + # Filter to growing season only (May-Sep) + + _ts = pd.to_datetime(df["time"], utc=True) + + _grow_mask = _ts.dt.month.isin([5, 6, 7, 8, 9]) + + _dt_grow = delta_t[_grow_mask] + + _ts_grow = _ts[_grow_mask] + + fig_dt2 = go.Figure() + + fig_dt2.add_trace(go.Scatter( + + x=_ts_grow, y=_dt_grow.values, + + mode="markers", marker=dict(size=2, color=_BRAND_GREEN, opacity=0.4), + + name="\u0394T", + + )) + + fig_dt2.add_hline(y=0, line_dash="dash", line_color="red") + + fig_dt2.update_layout( + + title="\u0394T over time", + + xaxis_title="Time", + + yaxis_title="\u0394T (\u00b0C)", + + height=350, + + ) + + st.plotly_chart(fig_dt2) + + + elif eda_stage == "Weather station data": + + st.subheader("Weather station data") + + with st.expander("About this data"): + + st.markdown( + + "Shows the IMS weather station data and the merged dataset used for " + + "prediction model training. This helps verify data overlap, check for " + + "missing values, and understand the weather patterns." + + ) + + try: + + from scripts.eda import get_stage2_eda + + s2 = get_stage2_eda() + + except Exception as e: + + st.error(str(e)) + + s2 = {"error": str(e)} + + + if s2.get("error"): + + st.warning(s2["error"]) + + else: + + stats = s2["stats"] + + c1, c2, c3 = st.columns(3) + + c1.metric("IMS rows", f"{stats['ims_rows']:,}") + + c2.metric("Merged rows", f"{stats['merged_rows']:,}") + + c3.metric("Features", len(stats["feature_cols"])) + + st.caption(f"IMS range: {stats['ims_date_min']} to {stats['ims_date_max']}") + + + with st.expander("What are the feature columns?"): + + st.markdown( + + "IMS weather variables and engineered time features used as " + + "ML inputs. No on-site sensor data is included (strict separation to avoid leakage).\n\n" + + "- **air_temperature_c, tdmax_c, tdmin_c:** Temperature from IMS station.\n" + + "- **ghi_w_m2:** Global Horizontal Irradiance (solar radiation) \u2014 proxy for PAR.\n" + + "- **rh_percent:** Relative humidity.\n" + + "- **rain_mm:** Precipitation.\n" + + "- **wind_speed_ms:** Wind speed.\n" + + "- **hour_sin, hour_cos:** Cyclical encoding of hour-of-day.\n" + + "- **doy_sin, doy_cos:** Cyclical encoding of day-of-year (seasonality)." + + ) + + merged = s2["merged"] + + st.dataframe(merged.describe()) + + + if _HAS_PLOTLY and "A" in merged.columns: + + with st.expander("About: Distribution of A (merged)"): + + st.markdown( + + "Distribution of A in the merged IMS+labels dataset. This is the subset " + + "of Stage 1 labels that have matching IMS timestamps. Compare with Stage 1 " + + "distribution to check for sampling bias." + + ) + + fig = px.histogram(merged["A"][merged["A"] >= 1].dropna(), nbins=50, title="Distribution of A (merged set, A \u2265 1)") + + fig.update_layout(xaxis_title="A (\u00b5mol m\u207b\u00b2 s\u207b\u00b9)", xaxis_range=[1, None]) + + st.plotly_chart(fig) + + + if _HAS_PLOTLY and merged is not None: + + num_cols = [c for c in stats["feature_cols"] if c in merged.columns][:4] + + if num_cols: + + with st.expander("About: Feature distributions"): + + st.markdown( + + "Histograms of the first four numeric IMS features in the merged dataset. " + + "Check for: reasonable value ranges, skewness, outliers, and missing-value " + + "patterns that might affect model training." + + ) + + fig = make_subplots(rows=2, cols=2, subplot_titles=num_cols) + + for i, col in enumerate(num_cols): + + r, c = i // 2 + 1, i % 2 + 1 + + fig.add_trace(go.Histogram(x=merged[col].dropna(), nbinsx=30), row=r, col=c) + + fig.update_layout(title="Feature distributions (merged)") + + st.plotly_chart(fig) + + + else: + + # ── AI Data Engineering ────────────────────────────────────────────── + + st.subheader("AI Data Engineering") + + st.markdown( + + "Gemini analyzes each sensor column's statistics against known physical constraints " + + "for grapevines in the Negev desert, then returns per-column anomaly thresholds " + + "(hard bounds + Z-score + IQR multiplier). The pipeline also generates five " + + "engineered features fed directly into the ML prediction models." + + ) + + + _llm_err = None + + try: + + from src.llm_data_engineer import LLMDataEngineer, SENSOR_CONTEXT + + + _loader_path = settings.SENSORS_WIDE_SAMPLE_PATH + + if not _loader_path.exists(): + + _loader_path = settings.SENSORS_WIDE_PATH + + if not _loader_path.exists(): + + raise FileNotFoundError("Sensor data file not found.") + + + _df_raw = pd.read_csv(_loader_path) + + _engineer = LLMDataEngineer(verbose=False) + + _key_cols = list(SENSOR_CONTEXT.keys()) + + _present = [c for c in _key_cols if c in _df_raw.columns] + + + with st.spinner("Querying Gemini for anomaly thresholds…"): + + _thresholds = _engineer.analyze_anomalies(_df_raw, columns=_present) + + + _df_clean = _engineer.apply_cleaning(_df_raw, _thresholds, strategy="clip") + + + with st.spinner("Querying Gemini for feature engineering spec…"): + + _feat_spec = _engineer.get_feature_spec(list(_df_clean.columns)) + + + _df_eng = _engineer.engineer_features(_df_clean, feature_spec=_feat_spec) + + + # Violation counts + + _viol_before, _viol_after = {}, {} + + for _col, _t in _thresholds.items(): + + if _col not in _df_raw.columns: + + continue + + _lo, _hi = _t.get("lower_bound"), _t.get("upper_bound") + + _m = pd.Series(False, index=_df_raw.index) + + if _lo is not None: + + _m |= _df_raw[_col] < _lo + + if _hi is not None: + + _m |= _df_raw[_col] > _hi + + _viol_before[_col] = int(_m.sum()) + + _m2 = pd.Series(False, index=_df_clean.index) + + if _lo is not None: + + _m2 |= _df_clean[_col] < _lo + + if _hi is not None: + + _m2 |= _df_clean[_col] > _hi + + _viol_after[_col] = int(_m2.sum()) + + + # Stress profile + + _df_eng["_hr_local"] = (pd.to_datetime(_df_eng["time"], utc=True).dt.hour + 3) % 24 + + _daytime = _df_eng[_df_eng["Air1_PAR_ref"] > 50] if "Air1_PAR_ref" in _df_eng.columns else _df_eng + + _stress_profile = ( + + _daytime.groupby("_hr_local")["stress_risk_score"].mean() + + .reindex(range(24), fill_value=float("nan")) + + ) + + + _used_gemini = "Statistical fallback" not in list(_thresholds.values())[0].get("rationale", "") + + + except Exception as _exc: + + _llm_err = str(_exc) + + + if _llm_err: + + st.error(f"Pipeline error: {_llm_err}") + + else: + + _source_badge = ( + + "🤖 Thresholds sourced from **Gemini**" + + if _used_gemini + + else "⚙️ Thresholds from **statistical fallback** (set `GOOGLE_API_KEY` to enable Gemini)" + + ) + + st.caption(_source_badge) + + + # ── Section 1: Anomaly thresholds ────────────────────────────── + + st.markdown("#### Gemini anomaly thresholds") + + with st.expander("How are thresholds generated?"): + + st.markdown( + + "For each sensor column, `LLMDataEngineer` sends the full descriptive " + + "statistics (min, max, percentiles) plus domain context — physical units, " + + "expected range for the Negev site, known failure modes — to Gemini. " + + "Gemini returns a JSON with:\n\n" + + "- **Hard bounds** (`lower_bound` / `upper_bound`): values outside these are " + + "physically impossible or known sensor faults.\n" + + "- **Z-score threshold**: flags readings that deviate more than N standard " + + "deviations from the column mean.\n" + + "- **IQR multiplier**: flags readings outside Q1 − k·IQR … Q3 + k·IQR.\n\n" + + "A reading is flagged only when the hard-bound violation OR both the Z-score " + + "AND IQR conditions are met simultaneously. Default strategy is **clip** " + + "(clamp to bounds), preserving row count." + + ) + + + _thresh_rows = [] + + _col_labels = { + + "Air1_PAR_ref": "PAR (μmol/m²/s)", + + "Air1_leafTemperature_ref": "T_leaf (°C)", + + "Air1_airTemperature_ref": "T_air (°C)", + + "Air1_VPD_ref": "VPD (kPa)", + + "Air1_airHumidity_ref": "Humidity (%)", + + "Air1_CO2_ref": "CO₂ raw (ppm)", + + } + + for _col in _present: + + _t = _thresholds.get(_col, {}) + + _vb = _viol_before.get(_col, 0) + + _va = _viol_after.get(_col, 0) + + _thresh_rows.append({ + + "Sensor": _col_labels.get(_col, _col), + + "Lower bound": _t.get("lower_bound", "—"), + + "Upper bound": _t.get("upper_bound", "—"), + + "Z-score σ": _t.get("zscore_threshold", "—"), + + "IQR ×": _t.get("iqr_multiplier", "—"), + + "Violations (raw)": _vb, + + "After clip": _va, + + "Rationale": _t.get("rationale", ""), + + }) + + _thresh_df = pd.DataFrame(_thresh_rows) + + st.dataframe(_thresh_df, hide_index=True) + + + # ── Section 2: Cleaning summary metrics ──────────────────────── + + st.markdown("#### Cleaning summary") + + _total_viol = sum(_viol_before.values()) + + _total_cleared = sum(v for v in _viol_after.values() if v == 0) + + _pct_retained = len(_df_clean) / len(_df_raw) * 100 + + _cm1, _cm2, _cm3, _cm4 = st.columns(4) + + _cm1.metric("Rows in dataset", f"{len(_df_raw):,}") + + _cm2.metric("Physical violations found", str(_total_viol)) + + _cm3.metric("Columns fully cleared", f"{_total_cleared} / {len(_viol_before)}") + + _cm4.metric("Rows retained (clip)", f"{_pct_retained:.1f}%") + + + if _HAS_PLOTLY and _total_viol > 0: + + _viol_cols = [_col_labels.get(c, c) for c in _viol_before if _viol_before[c] > 0] + + _viol_vals = [_viol_before[c] for c in _viol_before if _viol_before[c] > 0] + + _fig_viol = px.bar( + + x=_viol_cols, y=_viol_vals, + + labels={"x": "Sensor", "y": "Violation count"}, + + title="Physical violations by sensor (before cleaning)", + + color_discrete_sequence=[_BRAND_GREEN], + + ) + + _fig_viol.update_layout(height=300) + + st.plotly_chart(_fig_viol) + + + # ── Section 3: Before / after distributions ──────────────────── + + if _HAS_PLOTLY: + + st.markdown("#### Before vs after cleaning — PAR & VPD") + + with st.expander("What to look for"): + + st.markdown( + + "The **raw** histogram (red) includes all sensor readings. " + + "The **cleaned** histogram (green) shows the same column after " + + "the Gemini-generated thresholds are applied. Outlier spikes at the " + + "far right of PAR and VPD should disappear or be clipped to the bound." + + ) + + _ba_cols = st.columns(2) + + for _idx, _col in enumerate(["Air1_PAR_ref", "Air1_VPD_ref"]): + + if _col not in _df_raw.columns: + + continue + + _label = _col_labels.get(_col, _col) + + _hi_bound = _thresholds.get(_col, {}).get("upper_bound") + + _raw_s = _df_raw[_col].dropna() + + _clean_s = _df_clean[_col].dropna() + + _fig_ba = go.Figure() + + _fig_ba.add_trace(go.Histogram( + + x=_raw_s, nbinsx=60, name="Raw", + + marker_color="crimson", opacity=0.55, + + )) + + _fig_ba.add_trace(go.Histogram( + + x=_clean_s, nbinsx=60, name="Cleaned", + + marker_color=_BRAND_GREEN, opacity=0.7, + + )) + + if _hi_bound is not None: + + _fig_ba.add_vline( + + x=_hi_bound, line_dash="dash", line_color="orange", + + annotation_text=f"bound={_hi_bound}", + + ) + + _fig_ba.update_layout( + + barmode="overlay", title=f"{_label} — raw vs cleaned", + + xaxis_title=_label, height=320, + + ) + + with _ba_cols[_idx]: + + st.plotly_chart(_fig_ba) + + + # ── Section 4: Engineered features ───────────────────────────── + + st.markdown("#### Engineered features") + + with st.expander("How are features engineered?"): + + st.markdown( + + "After cleaning, the pipeline asks Gemini to confirm the optimal weights " + + "and normalisation bounds for the **Stress Risk Score**, given the available " + + "sensor columns and the Semillon grapevine stress physiology. " + + "It then computes five new columns:\n\n" + + "| Feature | Formula | Purpose |\n" + + "|---|---|---|\n" + + "| `hour_sin` | sin(2π·h/24) | Cyclical hour-of-day |\n" + + "| `hour_cos` | cos(2π·h/24) | Cyclical hour-of-day |\n" + + "| `doy_sin` | sin(2π·d/365) | Seasonal position |\n" + + "| `doy_cos` | cos(2π·d/365) | Seasonal position |\n" + + "| `stress_risk_score` | w_VPD·norm(VPD) + w_CWSI·norm(CWSI) | Acute stress in [0, 1] |\n\n" + + "Cyclical encodings ensure that midnight→01:00 and 23:00→midnight are " + + "treated as equally close by the model — something a raw hour integer cannot do." + + ) + + + # Feature spec card + + _fs_vpd_w = _feat_spec.get("vpd_weight", "—") + + _fs_cwsi_w = _feat_spec.get("cwsi_weight", "—") + + _fs_vpd_clip = _feat_spec.get("vpd_clip_max", "—") + + _fs_rat = _feat_spec.get("rationale", "") + + _fc1, _fc2, _fc3 = st.columns(3) + + _fc1.metric("VPD weight", _fs_vpd_w) + + _fc2.metric("CWSI weight", _fs_cwsi_w) + + _fc3.metric("VPD clip max (kPa)", _fs_vpd_clip) + + st.caption(f"Gemini rationale: {_fs_rat}") + + + # Feature stats table + + _eng_feat_cols = ["hour_sin", "hour_cos", "doy_sin", "doy_cos", "stress_risk_score"] + + _feat_stats = ( + + _df_eng[[c for c in _eng_feat_cols if c in _df_eng.columns]] + + .describe(percentiles=[0.25, 0.5, 0.75]) + + .loc[["min", "mean", "max"]] + + .round(4) + + ) + + st.dataframe(_feat_stats) + + + # ── Section 5: Daytime stress profile ────────────────────────── + + if _HAS_PLOTLY and "stress_risk_score" in _df_eng.columns: + + st.markdown("#### Daytime stress profile") + + with st.expander("How to read this chart"): + + st.markdown( + + "Mean **Stress Risk Score** per local hour (Israel = UTC+3), " + + "computed over all daytime readings (PAR > 50 μmol m⁻² s⁻¹). " + + "A score of 1.0 means the vine is under maximum atmospheric demand; " + + "0.0 means no stress. The midday–afternoon peak is the primary " + + "window where SolarWine shading interventions are concentrated." + + ) + + _profile_df = _stress_profile.dropna().reset_index() + + _profile_df.columns = ["Hour (local)", "Stress Risk Score"] + + _peak_hr = int(_profile_df.loc[_profile_df["Stress Risk Score"].idxmax(), "Hour (local)"]) + + _fig_stress = px.bar( + + _profile_df, + + x="Hour (local)", y="Stress Risk Score", + + color="Stress Risk Score", + + color_continuous_scale=["#00BD3E", "#f5c518", "#e63946"], + + range_y=[0, 1], + + title=f"Hourly stress profile — peak at {_peak_hr:02d}:00 local", + + ) + + _fig_stress.add_hline( + + y=0.5, line_dash="dot", line_color="orange", + + annotation_text="Intervention threshold (0.5)", + + ) + + _fig_stress.update_layout( + + xaxis=dict(tickmode="linear", dtick=1), + + coloraxis_showscale=False, + + height=380, + + ) + + st.plotly_chart(_fig_stress) + + st.caption( + + f"Peak stress: {_peak_hr:02d}:00 local " + + f"(score = {_stress_profile.max():.3f}). " + + f"Low-stress morning window (before 10:00): " + + f"mean score = {_stress_profile.loc[6:9].mean():.3f} — shading withheld." + + ) + + + # --------------------------------------------------------------------------- + + # --------------------------------------------------------------------------- + # Tab — Shading Simulator (was Panel vs Open Sky) + # --------------------------------------------------------------------------- diff --git a/ui/tab_docs.py b/ui/tab_docs.py new file mode 100644 index 0000000000000000000000000000000000000000..0b8a1c595a0737ca8a4a969b26e9179608aff4ed --- /dev/null +++ b/ui/tab_docs.py @@ -0,0 +1,499 @@ +""" +Docs tab. +""" + +from __future__ import annotations + +import pandas as pd +import streamlit as st + + + +def render_tab_docs() -> None: + st.header("Documentation") + + st.markdown( + + "Technical documentation, sensor inventory, project roadmap, " + + "scientific references, and glossary." + + ) + + + with st.expander("Sensor Inventory & Data Usage", expanded=False): + + st.subheader("On-site sensor inventory") + + st.markdown(""" + + The Sde Boker research plot is equipped with a dense sensor network from + + [Seymour](https://www.seymouragri.com/). The dataset (`sensors_wide.csv`) + + contains **600+ columns** from the following device categories: + + """) + + + sensor_inventory = pd.DataFrame([ + + {"Device": "Air1 (ref)", "Role": "Reference air station", "Location": "Reference plot", "Key measurements": "PAR, Tleaf, Tair, CO2, VPD, RH, GSR, wind, pressure, rain, spectral (10 incoming + 18 outgoing bands), NDVI, PRI, LWD/LWUP, VOC/NOX, dew point, UV, DLI, ToF distance", "Columns": "~80"}, + + {"Device": "Air2 (test)", "Role": "Test air station", "Location": "Test plot (under panels)", "Key measurements": "Same suite as Air1: PAR, Tleaf, Tair, CO2, VPD, spectral bands, NDVI, PRI, UV, ToF", "Columns": "~70"}, + + {"Device": "Air3 (all)", "Role": "Third air station", "Location": "Full-plot coverage", "Key measurements": "PAR, Tleaf, Tair, CO2, VPD, spectral bands, NDVI, PRI, UV, ToF", "Columns": "~70"}, + + {"Device": "Air4 (all)", "Role": "Fourth air station", "Location": "Full-plot coverage", "Key measurements": "PAR, Tleaf, Tair, CO2, VPD, spectral bands, NDVI, PRI, UV, rain, DLI, ToF", "Columns": "~80"}, + + {"Device": "Crop1", "Role": "Crop sensor", "Location": "Canopy-level", "Key measurements": "Leaf temp (IRT), NDVI, spectral outgoing (18 bands), ToF distance (16 zones), PRI, rNDVI, RENDVI, vegetation indices, UV", "Columns": "~60"}, + + {"Device": "Crop2", "Role": "Crop sensor (extended)", "Location": "Canopy-level", "Key measurements": "All of Crop1 + VPD, CO2, Tair, RH, GSR, PAR, wind, soil moisture/temp/EC/pH, mock leaf temp, leaf wetness, VOC/NOX", "Columns": "~80"}, + + {"Device": "Crop3\u20137", "Role": "Crop sensors", "Location": "Various canopy positions", "Key measurements": "GSR, PAR, leaf temp (IRT), spectral (incoming + outgoing), NDVI, PRI, vegetation indices, UV, ToF, DLI", "Columns": "~60 each"}, + + {"Device": "Soil1\u20134", "Role": "Soil probes (dual depth)", "Location": "Root zone", "Key measurements": "Soil temperature, moisture, dielectric, bulk EC, pore-water EC, pH \u2014 at two depths per probe", "Columns": "~20 each"}, + + {"Device": "Soil5\u20137, 9", "Role": "Additional soil probes", "Location": "Root zone", "Key measurements": "Soil temperature, moisture, dielectric, EC, pH (some dual depth)", "Columns": "~15 each"}, + + {"Device": "Irrigation1", "Role": "Irrigation monitor", "Location": "Drip line", "Key measurements": "Flow rate, volume, pressure, EC, pH, water temperature, irrigation duration, per-cycle aggregates", "Columns": "~23"}, + + {"Device": "Thermocouples 1\u20132", "Role": "Temperature arrays", "Location": "Canopy profile (multi-height)", "Key measurements": "4 thermocouple channels each (thermocoupleTemperature_1\u20134) + internal reference temperatures", "Columns": "~8 each"}, + + ]) + + st.dataframe(sensor_inventory, hide_index=True) + + + st.subheader("What the current model uses") + + st.markdown("Stage 1 Farquhar model inputs (6 columns from Air1 ref) are listed " + + "in the **Photosynthesis & Data** tab (Farquhar Model section).") + + + st.markdown("#### Stage 2 \u2014 ML prediction features (IMS station 43)") + + st.markdown(""" + + Stage 2 combines on-site sensor history with public IMS weather data to + + **forecast A ahead of time**, enabling the day-ahead tracker optimizer to + + plan shading interventions. + + """) + + + ims_features = pd.DataFrame([ + + {"Column": "air_temperature_c", "IMS channel": "TD (ch 6)", "Units": "\u00b0C", "Notes": "Ambient air temperature"}, + + {"Column": "tdmax_c / tdmin_c", "IMS channel": "TDmax/TDmin (ch 8/9)", "Units": "\u00b0C", "Notes": "Daily extremes"}, + + {"Column": "ghi_w_m2", "IMS channel": "Grad (ch 10)", "Units": "W/m\u00b2", "Notes": "Global Horizontal Irradiance \u2014 proxy for PAR"}, + + {"Column": "rh_percent", "IMS channel": "RH (ch 7)", "Units": "%", "Notes": "Relative humidity \u2014 used to derive VPD proxy"}, + + {"Column": "rain_mm", "IMS channel": "Rain (ch 20)", "Units": "mm", "Notes": "Rainfall"}, + + {"Column": "wind_speed_ms", "IMS channel": "WS (ch 3)", "Units": "m/s", "Notes": "Wind speed"}, + + ]) + + st.dataframe(ims_features, hide_index=True) + + + st.markdown(""" + + Time features are added during preprocessing: `hour_sin`, `hour_cos`, + + `doy_sin`, `doy_cos`, `month`, `day_of_year` \u2014 cyclical encodings for + + linear models and raw integers for tree-based models. + + """) + + + with st.expander("Unused Sensors — Available for Future Improvements", expanded=False): + + st.subheader("Unused sensors \u2014 available for future improvements") + + + st.markdown("#### High impact \u2014 would directly improve model accuracy") + + + high_impact = pd.DataFrame([ + + {"Sensor": "Soil moisture", "Columns": "Soil1\u20139: soilMoisture (dual depth)", "Why it matters": "Root-zone water availability is THE primary driver of stomatal conductance in the Negev. Our CWSI is a proxy from (Tleaf \u2212 Tair); actual soil moisture would be far more accurate for computing stomatal conductance (gs) and intercellular CO\u2082 (ci).", "Impact": "High"}, + + {"Sensor": "PRI (Photochemical Reflectance Index)", "Columns": "Air1_PRI_ref, Crop1\u20137_PRI_all", "Why it matters": "Direct optical measurement of photosynthetic light-use efficiency. PRI tracks the xanthophyll cycle in real time \u2014 essentially a ground-truth signal for how efficiently the vine converts light to carbon. Could calibrate the quantum yield parameter (\u03b1) in Farquhar.", "Impact": "High"}, + + {"Sensor": "NDVI", "Columns": "Air1_NDVI_ref, Crop1\u20137_NDVI_all", "Why it matters": "Tracks canopy greenness and effective leaf area through the season. We use a fixed LAI = 2.5 \u2014 NDVI could make this dynamic (LAI increases May\u2192July, declines Aug\u2192Sep after veraison).", "Impact": "High"}, + + {"Sensor": "On-site wind", "Columns": "Air1_windSpeed_ref, Air1_windAngle_ref", "Why it matters": "Boundary-layer conductance affects the coupling between leaf temperature and air temperature. Wind drives transpiration cooling and modifies effective VPD at the leaf surface. Without it, our leaf energy balance is incomplete.", "Impact": "High"}, + + {"Sensor": "GSR (Global Solar Radiation)", "Columns": "Air1_GSR_ref", "Why it matters": "Cross-check with PAR. The ratio PAR/GSR indicates diffuse fraction (cloudy vs clear sky). We use a fixed diffuse_fraction = 0.15 in the shadow model \u2014 GSR could make this dynamic.", "Impact": "High"}, + + {"Sensor": "Thermocouple arrays", "Columns": "Thermocouples-1 and -2 (4 channels each)", "Why it matters": "Likely placed at different canopy heights. Could validate the 3-zone temperature model (we assume a single Tleaf with a \u22121.5\u00b0C shade offset for shaded zones).", "Impact": "High"}, + + ]) + + st.dataframe(high_impact, hide_index=True) + + + st.markdown("#### Medium impact \u2014 improves accuracy or enables validation") + + + medium_impact = pd.DataFrame([ + + {"Sensor": "LWD / LWUP (longwave radiation)", "Columns": "Air1_LWD_ref, Air1_LWUP_ref", "Why it matters": "Leaf energy balance: longwave down from sky + up from ground. Required for predicting Tleaf when moving from measured to modeled leaf temperature."}, + + {"Sensor": "airLeafDeltaT (pre-computed)", "Columns": "Air1_airLeafDeltaT_ref", "Why it matters": "Direct Tleaf \u2212 Tair measurement. We compute CWSI from exactly this \u2014 should verify our derived CWSI against this pre-computed value."}, + + {"Sensor": "Dew point / leaf dew delta", "Columns": "Air1_dewTemperature_ref, Air1_leafDewDeltaT_ref", "Why it matters": "Early morning dew affects PAR readings and blocks gas exchange. Condensation on leaves is not accounted for."}, + + {"Sensor": "Air2 (test) \u2014 full repeat", "Columns": "Air2_PAR_test, Air2_leafTemperature_test, ...", "Why it matters": "Appears to be a treatment comparison (ref = open?, test = under panels?). Could validate the shadow model against measured below-panel PAR."}, + + {"Sensor": "Irrigation data", "Columns": "Irrigation1_irrigationVolume_all, irrigationEC_all, ...", "Why it matters": "Irrigation timing and volume directly affect soil moisture \u2192 stomatal conductance \u2192 A. Without this, we cannot account for the irrigation signal."}, + + {"Sensor": "Crop spectral vegetation indices", "Columns": "Crop1\u20137: rNDVI, RENDVI, SIPI, GCI, GRVI, LCI, WI, mARI, PSRI, ...", "Why it matters": "Red-edge indices track chlorophyll content; water indices track leaf water status; senescence indices track aging. Each tells a different story about vine physiological state."}, + + {"Sensor": "ToF (Time of Flight) distance", "Columns": "Crop1\u20137_tofDist1a\u201316b, Air1\u20134_tofDist*", "Why it matters": "Up to 16 zones per device measuring distances \u2014 likely canopy depth profile, fruit sizing, or panel-vine clearance. Could track canopy growth through the season."}, + + ]) + + st.dataframe(medium_impact, hide_index=True) + + + st.markdown("#### Lower impact \u2014 useful for v2.0 / edge cases") + + + low_impact = pd.DataFrame([ + + {"Sensor": "VOC / NOX", "Columns": "Air1_srawVOC_ref, Air1_srawNOX_ref", "Why it matters": "Volatile organic compounds emitted by stressed plants. Potential stress indicator for the v2 intervention gate."}, + + {"Sensor": "Air pressure", "Columns": "Air1_airPressure_ref", "Why it matters": "At 475 m altitude (Sde Boker), atmospheric pressure is ~95.5 kPa vs 101.3 at sea level. Affects CO\u2082 partial pressure in Farquhar by ~5.7%."}, + + {"Sensor": "Rain (on-site)", "Columns": "Air1_rain_ref", "Why it matters": "Identifies periods where PAR sensor readings may be unreliable (wet sensor dome). Also marks soil wetting events."}, + + {"Sensor": "UV measurements", "Columns": "Air1_outgoingUVA/B/C_ref, Air1_DUVI_ref", "Why it matters": "Berry sunburn risk assessment for v2 fruiting-zone protection algorithm."}, + + {"Sensor": "Incoming spectral bands", "Columns": "Air1_incoming{Purple..NIR}_ref (10 bands)", "Why it matters": "Could decompose PAR into photosynthetically useful vs heat-load wavelengths. Red:far-red ratio affects canopy shade responses."}, + + {"Sensor": "DLI / PAR averages", "Columns": "Air1_DLI_ref, Air1_PARAvg1H_ref, Air1_PARAvg24H_ref", "Why it matters": "Pre-computed Daily Light Integral and running averages. Relevant for cumulative light stress assessment."}, + + {"Sensor": "Soil pH, EC, temperature", "Columns": "Soil1\u20139: soilpH, soilBulkEC, soilTemperature", "Why it matters": "Root-zone conditions affecting nutrient uptake and root respiration."}, + + ]) + + st.dataframe(low_impact, hide_index=True) + + + with st.expander("Known Correctness Notes", expanded=False): + + st.subheader("Known correctness notes") + + st.markdown(""" + + 1. **Humidity loaded but unused:** `Air1_airHumidity_ref` is listed in + + Stage 1 columns but never consumed by `calc_photosynthesis()`. VPD + + already encodes humidity, so there is no model error \u2014 but the column + + is redundant. + + + 2. **Fixed diffuse fraction (0.15):** The canopy shadow model assumes 15% + + diffuse light at all times. With both GSR and PAR sensors available, this + + could be computed dynamically: `diffuse \u2248 1 \u2212 PAR / (GSR \u00d7 0.45)`. + + + 3. **Fixed LAI (2.5):** Leaf area index is constant through the season. + + Multiple NDVI sensors could track seasonal LAI changes. + + + 4. **CWSI is a proxy:** We derive the Crop Water Stress Index from + + (Tleaf \u2212 Tair) when actual soil moisture sensors exist at multiple + + depths and locations. Direct soil moisture would give a more accurate + + stomatal conductance estimate. + + + 5. **Altitude CO\u2082 correction missing:** At 475 m elevation, atmospheric + + pressure is ~5.7% lower than sea level. The `airPressure` sensor could + + correct the CO\u2082 partial pressure used in the Farquhar model. + + + 6. **No ref/test comparison:** The dataset has explicit \"ref\" and \"test\" + + device roles. Understanding whether Air1 (ref) is the open-sky reference + + and Air2 (test) is under panels would allow direct validation of the + + shadow model against measured below-panel PAR. + + """) + + + with st.expander("Project File Structure", expanded=False): + + st.subheader("Project file structure") + + st.code(""" + + config/settings.py Site/panel geometry, IMS channels, paths + + src/ + + farquhar_model.py Farquhar-Greer-Weedon mechanistic model + + sensor_data_loader.py Load and filter on-site sensor CSVs + + ims_client.py IMS REST API client with caching + + preprocessor.py Merge IMS + labels, time features, split + + predictor.py Train/evaluate ML regressors (LR, DT, RF, GBR, XGB) + + ts_predictor.py Multi-horizon time-series forecasting + + tracker_optimizer.py Tilt-angle simulation and stress heatmap + + solar_geometry.py Sun position, shadow projection, canopy PAR + + canopy_photosynthesis.py Zone-weighted canopy photosynthesis + + scripts/ + + download_ims_data.py Fetch IMS station data (CLI) + + run_pipeline.py Execute Stage 1 -> Stage 2 pipeline + + create_sample_data.py Generate trimmed sample for cloud deploy + + app.py This Streamlit dashboard + + Data/Seymour/ On-site sensor data (15-min intervals) + + Data/ims/ Cached IMS API responses + + Data/processed/ Intermediate files (labels, merged data) + + """, language="text") + + + with st.expander("Roadmap — SolarWine 2.0", expanded=False): + + st.markdown(""" + + This baseline establishes the photosynthesis prediction floor. **SolarWine 2.0** + + evolves it into a full agrivoltaic tracker control system \u2014 the panels follow the + + sun by default and only deviate when the vine genuinely needs protection. + + + ### The control principle + + + **Full astronomical tracking is the default.** The panels generate maximum energy + + 100% of the time. Anti-tracking (tilting away to shade the vine) is a rare, + + targeted intervention used ONLY when the fruiting zone is at measurable risk + + of heat or radiation damage, and ONLY at the minimum dose necessary. + + + ### Day-ahead forecast (Chronos-2) + + + A pre-trained time-series foundation model ([Amazon Chronos-2](https://github.com/amazon-science/chronos-forecasting)) + + produces a **24-hour, 96-slot (15-min) photosynthesis forecast** each sunrise. + + The model ingests multivariate context \u2014 historical A\u2099 plus past IMS weather + + measurements (GHI, temperature, wind, humidity) and on-site sensors (PAR, + + T\u2091\u2090\u2099\u2092\u209a\u2099, VPD, CWSI). IMS *forecasts* for the prediction horizon are used as + + known-future covariates. This day-ahead baseline tells the system what + + photosynthesis to expect under full tracking, so it can judge whether an + + intervention is worth its energy cost. + + + ### Budget-constrained dynamic programming + + + The user sets a hard ceiling on annual energy sacrifice (e.g. 5%). A + + hierarchical budget planner distributes that ceiling across + + **Year \u2192 Month \u2192 Week \u2192 Day \u2192 15-min slot**, concentrating nearly all of it + + in July\u2013August midday windows when heat stress actually threatens grape quality. + + + At sunrise each day, a **Discrete Dynamic Programming** optimizer computes the + + optimal tracker angle trajectory for all 96 slots: + + + \u2003\u2003max \u2211 [ Price\u2091\u2099\u2091\u1d63\u1d4d\u1d67(t) \u00b7 E(t,\u03b8) + Price\u1d9c\u1d63\u1d52\u1d56(t) \u00b7 A(t,\u03b8) \u2212 Cost\u2098\u2092\u1d65\u1d49 \u00b7 |\u03b8\u209c \u2212 \u03b8\u209c\u208b\u2081| ] + + + subject to: total energy sacrifice \u2264 daily budget. + + + The crop price term scales with **phenological stage** (1.5\u00d7 during veraison + + for sugar loading, 0.5\u00d7 post-harvest) and **canopy zone** (top canopy \u00d70.6, + + fruiting zone \u00d70.3 \u2014 penalizing angles that shade the productive upper leaves). + + + ### Real-time control loop (every 15 min) + + + The day-ahead plan is a schedule, not a command. A real-time arbiter executes + + the planned trajectory but can override it: + + + 1. **Compute \u03b8\u2090\u209b\u209c\u1d63\u2092** (astronomical tracking angle via pvlib) \u2014 this is the default + + 2. **Check hard gates** \u2014 no shading before 10:00, never in May, not below 28\u00b0C / CWSI < 0.3 + + 3. **Check eligibility** \u2014 all must pass: T\u2097\u2091\u2090\u1da0 > 30\u00b0C (Rubisco-limited), CWSI > 0.4, GHI > 500 W/m\u00b2, FvCB confirms shading helps + + 4. **Minimum effective dose** \u2014 scan offsets [3\u00b0, 5\u00b0, 8\u00b0, 10\u00b0, 15\u00b0, 20\u00b0] smallest-first; select the first that brings fruiting zone PAR < 400 \u00b5mol while keeping top canopy > 70% sunlit + + 5. **Budget accounting** \u2014 record sacrifice, roll unused budget forward + + + A typical July day: full tracking 05:00\u201311:00, minimum-dose shading (\u223c3\u20138\u00b0) + + 11:00\u201315:30, back to full tracking by 16:00. Season total: \u223c92% full tracking, + + \u223c8% minimum-dose shading, energy sacrifice guaranteed \u2264 5%. + + + ### Intelligent model routing (Gemini) + + + An LLM-based routing layer selects the best photosynthesis model for each + + cycle: the mechanistic FvCB model (accurate under standard conditions) or the + + ML ensemble (handles non-linear stress better). This replaces the hard-coded + + 12% divergence threshold with context-aware switching. + + + ### What's next + + + | Phase | Status | Focus | + + |---|---|---| + + | **Chronos-2 forecasting** | ✅ Done | Zero-shot MAE ~3.9 µmol m⁻² s⁻¹ (R² ~0.52); IMS + on-site sensor covariates, walk-forward eval | + + | **Gemini routing agent** | ✅ Done | Context-aware FvCB / ML selection from real-time telemetry | + + | **Gemini data engineering** | 🔜 Next | LLM-assisted sensor anomaly detection, feature generation | + + | **Control algorithm** | 🔜 Next | Intervention gate, minimum-dose engine, energy budget, command arbiter | + + | **Day-ahead DP planner** | 🔜 Next | Trajectory optimization with movement cost + budget constraint | + + | **Dashboard v2** | 🔜 Next | Budget planner, control replay, fruiting zone monitor, ROI tabs | + + """) + + + with st.expander("Glossary", expanded=False): + + st.markdown( + + "- **A (Net photosynthesis rate):** The net rate of CO₂ fixation by the leaf, " + + "measured in µmol CO₂ m⁻² s⁻¹. Calculated as min(Ac, Aj) − Rd.\n" + + "- **PAR (Photosynthetically Active Radiation):** Light in the 400–700 nm range " + + "that drives photosynthesis, in µmol photons m⁻² s⁻¹.\n" + + "- **VPD (Vapor Pressure Deficit):** Difference between saturated and actual water " + + "vapor pressure (kPa). High VPD causes stomatal closure, reducing photosynthesis.\n" + + "- **CWSI (Crop Water Stress Index):** Index from 0 (no stress) to 1 (max stress) " + + "based on leaf–air temperature difference. Modulates stomatal conductance.\n" + + "- **Vcmax:** Maximum rate of Rubisco carboxylation (µmol m⁻² s⁻¹).\n" + + "- **Jmax:** Maximum rate of electron transport (µmol m⁻² s⁻¹).\n" + + "- **GHI (Global Horizontal Irradiance):** Total solar radiation on a horizontal surface (W/m²). " + + "Used as a proxy for PAR from IMS data.\n" + + "- **IMS:** Israel Meteorological Service.\n" + + "- **Temporal split:** Train/test split preserving time order (first 75%% train, last 25%% test) " + + "to prevent data leakage from future observations." + + ) + + + with st.expander("References", expanded=False): + + st.markdown( + + "- [Farquhar, von Caemmerer & Berry (1980)](https://doi.org/10.1007/BF00386231) — " + + "A biochemical model of photosynthetic CO₂ assimilation in leaves of C₃ species. " + + "*Planta*, 149, 78–90.\n" + + "- [Greer & Weedon (2012)](https://doi.org/10.1111/j.1365-3040.2011.02471.x) — " + + "Modelling photosynthetic responses to temperature of grapevine. " + + "*Plant, Cell & Environment*, 35, 1050–1064.\n" + + "- [Bernacchi et al. (2001)](https://doi.org/10.1046/j.1365-3040.2001.00668.x) — " + + "Improved temperature response functions for models of Rubisco-limited photosynthesis. " + + "*Plant, Cell & Environment*, 24, 253–259.\n" + + "- [IMS API documentation](https://ims.gov.il/en/ObservationDataAPI) — " + + "Israel Meteorological Service environmental data API." + + ) + + + st.markdown("---") + + st.markdown( + + "Learn more at [solarwine.ai](https://www.solarwine.ai/)" + + ) diff --git a/ui/tab_forecast.py b/ui/tab_forecast.py new file mode 100644 index 0000000000000000000000000000000000000000..12cac4f4e262a048c39af2d98604916655c505d7 --- /dev/null +++ b/ui/tab_forecast.py @@ -0,0 +1,587 @@ +""" +Forecasting tab: prediction metrics, time-series, Chronos-2, routing, day-ahead advisory. +""" + +from __future__ import annotations + +from pathlib import Path + +import pandas as pd +import streamlit as st + +from config import settings +from ui.bootstrap import _BRAND_GREEN, _HAS_PLOTLY, load_metrics + +if _HAS_PLOTLY: + import plotly.express as px + import plotly.graph_objects as go + from plotly.subplots import make_subplots + + +def render_tab_forecast() -> None: + st.header("How well can we predict vine activity from weather?") + st.markdown( + "Optimizing panel tilt angles requires knowing vine photosynthesis **ahead " + "of time** — the tracker schedule for tomorrow must be planned today. " + "This tab shows how well different prediction methods forecast A from " + "on-site sensors and IMS weather data, and how accuracy varies with " + "forecast horizon." + ) + with st.expander("What models are compared?"): + st.markdown( + "**Cross-sectional models** predict A from weather at the same time step, " + "with no memory of past values. Models: **Linear Regression**, **Decision Tree**, " + "**Random Forest**, **Gradient Boosting**, and **XGBoost**.\n\n" + "**Time-series models** add lagged values of A and weather (past 15 min to 3 hours) " + "as features, and are trained per forecast horizon (15 min to 1 month). " + "This tests whether knowing recent photosynthesis history improves predictions." + ) + + metrics_path = settings.OUTPUTS_DIR / "stage2_metrics.csv" + pred_img = settings.OUTPUTS_DIR / "stage2_predictions.png" + imp_path = settings.OUTPUTS_DIR / "stage2_feature_importance.csv" + + if metrics_path.exists(): + eval_df = load_metrics(str(metrics_path)) + with st.expander("Understanding the metrics"): + st.markdown( + "- **RMSE (Root Mean Squared Error):** Average prediction error in the same units as A " + "(\u00b5mol m\u207b\u00b2 s\u207b\u00b9). Lower is better. Penalizes large errors more than MAE.\n" + "- **MAE (Mean Absolute Error):** Average absolute prediction error. Lower is better. " + "More robust to outliers than RMSE.\n" + "- **R\u00b2 (R-squared):** Proportion of variance in A explained by the model. " + "1.0 = perfect, 0.0 = no better than predicting the mean, negative = worse than the mean.\n\n" + "The **Dummy** model serves as the baseline: any useful model should beat it on all metrics." + ) + st.dataframe(eval_df, hide_index=True) + + # Plain-language interpretation of best R² + if "R2" in eval_df.columns: + _best_r2 = eval_df["R2"].max() + if _best_r2 > 0.8: + st.success( + f"The best model explains **{_best_r2*100:.0f}%** of the variation in " + "photosynthesis — a strong result that suggests weather data alone " + "can be a useful predictor." + ) + elif _best_r2 > 0.5: + st.info( + f"The best model explains **{_best_r2*100:.0f}%** of the variation. " + "Useful as a rough estimate, but there is room for improvement." + ) + else: + st.warning( + f"The best model explains only **{_best_r2*100:.0f}%** of the variation. " + "Weather data alone may not capture the full picture." + ) + + st.download_button( + "Download metrics CSV", + eval_df.to_csv(index=False), + file_name="stage2_metrics.csv", + mime="text/csv", + ) + + if pred_img.exists(): + with st.expander("How to read the prediction plots"): + st.markdown( + "**Left \u2014 Predicted vs Approx A scatter:** Each dot is one test-set observation. " + "Points on the dashed 1:1 line are perfect predictions. Spread around the line " + "indicates prediction error.\n\n" + "**Right \u2014 Time series overlay:** Approx A (blue) vs model predictions over time. " + "Shows whether the model captures temporal patterns (diurnal cycles, seasonal trends)." + ) + st.image(str(pred_img), width='stretch') + + if imp_path.exists(): + imp = load_metrics(str(imp_path)) + st.subheader("Feature importance (best tree model)") + with st.expander("What is feature importance?"): + st.markdown( + "Feature importance measures how much each input variable " + "contributes to reducing prediction error across all splits in tree-based models. " + "Higher values mean the feature is more influential for predicting A." + ) + + # Bar chart + if _HAS_PLOTLY and len(imp.columns) >= 2: + feat_col = imp.columns[0] + val_col = imp.columns[1] + imp_sorted = imp.sort_values(val_col, ascending=True) + fig_imp = px.bar( + imp_sorted, x=val_col, y=feat_col, orientation="h", + title="Feature importance", + ) + fig_imp.update_layout(yaxis_title="", xaxis_title="Importance", height=400) + with st.expander("How to read this chart"): + st.markdown( + "Each bar shows how much a feature contributes to reducing prediction " + "error across all tree splits. Longer bars = more influential features. " + "**ghi_w_m2** (solar radiation) and time features typically dominate, " + "confirming that light and time-of-day drive most of the variation in A." + ) + st.plotly_chart(fig_imp) + else: + st.dataframe(imp, hide_index=True) + else: + st.info("No prediction metrics found. Run `python scripts/run_pipeline.py` to generate them.") + + # --- Time Series Forecasting section --- + st.divider() + st.subheader("Can we predict ahead of time?") + with st.expander("What is this?"): + st.markdown( + "Instead of just estimating current photosynthesis, we also test whether we can " + "**predict it into the future** — from 15 minutes to 1 month ahead. This is " + "important for planning irrigation and shade schedules. The model uses recent " + "photosynthesis history plus weather data to make these forecasts." + ) + + ts_comp_path = settings.OUTPUTS_DIR / "ts_horizon_comparison.csv" + ts_season_path = settings.OUTPUTS_DIR / "ts_per_season_metrics.csv" + + _HORIZON_ORDER = ["15min", "1hour", "1day", "1week", "1month"] + + if ts_comp_path.exists(): + ts_comp = load_metrics(str(ts_comp_path)) + + # Split into time-series and cross-sectional rows (season == "all" only) + _season_filter = (ts_comp["season"] == "all") if "season" in ts_comp.columns else pd.Series([True] * len(ts_comp), index=ts_comp.index) + _ts_rows = ts_comp[_season_filter & (ts_comp["approach"] == "time_series")].copy() + _xs_rows = ts_comp[_season_filter & ts_comp["approach"].str.startswith("cross_sectional", na=False)].drop_duplicates("horizon").copy() + + # --- Metric cards --- + _ts_15 = _ts_rows[_ts_rows["horizon"] == "15min"] + _best_ts_rmse = float(_ts_15["RMSE"].iloc[0]) if not _ts_15.empty else None + _best_ts_r2 = float(_ts_15["R2"].iloc[0]) if not _ts_15.empty else None + _best_xs_rmse = float(_xs_rows["RMSE"].iloc[0]) if not _xs_rows.empty else None + _best_xs_r2 = float(_xs_rows["R2"].iloc[0]) if not _xs_rows.empty else None + + _mc1, _mc2, _mc3 = st.columns(3) + if _best_ts_rmse is not None: + _delta_rmse = f"{_best_ts_rmse - _best_xs_rmse:+.2f} vs cross-sectional" if _best_xs_rmse else None + _mc1.metric( + "TS RMSE @ 15 min", + f"{_best_ts_rmse:.2f} µmol m⁻² s⁻¹", + delta=_delta_rmse, + delta_color="inverse", + help="RMSE of the time-series model at the shortest horizon. Lower is better.", + ) + if _best_ts_r2 is not None: + _delta_r2 = f"{_best_ts_r2 - _best_xs_r2:+.3f} vs cross-sectional" if _best_xs_r2 is not None else None + _mc2.metric( + "TS R² @ 15 min", + f"{_best_ts_r2:.3f}", + delta=_delta_r2, + help="R² of the time-series model at the shortest horizon. 1.0 = perfect.", + ) + if _best_xs_rmse is not None: + _mc3.metric( + "Cross-sectional RMSE", + f"{_best_xs_rmse:.2f} µmol m⁻² s⁻¹", + help="Best cross-sectional model (LinearRegression on IMS features only). Same RMSE at every horizon — no lag information.", + ) + + # --- Summary pivot table --- + _ts_tbl = _ts_rows[["horizon", "RMSE", "MAE", "R2"]].rename( + columns={"RMSE": "TS RMSE", "MAE": "TS MAE", "R2": "TS R²"} + ) + _xs_tbl = _xs_rows[["horizon", "RMSE", "R2"]].rename( + columns={"RMSE": "XS RMSE", "R2": "XS R²"} + ) + _summary = _ts_tbl.merge(_xs_tbl, on="horizon", how="left") + _summary["RMSE Δ"] = (_summary["TS RMSE"] - _summary["XS RMSE"]).round(3) + _summary["_ord"] = _summary["horizon"].map({h: i for i, h in enumerate(_HORIZON_ORDER)}) + _summary = _summary.sort_values("_ord").drop(columns=["_ord"]) + for _col in ["TS RMSE", "TS MAE", "TS R²", "XS RMSE", "XS R²"]: + if _col in _summary.columns: + _summary[_col] = _summary[_col].round(3) + + st.markdown("**Summary: time-series vs cross-sectional by horizon**") + with st.expander("How to read this table"): + st.markdown( + "Each row is a forecast horizon. **TS** = time-series model (uses lagged A + weather features). " + "**XS** = best cross-sectional model (IMS weather only, no lag memory — same RMSE at every horizon). " + "**RMSE \u0394** = TS RMSE \u2212 XS RMSE: negative means time-series wins, positive means it loses. " + "Time-series should win at short horizons (recent A values are informative) " + "and lose at long horizons (lags are too stale to help)." + ) + st.dataframe(_summary, hide_index=True) + + # --- Dual chart: RMSE and R² side by side --- + if _HAS_PLOTLY and not _ts_rows.empty: + _ts_chart = _ts_rows.copy() + _xs_chart = _xs_rows.copy() + _ts_chart["_ord"] = _ts_chart["horizon"].map({h: i for i, h in enumerate(_HORIZON_ORDER)}) + _xs_chart["_ord"] = _xs_chart["horizon"].map({h: i for i, h in enumerate(_HORIZON_ORDER)}) + _ts_chart = _ts_chart.sort_values("_ord") + _xs_chart = _xs_chart.sort_values("_ord") + + fig_dual = make_subplots( + rows=1, cols=2, + subplot_titles=[ + "RMSE by horizon (lower = better)", + "R² by horizon (higher = better)", + ], + ) + # RMSE + fig_dual.add_trace(go.Bar( + x=_ts_chart["horizon"].tolist(), y=_ts_chart["RMSE"].tolist(), + name="Time-series", marker_color=_BRAND_GREEN, + text=[f"{v:.2f}" for v in _ts_chart["RMSE"]], textposition="outside", + ), row=1, col=1) + if not _xs_chart.empty: + fig_dual.add_trace(go.Bar( + x=_xs_chart["horizon"].tolist(), y=_xs_chart["RMSE"].tolist(), + name="Cross-sectional", marker_color="#FF8C00", + text=[f"{v:.2f}" for v in _xs_chart["RMSE"]], textposition="outside", + ), row=1, col=1) + # R² + fig_dual.add_trace(go.Bar( + x=_ts_chart["horizon"].tolist(), y=_ts_chart["R2"].tolist(), + name="Time-series", marker_color=_BRAND_GREEN, + text=[f"{v:.3f}" for v in _ts_chart["R2"]], textposition="outside", + showlegend=False, + ), row=1, col=2) + if not _xs_chart.empty: + fig_dual.add_trace(go.Bar( + x=_xs_chart["horizon"].tolist(), y=_xs_chart["R2"].tolist(), + name="Cross-sectional", marker_color="#FF8C00", + text=[f"{v:.3f}" for v in _xs_chart["R2"]], textposition="outside", + showlegend=False, + ), row=1, col=2) + # Baseline reference line on RMSE chart + if _best_xs_rmse is not None: + fig_dual.add_hline( + y=_best_xs_rmse, line_dash="dash", line_color="gray", + annotation_text=f"XS baseline ({_best_xs_rmse:.2f})", + row=1, col=1, + ) + # Zero line on R² chart + fig_dual.add_hline( + y=0, line_dash="dot", line_color="red", + annotation_text="R²=0 (predicting mean)", + row=1, col=2, + ) + fig_dual.update_layout( + height=460, barmode="group", + legend=dict(orientation="h", yanchor="bottom", y=1.05, xanchor="right", x=1), + ) + fig_dual.update_yaxes(title_text="RMSE (\u00b5mol m\u207b\u00b2 s\u207b\u00b9)", row=1, col=1) + fig_dual.update_yaxes(title_text="R\u00b2", row=1, col=2) + with st.expander("How to read these charts"): + st.markdown( + "**Left \u2014 RMSE:** lower = better. Green = time-series (with lag features), " + "orange = cross-sectional (weather only). The dashed line is the cross-sectional " + "baseline \u2014 green bars below it mean lags help at that horizon. " + "The 1-month spike is expected: a 30-day-ahead forecast from recent lags is unreliable.\n\n" + "**Right \u2014 R\u00b2:** higher = better. Above the red dotted line (R\u00b2 > 0) means the " + "model beats a simple mean prediction. Negative R\u00b2 (e.g. 1-month) means the model " + "is worse than the mean." + ) + st.plotly_chart(fig_dual) + + # --- Per-season breakdown --- + if ts_season_path.exists(): + ts_season = load_metrics(str(ts_season_path)) + ts_per = ts_season[ts_season["season"] != "all"].copy() + if not ts_per.empty: + st.markdown("**Per-season breakdown**") + _per_cols = [c for c in ["horizon", "season", "RMSE", "MAE", "R2", "n_train", "n_test"] if c in ts_per.columns] + ts_per_disp = ts_per[_per_cols].copy() + ts_per_disp["_ord"] = ts_per_disp["horizon"].map({h: i for i, h in enumerate(_HORIZON_ORDER)}) + ts_per_disp = ts_per_disp.sort_values(["_ord", "season"]).drop(columns=["_ord"]) + for _col in ["RMSE", "MAE", "R2"]: + if _col in ts_per_disp.columns: + ts_per_disp[_col] = ts_per_disp[_col].round(3) + with st.expander("How to read the per-season table"): + st.markdown( + "Each growing season (May\u2013Sep) is evaluated independently \u2014 lags and targets " + "never cross the off-season gap. **n_train / n_test** show the number of 15-min " + "samples used. Year-to-year differences reveal weather variability: a season " + "with steadier radiation has lower RMSE. Missing rows mean not enough data " + "for that horizon in that season (e.g. 1-month needs 30 days of future data)." + ) + st.dataframe(ts_per_disp, hide_index=True) + + if _HAS_PLOTLY: + _per_chart = ts_per.copy() + _per_chart["_ord"] = _per_chart["horizon"].map({h: i for i, h in enumerate(_HORIZON_ORDER)}) + _per_chart = _per_chart.sort_values(["_ord", "season"]) + fig_s = px.bar( + _per_chart, x="horizon", y="RMSE", color="season", + barmode="group", + title="RMSE by horizon and season", + labels={"RMSE": "RMSE (\u00b5mol m\u207b\u00b2 s\u207b\u00b9)", "horizon": "Horizon"}, + text="RMSE", + ) + fig_s.update_traces(texttemplate="%{text:.2f}", textposition="outside") + fig_s.update_layout(height=400) + st.plotly_chart(fig_s) + + st.download_button( + "Download horizon comparison CSV", + ts_comp.to_csv(index=False), + file_name="ts_horizon_comparison.csv", + mime="text/csv", + ) + else: + st.info("No time-series results found. Run `python scripts/run_pipeline.py` to generate them.") + + # ---- IMS Cache Coverage Panel ------------------------------------------ + st.divider() + st.subheader("IMS Weather Data Coverage") + with st.spinner("Loading IMS cache coverage…"): + try: + from src.ims_client import IMSClient as _IMSClient + _ims = _IMSClient() + _df_ims = _ims.load_cached() + if _df_ims.empty: + st.info("No IMS data in cache. Use the IMS fetch controls to populate it.") + else: + _ts_col = "timestamp_utc" if "timestamp_utc" in _df_ims.columns else _df_ims.columns[0] + _ts = pd.to_datetime(_df_ims[_ts_col], utc=True) + _first = _ts.min() + _last = _ts.max() + _n_days = (_last - _first).days + 1 + _now_utc = pd.Timestamp.now(tz="UTC") + _age_min = float((_now_utc - _last).total_seconds() / 60.0) + _age_str = ( + f"{_age_min:.0f} min" if _age_min < 60 + else f"{_age_min / 60:.1f} h" + ) + _cov1, _cov2, _cov3, _cov4 = st.columns(4) + _cov1.metric("First record", _first.strftime("%Y-%m-%d %H:%M UTC")) + _cov2.metric("Last record", _last.strftime("%Y-%m-%d %H:%M UTC")) + _cov3.metric("Days of coverage", f"{_n_days} d") + _cov4.metric("Age of latest record", _age_str) + except Exception as _cov_exc: + st.warning(f"Could not load IMS cache: {_cov_exc}") + + # ---- Day-Ahead Forecasting (Chronos-2) -------------------------------- + st.divider() + st.subheader("Day-Ahead Forecasting with Chronos-2") + st.markdown( + "**Chronos-2** is a pre-trained time-series foundation model (Amazon, 120 M params) " + "that forecasts photosynthesis rate **24 hours ahead** using weather covariates. " + "Because it is a *foundation model*, it requires **no task-specific training** — " + "the model generalises from its pre-training corpus to our vineyard signal." + ) + + with st.expander("What is Chronos-2?"): + st.markdown(""" + **Foundation model approach** — Chronos-2 is pre-trained on a massive corpus of + open time-series data, then applied *zero-shot* to our vineyard A series. We use + four covariate modes (walk-forward, daytime-only evaluation): + + | Mode | Covariates | + |------|-----------| + | `none` | Univariate (A only) | + | `ims` | IMS station 43: GHI, air T, RH, wind | + | `sensor` | On-site: PAR, VPD, T_leaf, CO₂ | + | `all` | IMS + sensor (past); IMS as future covariates | + + **Input pipeline** — Data is merged (labels + IMS + sensors), resampled to a + regular 15-min grid, and engineered time/stress columns are available in the + pipeline; the benchmark uses IMS + sensor for the best zero-shot trade-off. + """) + + chronos_path = settings.OUTPUTS_DIR / "chronos_benchmark.csv" + chronos_bench = load_metrics(chronos_path) if chronos_path.exists() else pd.DataFrame() + + if not chronos_bench.empty: + # --- Metric cards --- (zero-shot = any row that is not LoRA or ML baseline) + zs_mask = ~chronos_bench["mode"].str.contains("lora|ML baseline", case=False, na=False) + zs_rows = chronos_bench.loc[zs_mask].copy() + best_mae_row = zs_rows.loc[zs_rows["MAE"].idxmin()] if not zs_rows.empty else None + ml_row = chronos_bench[chronos_bench["mode"].str.contains("ML baseline", case=False, na=False)] + ml_mae = float(ml_row["MAE"].iloc[0]) if not ml_row.empty else 2.7 + + c1, c2, c3 = st.columns(3) + if best_mae_row is not None: + mode_label = best_mae_row["mode"].split("/")[-1].strip() if "/" in str(best_mae_row["mode"]) else best_mae_row["mode"] + c1.metric("Best Zero-Shot MAE", f"{best_mae_row['MAE']:.2f} µmol m⁻² s⁻¹", + delta=f"{mode_label} covariates") + best_r2 = best_mae_row.get("R2") or best_mae_row.get("R²") + best_r2 = best_r2 if pd.notna(best_r2) else 0.52 + c2.metric("R²", f"{float(best_r2):.2f}") + c3.metric("ML Baseline MAE", f"{ml_mae:.1f} µmol m⁻² s⁻¹", + delta=f"{((ml_mae - (best_mae_row['MAE'] if best_mae_row is not None else ml_mae)) / ml_mae * 100):.0f}% improvement", + delta_color="normal") + + # --- Covariate ablation table (zero-shot only) --- + st.markdown("##### Covariate Ablation (Zero-Shot)") + if not zs_rows.empty: + r2_col = "R2" if "R2" in zs_rows.columns else "R²" + display_zs = zs_rows[["mode", "MAE", "RMSE", r2_col]].copy() + display_zs.columns = ["Mode", "MAE", "RMSE", "R²"] + st.dataframe(display_zs.style.format({"MAE": "{:.4f}", "RMSE": "{:.4f}", "R²": "{:.4f}"}), + hide_index=True) + + # --- Per-month LoRA table --- + lora_rows = chronos_bench[chronos_bench["mode"].str.contains("lora", case=False, na=False)].copy() + if not lora_rows.empty: + st.markdown("##### Per-Month LoRA Fine-Tuning") + lora_rows["Month"] = lora_rows["mode"].str.extract(r"(\w+)$") + display_lora = lora_rows[["Month", "MAE", "R2"]].copy() + display_lora.columns = ["Month", "MAE", "R²"] + st.dataframe(display_lora.style.format({"MAE": "{:.3f}", "R²": "{:.3f}"}), + hide_index=True) + + # --- Bar chart: MAE by covariate mode --- + if _HAS_PLOTLY and not zs_rows.empty: + fig_chr = px.bar( + zs_rows, x="mode", y="MAE", + title="Zero-Shot MAE by Covariate Mode", + labels={"MAE": "MAE (µmol m⁻² s⁻¹)", "mode": "Covariate Mode"}, + text="MAE", + color_discrete_sequence=[_BRAND_GREEN], + ) + fig_chr.update_traces(texttemplate="%{text:.2f}", textposition="outside") + fig_chr.add_hline(y=ml_mae, line_dash="dash", line_color="red", + annotation_text=f"ML baseline ({ml_mae})") + fig_chr.update_layout(height=400, showlegend=False) + st.plotly_chart(fig_chr) + + # --- Forecast sample image --- + forecast_img = settings.OUTPUTS_DIR / "chronos_forecast_sample.png" + if forecast_img.exists(): + with st.expander("Sample Forecast with Confidence Bands", expanded=True): + st.image(str(forecast_img), width='stretch') + st.caption( + "Shaded regions show 80% and 95% prediction intervals from " + "Chronos-2's probabilistic output. Unlike point-estimate ML models, " + "the foundation model quantifies forecast uncertainty natively." + ) + + st.info( + "**Key insight:** Chronos-2 zero-shot with IMS + sensor covariates achieves " + "MAE ~3.9 µmol m⁻² s⁻¹ (R² ~0.52) in walk-forward evaluation, with **probabilistic** " + "forecasts (10–90% quantiles). The pipeline was revisited with extended IMS (tdmax/tdmin) " + "and time/stress features; the current best uses the standard IMS + on-site sensor set." + ) + else: + st.info("No Chronos-2 benchmark results found. See `outputs/chronos_benchmark.csv`.") + + # ---- Intelligent Model Routing (Gemini) -------------------------------- + st.divider() + st.subheader("Intelligent Model Routing (Gemini)") + st.markdown( + "An LLM-based routing agent classifies real-time vineyard conditions and " + "selects the most appropriate photosynthesis model: **FvCB** (Farquhar) for " + "standard conditions or **ML ensemble** for non-linear heat/water stress." + ) + + routing_scenarios = pd.DataFrame({ + "Scenario": [ + "Cool morning (T=22°C, PAR=800)", + "Hot afternoon (T=38°C, VPD=3.2 kPa)", + "Moderate midday (T=29°C, well-watered)", + ], + "Routed Model": ["FvCB (Farquhar)", "ML Ensemble", "ML Ensemble"], + "Rationale": [ + "Below 30°C transition — RuBP-limited, FvCB is reliable", + "Above stress threshold — non-linear response, ML captures better", + "Near transition — ML provides safer prediction margin", + ], + }) + st.dataframe(routing_scenarios, hide_index=True) + + with st.expander("How does routing work?"): + st.markdown(""" + **System prompt** — The routing agent receives a structured system prompt + describing the two available models, their strengths, and decision criteria + based on temperature, VPD, and radiation thresholds. + + **Gemini 2.5 Flash** — We use Google's Gemini 2.5 Flash for low-latency + classification (~200 ms per call). The model returns a structured JSON + response with `model_choice` and `reasoning` fields. + + **Fallback logic** — If the LLM call fails or times out, the system defaults + to the ML ensemble (the safer, more general option). + + **Architecture:** + + ``` + Telemetry (T, VPD, PAR, SWC) + │ + ▼ + Gemini 2.5 Flash + (routing classifier) + │ + ┌────┴────┐ + ▼ ▼ + FvCB ML Ensemble + (standard) (stress) + │ │ + └────┬────┘ + ▼ + A prediction (µmol m⁻² s⁻¹) + ``` + """) + + # ---- Day-Ahead Stress Advisory (Gemini) --------------------------------- + st.divider() + st.subheader("Day-Ahead Stress Advisory (Gemini)") + st.markdown( + "Gemini analyzes the day-ahead weather forecast through **Semillon vine biology rules** " + "to produce a structured stress profile, energy budget recommendations, and model routing " + "preferences. This advisory feeds into the future day-ahead planner." + ) + + try: + from src.day_ahead_advisor import DayAheadAdvisor + + # Load last available IMS day from cache as demo forecast + _ims_cache_path = Path("Data/ims/ims_merged_15min.csv") + if _ims_cache_path.exists(): + _adv_df = pd.read_csv(_ims_cache_path, parse_dates=True) + for _tc in ["timestamp_utc", "datetime", "time", "timestamp"]: + if _tc in _adv_df.columns: + _adv_df.index = pd.to_datetime(_adv_df[_tc]) + break + if isinstance(_adv_df.index, pd.DatetimeIndex): + _last_date = _adv_df.index.date[-1] + _adv_day = _adv_df[_adv_df.index.date == _last_date] + _date_str = str(_last_date) + else: + _adv_day = _adv_df.tail(96) + _date_str = "unknown" + + _advisor = DayAheadAdvisor(verbose=False) + _report = _advisor.advise( + date=_date_str, + weather_forecast=_adv_day, + phenological_stage="veraison", + remaining_weekly_budget_kWh=15.0, + remaining_monthly_budget_kWh=50.0, + ) + + # Metric cards + _ac1, _ac2, _ac3, _ac4 = st.columns(4) + _ac1.metric("Peak Severity", + _report.stress_profile.peak_stress_severity.capitalize()) + _ac2.metric("Peak Stress Hour", + f"{_report.stress_profile.peak_stress_hour}:00") + _ac3.metric("Budget Rec.", + f"{_report.budget_recommendation.daily_budget_fraction:.0%}") + _ac4.metric("Rubisco-Limited Hours", + _report.stress_profile.rubisco_limited_hours) + + # Summary + st.info(_report.stress_profile.summary) + + # Full JSON report + with st.expander("Full Advisory Report (JSON)"): + st.json(DayAheadAdvisor.report_to_dict(_report)) + else: + st.info("No IMS data found at Data/ims/ims_merged_15min.csv. " + "Run `python scripts/download_ims_data.py` to fetch weather data.") + except Exception as _adv_exc: + st.warning(f"Day-Ahead Advisory unavailable: {_adv_exc}") + + # --------------------------------------------------------------------------- + # --------------------------------------------------------------------------- + # Tab — Photosynthesis & Data (combines Farquhar Model, Model Validation, Data Explorer) + # --------------------------------------------------------------------------- + diff --git a/ui/tab_overview.py b/ui/tab_overview.py new file mode 100644 index 0000000000000000000000000000000000000000..b772bd4d1f6c9682abe01050430bb79ddb40ea5f --- /dev/null +++ b/ui/tab_overview.py @@ -0,0 +1,482 @@ +""" +Overview tab: presentation and key takeaways for the SolarWine app. +""" + +from __future__ import annotations + +import pandas as pd +import streamlit as st + +from config import settings +from ui.bootstrap import ( + check_ai_health, + ensure_ims_refresh_background, + load_labels, + load_metrics, +) + +_ASSETS = settings.PROJECT_ROOT / "assets" + + +def render_tab_overview() -> None: + _ai_status = check_ai_health() + _ims_status = ensure_ims_refresh_background() + + status_cols = st.columns(2) + with status_cols[0]: + if _ai_status.get("ok"): + st.caption("AI service status: healthy (Gemini reachable).") + else: + st.warning( + "AI service status: unavailable. " + "Gemini calls may fall back to biology-only answers or cached data. " + "Check your GOOGLE_API_KEY or network access." + ) + if _ai_status.get("error"): + st.caption(f"AI health check error: `{_ai_status['error']}`") + + with status_cols[1]: + if _ims_status.get("running"): + st.caption("IMS cache status: refreshing recent weather data in the background…") + elif _ims_status.get("ok"): + st.caption("IMS cache status: refreshed with recent weather data.") + else: + st.warning( + "IMS cache status: not up to date. " + "Latest weather in the app may be stale until IMS is fixed." + ) + if _ims_status.get("error"): + st.caption(f"IMS refresh error: `{_ims_status['error']}`") + + st.markdown("## 1. SolarWine — Smart Shading for Agrivoltaic Vineyards") + st.markdown( + "**Site:** Sde Boker research station, Negev desert, Israel \n" + "**Crop:** *Vitis vinifera* cv. Semillon grapevine \n" + "**Challenge:** Solar panels and grapevines compete for the same sunlight. " + "How do we split it so both thrive?" + ) + + _vineyard_img = _ASSETS / "vineyard_panels.png" + _closeup_img = _ASSETS / "vineyard_closeup.png" + if _vineyard_img.exists() or _closeup_img.exists(): + _p_img_l, _p_img_r = st.columns(2) + if _vineyard_img.exists(): + with _p_img_l: + st.image(str(_vineyard_img), width='stretch', + caption="Solar trackers above grapevine rows") + if _closeup_img.exists(): + with _p_img_r: + st.image(str(_closeup_img), width='stretch', + caption="Grapevines under tilted solar panels") + + st.markdown( + "**Why photosynthesis?** Our working hypothesis is simple: " + "a vine that photosynthesizes well produces good wine. Photosynthesis " + "drives sugar accumulation, flavor-compound synthesis, and canopy health " + "— so if we can keep A (net carbon assimilation) high throughout the " + "growing season, grape quality follows. Everything in this system is " + "built around measuring, predicting, and protecting photosynthesis." + ) + st.markdown( + "The Negev provides **far more radiation** than a grapevine can use — " + "midday PAR routinely exceeds 2000 µmol/m²/s, but photosynthesis " + "saturates well below that. The surplus can be harvested as electricity " + "without hurting the vine." + ) + st.markdown( + "But first we need to *measure* how much photosynthesis the vine actually " + "performs — that's what the Farquhar model does." + ) + + with st.expander("What is agrivoltaics? What is PAR?"): + st.markdown( + "**Agrivoltaics** is the dual use of land for both agriculture and solar " + "energy — panels are mounted above the crops so both share the same field.\n\n" + "**PAR (Photosynthetically Active Radiation)** is the slice of sunlight " + "(wavelengths 400–700 nm) that plants actually use for photosynthesis, " + "measured in µmol photons/m²/s.\n\n" + "**Light saturation** means that beyond a certain PAR threshold, more " + "light does *not* increase photosynthesis — the vine's internal " + "biochemistry becomes the bottleneck, not the light supply.\n\n" + "**Why Sde Boker?** The Negev desert delivers extreme radiation, well " + "above the vine's saturation point, making it an ideal site to demonstrate " + "that surplus light can be redirected to electricity without harming the crop." + ) + + st.divider() + + st.markdown("## 2. Two-Stage Pipeline") + st.markdown( + "We built a two-stage system to model and then predict vine photosynthesis:" + ) + + _p_s1, _p_arrow1, _p_s2, _p_arrow2, _p_s3 = st.columns([3, 1, 3, 1, 3]) + with _p_s1: + st.markdown( + "### Stage 1: Measure\n" + "**6 on-site sensors** (PAR, leaf temp, air temp, CO₂, VPD, humidity) " + "→ Farquhar FvCB mechanistic model → **photosynthesis rate A** " + "(µmol CO₂ m⁻² s⁻¹)" + ) + with _p_arrow1: + st.markdown("
", + unsafe_allow_html=True) + with _p_s2: + st.markdown( + "### Stage 2: Predict\n" + "**On-site sensors + IMS weather** (station 43 — temperature, GHI, " + "humidity, wind, rain) → ML regressors (RF, GBR, XGBoost) → " + "**forecast A ahead of time**" + ) + with _p_arrow2: + st.markdown("
", + unsafe_allow_html=True) + with _p_s3: + st.markdown( + "### Goal\n" + "Predict tomorrow's photosynthesis so the **panel-tilt optimizer** " + "can plan tracker angles a day ahead — shading only when the vine " + "actually needs protection." + ) + + st.info( + "**CO₂ correction:** On-site CO₂ sensor reads ~600 ppm (known warm bias). " + "A ×0.7 correction factor brings values to ~420 ppm, consistent with " + "ambient atmospheric levels." + ) + + with st.expander("Key terms: Farquhar model, ML regressors, IMS"): + st.markdown( + "**Farquhar FvCB model** (1980) is the standard physics-based model that " + "predicts leaf photosynthesis from light, temperature, and CO₂ — think of " + "it as a formula that says *'given this much light and heat, the leaf fixes " + "this much carbon.'*\n\n" + "**ML regressors** are machine-learning algorithms that learn patterns " + "from data:\n" + "- **RF (Random Forest):** many decision trees vote together\n" + "- **GBR (Gradient Boosted Regression):** trees are added one at a time, " + "each correcting the previous errors\n" + "- **XGBoost:** an optimised variant of gradient boosting\n\n" + "**IMS** — Israel Meteorological Service, providing free public weather " + "station data.\n\n" + "**VPD (Vapor Pressure Deficit)** measures how dry the air is. High VPD " + "makes the vine close its stomata (leaf pores) to conserve water, which " + "reduces CO₂ intake and slows photosynthesis.\n\n" + "**Why two stages?** Stage 1 computes A from current sensor readings " + "(what is happening *now*); Stage 2 learns to *forecast* A ahead of time " + "so the tracker optimizer can plan tomorrow's panel angles today." + ) + + st.divider() + + st.markdown("## 3. Stage 1 — Farquhar Mechanistic Model") + st.markdown( + "The Farquhar et al. (1980) model with Greer & Weedon (2012) grapevine " + "parameters computes **A = min(Ac, Aj) − Rd** at each 15-min interval " + "during the growing season (May–Sep, daytime PAR > 50)." + ) + + _p_labels_path = settings.PROCESSED_DIR / "stage1_labels.csv" + _p_val_img = settings.OUTPUTS_DIR / "stage1_validation.png" + + if _p_labels_path.exists(): + _p_labels = load_labels(str(_p_labels_path)) + _p_labels.index = pd.to_datetime(_p_labels.index, utc=True) + + _pc1, _pc2, _pc3, _pc4 = st.columns(4) + _pc1.metric("Observations", f"{len(_p_labels):,}") + _pc2.metric("Mean A", f"{_p_labels.iloc[:, 0].mean():.1f} µmol m⁻² s⁻¹") + _pc3.metric("Date from", _p_labels.index.min().strftime("%Y-%m-%d")) + _pc4.metric("Date to", _p_labels.index.max().strftime("%Y-%m-%d")) + else: + st.warning("Stage 1 labels not found — run the pipeline first.") + + if _p_val_img.exists(): + st.image(str(_p_val_img), width='stretch', + caption="Top: Diurnal A pattern (bell curve peaking mid-morning). " + "Bottom: A vs PAR (light-response curve with saturation).") + + st.success( + "**Key insight:** The model produces physiologically plausible A values — " + "a clear diurnal bell curve and the expected light-saturation response." + ) + st.markdown( + "With reliable A measurements in hand, the next step is *predicting* A " + "from weather data so the system can plan ahead." + ) + + with st.expander("Reading the results: what is A? What do the plots show?"): + st.markdown( + "**A (net photosynthesis rate)** is measured in µmol CO₂ per m² of leaf " + "per second — higher means the vine is growing faster. Healthy grapevines " + "typically range from 5 to 20.\n\n" + "**Diurnal bell curve:** photosynthesis peaks mid-morning when both light " + "and temperature are favourable, then drops in the afternoon heat.\n\n" + "**Light-response curve:** A increases with PAR up to a point, then " + "flattens (saturates) — this proves the vine cannot use all of the " + "Negev's intense sunlight.\n\n" + "**\"Physiologically plausible\"** means the model reproduces the patterns " + "that plant biologists expect from real grapevines — it behaves like a " + "real vine, not just a curve fit." + ) + + st.divider() + + st.markdown("## 4. Stage 2 — ML Prediction from Weather Data") + + _p_metrics_path = settings.OUTPUTS_DIR / "stage2_metrics.csv" + _p_pred_img = settings.OUTPUTS_DIR / "stage2_predictions.png" + _p_ts_path = settings.OUTPUTS_DIR / "ts_horizon_comparison.csv" + + if _p_metrics_path.exists(): + _p_metrics = load_metrics(str(_p_metrics_path)) + st.markdown("#### Cross-sectional model comparison") + st.dataframe(_p_metrics, hide_index=True) + + if "R2" in _p_metrics.columns: + _p_best = _p_metrics.loc[_p_metrics["R2"].idxmax()] + st.markdown( + f"**Best model:** {_p_best['model']} — " + f"R² = {_p_best['R2']:.3f}, RMSE = {_p_best['RMSE']:.2f} µmol m⁻² s⁻¹. " + f"Explains **{_p_best['R2']*100:.0f}%** of variance in A from weather data." + ) + else: + st.warning("Stage 2 metrics not found.") + + if _p_pred_img.exists(): + st.image(str(_p_pred_img), width='stretch', + caption="Left: Predicted vs approximate A (scatter). " + "Right: Time-series overlay showing temporal patterns.") + + if _p_ts_path.exists(): + _p_ts = load_metrics(str(_p_ts_path)) + st.markdown("#### Time-series forecasting (lagged features)") + _p_ts_all = _p_ts[_p_ts["season"] == "all"] if "season" in _p_ts.columns else _p_ts + _p_ts_ts = _p_ts_all[_p_ts_all["approach"] == "time_series"].copy() + if not _p_ts_ts.empty: + _p_ts_disp = _p_ts_ts[["horizon", "RMSE", "MAE", "R2"]].copy() + for _c in ["RMSE", "MAE", "R2"]: + _p_ts_disp[_c] = _p_ts_disp[_c].round(3) + st.dataframe(_p_ts_disp, hide_index=True) + _p_best_ts = _p_ts_ts.loc[_p_ts_ts["R2"].idxmax()] + st.markdown( + f"**Best horizon:** {_p_best_ts['horizon']} — " + f"R² = {_p_best_ts['R2']:.3f}, RMSE = {_p_best_ts['RMSE']:.2f}. " + "Adding recent A history dramatically improves short-term predictions." + ) + + with st.expander("Understanding the metrics: R², RMSE, cross-sectional vs time-series"): + st.markdown( + "**R² (R-squared):** the proportion of variance explained by the model. " + "R² = 0.87 means the model explains 87% of the variation in A — close to " + "1.0 is excellent, 0.0 means no better than guessing the average.\n\n" + "**RMSE (Root Mean Squared Error):** the average prediction error in the " + "same units as A (µmol/m²/s). Lower is better. It penalises large errors " + "more than small ones.\n\n" + "**Cross-sectional model:** predicts A from the weather at the *same* " + "moment — no memory of what happened before.\n\n" + "**Time-series model:** also uses recent past values (lags) — " + "*\"what was A 15 minutes ago?\"* This helps because photosynthesis changes " + "smoothly over time.\n\n" + "**Why short horizons are better:** recent A values are very informative; " + "predicting 15 minutes ahead is much easier than predicting a month ahead." + ) + + st.divider() + + st.markdown("## 5. ML Strategy — Four Prediction Layers") + st.markdown( + "Predicting photosynthesis is not a single-model problem. We stack four " + "complementary approaches, each adding a capability the previous one lacks:" + ) + + _ml_cols = st.columns(4) + with _ml_cols[0]: + st.markdown( + "### Layer 1\n" + "**Cross-sectional ML**\n\n" + "RF, GBR, XGBoost trained on IMS weather features at the *same* time step. " + "No memory of the past — purely \"given today's weather, what is A right now?\" " + "Best R² ≈ 0.80." + ) + with _ml_cols[1]: + st.markdown( + "### Layer 2\n" + "**Time-series forecasting**\n\n" + "Adds lagged A and rolling weather windows (15 min – 3 h) as features. " + "A separate model per horizon (15-min to 1-month). " + "Best R² ≈ 0.87 at 15-min; degrades at longer horizons." + ) + with _ml_cols[2]: + st.markdown( + "### Layer 3\n" + "**Chronos-2 foundation model**\n\n" + "Amazon's pre-trained 120M-parameter time-series model. Zero-shot " + "day-ahead forecast (24 h / 96 steps) with probabilistic confidence " + "bands — no task-specific training needed. Optional LoRA fine-tuning." + ) + with _ml_cols[3]: + st.markdown( + "### Layer 4\n" + "**LLM orchestration (Gemini)**\n\n" + "Two roles: (a) *Data engineer* — LLM-generated anomaly thresholds and " + "stress features; (b) *Routing agent* — classifies real-time conditions " + "and picks FvCB or ML ensemble per 15-min slot, plus day-ahead advisory." + ) + + st.markdown( + "Each layer feeds the next: cross-sectional models establish a baseline, " + "time-series models exploit temporal continuity, Chronos-2 extends the " + "horizon to 24 hours with uncertainty quantification, and Gemini ties " + "everything together — cleaning the data, selecting the right model for " + "each moment, and producing actionable day-ahead shading recommendations." + ) + st.markdown( + "Predictions alone aren't enough — we also need to understand exactly " + "how panel shadows affect each part of the canopy." + ) + + with st.expander("Why four layers instead of one best model?"): + st.markdown( + "**No single model wins everywhere.** Cross-sectional ML is robust but " + "blind to recent trends. Time-series models excel at short horizons but " + "degrade beyond a few hours. Chronos-2 handles day-ahead with built-in " + "uncertainty but needs a sanity check. The Gemini routing agent acts as " + "an intelligent dispatcher:\n\n" + "- **Cool morning, T < 30 °C →** route to Farquhar (mechanistic model " + "is most accurate in the RuBP-limited regime)\n" + "- **Hot afternoon, T > 30 °C →** route to ML ensemble (better at " + "capturing stress-induced non-linearities)\n" + "- **Day-ahead planning →** Chronos-2 probabilistic forecast, cross-checked " + "against vine biology rules (no shade before 10:00, no shade in May, " + "5% annual energy ceiling)\n\n" + "**Foundation model (Chronos-2):** a large neural network pre-trained on " + "millions of time series from many domains. It learns general patterns " + "(trends, seasonality, noise) and can forecast new series *zero-shot* — " + "without any vineyard-specific training.\n\n" + "**LoRA fine-tuning:** Low-Rank Adaptation — a lightweight method to " + "specialise the foundation model on our vineyard data using only ~500 " + "training steps, without modifying the original weights.\n\n" + "**LLM orchestration:** using a large language model (Gemini) not for " + "chat, but as a reasoning engine that reads sensor statistics, applies " + "domain rules, and outputs structured decisions (thresholds, routing " + "choices, shading schedules)." + ) + + st.divider() + + st.markdown("## 6. Shadow Model & Shading Analysis") + st.markdown( + "A 3D ray-tracing shadow model computes where panel shadows fall on a " + "VSP-trained canopy (1.2 m tall, 3 vertical zones). Combined with the " + "Farquhar model, this shows how much photosynthesis the vine retains " + "under panels. At midsummer noon the vine retains the vast majority of " + "its photosynthesis under the panel — light saturation means halving PAR " + "barely affects A, so the surplus can be harvested as electricity." + ) + st.markdown( + "This shadow model becomes the physics engine inside the tracker " + "controller — it evaluates candidate tilt angles and their effect on " + "each canopy zone in real time." + ) + st.info( + "See the **Shading Simulator** tab for the interactive 3D shadow viewer " + "with date/hour controls, PAR and photosynthesis heatmaps, and zone-level analysis." + ) + + with st.expander("How the shadow model works"): + st.markdown( + "**VSP trellis (Vertical Shoot Positioning):** the standard vineyard " + "training system where shoots grow upward in a flat plane, creating a wall " + "of leaves roughly 1.2 m tall.\n\n" + "**3 vertical zones:** the canopy is divided into bottom (trunk/cordons), " + "middle (fruiting zone — where the grapes hang), and top (main leaf area). " + "Each zone has different leaf density and economic importance.\n\n" + "**Ray-tracing:** the model tracks the sun's position, calculates where " + "the panel casts a shadow, and determines which parts of the canopy are " + "shaded versus sunlit at each time step.\n\n" + "**Why the vine barely notices the panel:** at midday, even the shaded " + "parts receive enough scattered (diffuse) light plus direct light from " + "unshaded portions to saturate photosynthesis." + ) + + st.divider() + + st.markdown("## 7. Tracker Control & Optimization") + st.markdown( + "**Default = full astronomical tracking** (maximum energy generation). " + "Anti-tracking is a rare, minimum-dose intervention ONLY when the fruiting " + "zone faces measurable heat/radiation risk. The user sets a hard energy " + "sacrifice ceiling (e.g. 5%/year) — the system guarantees it is never exceeded." + ) + + _tc_cols = st.columns(4) + with _tc_cols[0]: + st.markdown( + "### Budget Hierarchy\n" + "User sets an annual ceiling (e.g. 5%). Distributed " + "Year → Month → Week → Day → 15-min slot. " + "July–Aug get ~85% of the budget. Unused slots roll forward." + ) + with _tc_cols[1]: + st.markdown( + "### Intervention Gate\n" + "Hard pass/fail filter. **No-shade windows:** before 10:00, May, " + "T < 28 °C, CWSI < 0.3. Eligible only when ALL pass: " + "T ≥ 30 °C, CWSI ≥ 0.4, GHI ≥ 500, FvCB confirms shading helps." + ) + with _tc_cols[2]: + st.markdown( + "### Minimum Dose\n" + "Scan offsets [3°, 5°, 8°, 10°, 15°, 20°] smallest-first. " + "Select first that brings fruiting-zone PAR < 400 µmol while top " + "canopy > 70% sunlit, within budget." + ) + with _tc_cols[3]: + st.markdown( + "### Day-Ahead DP\n" + "Discrete Dynamic Programming at sunrise: optimize 96-slot trajectory. " + "Utility = energy value + crop value − movement cost, subject to " + "daily budget. Phenological weighting (1.5× veraison)." + ) + + st.markdown( + "**Typical day:** full tracking 05:00–11:00 → minimum-dose shading " + "~3–8° from 11:00–15:30 → full tracking by 16:00. Over a season: " + "~92% full tracking, ~8% shading, sacrifice ≤ 5%." + ) + st.info( + "This control system is the next implementation phase. The measurement, " + "prediction, and shadow modules above are its foundation. " + "Manual **LiCor gas-exchange measurements** (LI-6400/6800) will serve as " + "ground truth for calibrating model parameters and fine-tuning the ML pipeline." + ) + + with st.expander("How does the day-ahead optimizer work?"): + st.markdown( + "**DP in plain English:** plan the best tilt angle for each 15-min slot, " + "knowing that each choice affects how much budget remains for later slots.\n\n" + "**Utility function:** balances electricity revenue vs crop protection, and " + "penalises motor movement (each tilt change costs energy and wear).\n\n" + "**Phenological weighting:** crop value varies by growth stage — 1.5× during " + "veraison (berry ripening), 0.5× post-harvest — so the system shades more " + "aggressively when fruit quality is most at stake.\n\n" + "**Zone weighting:** top canopy 60%, fruiting zone 30%, trunk 10% — " + "penalises shading productive upper leaves, which generate most of the " + "vine's energy.\n\n" + "**Real-time override:** the DP plan is a *schedule*, not a command. Live " + "sensor readings override if the forecast diverges from reality.\n\n" + "**Fallback:** if anything fails — sensor dropout, model error, comms loss — " + "the tracker reverts to full astronomical tracking (zero sacrifice)." + ) + + st.markdown("## 8. Key Takeaways") + st.markdown(""" +- **Farquhar model** → reliable 15-min photosynthesis measurements from on-site sensors +- **Four ML layers** → day-ahead prediction with uncertainty (cross-sectional → time-series → Chronos-2 → Gemini routing) +- **Shadow model** → physics engine for evaluating tilt-angle effects on each canopy zone +- **Tracker control** → budget-constrained DP optimization; minimum-dose shading; ≤ 5% energy sacrifice guaranteed +- **LiCor calibration** → manual gas-exchange ground truth triggers automated model retraining and versioned deployment +- **Full story** → measure → predict → simulate → control → calibrate — each module feeds the next + """) + st.markdown("Learn more at [solarwine.ai](https://www.solarwine.ai/)") diff --git a/ui/tab_shading.py b/ui/tab_shading.py new file mode 100644 index 0000000000000000000000000000000000000000..2c368cca51966c631e13626ed65d90ebfc290b3f --- /dev/null +++ b/ui/tab_shading.py @@ -0,0 +1,1574 @@ +""" +Shading tab. +""" + +from __future__ import annotations + +import streamlit as st +import pandas as pd +import numpy as np + +from config import settings +from ui.bootstrap import _BRAND_GREEN, _HAS_PLOTLY + +if _HAS_PLOTLY: + import plotly.express as px + import plotly.graph_objects as go + from plotly.subplots import make_subplots + + +def render_tab_shading() -> None: + st.header("Panel vs Open Sky — Reference & Test Comparison") + + st.markdown( + + "This tab compares vine conditions **under solar panels** (test, in full astronomical " + + "tracking mode) vs **open sky** (reference, no panels). The panels are always tracking " + + "the sun \u2014 no smart shading algorithm is active yet. These visualizations show " + + "the baseline effect of the panels on light, shadow geometry, and modeled photosynthesis." + + ) + + st.caption( + "\u2139\ufe0f Historical analysis \u2014 the underlying `sensors_wide.csv` archive is frozen at " + "Feb 2026 (the 2026 sensor refresh has a different schema). For live photosynthesis " + "and tracker state, use the **Vineyard Advisor** and **System Status** tabs." + ) + + + try: + + from src.tracker_optimizer import load_sensor_data + + + @st.cache_data + + def _opt_load(): + + return load_sensor_data() + + + df_opt = _opt_load() + + + from src.solar_geometry import ShadowModel + + from src.canopy_photosynthesis import CanopyPhotosynthesisModel + + import pvlib + + + shadow_model = ShadowModel() + + canopy_model = CanopyPhotosynthesisModel(shadow_model=shadow_model) + + + # Inputs: date + hour (local time) + + import datetime as _dt + + _LOCAL_TZ = "Asia/Jerusalem" + + + # Default to a growing-season date — sensor data is May-Sep only + + _today = _dt.date.today() + + _default_date = _today if 5 <= _today.month <= 9 else _dt.date(_today.year, 7, 15) + + if "date" in df_opt.columns: + + _sensor_dates = sorted(df_opt["date"].unique()) + + if _sensor_dates: + + _default_date = _sensor_dates[len(_sensor_dates) // 2] + + viz_date = st.date_input("Date", value=_default_date) + + + # Compute sunrise/sunset for this date to set slider range + + _noon_local = pd.Timestamp(viz_date, tz=_LOCAL_TZ) + pd.Timedelta(hours=12) + + _loc = pvlib.location.Location(shadow_model.lat, shadow_model.lon, + + altitude=shadow_model.altitude, tz=_LOCAL_TZ) + + _sun_times = _loc.get_sun_rise_set_transit( + + pd.DatetimeIndex([_noon_local]), + + ) + + _sunrise_h = int(_sun_times["sunrise"].iloc[0].hour) + + _sunset_h = min(20, int(_sun_times["sunset"].iloc[0].hour) + 1) + + _default_h = (_sunrise_h + _sunset_h) // 2 # midday + + + # --- Section 1: DLI (Daily Light Integral) — date-level, no hour dependency --- + + st.markdown("---") + + st.subheader("1. How much total light reaches the vine?") + + with st.expander("What is DLI and how to read the chart?"): + + st.markdown( + + "**Daily Light Integral (DLI)** is the total number of photosynthetically " + + "active photons received per square meter over a full day, expressed in " + + "**mol m\u207b\u00b2 d\u207b\u00b9**. It integrates both light intensity and duration.\n\n" + + "**Formula:** DLI = \u03a3(PAR\u1d62 \u00d7 \u0394t) / 1,000,000\n\n" + + "**Grapevine thresholds:**\n" + + "- < 5 mol/m\u00b2/d \u2014 severely limiting\n" + + "- 5\u201315 mol/m\u00b2/d \u2014 sub-optimal, reduced yield\n" + + "- 15\u201330 mol/m\u00b2/d \u2014 adequate to optimal\n" + + "- > 30 mol/m\u00b2/d \u2014 above light saturation, no extra benefit\n\n" + + "**The 3-panel chart below:**\n" + + "- **Top:** PAR through the day for reference (orange) and test (green). " + + "The area under each curve is the DLI.\n" + + "- **Middle:** Tracker rotation angle from pvlib (positive = tilted east).\n" + + "- **Bottom:** % of canopy shaded by the panel at each time step.\n\n" + + "_Reference: Faust & Logan (2018), Purdue Extension HO-238-W_" + + ) + + + @st.cache_data + + def _compute_dli(date_str): + + """Compute DLI for ref and test on a given date, 15-min resolution.""" + + _tz = "Asia/Jerusalem" + + _date_local = pd.Timestamp(date_str, tz=_tz) + + _times = pd.date_range( + + _date_local + pd.Timedelta(hours=4), + + _date_local + pd.Timedelta(hours=21), + + freq="15min", + + ) + + _solar = shadow_model.get_solar_position(_times) + + dt_seconds = 15 * 60 # 900 s per step + + + # Try to get measured PAR for this date + + _date_only = pd.Timestamp(date_str) + + _df_day = None + + if "time" in df_opt.columns: + + _ts = pd.to_datetime(df_opt["time"], utc=True) + + _day_mask = _ts.dt.date == _date_only.date() + + if _day_mask.sum() > 10: + + _df_day = df_opt.loc[_day_mask].copy() + + _df_day["_ts"] = _ts[_day_mask] + + + par_ref_sum = 0.0 + + par_test_sum = 0.0 + + steps = [] + + + for idx in range(len(_times)): + + elev = _solar["solar_elevation"].iloc[idx] + + azim = _solar["solar_azimuth"].iloc[idx] + + t = _times[idx] + + # Use local time for display + + t_local = t.tz_convert(_tz) if t.tzinfo else t + + h = t_local.hour + t_local.minute / 60 + + + if elev <= 2: + + steps.append(dict( + + hour=h, par_ref=0.0, par_test=0.0, + + tracker_theta=0.0, shaded_pct=0.0, sunlit_pct=100.0, + + ref_shaded_pct=0.0, + + )) + + continue + + + # PAR: use measured if available, else clear-sky estimate + + if _df_day is not None: + + _near = (_df_day["_ts"] - t).abs() + + _closest = _near.idxmin() + + if _near[_closest] < pd.Timedelta(minutes=20): + + par_full = max(0.0, float(_df_day.loc[_closest, "Air1_PAR_ref"])) + + else: + + par_full = max(0.0, 2000.0 * np.sin(np.radians(elev))) + + else: + + par_full = max(0.0, 2000.0 * np.sin(np.radians(elev))) + + + # Tracker angle from pvlib (energy-maximizing mode) + + _info = shadow_model.compute_tracker_tilt(azim, elev) + + _theta = _info["tracker_theta"] + + + # Reference: self-shading only (no panels) + + _fs_ref = shadow_model.compute_face_shading( + + elev, azim, _theta, include_panels=False, + + ) + + _sunlit_ref = _fs_ref["sunlit_fraction"] + + _shaded_ref = 1.0 - _sunlit_ref + + + # Test: panel + self-shading + + _fs = shadow_model.compute_face_shading(elev, azim, _theta) + + _sunlit = _fs["sunlit_fraction"] + + _shaded = 1.0 - _sunlit + + + # Effective canopy-average PAR (self-shaded faces get diffuse) + + par_ref = par_full * (_sunlit_ref + _shaded_ref * 0.15) + + par_test = par_full * (_sunlit + _shaded * 0.15) + + + par_ref_sum += par_ref * dt_seconds + + par_test_sum += par_test * dt_seconds + + steps.append(dict( + + hour=h, par_ref=par_ref, par_test=par_test, + + tracker_theta=_theta, shaded_pct=_shaded * 100, + + sunlit_pct=_sunlit * 100, + + ref_shaded_pct=_shaded_ref * 100, + + )) + + + dli_ref = par_ref_sum / 1_000_000 + + dli_test = par_test_sum / 1_000_000 + + return dli_ref, dli_test, pd.DataFrame(steps) + + + dli_ref, dli_test, dli_df = _compute_dli(str(viz_date)) + + + # DLI metrics side by side + + col_dli_ref, col_dli_test, col_dli_diff = st.columns(3) + + col_dli_ref.metric("DLI Reference (open sky)", f"{dli_ref:.1f} mol/m\u00b2/d") + + col_dli_test.metric("DLI Test (under panel)", f"{dli_test:.1f} mol/m\u00b2/d") + + if dli_ref > 0: + + _dli_pct = dli_test / dli_ref * 100 + + col_dli_diff.metric("Light retained", f"{_dli_pct:.0f}%", + + delta=f"{dli_test - dli_ref:.1f} mol/m\u00b2/d") + + + st.markdown( + + f"Grapevine range: Ref = **{dli_ref:.1f}** | " + + f"Test = **{dli_test:.1f}** mol/m\u00b2/d " + + f"({'adequate' if dli_test >= 15 else 'sub-optimal' if dli_test >= 5 else 'severely limiting'} " + + f"for grapevine)" + + ) + + + # 3-panel chart: PAR, tracker angle, shading % + + if _HAS_PLOTLY: + + fig_dli = make_subplots( + + rows=3, cols=1, shared_xaxes=True, + + row_heights=[0.5, 0.25, 0.25], + + subplot_titles=[ + + f"PAR through the day \u2014 {viz_date} (area = DLI)", + + "Tracker rotation angle (pvlib)", + + "Canopy shading", + + ], + + vertical_spacing=0.08, + + ) + + + # Row 1: PAR ref vs test + + fig_dli.add_trace(go.Scatter( + + x=dli_df["hour"], y=dli_df["par_ref"], mode="lines", + + name="Reference (open sky)", + + line=dict(color="#FF8C00", width=2), + + fill="tozeroy", fillcolor="rgba(255,140,0,0.15)", + + ), row=1, col=1) + + fig_dli.add_trace(go.Scatter( + + x=dli_df["hour"], y=dli_df["par_test"], mode="lines", + + name="Test (under panel)", + + line=dict(color=_BRAND_GREEN, width=2), + + fill="tozeroy", fillcolor="rgba(0,189,62,0.15)", + + ), row=1, col=1) + + + # DLI annotations on PAR chart + + _par_max = dli_df["par_ref"].max() + + if _par_max > 0: + + fig_dli.add_annotation( + + x=12, y=_par_max * 0.95, + + text=f"DLI ref = {dli_ref:.1f} mol/m\u00b2/d", + + showarrow=False, font=dict(color="#FF8C00", size=12), + + row=1, col=1, + + ) + + fig_dli.add_annotation( + + x=12, y=_par_max * 0.80, + + text=f"DLI test = {dli_test:.1f} mol/m\u00b2/d", + + showarrow=False, font=dict(color=_BRAND_GREEN, size=12), + + row=1, col=1, + + ) + + + # Row 2: Tracker angle + + fig_dli.add_trace(go.Scatter( + + x=dli_df["hour"], y=dli_df["tracker_theta"], mode="lines", + + name="Tracker \u03b8", + + line=dict(color="#6A5ACD", width=2), + + ), row=2, col=1) + + fig_dli.add_hline(y=0, line_dash="dot", line_color="gray", row=2, col=1) + + + # Row 3: Shading % + + fig_dli.add_trace(go.Scatter( + + x=dli_df["hour"], y=dli_df["shaded_pct"], mode="lines", + + name="Shaded %", + + line=dict(color="#b2182b", width=2), + + fill="tozeroy", fillcolor="rgba(178,24,43,0.15)", + + ), row=3, col=1) + + + fig_dli.update_yaxes(title_text="PAR (\u00b5mol m\u207b\u00b2 s\u207b\u00b9)", row=1, col=1) + + fig_dli.update_yaxes(title_text="Angle (\u00b0)", row=2, col=1) + + fig_dli.update_yaxes(title_text="Shaded (%)", range=[0, 100], row=3, col=1) + + fig_dli.update_xaxes(title_text="Hour (local time)", row=3, col=1) + + fig_dli.update_layout(height=650, showlegend=True) + + st.plotly_chart(fig_dli, key="dli_chart") + + + # 15-min detail table + + with st.expander("15-min resolution data"): + + _show_df = dli_df[dli_df["par_ref"] > 0][ + + ["hour", "par_ref", "par_test", "tracker_theta", "shaded_pct", "sunlit_pct", "ref_shaded_pct"] + + ].copy() + + _show_df.columns = ["Hour (local)", "PAR ref", "PAR test", "Tracker \u03b8 (\u00b0)", "Test shaded %", "Test sunlit %", "Ref shaded %"] + + for c in _show_df.columns[1:]: + + _show_df[c] = _show_df[c].round(1) + + st.dataframe(_show_df, hide_index=True) + + + # ---- Section 2: 3D Shadow Model ---- + + st.markdown("---") + + st.subheader("2. 3D view: where shadows fall") + + with st.expander("How to read this visualization"): + + st.markdown( + + "Two interactive 3D scenes show the vine canopy at the selected date and hour.\n\n" + + "- **Left (Test):** canopy under solar panels. Dark red patches are shaded " + + "by the panel; green patches receive direct sun.\n" + + "- **Right (Reference):** same canopy with no panels. Only self-shading " + + "(the far side of the canopy) appears.\n\n" + + "The yellow arrow shows the sun direction. Metrics above the scenes report " + + "the % of each canopy face (top, east, west) that is sunlit. " + + "Rotate the 3D view by dragging to see shading from different angles.\n\n" + + "**Key insight:** even under panels, a large fraction of the canopy " + + "stays sunlit because the shadow is narrow and moves with the tracker." + + ) + + + viz_hour_local = st.slider( + + "Hour (local time)", _sunrise_h, _sunset_h, _default_h, + + ) + + + # Convert local time to UTC for solar position + + viz_time = pd.DatetimeIndex([ + + pd.Timestamp(viz_date, tz=_LOCAL_TZ) + pd.Timedelta(hours=viz_hour_local) + + ]) + + solar_pos = shadow_model.get_solar_position(viz_time) + + sol_elev = solar_pos["solar_elevation"].iloc[0] + + sol_az = solar_pos["solar_azimuth"].iloc[0] + + + if sol_elev > 0: + + tracker_info = shadow_model.compute_tracker_tilt(sol_az, sol_elev) + + tracker_tilt = tracker_info["tracker_theta"] + + tracker_aoi = tracker_info["aoi"] + + tracker_surface_tilt = tracker_info["surface_tilt"] + + tracker_surface_az = tracker_info["surface_azimuth"] + + shadow_mask = shadow_model.project_shadow(sol_elev, sol_az, tracker_tilt) + + face_shading = shadow_model.compute_face_shading(sol_elev, sol_az, tracker_tilt) + + face_bounds = shadow_model.compute_face_shadow_bounds(sol_elev, sol_az, tracker_tilt) + + # Reference: self-shading only (no panels) + + face_shading_ref = shadow_model.compute_face_shading( + + sol_elev, sol_az, tracker_tilt, include_panels=False, + + ) + + face_bounds_ref = shadow_model.compute_face_shadow_bounds( + + sol_elev, sol_az, tracker_tilt, include_panels=False, + + ) + + + # Face-aware sunlit area (top + east + west faces) + + _total_area = face_shading["total_area"] # m²/m of row + + _sunlit_area_ref = face_shading_ref["total_sunlit_area"] + + sunlit_frac_ref = face_shading_ref["sunlit_fraction"] + + _sunlit_area_test = face_shading["total_sunlit_area"] + + sunlit_frac_test = face_shading["sunlit_fraction"] + + + # Solar position & tracker metrics + + c1, c2, c3, c4, c5 = st.columns(5) + + c1.metric("Sun elevation", f"{sol_elev:.1f}\u00b0") + + c2.metric("Sun azimuth", f"{sol_az:.1f}\u00b0") + + c3.metric("Tracker rotation", f"{tracker_tilt:.1f}\u00b0") + + c4.metric("Surface tilt", f"{tracker_surface_tilt:.1f}\u00b0") + + c5.metric("Angle of incidence", f"{tracker_aoi:.1f}\u00b0") + + st.caption( + + f"Tracker axis: {shadow_model.row_azimuth:.0f}\u00b0 (NW\u2013SE) | " + + f"Panel faces {tracker_surface_az:.0f}\u00b0 | " + + f"Rotation {tracker_tilt:+.1f}\u00b0 (pvlib.tracking.singleaxis, " + + f"backtrack=True, GCR={shadow_model.panel_width/shadow_model.row_spacing:.2f})" + + ) + + + # Per-face shading breakdown — Test (with panels) vs Reference (no panels) + + st.markdown("**With panels** (test)") + + c1, c2, c3, c4 = st.columns(4) + + c1.metric("Top face sunlit", f"{face_shading['top_sunlit']*100:.0f}%", + + help=f"Area: {face_shading['top_area']:.1f} m\u00b2/m") + + c2.metric("East face sunlit", f"{face_shading['east_sunlit']*100:.0f}%", + + help=f"Area: {face_shading['east_area']:.1f} m\u00b2/m") + + c3.metric("West face sunlit", f"{face_shading['west_sunlit']*100:.0f}%", + + help=f"Area: {face_shading['west_area']:.1f} m\u00b2/m") + + c4.metric("Total sunlit", f"{sunlit_frac_test*100:.0f}%", + + help=f"{_sunlit_area_test:.2f} / {_total_area:.1f} m\u00b2/m") + + + st.markdown("**Without panels** (reference)") + + r1, r2, r3, r4 = st.columns(4) + + r1.metric("Top face sunlit", f"{face_shading_ref['top_sunlit']*100:.0f}%", + + help=f"Area: {face_shading_ref['top_area']:.1f} m\u00b2/m") + + r2.metric("East face sunlit", f"{face_shading_ref['east_sunlit']*100:.0f}%", + + help=f"Area: {face_shading_ref['east_area']:.1f} m\u00b2/m") + + r3.metric("West face sunlit", f"{face_shading_ref['west_sunlit']*100:.0f}%", + + help=f"Area: {face_shading_ref['west_area']:.1f} m\u00b2/m") + + r4.metric("Total sunlit", f"{sunlit_frac_ref*100:.0f}%", + + help=f"{_sunlit_area_ref:.2f} / {_total_area:.1f} m\u00b2/m") + + + if _HAS_PLOTLY: + + # --- Helper: build a quad (2 triangles) from 4 world-coord corners --- + + def _add_quad(fig, pts, color, opacity, name=None, showlegend=False): + + """Add a quadrilateral (4 corners) as 2 triangles.""" + + fig.add_trace(go.Mesh3d( + + x=[p[0] for p in pts], y=[p[1] for p in pts], z=[p[2] for p in pts], + + i=[0, 0], j=[1, 2], k=[2, 3], + + color=color, opacity=opacity, + + name=name, showlegend=showlegend, flatshading=True, + + )) + + + # --- Helper to build 3D scene --- + + def _build_3d_scene(show_panels: bool, title: str): + + fig = go.Figure() + + n_rows = shadow_model.n_rows + + spacing = shadow_model.row_spacing + + cw2 = shadow_model.canopy_width / 2 + + ch = shadow_model.canopy_height + + half_len = 1.5 # along-row length for visualization + + _row_u = shadow_model._row_u + + _row_v = shadow_model._row_v + + _green = _BRAND_GREEN + + _shade_color = "#8B0000" + + + for row_idx in range(n_rows): + + offset = (row_idx - n_rows // 2) * spacing + + show_legend = (row_idx == 0) + + ox = offset * _row_v[0] + + oy = offset * _row_v[1] + + + if show_panels: + + fb = face_bounds # panel + self-shading + + else: + + fb = face_bounds_ref # self-shading only + + + # Helper: world coord from local (v, u, z) + + def _w(v, u, z): + + return [v*_row_v[0] + u*_row_u[0] + ox, + + v*_row_v[1] + u*_row_u[1] + oy, z] + + + u0, u1 = -half_len, half_len + + + # --- Top face --- + + top_sh = fb["top_shaded"] + + if top_sh is not None: + + sv_lo, sv_hi = max(top_sh[0], -cw2), min(top_sh[1], cw2) + + if sv_lo < sv_hi: + + # Shaded portion + + _add_quad(fig, [_w(sv_lo,u0,ch), _w(sv_hi,u0,ch), + + _w(sv_hi,u1,ch), _w(sv_lo,u1,ch)], + + _shade_color, 0.5, + + "Shaded" if show_legend else None, show_legend) + + # Sunlit portions (left and right of shade) + + if sv_lo > -cw2: + + _add_quad(fig, [_w(-cw2,u0,ch), _w(sv_lo,u0,ch), + + _w(sv_lo,u1,ch), _w(-cw2,u1,ch)], + + _green, 0.4) + + if sv_hi < cw2: + + _add_quad(fig, [_w(sv_hi,u0,ch), _w(cw2,u0,ch), + + _w(cw2,u1,ch), _w(sv_hi,u1,ch)], + + _green, 0.4) + + else: + + _add_quad(fig, [_w(-cw2,u0,ch), _w(cw2,u0,ch), + + _w(cw2,u1,ch), _w(-cw2,u1,ch)], + + _green, 0.4) + + else: + + _add_quad(fig, [_w(-cw2,u0,ch), _w(cw2,u0,ch), + + _w(cw2,u1,ch), _w(-cw2,u1,ch)], + + _green, 0.4, + + "Sunlit" if show_legend else None, show_legend) + + + # --- East face (positive v = +cw2) --- + + east_sh = fb["east_shaded"] + + if east_sh is not None: + + sz_lo, sz_hi = max(east_sh[0], 0), min(east_sh[1], ch) + + if sz_lo < sz_hi: + + _add_quad(fig, [_w(cw2,u0,sz_lo), _w(cw2,u0,sz_hi), + + _w(cw2,u1,sz_hi), _w(cw2,u1,sz_lo)], + + _shade_color, 0.5) + + if sz_lo > 0: + + _add_quad(fig, [_w(cw2,u0,0), _w(cw2,u0,sz_lo), + + _w(cw2,u1,sz_lo), _w(cw2,u1,0)], + + _green, 0.4) + + if sz_hi < ch: + + _add_quad(fig, [_w(cw2,u0,sz_hi), _w(cw2,u0,ch), + + _w(cw2,u1,ch), _w(cw2,u1,sz_hi)], + + _green, 0.4) + + else: + + _add_quad(fig, [_w(cw2,u0,0), _w(cw2,u0,ch), + + _w(cw2,u1,ch), _w(cw2,u1,0)], + + _green, 0.4) + + else: + + _add_quad(fig, [_w(cw2,u0,0), _w(cw2,u0,ch), + + _w(cw2,u1,ch), _w(cw2,u1,0)], + + _green, 0.4) + + + # --- West face (negative v = -cw2) --- + + west_sh = fb["west_shaded"] + + if west_sh is not None: + + sz_lo, sz_hi = max(west_sh[0], 0), min(west_sh[1], ch) + + if sz_lo < sz_hi: + + _add_quad(fig, [_w(-cw2,u0,sz_lo), _w(-cw2,u0,sz_hi), + + _w(-cw2,u1,sz_hi), _w(-cw2,u1,sz_lo)], + + _shade_color, 0.5) + + if sz_lo > 0: + + _add_quad(fig, [_w(-cw2,u0,0), _w(-cw2,u0,sz_lo), + + _w(-cw2,u1,sz_lo), _w(-cw2,u1,0)], + + _green, 0.4) + + if sz_hi < ch: + + _add_quad(fig, [_w(-cw2,u0,sz_hi), _w(-cw2,u0,ch), + + _w(-cw2,u1,ch), _w(-cw2,u1,sz_hi)], + + _green, 0.4) + + else: + + _add_quad(fig, [_w(-cw2,u0,0), _w(-cw2,u0,ch), + + _w(-cw2,u1,ch), _w(-cw2,u1,0)], + + _green, 0.4) + + else: + + _add_quad(fig, [_w(-cw2,u0,0), _w(-cw2,u0,ch), + + _w(-cw2,u1,ch), _w(-cw2,u1,0)], + + _green, 0.4) + + + if show_panels: + + # Solar panel + + corners = shadow_model.panel_corners_world(tracker_tilt, offset) + + fig.add_trace(go.Mesh3d( + + x=corners[:, 0].tolist(), + + y=corners[:, 1].tolist(), + + z=corners[:, 2].tolist(), + + i=[0, 0], j=[1, 2], k=[2, 3], + + color="#333333", opacity=0.8, + + name="Panel" if show_legend else None, + + showlegend=show_legend, + + flatshading=True, + + )) + + + # Sun direction arrow + + elev_rad = np.radians(sol_elev) + + az_rad = np.radians(sol_az) + + arrow_len = 3.0 + + sun_dx = np.cos(elev_rad) * np.sin(az_rad) * arrow_len + + sun_dy = np.cos(elev_rad) * np.cos(az_rad) * arrow_len + + sun_dz = np.sin(elev_rad) * arrow_len + + fig.add_trace(go.Scatter3d( + + x=[sun_dx, 0], y=[sun_dy, 0], + + z=[shadow_model.panel_height + sun_dz, shadow_model.panel_height], + + mode="lines", line=dict(color="#FFD700", width=6), + + name="Sun ray", + + )) + + + # Compass labels + + _range = n_rows * spacing / 2 + 2 + + for label, dx, dy in [("N", 0, _range), ("S", 0, -_range), ("E", _range, 0), ("W", -_range, 0)]: + + fig.add_trace(go.Scatter3d( + + x=[dx], y=[dy], z=[0], mode="text", + + text=[label], textfont=dict(size=14, color="gray"), + + showlegend=False, + + )) + + + fig.update_layout( + + scene=dict( + + xaxis_title="East (m)", yaxis_title="North (m)", zaxis_title="Height (m)", + + aspectmode="data", + + camera=dict(eye=dict(x=1.5, y=-2, z=1.2)), + + ), + + height=500, showlegend=True, title=title, + + margin=dict(l=0, r=0, t=40, b=0), + + ) + + return fig + + + # --- Side-by-side: Test (panels) vs Reference (no panels) --- + + col_test, col_ref = st.columns(2) + + + with col_test: + + st.markdown( + + f"### Test (under panel)\n" + + f"**Direct sun: {_sunlit_area_test:.2f} / {_total_area:.1f} m\u00b2/m** " + + f"({sunlit_frac_test*100:.0f}%)\n\n" + + f"Top: {face_shading['top_sunlit']*100:.0f}% | " + + f"East: {face_shading['east_sunlit']*100:.0f}% | " + + f"West: {face_shading['west_sunlit']*100:.0f}%" + + ) + + fig_test = _build_3d_scene( + + show_panels=True, + + title=f"Test \u2014 {viz_hour_local}:00, {viz_date}", + + ) + + st.plotly_chart(fig_test, key="3d_test") + + + with col_ref: + + st.markdown( + + f"### Reference (open sky)\n" + + f"**Direct sun: {_sunlit_area_ref:.2f} / {_total_area:.1f} m\u00b2/m** " + + f"({sunlit_frac_ref*100:.0f}%)\n\n" + + f"Top: {face_shading_ref['top_sunlit']*100:.0f}% | " + + f"East: {face_shading_ref['east_sunlit']*100:.0f}% | " + + f"West: {face_shading_ref['west_sunlit']*100:.0f}%" + + ) + + fig_ref = _build_3d_scene( + + show_panels=False, + + title=f"Reference \u2014 {viz_hour_local}:00, {viz_date}", + + ) + + st.plotly_chart(fig_ref, key="3d_ref") + + + # Shadow percentage summary + + st.markdown( + + f"At **{viz_hour_local}:00** on **{viz_date}**, " + + f"reference canopy receives direct sun on **{sunlit_frac_ref*100:.0f}%** " + + f"of its surface (self-shading on the far side). " + + f"Under the panel, direct sun drops to **{sunlit_frac_test*100:.0f}%** " + + f"({_sunlit_area_ref:.2f} \u2192 {_sunlit_area_test:.2f} m\u00b2/m)." + + ) + + + # --- PAR heatmap --- + + st.subheader("3. Light map across the canopy (per face)") + + with st.expander("How to read these heatmaps"): + + st.markdown( + + "The canopy box has three light-receiving faces: **West**, " + + "**Top**, and **East**. Each cell shows the **PAR** " + + "(\u00b5mol m\u207b\u00b2 s\u207b\u00b9) reaching that face and height zone.\n\n" + + "- **Bright yellow:** full direct sunlight.\n" + + "- **Dark blue:** heavily shaded (receiving only diffuse PAR).\n\n" + + "Side faces (East/West) receive direct beam through row gaps " + + "when the sun is on their side; the opposite face is self-shaded. " + + "The Top face value is uniform across all rows." + + ) + + # Convert local hour to UTC for sensor data matching + + _viz_utc_hour = viz_time[0].tz_convert("UTC").hour + viz_time[0].tz_convert("UTC").minute / 60 + + hour_mask = df_opt["hour"].between(_viz_utc_hour - 0.25, _viz_utc_hour + 0.25) + + if hour_mask.any(): + + sample_par = float(df_opt.loc[hour_mask, "Air1_PAR_ref"].median()) + + else: + + sample_par = 1000.0 + + + _face_par_test = shadow_model.compute_face_par_zones( + + sample_par, sol_elev, sol_az, tracker_tilt, + + include_panels=True, + + ) + + _face_par_ref = shadow_model.compute_face_par_zones( + + sample_par, sol_elev, sol_az, tracker_tilt, + + include_panels=False, + + ) + + + _par_cs = [[0, "#1a1a2e"], [0.5, "#e6a817"], [1, "#ffff00"]] + + _par_max = max( + + float(max(_face_par_ref["west"].max(), _face_par_ref["top"].max(), _face_par_ref["east"].max())), + + sample_par, + + ) + + _par_yz = ["Bottom", "Middle", "Top"] + + _par_xt = ["W-edge", "Centre", "E-edge"] + + + def _render_face_par(face_data, scenario_label, key_prefix): + + st.markdown(f"**{scenario_label}**") + + cW, cT, cE = st.columns(3) + + with cW: + + st.caption("West face") + + _fig = px.imshow( + + face_data["west"].reshape(3, 1), + + x=["West"], y=_par_yz, + + color_continuous_scale=_par_cs, + + range_color=[0, _par_max], + + text_auto=".0f", aspect="auto", + + ) + + _fig.update_coloraxes(showscale=False) + + _fig.update_layout(height=200, margin=dict(l=0, r=0, t=0, b=0)) + + _fig.update_yaxes(autorange="reversed") + + st.plotly_chart(_fig, key=f"{key_prefix}_w") + + with cT: + + st.caption("Top face") + + _fig = px.imshow( + + face_data["top"].reshape(1, 3), + + x=_par_xt, y=["Top"], + + color_continuous_scale=_par_cs, + + range_color=[0, _par_max], + + text_auto=".0f", aspect="auto", + + ) + + _fig.update_coloraxes(showscale=False) + + _fig.update_layout(height=200, margin=dict(l=0, r=0, t=0, b=0)) + + st.plotly_chart(_fig, key=f"{key_prefix}_t") + + with cE: + + st.caption("East face") + + _fig = px.imshow( + + face_data["east"].reshape(3, 1), + + x=["East"], y=_par_yz, + + color_continuous_scale=_par_cs, + + range_color=[0, _par_max], + + text_auto=".0f", aspect="auto", + + ) + + _fig.update_coloraxes(colorbar_title="PAR") + + _fig.update_layout(height=200, margin=dict(l=0, r=0, t=0, b=0)) + + _fig.update_yaxes(autorange="reversed") + + st.plotly_chart(_fig, key=f"{key_prefix}_e") + + + _render_face_par(_face_par_test, "Test (under panel)", "par_test") + + _render_face_par(_face_par_ref, "Reference (open sky)", "par_ref") + + + # --- Photosynthesis map (3-face view) --- + + st.subheader("4. Growth activity across the canopy") + + with st.expander("How to read these heatmaps"): + + st.markdown( + + "Same 3-face layout as the PAR map, but now each cell shows the " + + "**photosynthesis rate A** (\u00b5mol CO\u2082 m\u207b\u00b2 s\u207b\u00b9) computed by the " + + "Farquhar model for that face\u2019s PAR and the current temperature/VPD/CO\u2082.\n\n" + + "- **Bright green:** high A \u2014 the zone is photosynthesizing actively.\n" + + "- **Dark:** low A \u2014 the zone is shaded and limited by light.\n\n" + + "Notice that A drops less steeply than PAR because photosynthesis " + + "saturates at high light \u2014 halving PAR from 2000 to 1000 may only " + + "reduce A by 20\u201330%. The **A_vine** value integrates across all zones." + + ) + + if hour_mask.any(): + + sample_row = df_opt.loc[hour_mask].iloc[len(df_opt.loc[hour_mask])//2] + + s_tleaf = float(sample_row["Air1_leafTemperature_ref"]) + + s_co2 = float(sample_row["Air1_CO2_ref"]) + + s_vpd = float(sample_row["Air1_VPD_ref"]) + + s_tair = float(sample_row["Air1_airTemperature_ref"]) + + else: + + s_tleaf, s_co2, s_vpd, s_tair = 28.0, 400.0, 1.5, 26.0 + + + # A_vine from the existing grid model (for the summary metric) + + result_panel = canopy_model.compute_vine_A( + + sample_par, s_tleaf, s_co2, s_vpd, s_tair, shadow_mask, + + solar_elevation=sol_elev, solar_azimuth=sol_az, + + tracker_tilt=tracker_tilt, + + ) + + result_ref = canopy_model.compute_vine_A( + + sample_par, s_tleaf, s_co2, s_vpd, s_tair, + + np.zeros_like(shadow_mask, dtype=bool), + + solar_elevation=sol_elev, solar_azimuth=sol_az, + + ) + + + # Compute face-level A from face PAR zones + + _farq = canopy_model.farquhar + + def _par_arr_to_A(par_arr): + + A = np.zeros_like(par_arr) + + for i in range(len(par_arr)): + + if par_arr[i] > 0: + + A[i] = _farq.calc_photosynthesis( + + PAR=par_arr[i], Tleaf=s_tleaf, + + CO2=s_co2, VPD=s_vpd, Tair=s_tair, + + ) + + return A + + + def _face_to_A(face_par_dict): + + return { + + "west": _par_arr_to_A(face_par_dict["west"]), + + "top": _par_arr_to_A(face_par_dict["top"]), + + "east": _par_arr_to_A(face_par_dict["east"]), + + } + + + _A_face_test = _face_to_A(_face_par_test) + + _A_face_ref = _face_to_A(_face_par_ref) + + + _a_cs = [[0, "#1a1a2e"], [0.5, "#2d6a4f"], [1, _BRAND_GREEN]] + + _a_max = float(max( + + _A_face_ref["west"].max(), _A_face_ref["top"].max(), _A_face_ref["east"].max(), + + )) + 1 + + _a_yz = ["Bottom", "Middle", "Top"] + + _a_xt = ["W-edge", "Centre", "E-edge"] + + + def _render_face_A(face_A, scenario_label, a_vine, key_prefix): + + st.markdown(f"**{scenario_label}** (A_vine = {a_vine:.1f})") + + cW, cT, cE = st.columns(3) + + with cW: + + st.caption("West face") + + _fig = px.imshow( + + face_A["west"].reshape(3, 1), + + x=["West"], y=_a_yz, + + color_continuous_scale=_a_cs, + + range_color=[0, _a_max], + + text_auto=".1f", aspect="auto", + + ) + + _fig.update_coloraxes(showscale=False) + + _fig.update_layout(height=200, margin=dict(l=0, r=0, t=0, b=0)) + + _fig.update_yaxes(autorange="reversed") + + st.plotly_chart(_fig, key=f"{key_prefix}_w") + + with cT: + + st.caption("Top face") + + _fig = px.imshow( + + face_A["top"].reshape(1, 3), + + x=_a_xt, y=["Top"], + + color_continuous_scale=_a_cs, + + range_color=[0, _a_max], + + text_auto=".1f", aspect="auto", + + ) + + _fig.update_coloraxes(showscale=False) + + _fig.update_layout(height=200, margin=dict(l=0, r=0, t=0, b=0)) + + st.plotly_chart(_fig, key=f"{key_prefix}_t") + + with cE: + + st.caption("East face") + + _fig = px.imshow( + + face_A["east"].reshape(3, 1), + + x=["East"], y=_a_yz, + + color_continuous_scale=_a_cs, + + range_color=[0, _a_max], + + text_auto=".1f", aspect="auto", + + ) + + _fig.update_coloraxes(colorbar_title="A") + + _fig.update_layout(height=200, margin=dict(l=0, r=0, t=0, b=0)) + + _fig.update_yaxes(autorange="reversed") + + st.plotly_chart(_fig, key=f"{key_prefix}_e") + + + _render_face_A(_A_face_test, "Under panel", result_panel['A_vine'], "a_panel") + + _render_face_A(_A_face_ref, "No panel (reference)", result_ref['A_vine'], "a_ref") + + + if result_ref["A_vine"] > 0: + + st.caption( + + f"Panel retains {result_panel['A_vine']/result_ref['A_vine']*100:.0f}% " + + f"of vine-level photosynthesis despite {(1-sunlit_frac_test)*100:.0f}% shadow coverage. " + + "Shaded zones still photosynthesize using diffuse light." + + ) + + + # --- Validation: modeled vs measured PAR ratio --- + + if "Air2_PAR_test" in df_opt.columns: + + st.subheader("5. Does the model match reality?") + + with st.expander("How to read this chart"): + + st.markdown( + + "Each dot is one 15-min observation. **X-axis:** the 3D model's " + + "predicted PAR ratio (test/reference). **Y-axis:** the actually " + + "measured ratio from sensors (Air2\\_PAR\\_test / Air1\\_PAR\\_ref).\n\n" + + "Points on the **dashed 1:1 line** mean the model perfectly matches " + + "reality. Systematic offset (dots above/below the line) reveals model " + + "bias. Scatter indicates noise. A tight cluster around the 1:1 line " + + "validates the 3D shadow geometry." + + ) + + + @st.cache_data + + def _compute_validation(): + + _df = df_opt.dropna(subset=["Air1_PAR_ref", "Air2_PAR_test"]).copy() + + _df = _df[_df["Air1_PAR_ref"] > 50] + + _times = pd.DatetimeIndex(_df["time"]) + + _solar = shadow_model.get_solar_position(_times) + + measured_ratio = _df["Air2_PAR_test"].values / _df["Air1_PAR_ref"].values + + modeled_sunlit = [] + + for _, srow in _solar.iterrows(): + + e, a = srow["solar_elevation"], srow["solar_azimuth"] + + if e > 2: + + m = shadow_model.project_shadow(e, a) + + modeled_sunlit.append(shadow_model.sunlit_fraction(m)) + + else: + + modeled_sunlit.append(1.0) + + diffuse = 0.15 + + modeled_par_ratio = np.array(modeled_sunlit) + (1 - np.array(modeled_sunlit)) * diffuse + + return measured_ratio, modeled_par_ratio, _times + + + meas_r, mod_r, val_times = _compute_validation() + + + fig_val = go.Figure() + + fig_val.add_trace(go.Scatter( + + x=mod_r, y=meas_r, mode="markers", + + marker=dict(size=3, color=_BRAND_GREEN, opacity=0.3), + + name="Data", + + )) + + fig_val.add_trace(go.Scatter( + + x=[0, 1.2], y=[0, 1.2], mode="lines", + + line=dict(dash="dash", color="gray"), name="1:1", + + )) + + fig_val.update_layout( + + title="Modeled vs measured PAR ratio (test/ref)", + + xaxis_title="Modeled PAR ratio", + + yaxis_title="Measured PAR ratio (Air2/Air1)", + + height=400, + + ) + + st.plotly_chart(fig_val, key="validation") + + + else: + + st.warning(f"Sun is below horizon at {viz_hour_local}:00 on {viz_date}.") + + + except Exception as e: + + st.error(f"Tracker Optimizer error: {e}") + + import traceback + + st.code(traceback.format_exc()) + + + # --------------------------------------------------------------------------- + # Tab — Vineyard Advisor (Gemini chatbot) + # --------------------------------------------------------------------------- diff --git a/ui/tab_system_status.py b/ui/tab_system_status.py new file mode 100644 index 0000000000000000000000000000000000000000..1153db22356355a07ef714bb0e223c9c8c1d2b4b --- /dev/null +++ b/ui/tab_system_status.py @@ -0,0 +1,671 @@ +""" +System Status tab: unified view of tracker status, energy budget, +control replay, fruiting zone monitor, and ROI dashboard. + +Five sections accessible via sub-tabs within a single page. +""" + +from __future__ import annotations + +import json +import logging +from datetime import date, datetime, timedelta, timezone +from pathlib import Path +from typing import Optional + +import pandas as pd +import streamlit as st + +from config import settings + +logger = logging.getLogger(__name__) + + +def render_tab_system_status() -> None: + st.header("System Status") + + # Live vineyard camera + import streamlit.components.v1 as _components + _components.html( + """ + + Vineyard live view + + """, + height=280, + ) + st.caption( + "Live vineyard camera — Yeruham, Israel. " + "_If the view shows only sky, the on-site camera needs realignment._" + ) + + st.divider() + + section = st.radio( + "Section", + [ + "Tracker Status", + "Energy Budget", + "Control Replay", + "Fruiting Zone", + "ROI Dashboard", + ], + horizontal=True, + label_visibility="collapsed", + ) + + if section == "Tracker Status": + _render_tracker_status() + elif section == "Energy Budget": + _render_energy_budget() + elif section == "Control Replay": + _render_control_replay() + elif section == "Fruiting Zone": + _render_fruiting_zone() + elif section == "ROI Dashboard": + _render_roi_dashboard() + + +# ====================================================================== +# 1. Tracker Status +# ====================================================================== + +def _get_tracker_data(): + """Fetch live tracker angles and attributes from ThingsBoard.""" + cache_key = "sys_tracker_data" + cache_ts_key = "sys_tracker_ts" + now = datetime.now(tz=timezone.utc) + + # 5-second cache + if cache_key in st.session_state: + cached_ts = st.session_state.get(cache_ts_key) + if cached_ts and (now - cached_ts).total_seconds() < 5: + return st.session_state[cache_key] + + try: + from src.tracker_dispatcher import TrackerDispatcher + dispatcher = TrackerDispatcher(dry_run=True) + angles = dispatcher.read_current_angles() + st.session_state[cache_key] = angles + st.session_state[cache_ts_key] = now + return angles + except Exception as exc: + logger.warning("Failed to fetch tracker data: %s", exc) + return None + + +def _render_tracker_status(): + st.subheader("Tracker Status") + st.caption("Live panel angles and control state from ThingsBoard.") + + angles = _get_tracker_data() + + if angles is None: + st.warning("Could not connect to ThingsBoard. Check credentials.") + return + + cols = st.columns(len(angles)) + for col, (name, angle) in zip(cols, angles.items()): + with col: + display_name = name.replace("Tracker", "T") + if angle is not None: + st.metric(display_name, f"{angle:.1f}°") + else: + st.metric(display_name, "offline") + + # Angle comparison chart + valid = {k: v for k, v in angles.items() if v is not None} + if valid: + try: + import plotly.graph_objects as go + + fig = go.Figure() + names = list(valid.keys()) + vals = list(valid.values()) + colors = ["#2196F3" if abs(v - vals[0]) < settings.ANGLE_TOLERANCE_DEG + else "#FF5722" for v in vals] + fig.add_trace(go.Bar( + x=[n.replace("Tracker", "T") for n in names], + y=vals, + marker_color=colors, + text=[f"{v:.1f}°" for v in vals], + textposition="outside", + )) + fig.update_layout( + yaxis_title="Angle (°)", + yaxis_range=[0, max(vals) * 1.3 + 5], + height=300, + margin=dict(t=20, b=40), + ) + st.plotly_chart(fig, key="tracker_angles_chart") + except ImportError: + df = pd.DataFrame({"Tracker": list(valid.keys()), + "Angle (°)": list(valid.values())}) + st.dataframe(df, hide_index=True) + + # Coherence check + if len(valid) >= 2: + vals = list(valid.values()) + spread = max(vals) - min(vals) + if spread > settings.ANGLE_TOLERANCE_DEG * 2: + st.warning( + f"Tracker spread is {spread:.1f}° — some trackers may be " + f"out of sync (tolerance: {settings.ANGLE_TOLERANCE_DEG}°)." + ) + else: + st.success(f"All trackers aligned within {spread:.1f}°.") + + if st.button("Refresh", key="refresh_trackers"): + for k in ["sys_tracker_data", "sys_tracker_ts"]: + st.session_state.pop(k, None) + st.rerun() + + +# ====================================================================== +# 2. Energy Budget +# ====================================================================== + +def _render_energy_budget(): + st.subheader("Energy Budget") + st.caption( + f"Hierarchical shading budget — max {settings.MAX_ENERGY_REDUCTION_PCT}% " + f"of annual PV generation." + ) + + from src.energy_budget import EnergyBudgetPlanner + + planner = EnergyBudgetPlanner() + today = date.today() + annual = planner.compute_annual_plan(today.year) + + # Annual overview + total_potential = annual["total_potential_kWh"] + annual_budget = annual["total_budget_kWh"] + reserve = annual["annual_reserve_kWh"] + + c1, c2, c3 = st.columns(3) + c1.metric("Annual PV Potential", f"{total_potential:,.0f} kWh") + c2.metric("Shading Budget (5%)", f"{annual_budget:,.0f} kWh") + c3.metric("Emergency Reserve", f"{reserve:,.0f} kWh") + + # Monthly breakdown + monthly = annual.get("monthly_budgets", {}) + if monthly: + month_names = { + 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", + } + months = sorted(monthly.keys()) + labels = [month_names.get(m, str(m)) for m in months] + values = [monthly[m] for m in months] + + try: + import plotly.graph_objects as go + + colors = [] + for m in months: + w = settings.MONTHLY_BUDGET_WEIGHTS.get(m, 0) + if w >= 0.4: + colors.append("#FF5722") + elif w >= 0.1: + colors.append("#FF9800") + else: + colors.append("#4CAF50") + + fig = go.Figure(go.Bar( + x=labels, y=values, + marker_color=colors, + text=[f"{v:.1f}" for v in values], + textposition="outside", + )) + fig.update_layout( + yaxis_title="Budget (kWh)", + height=300, + margin=dict(t=20, b=40), + title_text="Monthly Shading Budget Allocation", + ) + st.plotly_chart(fig, key="monthly_budget_chart") + except ImportError: + df = pd.DataFrame({"Month": labels, "Budget (kWh)": values}) + st.dataframe(df, hide_index=True) + + # Weekly plan for current week + with st.expander("This Week's Budget"): + try: + # compute_weekly_plan needs monthly_remaining; derive from annual + current_month = today.month + monthly_budget = monthly.get(current_month, 0.0) + weekly = planner.compute_weekly_plan(today, monthly_remaining=monthly_budget) + st.json(weekly) + except Exception as exc: + st.info(f"Weekly plan unavailable: {exc}") + + +# ====================================================================== +# 3. Control Replay +# ====================================================================== + +def _load_sim_logs() -> list[Path]: + log_dir = settings.SIMULATION_LOG_DIR + if not log_dir.exists(): + return [] + return sorted(log_dir.glob("*.json"), reverse=True) + + +def _render_control_replay(): + st.subheader("Control Replay") + st.caption("Step through historical control loop decisions slot by slot.") + + log_files = _load_sim_logs() + + # Also check for in-memory tick log + sources = {} + if log_files: + for f in log_files[:10]: + sources[f.stem] = f + + if not sources: + _today_iso = date.today().isoformat() + _week_ago_iso = (date.today() - timedelta(days=7)).isoformat() + st.info( + "No simulation logs found. Run the simulation script:\n\n" + f"```\npython scripts/run_control_simulation.py --start {_week_ago_iso} --end {_today_iso}\n```" + ) + return + + selected = st.selectbox("Log file", list(sources.keys()), key="replay_log_select") + path = sources[selected] + + with open(path) as f: + ticks = json.load(f) + + if not ticks: + st.warning("Empty log file.") + return + + # Surface log freshness — sim logs are historical replays, but if the latest + # one is >30 days old it almost certainly means no fresh sim has been run. + file_age_days = ( + date.today() + - date.fromtimestamp(path.stat().st_mtime) + ).days + if file_age_days > 30: + st.warning( + f"⚠ This log is **{file_age_days} days old** " + f"(generated {date.fromtimestamp(path.stat().st_mtime).isoformat()}). " + f"Run `python scripts/run_control_simulation.py` to generate a fresh replay." + ) + + # Extract sim window from first/last tick timestamps for an honest caption. + _ts_first = ticks[0].get("timestamp", "") if ticks else "" + _ts_last = ticks[-1].get("timestamp", "") if ticks else "" + _sim_range = "" + if isinstance(_ts_first, str) and isinstance(_ts_last, str) and _ts_first and _ts_last: + _sim_range = f" · simulated {_ts_first[:10]} → {_ts_last[:10]}" + + st.caption(f"{len(ticks)} ticks loaded from `{path.name}`{_sim_range}") + + # Date filter + days = sorted(set(t.get("sim_day") or str(t.get("timestamp", ""))[:10] for t in ticks)) + if len(days) > 1: + sel_day = st.select_slider("Day", days, key="replay_day") + ticks = [t for t in ticks if (t.get("sim_day") or str(t.get("timestamp", ""))[:10]) == sel_day] + + # Summary metrics + interventions = sum(1 for t in ticks if (t.get("plan_offset_deg") or 0) > 0) + overrides = sum(1 for t in ticks if t.get("live_override")) + dispatched = sum(1 for t in ticks if t.get("dispatch")) + + c1, c2, c3, c4 = st.columns(4) + c1.metric("Ticks", len(ticks)) + c2.metric("Interventions", interventions) + c3.metric("Live Overrides", overrides) + c4.metric("Dispatched", dispatched) + + # Timeline chart + try: + import plotly.graph_objects as go + from plotly.subplots import make_subplots + + times = [] + angles = [] + offsets = [] + temps = [] + ghis = [] + for t in ticks: + ts = t.get("timestamp", "") + if isinstance(ts, str) and ts: + try: + times.append(datetime.fromisoformat(ts)) + except ValueError: + times.append(None) + else: + times.append(None) + angles.append(t.get("target_angle", 0)) + offsets.append(t.get("plan_offset_deg", 0) or 0) + temps.append(t.get("air_temp_c")) + ghis.append(t.get("ghi_w_m2")) + + valid_times = [t for t in times if t is not None] + if valid_times: + fig = make_subplots( + rows=3, cols=1, shared_xaxes=True, + subplot_titles=("Target Angle", "Plan Offset", "Temperature"), + vertical_spacing=0.08, + row_heights=[0.4, 0.3, 0.3], + ) + fig.add_trace(go.Scatter( + x=valid_times, y=angles[:len(valid_times)], + mode="lines", name="Target angle (°)", + line=dict(color="#2196F3"), + ), row=1, col=1) + fig.add_trace(go.Bar( + x=valid_times, y=offsets[:len(valid_times)], + name="Offset (°)", + marker_color=["#FF5722" if o > 0 else "#E0E0E0" + for o in offsets[:len(valid_times)]], + ), row=2, col=1) + valid_temps = [t if t is not None else float("nan") + for t in temps[:len(valid_times)]] + fig.add_trace(go.Scatter( + x=valid_times, y=valid_temps, + mode="lines", name="Temp (°C)", + line=dict(color="#FF9800"), + ), row=3, col=1) + fig.add_hline( + y=settings.SEMILLON_TRANSITION_TEMP_C, row=3, col=1, + line_dash="dash", line_color="red", + annotation_text=f"{settings.SEMILLON_TRANSITION_TEMP_C}°C", + ) + fig.update_layout(height=600, margin=dict(t=40, b=20), showlegend=False) + st.plotly_chart(fig, key="replay_timeline") + except ImportError: + pass + + # Slot-by-slot detail + with st.expander("Slot Details"): + slot_idx = st.slider("Slot", 0, len(ticks) - 1, 0, key="replay_slot") + tick = ticks[slot_idx] + cols_display = { + "timestamp": "Time", + "slot_index": "Slot", + "target_angle": "Target Angle (°)", + "plan_offset_deg": "Plan Offset (°)", + "live_override": "Live Override", + "override_reason": "Override Reason", + "source": "Source", + "dispatch": "Dispatched", + "air_temp_c": "Air Temp (°C)", + "ghi_w_m2": "GHI (W/m²)", + "wind_speed_ms": "Wind (m/s)", + "stage_id": "Stage", + } + display = {} + for key, label in cols_display.items(): + val = tick.get(key) + if val is not None: + if isinstance(val, float): + display[label] = f"{val:.1f}" + else: + display[label] = str(val) + for label, val in display.items(): + st.text(f"{label}: {val}") + + +# ====================================================================== +# 4. Fruiting Zone Monitor +# ====================================================================== + +def _render_fruiting_zone(): + st.subheader("Fruiting Zone Monitor") + st.caption( + "Mid-canopy conditions in the grape cluster zone " + f"(Zone {settings.FRUITING_ZONE_INDEX}, ~{settings.FRUITING_ZONE_HEIGHT_M}m height)." + ) + + # Get current vine sensor data + try: + from src.data.data_providers import DataHub + hub = DataHub.default() + snapshot = hub.vine_sensors.get_snapshot() + has_data = snapshot and "error" not in snapshot + except Exception: + snapshot = {} + has_data = False + + if not has_data: + st.info("Live vine sensor data unavailable. Showing configuration thresholds.") + _render_fruiting_config() + return + + # Extract fruiting-zone relevant metrics from the 2026 VineSnapshot. + # PAR/VPD sensors were retired in the 2026 refresh; we now read NDVI/PRI + # (canopy state) and the leaf-air delta-T (heat-stress proxy). + t_crop_treat = snapshot.get("treatment_crop_leaf_temp_c") or snapshot.get("treatment_leaf_temp_c") + t_crop_ref = snapshot.get("reference_crop_leaf_temp_c") + delta_t = snapshot.get("treatment_air_leaf_delta_t") + ndvi_treat = snapshot.get("treatment_crop_ndvi") + ndvi_ratio = snapshot.get("ndvi_ratio") + pri_treat = snapshot.get("treatment_crop_pri") + psri_treat = snapshot.get("treatment_crop_psri") + + c1, c2, c3 = st.columns(3) + + with c1: + if t_crop_treat is not None: + delta = None + if t_crop_ref is not None: + delta = f"{t_crop_treat - t_crop_ref:+.1f}°C vs ref" + st.metric("Canopy Temp (treatment)", f"{t_crop_treat:.1f}°C", delta) + else: + st.metric("Canopy Temp", "N/A") + + with c2: + if ndvi_treat is not None: + ratio_str = f"{ndvi_ratio:.2f}× ref" if ndvi_ratio is not None else None + st.metric("NDVI (treatment)", f"{ndvi_treat:.3f}", ratio_str) + else: + st.metric("NDVI", "N/A") + + with c3: + if delta_t is not None: + st.metric( + "Leaf−air ΔT", + f"{delta_t:+.1f}°C", + "heat stress" if delta_t > 2 else "ok", + ) + else: + st.metric("Leaf−air ΔT", "N/A") + + # Soil + photochemical indices row + soil_temp = snapshot.get("treatment_soil_temp_c") + soil_moisture = snapshot.get("treatment_soil_moisture_pct") + soil_moisture_deep = snapshot.get("treatment_soil_moisture_deep_pct") + panel_temp = snapshot.get("treatment_panel_temp_c") + panel_count = snapshot.get("panel_temp_active_count", 0) or 0 + + c4, c5, c6, c7 = st.columns(4) + if soil_temp is not None: + c4.metric("Soil Temp", f"{soil_temp:.1f}°C") + if soil_moisture is not None: + delta = f"deep {soil_moisture_deep:.1f}%" if soil_moisture_deep is not None else None + c5.metric("Soil Moisture (shallow)", f"{soil_moisture:.1f}%", delta) + if pri_treat is not None: + c6.metric("PRI", f"{pri_treat:.3f}", help="Photochemical Reflectance Index") + if panel_temp is not None: + c7.metric("Panel Temp", f"{panel_temp:.1f}°C", f"{panel_count}/12 active") + + # Sunburn risk assessment (2026: no PAR sensor; rely on canopy temp + ΔT + PSRI) + st.markdown("---") + st.markdown("**Fruiting Zone Risk Assessment**") + + risks = [] + if t_crop_treat is not None and t_crop_treat >= settings.BERRY_SUNBURN_TEMP_C: + risks.append( + f"Berry temperature {t_crop_treat:.1f}°C exceeds sunburn " + f"threshold ({settings.BERRY_SUNBURN_TEMP_C}°C)" + ) + if delta_t is not None and delta_t > 3: + risks.append( + f"Leaf−air ΔT {delta_t:+.1f}°C indicates active heat stress " + f"(leaf hotter than ambient)" + ) + if psri_treat is not None and psri_treat > 0.2: + risks.append( + f"PSRI {psri_treat:.2f} elevated — early senescence / chlorosis signal" + ) + + if risks: + for r in risks: + st.error(r) + else: + st.success("No fruiting zone risks detected.") + + _render_fruiting_config() + + +def _render_fruiting_config(): + with st.expander("Fruiting Zone Thresholds"): + st.markdown(f""" +| Parameter | Value | +|-----------|-------| +| Zone index | {settings.FRUITING_ZONE_INDEX} (mid-canopy) | +| Zone height | {settings.FRUITING_ZONE_HEIGHT_M} m | +| Berry sunburn temp | {settings.BERRY_SUNBURN_TEMP_C}°C | +| Target PAR ceiling | {settings.FRUITING_ZONE_TARGET_PAR} µmol/m²/s | +| Semillon transition | {settings.SEMILLON_TRANSITION_TEMP_C}°C | +| Shade-eligible temp | {settings.SHADE_ELIGIBLE_TLEAF_ABOVE}°C | +""") + + +# ====================================================================== +# 5. ROI Dashboard +# ====================================================================== + +def _render_roi_dashboard(): + st.subheader("ROI Dashboard") + st.caption( + "Budget utilisation, intervention statistics, and Land Equivalent Ratio." + ) + + from src.roi_service import ROIService + + roi = ROIService() + + # Try loading the most recent simulation log + log_files = _load_sim_logs() + if log_files: + try: + with open(log_files[0]) as f: + tick_log = json.load(f) + roi.load_tick_log(tick_log) + st.caption(f"Using log: `{log_files[0].name}` ({len(tick_log)} ticks)") + except Exception as exc: + st.warning(f"Could not load log: {exc}") + tick_log = [] + else: + tick_log = [] + + # Budget status + st.markdown("### Budget Utilisation") + budget = roi.get_budget_status() + + c1, c2, c3 = st.columns(3) + c1.metric("Annual Budget", f"{budget.annual_budget_kwh:,.0f} kWh") + c2.metric("Spent", f"{budget.annual_spent_kwh:,.0f} kWh") + pct = budget.annual_utilisation_pct + c3.metric("Utilisation", f"{pct:.1f}%", + delta=f"{budget.annual_remaining_kwh:,.0f} kWh remaining", + delta_color="normal" if pct < 80 else "inverse") + + # Budget gauge + try: + import plotly.graph_objects as go + + fig = go.Figure(go.Indicator( + mode="gauge+number+delta", + value=pct, + delta={"reference": 100, "decreasing": {"color": "green"}}, + gauge={ + "axis": {"range": [0, 100]}, + "bar": {"color": "#2196F3"}, + "steps": [ + {"range": [0, 50], "color": "#E8F5E9"}, + {"range": [50, 80], "color": "#FFF3E0"}, + {"range": [80, 100], "color": "#FFEBEE"}, + ], + "threshold": { + "line": {"color": "red", "width": 4}, + "thickness": 0.75, + "value": 100, + }, + }, + title={"text": "Annual Budget Utilisation (%)"}, + )) + fig.update_layout(height=250, margin=dict(t=40, b=20)) + st.plotly_chart(fig, key="budget_gauge") + except ImportError: + pass + + if budget.is_over_budget(): + st.error("Annual shading budget EXCEEDED!") + + # Intervention stats + st.markdown("### Intervention Statistics") + stats = roi.compute_intervention_stats(label="all_time") + + c1, c2, c3, c4 = st.columns(4) + c1.metric("Total Slots", stats.total_slots) + c2.metric("Interventions", stats.intervention_slots) + c3.metric("Rate", f"{stats.intervention_rate_pct:.1f}%") + c4.metric("Avg Offset", f"{stats.avg_offset_deg:.1f}°") + + # LER calculator + st.markdown("### Land Equivalent Ratio (LER)") + st.caption( + f"Target LER: {settings.TARGET_LER:.1f} — " + "values above 1.0 mean combined land use is more productive than monoculture." + ) + + lc1, lc2 = st.columns(2) + with lc1: + actual_energy = st.number_input( + "Actual PV generation (kWh/year)", + value=int(roi.annual_gen * 0.97), + step=1000, + key="ler_energy", + ) + with lc2: + crop_ratio = st.slider( + "Crop yield ratio (agri/mono)", + 0.5, 1.5, 0.95, 0.05, + key="ler_crop", + ) + + ler = roi.compute_ler( + actual_energy_kwh=actual_energy, + actual_crop_yield=crop_ratio, + mono_crop_yield=1.0, + ) + + lm1, lm2, lm3 = st.columns(3) + lm1.metric("Energy Fraction", f"{ler.energy_fraction:.2f}") + lm2.metric("Crop Fraction", f"{ler.crop_fraction:.2f}") + color = "normal" if ler.meets_target else "inverse" + lm3.metric("LER", f"{ler.ler:.2f}", + delta="meets target" if ler.meets_target else "below target", + delta_color=color)