def test_custom_tracking_envelope_thresholds(summer_power_fixed): """Can pass a custom set of minimal r^2 values.""" assert system.is_tracking_envelope( summer_power_fixed, summer_power_fixed > 0, pd.Series(False, index=summer_power_fixed.index), fit_params={ (0.5, 1.0): { 'fixed': 0.9, 'tracking': 0.9, 'fixed_max': 0.9 } }) is system.Tracker.FIXED assert system.is_tracking_envelope( summer_power_fixed, summer_power_fixed > 0, pd.Series(False, index=summer_power_fixed.index), fit_params={ (0.0, 1.0): { 'fixed': 1.0, 'tracking': 0.8, 'fixed_max': 1.0 } }, fit_median=False) is system.Tracker.TRACKING
def test_median_mismatch_fixed(summer_power_fixed): """If the median does not have the same profile as the 99.5% quantile then tracking is UNKNOWN.""" power_half_fixed = summer_power_fixed.copy() power_half_fixed.iloc[0:100 * 24] = 1 assert system.is_tracking_envelope( power_half_fixed, pd.Series(True, index=power_half_fixed.index), pd.Series(False, index=power_half_fixed.index), fit_median=False) is system.Tracker.FIXED assert system.is_tracking_envelope( power_half_fixed, pd.Series(True, index=power_half_fixed.index), pd.Series(False, index=power_half_fixed.index)) is system.Tracker.UNKNOWN
def test_median_mismatch_tracking(summer_power_tracking): """If the median does not have the same fit as the 99.5% quantile then tracking is UNKNOWN.""" power_half_tracking = summer_power_tracking.copy() power_half_tracking.iloc[0:100 * 24] = 1 assert system.is_tracking_envelope( power_half_tracking, pd.Series(True, index=power_half_tracking.index), pd.Series(False, index=power_half_tracking.index), fit_median=False) is system.Tracker.TRACKING assert system.is_tracking_envelope( power_half_tracking, pd.Series(True, index=power_half_tracking.index), pd.Series(False, index=power_half_tracking.index)) is system.Tracker.UNKNOWN
def test_median_mismatch_tracking_old_pvlib(summer_power_tracking_old_pvlib): """If the median does not have the same fit as the 99.5% quantile then tracking is UNKNOWN.""" # copy of `test_median_mismatch_tracking` but with older pvlib API # TODO: remove when minimum pvlib version is >= 0.9.0 power_half_tracking = summer_power_tracking_old_pvlib.copy() power_half_tracking.iloc[0:100 * 24] = 1 assert system.is_tracking_envelope( power_half_tracking, pd.Series(True, index=power_half_tracking.index), pd.Series(False, index=power_half_tracking.index), fit_median=False) is system.Tracker.TRACKING assert system.is_tracking_envelope( power_half_tracking, pd.Series(True, index=power_half_tracking.index), pd.Series(False, index=power_half_tracking.index)) is system.Tracker.UNKNOWN
def test_power_tracking_envelope_tracking(summer_power_tracking): """Simulated single axis tracker is identified as TRACKING.""" assert system.is_tracking_envelope( summer_power_tracking, summer_power_tracking > 0, pd.Series( False, index=summer_power_tracking.index)) is system.Tracker.TRACKING
def test_year_bad_winter_tracking_envelope(winter_perturbed, albuquerque_clearsky): """If the data is perturbed during the winter months is_tracking_envelope() returns Tracker.UNKNOWN.""" assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index)) is system.Tracker.UNKNOWN
def test_constant_unknown_tracking_envelope(summer_ghi): """A constant signal has unknown tracking.""" constant = pd.Series(1, index=summer_ghi.index) assert system.is_tracking_envelope( constant, pd.Series(True, index=summer_ghi.index), pd.Series(False, index=summer_ghi.index), ) is system.Tracker.UNKNOWN
def test_high_clipping_unknown_tracking_envelope(summer_power_fixed): """If the amount of clipping is high then tracking is UNKNOWN""" clipping = pd.Series(False, index=summer_power_fixed.index) # 50% clipping clipping.iloc[0:len(clipping) // 2] = True assert system.is_tracking_envelope( summer_power_fixed, summer_power_fixed > 0, clipping, clip_max=0.4) is system.Tracker.UNKNOWN
def test_power_tracking_envelope_tracking_old_pvlib( summer_power_tracking_old_pvlib): """Simulated single axis tracker is identified as TRACKING.""" # copy of `test_power_tracking_envelope_tracking` but with older pvlib API # TODO: remove when minimum pvlib version is >= 0.9.0 assert system.is_tracking_envelope( summer_power_tracking_old_pvlib, summer_power_tracking_old_pvlib > 0, pd.Series(False, index=summer_power_tracking_old_pvlib.index) ) is system.Tracker.TRACKING
def test_power_tracking_envelope_fixed(summer_power_fixed): """Simulated system under clearsky condidtions is FIXED.""" assert system.is_tracking_envelope( summer_power_fixed, summer_power_fixed > 0, pd.Series(False, index=summer_power_fixed.index)) is system.Tracker.FIXED
def test_ghi_tracking_envelope_fixed(summer_ghi): """Clearsky GHI for a system that is FIXED.""" assert system.is_tracking_envelope( summer_ghi, summer_ghi > 0, pd.Series( False, index=summer_ghi.index)) is system.Tracker.FIXED
def test_tracking_envelope_seasonal_split(winter_perturbed, albuquerque_clearsky): """If winter or summer months are empty then only the season that is specified is used to determine fixed/tracking. Uses the fixture with perturbed winter months so that tests will fail if the winter months are analyzed. """ # no 'summer' months assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={ 'summer': [], 'winter': [5, 6, 7, 8] }) is system.Tracker.FIXED assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={ 'summer': None, 'winter': [5, 6, 7, 8] }) is system.Tracker.FIXED # no 'winter' months assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={ 'summer': [5, 6, 7, 8], 'winter': [] }) is system.Tracker.FIXED assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={ 'summer': [5, 6, 7, 8], 'winter': None }) is system.Tracker.FIXED # Leaving out a key is equivalent to passing None as its value assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={'summer': [5, 6, 7, 8]}) is system.Tracker.FIXED assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={'winter': [5, 6, 7, 8]}) is system.Tracker.FIXED # median fit should fail assert system.is_tracking_envelope( winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split=None) is system.Tracker.UNKNOWN assert system.is_tracking_envelope(winter_perturbed['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series( False, index=albuquerque_clearsky.index), seasonal_split=None, fit_median=False) # empty seasons should give Tracker.UNKNOWN with pytest.warns(UserWarning): assert system.is_tracking_envelope( albuquerque_clearsky['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index), seasonal_split={ 'winter': [], 'summer': [] }) is system.Tracker.UNKNOWN
def test_full_year_tracking_envelope(albuquerque_clearsky): """A full year of GHI should be identified as FIXED.""" assert system.is_tracking_envelope( albuquerque_clearsky['ghi'], albuquerque_clearsky['ghi'] > 0, pd.Series(False, index=albuquerque_clearsky.index)) is system.Tracker.FIXED