diff --git a/pvlib/clearsky.py b/pvlib/clearsky.py index 75f598baeb..8c57214800 100644 --- a/pvlib/clearsky.py +++ b/pvlib/clearsky.py @@ -687,7 +687,7 @@ def detect_clearsky(measured, clearsky, times, window_length, raise NotImplementedError('algorithm does not yet support unequal ' \ 'times. consider resampling your data.') - samples_per_window = int(window_length / sample_interval) + samples_per_window = int(window_length / sample_interval) + 1 # generate matrix of integers for creating windows with indexing from scipy.linalg import hankel @@ -697,25 +697,27 @@ def detect_clearsky(measured, clearsky, times, window_length, # calculate measurement statistics meas_mean = np.mean(measured[H], axis=0) meas_max = np.max(measured[H], axis=0) - meas_slope = np.diff(measured[H], n=1, axis=0) + meas_ghi_diff = np.diff(measured[H], n=1, axis=0) + meas_slope = np.diff(measured[H], n=1, axis=0) / sample_interval # matlab std function normalizes by N-1, so set ddof=1 here meas_slope_nstd = np.std(meas_slope, axis=0, ddof=1) / meas_mean - meas_slope_max = np.max(np.abs(meas_slope), axis=0) + # meas_slope_max = np.max(np.abs(meas_slope), axis=0) meas_line_length = np.sum(np.sqrt( - meas_slope*meas_slope + sample_interval*sample_interval), axis=0) + meas_ghi_diff*meas_ghi_diff + sample_interval*sample_interval), axis=0) # calculate clear sky statistics clear_mean = np.mean(clearsky[H], axis=0) clear_max = np.max(clearsky[H], axis=0) - clear_slope = np.diff(clearsky[H], n=1, axis=0) - clear_slope_max = np.max(np.abs(clear_slope), axis=0) + clear_ghi_diff = np.diff(clearsky[H], n=1, axis=0) + clear_slope = np.diff(clearsky[H], n=1, axis=0) / sample_interval + # clear_slope_max = np.max(np.abs(clear_slope), axis=0) from scipy.optimize import minimize_scalar alpha = 1 for iteration in range(max_iterations): clear_line_length = np.sum(np.sqrt( - alpha*alpha*clear_slope*clear_slope + + alpha*alpha*clear_ghi_diff*clear_ghi_diff + sample_interval*sample_interval), axis=0) line_diff = meas_line_length - clear_line_length @@ -725,7 +727,7 @@ def detect_clearsky(measured, clearsky, times, window_length, c2 = np.abs(meas_max - alpha*clear_max) < max_diff c3 = (line_diff > lower_line_length) & (line_diff < upper_line_length) c4 = meas_slope_nstd < var_diff - c5 = (meas_slope_max - alpha*clear_slope_max) < slope_dev + c5 = np.max(np.abs(meas_slope - alpha*clear_slope), axis=0) < slope_dev c6 = (clear_mean != 0) & ~np.isnan(clear_mean) clear_windows = c1 & c2 & c3 & c4 & c5 & c6 @@ -761,6 +763,13 @@ def rmse(alpha): components['slope_max'] = c5 components['mean_nan'] = c6 components['windows'] = clear_windows + + components['mean_diff_array'] = np.abs(meas_mean - alpha*clear_mean) + components['max_diff_array'] = np.abs(meas_max - alpha*clear_max) + components['line_length_array'] = meas_line_length - clear_line_length + components['slope_nstd_array'] = meas_slope_nstd + components['slope_max_array'] = (np.max(meas_slope - alpha*clear_slope, axis=0)) + return clear_samples, components, alpha else: return clear_samples