def test_normalize_with_expected_power_energy_option(pv_15, expected_15, irradiance_15): norm, insol = normalize_with_expected_power( pv_15, expected_15, irradiance_15, pv_input='energy') expected_norm = pd.Series( {Timestamp('2020-01-01 12:00:00', freq='15T'): np.nan, Timestamp('2020-01-01 12:15:00', freq='15T'): 5.714285714285714, Timestamp('2020-01-01 12:30:00', freq='15T'): 4.705882352941177, Timestamp('2020-01-01 12:45:00', freq='15T'): 3.5918367346938775, Timestamp('2020-01-01 13:00:00', freq='15T'): 4.097560975609756} ) expected_norm.name = 'energy_Wh' expected_norm.index.freq = '15T' expected_insol = pd.Series( {Timestamp('2020-01-01 12:00:00', freq='15T'): np.nan, Timestamp('2020-01-01 12:15:00', freq='15T'): 231.25, Timestamp('2020-01-01 12:30:00', freq='15T'): 225.0, Timestamp('2020-01-01 12:45:00', freq='15T'): 240.625, Timestamp('2020-01-01 13:00:00', freq='15T'): 233.125} ) expected_insol.name = 'energy_Wh' expected_insol.index.freq = '15T' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def test_normalized_with_expected_power_low_freq_expected(pv_15, expected_30, irradiance_30): norm, insol = normalize_with_expected_power( pv_15, expected_30, irradiance_30) expected_norm = pd.Series( {Timestamp('2020-01-01 12:15:00', freq='15T'): 1.09375, Timestamp('2020-01-01 12:30:00', freq='15T'): 1.1458333333333335, Timestamp('2020-01-01 12:45:00', freq='15T'): 1.0000000000000002, Timestamp('2020-01-01 13:00:00', freq='15T'): 0.9772727272727274} ) expected_norm.name = 'energy_Wh' expected_norm.index.freq = '15T' expected_insol = pd.Series( {Timestamp('2020-01-01 12:15:00', freq='15T'): 246.875, Timestamp('2020-01-01 12:30:00', freq='15T'): 240.625, Timestamp('2020-01-01 12:45:00', freq='15T'): 233.75, Timestamp('2020-01-01 13:00:00', freq='15T'): 226.25} ) expected_insol.name = 'energy_Wh' expected_insol.index.freq = '15T' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def _clearsky_preprocess(self): ''' Perform clear-sky-based normalization, filtering, and aggregation. If optional parameter self.power_expected is passed in, normalize_with_expected_power will be used instead of pvwatts. ''' try: if self.poa_global_clearsky is None: self._calc_clearsky_poa(model='isotropic') except AttributeError: raise AttributeError( "No poa_global_clearsky. 'set_clearsky' must be run " + "prior to 'clearsky_analysis'") if self.temperature_cell_clearsky is None: if self.temperature_ambient_clearsky is None: self._calc_clearsky_tamb() self.temperature_cell_clearsky = self._calc_cell_temperature( self.poa_global_clearsky, self.temperature_ambient_clearsky, 0) # Note example notebook uses windspeed=0 in the clearskybranch if self.power_expected is None: cs_normalized, cs_insolation = self._pvwatts_norm( self.poa_global_clearsky, self.temperature_cell_clearsky) else: # self.power_expected passed in by user cs_normalized, cs_insolation = normalization.normalize_with_expected_power( self.pv_energy, self.power_expected, self.poa_global_clearsky, pv_input='energy') self._filter(cs_normalized, 'clearsky') cs_aggregated, cs_aggregated_insolation = self._aggregate( cs_normalized[self.clearsky_filter], cs_insolation[self.clearsky_filter]) self.clearsky_aggregated_performance = cs_aggregated self.clearsky_aggregated_insolation = cs_aggregated_insolation
def _sensor_preprocess(self): ''' Perform sensor-based normalization, filtering, and aggregation. If optional parameter self.power_expected is passed in, normalize_with_expected_power will be used instead of pvwatts. ''' if self.poa_global is None: raise ValueError( 'poa_global must be available to perform _sensor_preprocess') if self.power_expected is None: # Thermal details required if power_expected is not manually set. if self.temperature_cell is None and self.temperature_ambient is None: raise ValueError( 'either cell or ambient temperature must be available ' 'to perform _sensor_preprocess') if self.temperature_cell is None: self.temperature_cell = self._calc_cell_temperature( self.poa_global, self.temperature_ambient, self.windspeed) energy_normalized, insolation = self._pvwatts_norm( self.poa_global, self.temperature_cell) else: # self.power_expected passed in by user energy_normalized, insolation = normalization.normalize_with_expected_power( self.pv_energy, self.power_expected, self.poa_global, pv_input='energy') self._filter(energy_normalized, 'sensor') aggregated, aggregated_insolation = self._aggregate( energy_normalized[self.sensor_filter], insolation[self.sensor_filter]) self.sensor_aggregated_performance = aggregated self.sensor_aggregated_insolation = aggregated_insolation
def test_normalize_with_expected_power_uniform_frequency( pv_15, expected_15, irradiance_15): norm, insol = normalize_with_expected_power(pv_15, expected_15, irradiance_15) expected_norm = pv_15.iloc[1:] / expected_15.iloc[1:] expected_norm.name = 'energy_Wh' expected_insol = irradiance_15.iloc[1:] * 0.25 expected_insol.name = 'energy_Wh' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def test_normalize_with_expected_power_energy_option(pv_15, expected_15, irradiance_15): norm, insol = normalize_with_expected_power(pv_15, expected_15, irradiance_15, pv_input='energy') expected_norm = pv_15 / (0.25 * expected_15.iloc[1:]) expected_norm.name = 'energy_Wh' expected_insol = irradiance_15.iloc[1:] * 0.25 expected_insol = expected_insol.reindex(expected_norm.index) expected_insol.name = 'energy_Wh' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def test_normalized_with_expected_power_low_freq_expected( pv_15, expected_30, irradiance_30): norm, insol = normalize_with_expected_power(pv_15, expected_30, irradiance_30) expected_15 = expected_30.reindex(pv_15.index).interpolate() expected_energy = expected_15.iloc[1:] * 0.25 expected_norm = pv_15.iloc[1:] * 0.25 / expected_energy expected_norm.name = 'energy_Wh' irradiance_15 = irradiance_30.reindex(pv_15.index).interpolate() expected_insol = irradiance_15.iloc[1:] * 0.25 expected_insol.name = 'energy_Wh' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def test_normalize_with_expected_power_low_freq_pv(pv_30, expected_15, irradiance_15): norm, insol = normalize_with_expected_power(pv_30, expected_15, irradiance_15) pv_energy = pv_30.iloc[1:] * 0.5 expected_energy = expected_15.iloc[1:] * 0.25 # aggregate to 30 min level expected_energy = expected_energy.rolling(2).sum() expected_energy = expected_energy.reindex(pv_energy.index) expected_norm = pv_energy / expected_energy expected_norm.name = 'energy_Wh' expected_insol = irradiance_15.iloc[1:] * 0.25 # aggregate to 30 min level expected_insol = expected_insol.rolling(2).sum() expected_insol = expected_insol.reindex(pv_energy.index) expected_insol.name = 'energy_Wh' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def test_normalize_with_expected_power_low_freq_pv(pv_30, expected_15, irradiance_15): norm, insol = normalize_with_expected_power( pv_30, expected_15, irradiance_15) expected_norm = pd.Series( {Timestamp('2020-01-01 12:30:00', freq='30T'): 0.9302325581395349, Timestamp('2020-01-01 13:00:00', freq='30T'): 1.1333333333333333} ) expected_norm.name = 'energy_Wh' expected_norm.index.freq = '30T' expected_insol = pd.Series( {Timestamp('2020-01-01 12:30:00', freq='30T'): 456.25, Timestamp('2020-01-01 13:00:00', freq='30T'): 473.75} ) expected_insol.name = 'energy_Wh' expected_insol.index.freq = '30T' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)
def test_normalize_with_expected_power_uniform_frequency(pv_15, expected_15, irradiance_15): norm, insol = normalize_with_expected_power( pv_15, expected_15, irradiance_15) expected_norm = pd.Series( {Timestamp('2020-01-01 12:15:00', freq='15T'): 1.0, Timestamp('2020-01-01 12:30:00', freq='15T'): 1.0784313725490198, Timestamp('2020-01-01 12:45:00', freq='15T'): 1.0612244897959184, Timestamp('2020-01-01 13:00:00', freq='15T'): 1.0487804878048783} ) expected_norm.name = 'energy_Wh' expected_norm.index.freq = '15T' expected_insol = pd.Series( {Timestamp('2020-01-01 12:15:00', freq='15T'): 231.25, Timestamp('2020-01-01 12:30:00', freq='15T'): 225.0, Timestamp('2020-01-01 12:45:00', freq='15T'): 240.625, Timestamp('2020-01-01 13:00:00', freq='15T'): 233.125} ) expected_insol.name = 'energy_Wh' expected_insol.index.freq = '15T' pd.testing.assert_series_equal(norm, expected_norm) pd.testing.assert_series_equal(insol, expected_insol)