feat(forecast): commission corrected Lihrenmoos profile

This commit is contained in:
dh
2026-10-04 09:07:30 +00:00
parent 913a4cd5f3
commit 30f7652803
5 changed files with 393 additions and 3 deletions
@@ -9,7 +9,7 @@ from bisect import bisect_right
from collections import defaultdict
from datetime import datetime, timedelta, timezone
from hashlib import sha256
from math import isfinite
from math import ceil, isfinite
from statistics import median
from zoneinfo import ZoneInfo
import json
@@ -34,6 +34,16 @@ def epoch(value):
return int(t.timestamp())
def availability_epoch(value):
if not isinstance(value, str):
raise ValueError('UTC timestamp required')
t = datetime.fromisoformat(value.replace('Z', '+00:00'))
if t.tzinfo is None or t.utcoffset().total_seconds() != 0:
raise ValueError('Explicit UTC timestamp required')
# Never claim an input existed before its sub-second observation completed.
return int(ceil(t.timestamp()))
def iso(t):
return datetime.fromtimestamp(t, UTC).isoformat()
@@ -479,7 +489,7 @@ def apply_load_forecast(con,plant,dataset,forecast,decision):
raise ValueError('No current external SDL request for the persistence scenario')
sdl=r['value']*s['factorToW']
result=json.loads(canonical(forecast)); result['families']={}
result['observedAt']=iso(max(epoch(forecast['observedAt']),model['trainedAt'],last['capturedAt']))
result['observedAt']=iso(max(availability_epoch(forecast['observedAt']),model['trainedAt'],last['capturedAt']))
for family,old in forecast['families'].items():
if family not in FAMILIES: continue
points=[]