diff --git a/docs/sphinx/source/whatsnew/v0.9.0.rst b/docs/sphinx/source/whatsnew/v0.9.0.rst index d46e51efdc..240fad9c03 100644 --- a/docs/sphinx/source/whatsnew/v0.9.0.rst +++ b/docs/sphinx/source/whatsnew/v0.9.0.rst @@ -46,7 +46,7 @@ Breaking changes :py:func:`pvlib.modelchain.basic_chain` (:issue:`1028`, :pull:`1181`) * Removed the ``**kwargs`` parameters from :py:meth:`~pvlib.pvsystem.PVSystem.sapm` and - :py:meth:`~pvlib.pvsystem.PVSystem.calcparams_desoto` and + :py:meth:`~pvlib.pvsystem.PVSystem.calcparams_desoto` and :py:meth:`~pvlib.pvsystem.PVSystem.calcparams_cec` (:issue:`1118`, :pull:`1222`) @@ -64,6 +64,7 @@ Deprecations * ``ModelChain.dc`` * ``ModelChain.diode_params`` * ``ModelChain.effective_irradiance`` + * ``ModelChain.losses`` * ``ModelChain.solar_position`` * ``ModelChain.spectral_modifier`` * ``ModelChain.total_irrad`` diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index c661a0ec39..f83f8ab96d 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -277,6 +277,7 @@ class ModelChainResult: field(default=None) diode_params: Optional[PerArray[pd.DataFrame]] = field(default=None) dc_ohmic_losses: Optional[PerArray[pd.Series]] = field(default=None) + losses: Optional[Union[pd.Series, float]] = field(default=None) weather: Optional[PerArray[pd.DataFrame]] = None times: Optional[pd.DatetimeIndex] = None @@ -379,7 +380,7 @@ class ModelChain: 'aoi', 'aoi_modifier', 'spectral_modifier', 'cell_temperature', 'effective_irradiance', 'dc', 'ac', 'diode_params', 'tracking', - 'weather', 'times'] + 'weather', 'times', 'losses'] def __init__(self, system, location, clearsky_model='ineichen', @@ -1094,16 +1095,16 @@ def infer_losses_model(self): raise NotImplementedError def pvwatts_losses(self): - self.losses = (100 - self.system.pvwatts_losses()) / 100. + self.results.losses = (100 - self.system.pvwatts_losses()) / 100. if isinstance(self.results.dc, tuple): for dc in self.results.dc: - dc *= self.losses + dc *= self.results.losses else: - self.results.dc *= self.losses + self.results.dc *= self.results.losses return self def no_extra_losses(self): - self.losses = 1 + self.results.losses = 1 return self def effective_irradiance_model(self): diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index e8692cd1fa..88b2104c99 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -1542,8 +1542,8 @@ def test_spectral_models_singleton_weather_single_array( def constant_losses(mc): - mc.losses = 0.9 - mc.results.dc *= mc.losses + mc.results.losses = 0.9 + mc.results.dc *= mc.results.losses def dc_constant_losses(mc): @@ -1682,7 +1682,7 @@ def test_losses_models_ext_def(pvwatts_dc_pvwatts_ac_system, location, weather, mc.run_model(weather) assert m.call_count == 1 assert isinstance(mc.results.ac, (pd.Series, pd.DataFrame)) - assert mc.losses == 0.9 + assert mc.results.losses == 0.9 assert not mc.results.ac.empty @@ -1695,7 +1695,7 @@ def test_losses_models_no_loss(pvwatts_dc_pvwatts_ac_system, location, weather, assert mc.losses_model == mc.no_extra_losses mc.run_model(weather) assert m.call_count == 0 - assert mc.losses == 1 + assert mc.results.losses == 1 def test_invalid_dc_model_params(sapm_dc_snl_ac_system, cec_dc_snl_ac_system,