@@ -155,23 +155,80 @@ def __init__(
155155 self .max_timedelta = max_timedelta
156156 self .results = {}
157157
158- # Initialize to use default filter parameters
159- self .filter_params = {
158+ # Define valid filter parameters
159+ self .valid_filter_params = [
160+ "normalized_filter" ,
161+ "poa_filter" ,
162+ "tcell_filter" ,
163+ "clip_filter" ,
164+ "hour_angle_filter" ,
165+ "clearsky_filter" ,
166+ "sensor_clearsky_filter" ,
167+ "ad_hoc_filter" ,
168+ ]
169+
170+ self .valid_filter_params_aggregated = [
171+ "two_way_window_filter" ,
172+ "insolation_filter" ,
173+ "hampel_filter" ,
174+ "directional_tukey_filter" ,
175+ "ad_hoc_filter" ,
176+ ]
177+
178+ # Define default filter parameters
179+ self .default_filter_params = {
160180 "normalized_filter" : {},
161181 "poa_filter" : {},
162182 "tcell_filter" : {},
163183 "clip_filter" : {},
164184 "clearsky_filter" : {},
165185 "ad_hoc_filter" : None , # use this to include an explict filter
166186 }
167- self .filter_params_aggregated = {
187+
188+ self .default_filter_params_aggregated = {
168189 "two_way_window_filter" : {},
169- "ad_hoc_filter" : None
190+ "ad_hoc_filter" : None ,
170191 }
192+
193+ # Initialize to use default filter parameters
194+ self ._filter_params = ValidatedFilterDict (
195+ self .valid_filter_params , self .default_filter_params
196+ )
197+ self ._filter_params_aggregated = ValidatedFilterDict (
198+ self .valid_filter_params_aggregated , self .default_filter_params_aggregated
199+ )
171200 # remove tcell_filter from list if power_expected is passed in
172201 if power_expected is not None and temperature_cell is None :
173202 del self .filter_params ["tcell_filter" ]
174203
204+ @property
205+ def filter_params (self ):
206+ return self ._filter_params
207+
208+ @filter_params .setter
209+ def filter_params (self , new_filter_params ):
210+ if not isinstance (new_filter_params , dict ):
211+ raise ValueError ("Attribute `filter_params` must be a dictionary." )
212+
213+ # If dictionary passed, check the new filter_params and set new filters.
214+ self ._filter_params = ValidatedFilterDict (self .valid_filter_params , new_filter_params )
215+ print (f"Attribute `filter_params` changed to: { new_filter_params } " )
216+
217+ @property
218+ def filter_params_aggregated (self ):
219+ return self ._filter_params_aggregated
220+
221+ @filter_params_aggregated .setter
222+ def filter_params_aggregated (self , new_filter_params_aggregated ):
223+ if not (isinstance (new_filter_params_aggregated , dict ) or None ):
224+ raise ValueError ("Attribute `filter_params_aggregated` must be a dictionary." )
225+
226+ # If dictionary passed, check the new filter_params and set new filters.
227+ self ._filter_params_aggregated = ValidatedFilterDict (
228+ self .valid_filter_params_aggregated , new_filter_params_aggregated
229+ )
230+ print (f"Attribute `filter_params_aggregated` changed to: { new_filter_params_aggregated } " )
231+
175232 def set_clearsky (
176233 self ,
177234 pvlib_location = None ,
@@ -1205,3 +1262,27 @@ def plot_degradation_timeseries(self, case, rolling_days=365, **kwargs):
12051262
12061263 fig = plotting .degradation_timeseries_plot (yoy_info , rolling_days , ** kwargs )
12071264 return fig
1265+
1266+
1267+ class ValidatedFilterDict (dict ):
1268+ def __init__ (self , valid_keys , * args , ** kwargs ):
1269+ self .valid_keys = valid_keys
1270+ self ._err_msg = "Key '{0}' is not a valid filter parameter."
1271+ super (ValidatedFilterDict , self ).__init__ (* args , ** kwargs )
1272+ self ._validate_keys ()
1273+
1274+ def __setitem__ (self , key , value ):
1275+ if key not in self .valid_keys :
1276+ raise KeyError (self ._err_msg .format (key ))
1277+ super (ValidatedFilterDict , self ).__setitem__ (key , value )
1278+
1279+ def update (self , * args , ** kwargs ):
1280+ for key in dict (* args , ** kwargs ).keys ():
1281+ if key not in self .valid_keys :
1282+ raise KeyError (self ._err_msg .format (key ))
1283+ super (ValidatedFilterDict , self ).update (* args , ** kwargs )
1284+
1285+ def _validate_keys (self ):
1286+ for key in self .keys ():
1287+ if key not in self .valid_keys :
1288+ raise KeyError (self ._err_msg .format (key ))
0 commit comments