From e942e6c97d3aeac33440ed3be82bbb071a41cea5 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Fri, 4 Jun 2021 10:55:26 -0600 Subject: [PATCH 1/4] correct slope calculation, add test with time interval 2 minutes --- pvlib/clearsky.py | 7 ++++--- pvlib/tests/test_clearsky.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pvlib/clearsky.py b/pvlib/clearsky.py index 857c5dd202..6c57f71860 100644 --- a/pvlib/clearsky.py +++ b/pvlib/clearsky.py @@ -633,15 +633,16 @@ def _calc_stats(data, samples_per_window, sample_interval, H): # shift to get forward difference, .diff() is backward difference instead data_diff = data.diff().shift(-1) data_slope = data_diff / sample_interval - data_slope_nstd = _slope_nstd_windowed(data, H, samples_per_window) + data_slope_nstd = _slope_nstd_windowed(data, H, samples_per_window, + sample_interval) data_slope_nstd = data_slope_nstd return data_mean, data_max, data_slope_nstd, data_slope -def _slope_nstd_windowed(data, H, samples_per_window): +def _slope_nstd_windowed(data, H, samples_per_window, sample_interval): with np.errstate(divide='ignore', invalid='ignore'): - raw = np.diff(data) + raw = np.diff(data) / sample_interval raw = raw[H[:-1, ]].std(ddof=1, axis=0) / data.values[H].mean(axis=0) return _to_centered_series(raw, data.index, samples_per_window) diff --git a/pvlib/tests/test_clearsky.py b/pvlib/tests/test_clearsky.py index b4db32355a..6fa6bda61e 100644 --- a/pvlib/tests/test_clearsky.py +++ b/pvlib/tests/test_clearsky.py @@ -607,6 +607,19 @@ def test_detect_clearsky_window(detect_clearsky_data): check_dtype=False, check_names=False) +def test_detect_clearsky_time_interval(detect_clearsky_data): + expected, cs = detect_clearsky_data + u = np.arange(0, len(cs), 2) + cs2 = cs.iloc[u] + expected2 = expected.iloc[u] + clear_samples = clearsky.detect_clearsky( + expected2['GHI'], cs2['ghi'], window_length=6) + expected = expected['Clear or not'].copy() + expected.iloc[-3:] = True + assert_series_equal(expected2['Clear or not'], clear_samples, + check_dtype=False, check_names=False) + + def test_detect_clearsky_arrays(detect_clearsky_data): expected, cs = detect_clearsky_data clear_samples = clearsky.detect_clearsky( From 2d9fd8a1215c6fd06d87c9fc38c2e31fa337e406 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Fri, 4 Jun 2021 10:59:52 -0600 Subject: [PATCH 2/4] remove unneeded test adjustment --- pvlib/tests/test_clearsky.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pvlib/tests/test_clearsky.py b/pvlib/tests/test_clearsky.py index 6fa6bda61e..1e7d89d82d 100644 --- a/pvlib/tests/test_clearsky.py +++ b/pvlib/tests/test_clearsky.py @@ -614,8 +614,6 @@ def test_detect_clearsky_time_interval(detect_clearsky_data): expected2 = expected.iloc[u] clear_samples = clearsky.detect_clearsky( expected2['GHI'], cs2['ghi'], window_length=6) - expected = expected['Clear or not'].copy() - expected.iloc[-3:] = True assert_series_equal(expected2['Clear or not'], clear_samples, check_dtype=False, check_names=False) From 976052c2d28a73686999ff413050f413e1f6c077 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 17 Jun 2021 09:30:04 -0600 Subject: [PATCH 3/4] add note to whatsnew --- docs/sphinx/source/whatsnew/v0.9.0.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/sphinx/source/whatsnew/v0.9.0.rst b/docs/sphinx/source/whatsnew/v0.9.0.rst index aeb600b100..0825c6e415 100644 --- a/docs/sphinx/source/whatsnew/v0.9.0.rst +++ b/docs/sphinx/source/whatsnew/v0.9.0.rst @@ -167,6 +167,9 @@ Bug fixes calling :py:func:`~pvlib.pvsystem.calcparams_cec`. (:issue:`1215`, :pull:`1216`) * Corrected methodology error in :py:func:`~pvlib.scaling.wvm`. Tracks with fix in PVLib for MATLAB. (:issue:`1206`, :pull:`1213`) +* Corrected an error affecting :py:func:`~pvlib.clearsky.detect_clearsky` + when data time step is not one minute. Error was introduced in v0.8.1. + (:issue:`1241`, :pull:`1242`) Testing ~~~~~~~ From 2b3fe70db63a69bcf64dce0900b249864c8f40f1 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 17 Jun 2021 10:50:17 -0600 Subject: [PATCH 4/4] avoid diff twice --- pvlib/clearsky.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pvlib/clearsky.py b/pvlib/clearsky.py index 6c57f71860..289e4dba60 100644 --- a/pvlib/clearsky.py +++ b/pvlib/clearsky.py @@ -633,18 +633,18 @@ def _calc_stats(data, samples_per_window, sample_interval, H): # shift to get forward difference, .diff() is backward difference instead data_diff = data.diff().shift(-1) data_slope = data_diff / sample_interval - data_slope_nstd = _slope_nstd_windowed(data, H, samples_per_window, - sample_interval) + data_slope_nstd = _slope_nstd_windowed(data_slope.values[:-1], data, H, + samples_per_window, sample_interval) data_slope_nstd = data_slope_nstd return data_mean, data_max, data_slope_nstd, data_slope -def _slope_nstd_windowed(data, H, samples_per_window, sample_interval): +def _slope_nstd_windowed(slopes, data, H, samples_per_window, sample_interval): with np.errstate(divide='ignore', invalid='ignore'): - raw = np.diff(data) / sample_interval - raw = raw[H[:-1, ]].std(ddof=1, axis=0) / data.values[H].mean(axis=0) - return _to_centered_series(raw, data.index, samples_per_window) + nstd = slopes[H[:-1, ]].std(ddof=1, axis=0) \ + / data.values[H].mean(axis=0) + return _to_centered_series(nstd, data.index, samples_per_window) def _max_diff_windowed(data, H, samples_per_window):