Skip to content

Commit 2f7e687

Browse files
authored
Ignore missing data in clipping.levels() (#97)
* Ignore missing data in clipping.levels() Drop missing data (NAs) before applying the clipping filter. Series is reindexed and NAs are filled with False before being returned.
1 parent 6eefb0a commit 2f7e687

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

pvanalytics/features/clipping.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,18 @@ def levels(ac_power, window=4, fraction_in_window=0.75,
7979
for more information.
8080
8181
"""
82+
power = ac_power.copy()
83+
power.dropna(inplace=True)
8284
num_bins = np.ceil(1.0 / rtol).astype(int)
83-
flags = pd.Series(index=ac_power.index, data=False)
84-
power_plateaus, bins = _detect_levels(ac_power, count=levels,
85+
flags = pd.Series(index=power.index, data=False)
86+
power_plateaus, bins = _detect_levels(power, count=levels,
8587
num_bins=num_bins)
8688
for lower, upper in power_plateaus:
87-
temp = pd.Series(index=ac_power.index, data=0.0)
88-
temp.loc[(ac_power >= lower) & (ac_power <= upper)] = 1.0
89+
temp = pd.Series(index=power.index, data=0.0)
90+
temp.loc[(power >= lower) & (power <= upper)] = 1.0
8991
flags = flags | _label_clipping(temp, window=window,
9092
frac=fraction_in_window)
91-
return flags
93+
return flags.reindex_like(ac_power).fillna(False)
9294

9395

9496
def _daytime_powercurve(ac_power, power_quantile):

pvanalytics/tests/features/test_clipping.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,16 @@ def test_levels_two_periods(quadratic, quadratic_clipped):
7171
assert not clipped[50:].any()
7272

7373

74+
def test_levels_missing_data(quadratic, quadratic_clipped):
75+
quadratic[10:20] = np.nan
76+
quadratic_clipped[10:20] = np.nan
77+
assert_series_equal(
78+
pd.Series(False, quadratic.index),
79+
clipping.levels(quadratic, window=10)
80+
)
81+
assert not clipping.levels(quadratic_clipped, window=10)[10:20].any()
82+
83+
7484
def test_threshold_no_clipping(quadratic):
7585
"""In a data set with a single quadratic there is no clipping."""
7686
quadratic.index = pd.date_range(

0 commit comments

Comments
 (0)