diff --git a/pvanalytics/features/clipping.py b/pvanalytics/features/clipping.py index 45f4bd7d..91af4eac 100644 --- a/pvanalytics/features/clipping.py +++ b/pvanalytics/features/clipping.py @@ -79,16 +79,18 @@ def levels(ac_power, window=4, fraction_in_window=0.75, for more information. """ + power = ac_power.copy() + power.dropna(inplace=True) num_bins = np.ceil(1.0 / rtol).astype(int) - flags = pd.Series(index=ac_power.index, data=False) - power_plateaus, bins = _detect_levels(ac_power, count=levels, + flags = pd.Series(index=power.index, data=False) + power_plateaus, bins = _detect_levels(power, count=levels, num_bins=num_bins) for lower, upper in power_plateaus: - temp = pd.Series(index=ac_power.index, data=0.0) - temp.loc[(ac_power >= lower) & (ac_power <= upper)] = 1.0 + temp = pd.Series(index=power.index, data=0.0) + temp.loc[(power >= lower) & (power <= upper)] = 1.0 flags = flags | _label_clipping(temp, window=window, frac=fraction_in_window) - return flags + return flags.reindex_like(ac_power).fillna(False) def _daytime_powercurve(ac_power, power_quantile): diff --git a/pvanalytics/tests/features/test_clipping.py b/pvanalytics/tests/features/test_clipping.py index 347ff408..d2da7cca 100644 --- a/pvanalytics/tests/features/test_clipping.py +++ b/pvanalytics/tests/features/test_clipping.py @@ -71,6 +71,16 @@ def test_levels_two_periods(quadratic, quadratic_clipped): assert not clipped[50:].any() +def test_levels_missing_data(quadratic, quadratic_clipped): + quadratic[10:20] = np.nan + quadratic_clipped[10:20] = np.nan + assert_series_equal( + pd.Series(False, quadratic.index), + clipping.levels(quadratic, window=10) + ) + assert not clipping.levels(quadratic_clipped, window=10)[10:20].any() + + def test_threshold_no_clipping(quadratic): """In a data set with a single quadratic there is no clipping.""" quadratic.index = pd.date_range(