From 53b81448318069ed9e33328ef29ae20385b883ec Mon Sep 17 00:00:00 2001 From: Kevin Anderson Date: Mon, 19 Jul 2021 17:14:23 -0600 Subject: [PATCH 1/3] dedent non-pv inputs --- rdtools/analysis_chains.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/rdtools/analysis_chains.py b/rdtools/analysis_chains.py index 159fd057..3b279e11 100644 --- a/rdtools/analysis_chains.py +++ b/rdtools/analysis_chains.py @@ -54,8 +54,8 @@ class TrendAnalysis(): normalized in the normalization step based on it's 95th percentile (see TrendAnalysis._pvwatts_norm() source). interp_freq : str or pandas.tseries.offsets.DateOffset - Pandas frequency specification used to interpolate all pandas.Series - passed at instantiation. We recommend using the natural frequency of the + Pandas frequency specification used to interpolate the input PV power + or energy. We recommend using the natural frequency of the data, rather than up or down sampling. Analysis requires regular time series. For more information see https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#dateoffset-objects @@ -86,21 +86,22 @@ def __init__(self, pv, poa_global=None, temperature_cell=None, temperature_ambie if interp_freq is not None: pv = normalization.interpolate(pv, interp_freq, max_timedelta) - if poa_global is not None: - poa_global = normalization.interpolate( - poa_global, pv.index, max_timedelta) - if temperature_cell is not None: - temperature_cell = normalization.interpolate( - temperature_cell, pv.index, max_timedelta) - if temperature_ambient is not None: - temperature_ambient = normalization.interpolate( - temperature_ambient, pv.index, max_timedelta) - if power_expected is not None: - power_expected = normalization.interpolate( - power_expected, pv.index, max_timedelta) - if isinstance(windspeed, pd.Series): - windspeed = normalization.interpolate( - windspeed, pv.index, max_timedelta) + + if poa_global is not None: + poa_global = normalization.interpolate( + poa_global, pv.index, max_timedelta) + if temperature_cell is not None: + temperature_cell = normalization.interpolate( + temperature_cell, pv.index, max_timedelta) + if temperature_ambient is not None: + temperature_ambient = normalization.interpolate( + temperature_ambient, pv.index, max_timedelta) + if power_expected is not None: + power_expected = normalization.interpolate( + power_expected, pv.index, max_timedelta) + if isinstance(windspeed, pd.Series): + windspeed = normalization.interpolate( + windspeed, pv.index, max_timedelta) if pv_input == 'power': self.pv_power = pv From 97d0f7b26b251cc7c1d3cbd4392e83e3bcd09036 Mon Sep 17 00:00:00 2001 From: Kevin Anderson Date: Tue, 20 Jul 2021 08:20:58 -0600 Subject: [PATCH 2/3] dedent clearsky inputs as well --- rdtools/analysis_chains.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/rdtools/analysis_chains.py b/rdtools/analysis_chains.py index 3b279e11..24d0c751 100644 --- a/rdtools/analysis_chains.py +++ b/rdtools/analysis_chains.py @@ -172,22 +172,21 @@ def set_clearsky(self, pvlib_location=None, pv_azimuth=None, pv_tilt=None, ''' max_timedelta = self.max_timedelta - if self.interp_freq is not None: - if poa_global_clearsky is not None: - poa_global_clearsky = normalization.interpolate( - poa_global_clearsky, self.pv_energy.index, max_timedelta) - if temperature_cell_clearsky is not None: - temperature_cell_clearsky = normalization.interpolate( - temperature_cell_clearsky, self.pv_energy.index, max_timedelta) - if temperature_ambient_clearsky is not None: - temperature_ambient_clearsky = normalization.interpolate( - temperature_ambient_clearsky, self.pv_energy.index, max_timedelta) - if isinstance(pv_azimuth, (pd.Series, pd.DataFrame)): - pv_azimuth = normalization.interpolate( - pv_azimuth, self.pv_energy.index, max_timedelta) - if isinstance(pv_tilt, (pd.Series, pd.DataFrame)): - pv_tilt = normalization.interpolate( - pv_tilt, self.pv_energy.index, max_timedelta) + if poa_global_clearsky is not None: + poa_global_clearsky = normalization.interpolate( + poa_global_clearsky, self.pv_energy.index, max_timedelta) + if temperature_cell_clearsky is not None: + temperature_cell_clearsky = normalization.interpolate( + temperature_cell_clearsky, self.pv_energy.index, max_timedelta) + if temperature_ambient_clearsky is not None: + temperature_ambient_clearsky = normalization.interpolate( + temperature_ambient_clearsky, self.pv_energy.index, max_timedelta) + if isinstance(pv_azimuth, (pd.Series, pd.DataFrame)): + pv_azimuth = normalization.interpolate( + pv_azimuth, self.pv_energy.index, max_timedelta) + if isinstance(pv_tilt, (pd.Series, pd.DataFrame)): + pv_tilt = normalization.interpolate( + pv_tilt, self.pv_energy.index, max_timedelta) self.pvlib_location = pvlib_location self.pv_azimuth = pv_azimuth From 73efd9ab6d78681a0b377bd7495f1808c5895563 Mon Sep 17 00:00:00 2001 From: Kevin Anderson Date: Tue, 20 Jul 2021 10:04:22 -0600 Subject: [PATCH 3/3] add basic test --- rdtools/test/analysis_chains_test.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rdtools/test/analysis_chains_test.py b/rdtools/test/analysis_chains_test.py index ad81bd38..317d4f7c 100644 --- a/rdtools/test/analysis_chains_test.py +++ b/rdtools/test/analysis_chains_test.py @@ -336,6 +336,27 @@ def test_no_set_clearsky(clearsky_parameters): rd_analysis.clearsky_analysis() +def test_index_mismatch(): + # GH #277 + times = pd.date_range('2019-01-01', '2022-01-01', freq='15min') + pv = pd.Series(1.0, index=times) + dummy_series = pd.Series(1.0, index=times[::4]) # low-frequency weather inputs + keys = ['poa_global', 'temperature_cell', 'temperature_ambient', 'power_expected', 'windspeed'] + kwargs = {key: dummy_series.copy() for key in keys} + rd_analysis = TrendAnalysis(pv, **kwargs) + for key in keys: + interpolated_series = getattr(rd_analysis, key) + assert interpolated_series.index.equals(times) + + cs_keys = ['poa_global_clearsky', 'temperature_cell_clearsky', 'temperature_ambient_clearsky', + 'pv_azimuth', 'pv_tilt'] + cs_kwargs = {key: dummy_series.copy() for key in cs_keys} + rd_analysis.set_clearsky(**cs_kwargs) + for key in cs_keys: + interpolated_series = getattr(rd_analysis, key) + assert interpolated_series.index.equals(times[1:]) + + @pytest.fixture def soiling_parameters(basic_parameters, soiling_normalized_daily, cs_input): # parameters for soiling analysis with TrendAnalysis