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:

  1. Data Filtering: Per turbine, keep only eligible production points (exclude idle, start/stop transients, and points below cut-in wind speed)
  2. 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)
  3. Sequence Validation: Keep only sustained windows (>= min_consecutive_points) with stable power (CV < power_stability_threshold)
  4. Loss: For flagged points, loss = max(expected - actual, 0)

Design Philosophy

  1. 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.

  2. Production-State Filtering: Non-production states (idle, start/stop transients) are excluded to focus detection on actual underperformance during normal operation.

  3. Statistical Validation: Power stability checks (coefficient of variation) ensure detected events represent sustained derate conditions rather than transient anomalies.

  4. Expected-Power Comparison: Uses the ExpectedPowerCons.10m column 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

  1. Cut-out Region: There is no explicit cut-out filter in this algorithm. Points where ExpectedPowerCons.10m <= 0 are never flagged as underperforming.

  2. Yaw Misalignment: Cannot distinguish between derating and yaw misalignment. Both appear as underperformance.

  3. Icing Events: May flag ice-induced underperformance as derate. Consider pre-filtering for icing conditions.

  4. Transient Derates: Very short derate events (<1 hour for 10-min data) are filtered out by design. Adjust min_consecutive_points if needed.

  5. 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.10m from Step 6_3 as the expected-power source

Contact

For questions, issues, or feature requests, please contact the BazeAnalytics development team.