rdtools.soiling.CODSAnalysis.iterative_signal_decomposition

CODSAnalysis.iterative_signal_decomposition(order=('SR', 'SC', 'Rd'), degradation_method='YoY', max_iterations=18, cleaning_sensitivity=0.5, convergence_criterion=0.005, pruning_iterations=1, clean_pruning_sensitivity=0.6, soiling_significance=0.75, process_noise=0.0001, renormalize_SR=None, ffill=True, clip_soiling=True, verbose=False)

Estimates the soiling losses and the degradation rate of a PV system based on its daily normalized energy, or daily Performance Index (PI). The underlying assumption is that the PI consists of a degradation trend, a seasonal component, and a soiling signal (defined as 1 if no soiling, decreasing with increasing soiling losses). I.e.: PI = degradation_trend * seasonal_component * soiling_ratio * residuals, or:

\[PI = Rd * SC * SR * R\]

The function has a heuristic for detecting whether the soiling signal is significant enough for soiling loss inference, which is based on the ratio between the spread in the soiling signal versus the spread in the residuals (defined by the 2.5th and 97.5th percentiles)

  • The degradation trend is obtained using the native RdTools Year-On-Year method 1.

  • The seasonal component is derived with statsmodels STL 2.

  • The soiling signal is derived with a Kalman Filter with a cleaning detection heuristic 3.

Parameters
  • order (tuple, default ('SR', 'SC', 'Rd')) -- Tuple containing 1 to 3 of the following strings 'SR' (soiling ratio), 'SC' (seasonal component), 'Rd' (degradation component), defining the order in which these components will be found during iterative decomposition

  • degradation_method (string, default 'YoY') -- Either 'YoY' or 'STL'. If anything else, 'YoY' will be assumed. Decides whether to use the YoY method [3] for estimating the degradation trend (assumes linear trend), or the STL-method (does not assume linear trend). The latter is slower.

  • max_iterations (int, default 18) -- Max number of iterations to perform. Each iteration fits only one of the components, so three iterations are needed to fit all three components.

  • cleaning_sensitivity (float, default .5) -- Higher value gives lower cleaning event detection sensitivity. Should be between 0.1 and 2

  • convergence_criterion (float, default 5e-3) -- the relative change in the convergence metric required for convergence

  • pruning_iterations (int, default 1) -- Number of iterations when pruning (removing) cleaning events

  • clean_pruning_sensitivity (float, default .6) -- Sensitivity tuner that decides how easily a cleaning event is pruned (removed). Larger values means a smaller chance of pruning a given event. Should be between 0.1 and 2

  • soiling_significance (float, default 0.75) -- The minimum amplitude of the soiling signal relative to the amplitude of the residuals that is considered a significant soiling signal.

  • process_noise (float, default 1e-4) -- A Kalman Filter parameter that represents the expected amount of unmodeled variation in the process, the process being the variation in the performance index that is due to soiling, seasonality and degradation.

  • renormalize_SR (float, default None) -- If not none, defines the percentile for which the SR will be normalized to, based on the SR just after cleaning events

  • ffill (bool, default True) -- Whether to use forward fill (default) or backward fill before doing the rolling median for cleaning event detection

  • clip_soiling (bool, default True) -- Whether or not to clip the soiling ratio at max 1 and minimum 0.

  • verbose (bool, default False) -- If true, prints a progress report

Returns

  • df_out (pandas.DataFrame) -- Dataframe that summarized the results of the iterative signal decomposition. Contains the followig columns:

    Column Name

    Description

    'soiling_ratio'

    soiling ratio (SR) (-)

    'soiling_rates'

    soiling rates (1/day)

    'cleaning_events'

    True at cleaning events

    'seasonal_component'

    seasonal component (SC)

    'degradation_trend'

    degradation trend (Rd)

    'total_model'

    the total model fit, i.e. SR * SC * Rd * rs, where SR is the soiling ratio, SC is the seasonal component, Rd is the degradation trend, and rs is the residual shift, i.e. the mean of the residuals (adjusting the position of the model fit to the position of the input data)

    'residuals'

    The residuals of the model fit, i.e. PI / (SR * SC * Rd)

  • results_dict (dict) -- Dictionary with the following entries:

    Key

    Description

    'degradation'

    Linear degradation rate of system in %/year (float)

    'soiling_loss'

    Average soiling losses over the time series in % (float)

    'residual_shift'

    Mean value of residuals. Multiply total model by this number for complete overlap with input pi (float)

    'RMSE'

    Root Means Squared Error of total model vs input pi (float)

    'small_soiling_signal'

    Whether or not the signal is deemed too small to infer soiling ratio (bool)

    'adf_res'

    The results of an Augmented Dickey-Fuller test (telling whether the residuals are stationary or not) (list)

References

1

Jordan, D.C., Deline, C., Kurtz, S.R., Kimball, G.M., Anderson, M., 2017. Robust PV Degradation Methodology and Application. IEEE J. Photovoltaics 1–7. https://doi.org/10.1109/JPHOTOV.2017.2779779

2

Deceglie, M.G., Micheli, L., Muller, M., 2018. Quantifying Soiling Loss Directly from PV Yield. IEEE J. Photovoltaics 8, 547–551. https://doi.org/10.1109/JPHOTOV.2017.2784682

3

Skomedal, Å. and Deceglie, M. G., IEEE Journal of Photovoltaics, Sept. 2020. https://doi.org/10.1109/JPHOTOV.2020.3018219