Overview
The Wind Derate Detection algorithm identifies periods when wind turbines are producing less power than expected. Expected power comes from the consolidated ExpectedPowerCons.10m column produced by Step 6_3 (WindExpectedPower), i.e. the reference power curve evaluated on the density-corrected wind speed (IEC 61400-12-1, 0 kW outside the curve domain). The algorithm detects sustained, stable underperformance patterns that indicate raw derating events, which can include operational constraints, curtailment, or technical issues before downstream reclassification. It processes one turbine at a time. In the pipeline, Step 8_1 Wind Derate Detection writes fact_wtg_derate_10m; Step 8_2 Wind Curtailment Detection consumes that table and owns the reconciled fact_wtg_derate_curtailment_10m output.
Algorithm Design
Conceptual Approach
The algorithm follows a three-step process to identify derate conditions:
flowchart TB
subgraph Step1["Step 1: Data Collection & Filtering"]
A[Raw Time Series Data] --> B{Filter Production States}
B -->|Remove| C1[Idle Points<br/>power <= 0]
B -->|Remove| C2[Start/Stop<br/>power_min <= 0]
B -->|Remove| C3[Below Cut-in<br/>wind_speed < cut_in]
B -->|Keep| D[Valid Production Data]
style C1 fill:#ff9999,stroke:#cc0000,stroke-width:2px,color:#000
style C2 fill:#ff9999,stroke:#cc0000,stroke-width:2px,color:#000
style C3 fill:#ff9999,stroke:#cc0000,stroke-width:2px,color:#000
style D fill:#99ff99,stroke:#009900,stroke-width:2px,color:#000
end
subgraph Step2["Step 2: Underperformance Detection"]
D --> E[Expected Power<br/>from Step 6_3 column]
E --> F{Compare: Actual vs Expected}
F -->|actual < expected x adaptive_threshold| G[Flag as Underperforming]
F -->|actual >= expected x adaptive_threshold| H[Normal Operation]
style G fill:#ff9999,stroke:#cc0000,stroke-width:2px,color:#000
style H fill:#99ff99,stroke:#009900,stroke-width:2px,color:#000
end
subgraph Step3["Step 3: Derating Sequence Detection"]
G --> I{Find Consecutive Windows}
I --> J{Window Size >= min_consecutive?}
J -->|No| K[Discard<br/>Isolated Points]
J -->|Yes| L{Power Stability Check<br/>CV < threshold?}
L -->|No| M[Discard<br/>Unstable Window]
L -->|Yes| N[Valid Derate Window]
N --> P[Final Derate Flags]
style K fill:#ff9999,stroke:#cc0000,stroke-width:2px,color:#000
style M fill:#ff9999,stroke:#cc0000,stroke-width:2px,color:#000
style N fill:#99ff99,stroke:#009900,stroke-width:2px,color:#000
style P fill:#66ff66,stroke:#006600,stroke-width:3px,color:#000
end
P --> Q[Output: Derate Flags + Losses]
style Step1 fill:#cce5ff,stroke:#0066cc,stroke-width:2px,color:#000
style Step2 fill:#ffe6cc,stroke:#cc6600,stroke-width:2px,color:#000
style Step3 fill:#e6ffcc,stroke:#66cc00,stroke-width:2px,color:#000
style Q fill:#ffff99,stroke:#cccc00,stroke-width:3px,color:#000
Algorithm Steps:
- Data Filtering: Per turbine, keep only eligible production points (exclude idle, start/stop transients, and points below cut-in wind speed)
- Underperformance Detection: Flag eligible points where actual power is below
expected x adaptive_threshold. The threshold band is wind-speed dependent (wider at low wind where the curve is steep, tighter near rated power) - Sequence Validation: Keep only sustained windows (>=
min_consecutive_points) with stable power (CV <power_stability_threshold) - Loss: For flagged points,
loss = max(expected - actual, 0)
Design Philosophy
-
Conservative Detection: The algorithm prioritizes precision over recall to minimize false positives. It requires sustained patterns (minimum 6 consecutive points) and power stability to confirm derate events.
-
Production-State Filtering: Non-production states (idle, start/stop transients) are excluded to focus detection on actual underperformance during normal operation.
-
Statistical Validation: Power stability checks (coefficient of variation) ensure detected events represent sustained derate conditions rather than transient anomalies.
-
Expected-Power Comparison: Uses the
ExpectedPowerCons.10mcolumn as the expected-power source. Turbine-specific reference power curves are used for cut-in filtering and for the adaptive threshold band shape.
Inputs
Required Time Series Data
The algorithm requires the consolidated per-turbine 10-min frame with these signals (CONS point names from Step 5_1):
| Schema Constant | Point Name | Aggregation | Description | Used For |
|---|---|---|---|---|
WIND_SPEED_CONS |
WindSpeedCons.10m |
Time Average | Selected nacelle wind speed (m/s) | Cut-in filter, adaptive threshold band |
ACTIVE_POWER_CONS |
ActivePowerCons.10m |
Time Average | Active power output (kW) | Performance comparison, stability checks |
ACTIVE_POWER_MIN_CONS |
ActivePowerMinCons.10m |
Minimum | Active power output (kW) | Start/stop detection, idle state filtering |
EXPECTED_POWER_CONS |
ExpectedPowerCons.10m |
Time Average | Expected power from Step 6_3 (kW) | Underperformance comparison and loss |
Typical Data Interval: 10-minute aggregated data is recommended for optimal detection.
Reference Power Curves
Each turbine's WindPowerCurve is used for the cut-in wind speed and the shape of the adaptive threshold band (cut-in and plateau wind speeds). The eligibility mask reads the cut-in wind speed from turbine attributes and uses 0 if the attribute is absent. The adaptive band uses that attribute when present, otherwise it infers cut-in from the curve using cut_in_threshold. The curve is not re-evaluated for expected power - that comes from the ExpectedPowerCons.10m column (Step 6_3), keeping detection and loss consistent with the KPI steps.
Step 8_1 loads AI reference power curves from REFERENCE_CURVE records, drops invalid curves, processes only turbines with valid matching curves, and skips derate detection if no valid reference curves remain.
Object Collection
Collection of wind turbine objects with:
- Object IDs matching the time series data
- Object type: TURBINE_TYPE (from bazeclient schema)
Outputs
Generated Time Series
The algorithm produces three output time series for each turbine:
| Schema Constant | Point Name | Data Type | Description |
|---|---|---|---|
POINT_NAME_DERATE |
DerateFlag |
Integer (0/1) | Binary flag indicating derate status - 0 = Normal operation - 1 = Derated |
POINT_NAME_DERATE_POWER_LOSS |
DeratePowerLosses.10m |
Float (kW) | Power loss during derate Calculated as: max(expected_power - actual_power, 0) |
POINT_NAME_DERATE_ENERGY_LOSS |
DerateEnergyLosses.10m |
Float (kWh) | Energy loss during derate Calculated as: power_loss x interval_hours |
Migration note (point-name change): The loss point names now carry the .10m interval
suffix (DeratePowerLosses.10m, DerateEnergyLosses.10m). The same change applies to the other
wind loss series - curtailment (CurtailmentPowerLosses.10m / CurtailmentEnergyLosses.10m),
icing (IcingPowerLosses.10m / IcingEnergyLosses.10m) and wake (WakePowerLosses.10m /
WakeEnergyLosses.10m). Any external contract or query referencing the old un-suffixed names
must be updated to the .10m names.
Output Format
Returns an ObjectTimeSeriesCollection containing the new signals, which can be:
- Uploaded to BazeField for visualization and reporting
- Converted to DataFrame for further analysis
- Exported for external systems
The Step 8_1 pipeline writes the raw derate output to fact_wtg_derate_10m. WindDerateDetection does not produce a derate category column; downstream Step 8_2 reclassifies raw derate events as curtailment where applicable and writes fact_wtg_derate_curtailment_10m.
Algorithm Parameters
Main Parameters
| Parameter | Default Value | Range | Purpose | Selection Rationale |
|---|---|---|---|---|
min_consecutive_points |
6 | >= 1 | Minimum consecutive underperforming points to flag as derated | 6 points (1 hour for 10-min data): Filters out transient anomalies and ensures detected events represent sustained derate conditions. |
power_stability_threshold |
0.10 | 0.0 - 1.0 | Maximum coefficient of variation (std/mean) for power stability | 10% CV: Ensures detected derate windows show stable power output, characteristic of true curtailment or limitation events. |
min_uncertainty |
0.03 | 0.0 - 1.0 | Threshold band width near rated power | Tighter tolerance where the curve is flat and measurement is reliable. |
max_uncertainty |
0.15 | 0.0 - 1.0 | Threshold band width at low wind speed | Wider tolerance where the curve is steep (small wind-speed error -> large power error). |
slope_parameter |
6.0 | >= 0.0 | Sigmoid steepness of the low->high wind transition of the band | Controls how quickly the band tightens between cut-in and plateau. |
cut_in_threshold |
0.05 | 0.0 - 1.0 | Power fraction used to infer cut-in when the curve has no cut-in attribute | Used only for the adaptive threshold band cut-in fallback. |
rated_power_fraction_threshold |
0.98 | 0.0 - 1.0 | Fraction of rated power marking the plateau start | Defines the upper bound of the adaptive band transition. |
Step 8_1 instantiates WindDerateDetection(min_consecutive_points=6, power_stability_threshold=0.05), so the pipeline uses a 5% CV stability threshold rather than the class default of 10%.
Parameter Tuning Guidelines
More Sensitive Detection (increase recall, may increase false positives):
- Decrease max_uncertainty -> 0.10 (tighter band = flag smaller deviations)
- Decrease min_consecutive_points -> 4 (detect shorter events)
- Increase power_stability_threshold -> 0.15 (allow more variation)
More Conservative Detection (reduce false positives, may miss events):
- Increase max_uncertainty -> 0.20 (wider band = require larger deviations)
- Increase min_consecutive_points -> 10 (require longer events)
- Decrease power_stability_threshold -> 0.05 (require tighter stability)
Algorithm Workflow
The algorithm processes one turbine at a time. For each turbine:
Step 1: Input Validation
Validates that the input is non-empty, the required columns are present
(WindSpeedCons.10m, ActivePowerCons.10m, ActivePowerMinCons.10m, ExpectedPowerCons.10m), and at least one
valid power curve matches a turbine. Turbines without a valid curve are skipped.
Step 2: Eligibility Mask
Keep only eligible production points: exclude idle (active_power <= 0), start/stop transients
(active_power > 0 AND power_min <= 0), and points below the turbine attribute cut-in wind
speed. If the cut-in attribute is absent, the eligibility cut-in value defaults to 0.
Step 3: Underperformance Detection
For each eligible point, compare actual power to expected x adaptive_threshold, where
expected is the ExpectedPowerCons.10m value and the adaptive threshold band is derived from the
curve shape (wider at low wind, tighter near rated). Points with expected power <= 0 (out of the
operating envelope) are never flagged.
Step 4: Consecutive Pattern Validation
Keep windows of >= min_consecutive_points consecutive underperforming points whose power is
stable (CV = std/mean < power_stability_threshold). Mark all points in valid windows as derated.
Step 5: Loss Calculation
For each derated point: power_loss = max(ExpectedPower - actual, 0), stored in
POINT_NAME_DERATE_POWER_LOSS (kW). The energy loss POINT_NAME_DERATE_ENERGY_LOSS (kWh) is the
power loss integrated over the sample interval: power_loss x interval_hours.
Step 6: Output Generation
Emit the per-turbine WIND_DERATE_FLAG, POINT_NAME_DERATE_POWER_LOSS and
POINT_NAME_DERATE_ENERGY_LOSS series (spanning all timestamps) into an
ObjectTimeSeriesCollection.
Usage Example
from bazeanalytics.wind import WindDerateDetection
from bazeanalytics.object_collection import ObjectCollection
# Initialize algorithm with custom parameters
derate_algo = WindDerateDetection(
min_consecutive_points=6, # Require 6 consecutive points (1 hour)
power_stability_threshold=0.05, # Require CV < 5% for stability
)
# Run algorithm (expected power comes from ExpectedPowerCons.10m in the consolidated frame, Step 6_3)
results = derate_algo.run(
tsc_wtg_consolidated=ts_collection, # Consolidated per-turbine frame
turbines=ObjectCollection(turbines), # Wind turbine objects
wind_power_curves=wind_power_curves, # List of WindPowerCurve objects
)
Performance Considerations
Computational Complexity
- Time Complexity: O(n x m) where n = number of time points, m = number of turbines
- Space Complexity: O(n x m) for DataFrame operations
- Typical Runtime: Depends on time range, turbine count, datalake read size, and reference-curve availability
Memory Optimization
- Uses vectorized numpy operations for power comparisons
- Processes turbines individually to limit memory footprint
- Slices the output frame to the emitted point names before returning
Data Quality Impact
The algorithm's effectiveness depends on: - Reference Curve Quality: Accurate curves are essential for meaningful detection - Data Completeness: No hard completeness threshold is enforced, but required columns must be present - Wind Speed Accuracy: Wind speed drives the adaptive threshold band and the upstream Step 6_3 expected-power calculation - Power Measurement Precision: No hard precision threshold is enforced; active power is used for comparison, stability, and loss
Limitations and Known Issues
-
Cut-out Region: There is no explicit cut-out filter in this algorithm. Points where
ExpectedPowerCons.10m <= 0are never flagged as underperforming. -
Yaw Misalignment: Cannot distinguish between derating and yaw misalignment. Both appear as underperformance.
-
Icing Events: May flag ice-induced underperformance as derate. Consider pre-filtering for icing conditions.
-
Transient Derates: Very short derate events (<1 hour for 10-min data) are filtered out by design. Adjust
min_consecutive_pointsif needed. -
Multiple Turbines: Requires individual reference curves. Does not perform inter-turbine comparison or fleet-wide analysis.
Related Algorithms
- Wind Power Curve Estimation: Generates data-driven reference curves for this algorithm
- Wind Data Quality: Pre-filters data for sensor anomalies before derate detection
- Inter-Turbine Anomaly Detection: Identifies underperforming turbines relative to fleet
References
- IEC 61400-12-1: Wind turbines - Power performance measurements
- IEC 61400-25: Communications for monitoring and control of wind power plants
- BazeAnalytics Wind Schema Documentation
Version History
- v1.0 (2026-01): Initial implementation with 3-step detection workflow
- Added power stability validation
- Added adaptive uncertainty thresholds based on wind speed and curve shape
- Uses
ExpectedPowerCons.10mfrom Step 6_3 as the expected-power source
Contact
For questions, issues, or feature requests, please contact the BazeAnalytics development team.