Skip to content

Load disaggregation

camber.disaggregate splits an interval load into three transparent components — the framing behind baseload reduction, envelope/HVAC targeting, and setback opportunity:

Three components that sum exactly to the metered load: an always-on floor, the weather-explained part, and an honest remainder.

flowchart LR
    load["load_kw"] --> dis["disaggregate_load"]
    oat["oat"] --> dis
    dis --> base["baseload (low-percentile floor)"]
    dis --> weather["weather (heating + cooling about balance_point)"]
    dis --> other["other (remainder)"]
    base --> sum["sum to total load"]
    weather --> sum
    other --> sum
from camber.disaggregate import disaggregate_load

c = disaggregate_load(load_kw, oat)
c.baseload_frac, c.weather_frac, c.other_frac  # e.g. 0.61, 0.26, 0.13 (sum to 1)
c.baseload_kw, c.balance_point_f
  • baseload — the always-on floor (a low percentile of the series; per-interval it can't exceed the actual load, so the three components sum exactly to the total);
  • weather — the part above baseload that outdoor-air temperature explains (heating + cooling legs about a balance point, searched for best fit unless fixed);
  • other — the remainder (occupancy, plug loads, and anything the weather model doesn't explain).

Deliberately honest: weather is only what OAT explains; the rest is labeled other, not over-attributed to a schedule the data can't cleanly separate. Flags: baseload_pct, balance_point, balance_range. numpy/pandas.