@@ -113,7 +113,7 @@ class WindFarm(object):
113113 31200000.0
114114 """
115115
116- def __init__ (self , wind_turbine_fleet , efficiency = None , name = '' , ** kwargs ):
116+ def __init__ (self , wind_turbine_fleet , efficiency = None , name = "" , ** kwargs ):
117117
118118 self .wind_turbine_fleet = wind_turbine_fleet
119119 self .efficiency = efficiency
@@ -141,76 +141,100 @@ def check_and_complete_wind_turbine_fleet(self):
141141
142142 # check wind turbines
143143 try :
144- for turbine in self .wind_turbine_fleet [' wind_turbine' ]:
144+ for turbine in self .wind_turbine_fleet [" wind_turbine" ]:
145145 if not isinstance (turbine , WindTurbine ):
146146 raise ValueError (
147- 'Wind turbine must be provided as WindTurbine object '
148- 'but was provided as {}.' .format (type (turbine )))
147+ "Wind turbine must be provided as WindTurbine object "
148+ "but was provided as {}." .format (type (turbine ))
149+ )
149150 except KeyError :
150- raise KeyError ('Missing wind_turbine key/column in '
151- 'wind_turbine_fleet parameter.' )
151+ raise KeyError (
152+ "Missing wind_turbine key/column in "
153+ "wind_turbine_fleet parameter."
154+ )
152155
153156 # add columns for number of turbines and total capacity if they don't
154157 # yet exist
155- if ' number_of_turbines' not in self .wind_turbine_fleet .columns :
156- self .wind_turbine_fleet [' number_of_turbines' ] = np .nan
157- if ' total_capacity' not in self .wind_turbine_fleet .columns :
158- self .wind_turbine_fleet [' total_capacity' ] = np .nan
158+ if " number_of_turbines" not in self .wind_turbine_fleet .columns :
159+ self .wind_turbine_fleet [" number_of_turbines" ] = np .nan
160+ if " total_capacity" not in self .wind_turbine_fleet .columns :
161+ self .wind_turbine_fleet [" total_capacity" ] = np .nan
159162
160163 # calculate number of turbines if necessary
161164 number_turbines_not_provided = self .wind_turbine_fleet [
162- self .wind_turbine_fleet ['number_of_turbines' ].isnull ()]
165+ self .wind_turbine_fleet ["number_of_turbines" ].isnull ()
166+ ]
163167 for ix , row in number_turbines_not_provided .iterrows ():
164- msg = 'Number of turbines of type {0} can not be deduced ' \
165- 'from total capacity. Please either provide ' \
166- '`number_of_turbines` in the turbine fleet definition or ' \
167- 'set the nominal power of the wind turbine.'
168+ msg = (
169+ "Number of turbines of type {0} can not be deduced "
170+ "from total capacity. Please either provide "
171+ "`number_of_turbines` in the turbine fleet definition or "
172+ "set the nominal power of the wind turbine."
173+ )
168174 try :
169- number_of_turbines = row ['total_capacity' ] / \
170- row ['wind_turbine' ].nominal_power
175+ number_of_turbines = (
176+ row ["total_capacity" ] / row ["wind_turbine" ].nominal_power
177+ )
171178 if np .isnan (number_of_turbines ):
172- raise ValueError (msg .format (row [' wind_turbine' ]))
179+ raise ValueError (msg .format (row [" wind_turbine" ]))
173180 else :
174- self .wind_turbine_fleet .loc [ix , 'number_of_turbines' ] = \
175- number_of_turbines
181+ self .wind_turbine_fleet .loc [
182+ ix , "number_of_turbines"
183+ ] = number_of_turbines
176184 except TypeError :
177- raise ValueError (msg .format (row [' wind_turbine' ]))
185+ raise ValueError (msg .format (row [" wind_turbine" ]))
178186
179187 # calculate total capacity if necessary and check that total capacity
180188 # and number of turbines is consistent if both are provided
181189 for ix , row in self .wind_turbine_fleet .iterrows ():
182- if np .isnan (row [' total_capacity' ]):
190+ if np .isnan (row [" total_capacity" ]):
183191 try :
184- self .wind_turbine_fleet .loc [ix , 'total_capacity' ] = \
185- row ['number_of_turbines' ] * \
186- row ['wind_turbine' ].nominal_power
192+ self .wind_turbine_fleet .loc [ix , "total_capacity" ] = (
193+ row ["number_of_turbines" ]
194+ * row ["wind_turbine" ].nominal_power
195+ )
187196 except TypeError :
188197 raise ValueError (
189- 'Total capacity of turbines of type {turbine} cannot '
190- 'be deduced. Please check if the nominal power of the '
191- 'wind turbine is set.' .format (
192- turbine = row ['wind_turbine' ]))
198+ "Total capacity of turbines of type {turbine} cannot "
199+ "be deduced. Please check if the nominal power of the "
200+ "wind turbine is set." .format (
201+ turbine = row ["wind_turbine" ]
202+ )
203+ )
193204 else :
194- if not abs (row ['total_capacity' ] - (
195- row ['number_of_turbines' ] *
196- row ['wind_turbine' ].nominal_power )) < 1 :
197- self .wind_turbine_fleet .loc [ix , 'total_capacity' ] = \
198- row ['number_of_turbines' ] * \
199- row ['wind_turbine' ].nominal_power
205+ if (
206+ not abs (
207+ row ["total_capacity" ]
208+ - (
209+ row ["number_of_turbines" ]
210+ * row ["wind_turbine" ].nominal_power
211+ )
212+ )
213+ < 1
214+ ):
215+ self .wind_turbine_fleet .loc [ix , "total_capacity" ] = (
216+ row ["number_of_turbines" ]
217+ * row ["wind_turbine" ].nominal_power
218+ )
200219 msg = (
201- 'The provided total capacity of WindTurbine {0} has '
202- 'been overwritten as it was not consistent with the '
203- 'number of turbines provided for this type.' )
204- warnings .warn (msg .format (row ['wind_turbine' ]),
205- tools .WindpowerlibUserWarning )
220+ "The provided total capacity of WindTurbine {0} has "
221+ "been overwritten as it was not consistent with the "
222+ "number of turbines provided for this type."
223+ )
224+ warnings .warn (
225+ msg .format (row ["wind_turbine" ]),
226+ tools .WindpowerlibUserWarning ,
227+ )
206228
207229 def __repr__ (self ):
208- if self .name is not '' :
209- return ' Wind farm: {name}' .format (name = self .name )
230+ if self .name is not "" :
231+ return " Wind farm: {name}" .format (name = self .name )
210232 else :
211- return ' Wind farm with turbine fleet: [number, type]\n {}' .format (
233+ return " Wind farm with turbine fleet: [number, type]\n {}" .format (
212234 self .wind_turbine_fleet .loc [
213- :, ['number_of_turbines' , 'wind_turbine' ]].values )
235+ :, ["number_of_turbines" , "wind_turbine" ]
236+ ].values
237+ )
214238
215239 @property
216240 def nominal_power (self ):
@@ -268,16 +292,24 @@ def mean_hub_height(self):
268292
269293 """
270294 self .hub_height = np .exp (
271- sum (np .log (row ['wind_turbine' ].hub_height ) * row ['total_capacity' ]
272- for ix , row in self .wind_turbine_fleet .iterrows ()) /
273- self .nominal_power )
295+ sum (
296+ np .log (row ["wind_turbine" ].hub_height ) * row ["total_capacity" ]
297+ for ix , row in self .wind_turbine_fleet .iterrows ()
298+ )
299+ / self .nominal_power
300+ )
274301 return self
275302
276- def assign_power_curve (self , wake_losses_model = 'wind_farm_efficiency' ,
277- smoothing = False , block_width = 0.5 ,
278- standard_deviation_method = 'turbulence_intensity' ,
279- smoothing_order = 'wind_farm_power_curves' ,
280- turbulence_intensity = None , ** kwargs ):
303+ def assign_power_curve (
304+ self ,
305+ wake_losses_model = "wind_farm_efficiency" ,
306+ smoothing = False ,
307+ block_width = 0.5 ,
308+ standard_deviation_method = "turbulence_intensity" ,
309+ smoothing_order = "wind_farm_power_curves" ,
310+ turbulence_intensity = None ,
311+ ** kwargs
312+ ):
281313 r"""
282314 Calculates the power curve of a wind farm.
283315
@@ -327,87 +359,126 @@ def assign_power_curve(self, wake_losses_model='wind_farm_efficiency',
327359
328360 """
329361 # Check if all wind turbines have a power curve as attribute
330- for turbine in self .wind_turbine_fleet [' wind_turbine' ]:
362+ for turbine in self .wind_turbine_fleet [" wind_turbine" ]:
331363 if turbine .power_curve is None :
332- raise ValueError ("For an aggregated wind farm power curve " +
333- "each wind turbine needs a power curve " +
334- "but `power_curve` of '{}' is None." .format (
335- turbine ))
364+ raise ValueError (
365+ "For an aggregated wind farm power curve "
366+ + "each wind turbine needs a power curve "
367+ + "but `power_curve` of '{}' is None." .format (turbine )
368+ )
336369 # Initialize data frame for power curve values
337370 df = pd .DataFrame ()
338371 for ix , row in self .wind_turbine_fleet .iterrows ():
339372 # Check if needed parameters are available and/or assign them
340373 if smoothing :
341- if (standard_deviation_method == 'turbulence_intensity' and
342- turbulence_intensity is None ):
343- if 'roughness_length' in kwargs and \
344- kwargs ['roughness_length' ] is not None :
374+ if (
375+ standard_deviation_method == "turbulence_intensity"
376+ and turbulence_intensity is None
377+ ):
378+ if (
379+ "roughness_length" in kwargs
380+ and kwargs ["roughness_length" ] is not None
381+ ):
345382 # Calculate turbulence intensity and write to kwargs
346- turbulence_intensity = (
347- tools . estimate_turbulence_intensity (
348- row [ 'wind_turbine' ]. hub_height ,
349- kwargs [ 'roughness_length' ]) )
350- kwargs [' turbulence_intensity' ] = turbulence_intensity
383+ turbulence_intensity = tools . estimate_turbulence_intensity (
384+ row [ "wind_turbine" ]. hub_height ,
385+ kwargs [ "roughness_length" ] ,
386+ )
387+ kwargs [" turbulence_intensity" ] = turbulence_intensity
351388 else :
352389 raise ValueError (
353- "`roughness_length` must be defined for using " +
354- "'turbulence_intensity' as " +
355- "`standard_deviation_method` if " +
356- "`turbulence_intensity` is not given" )
390+ "`roughness_length` must be defined for using "
391+ + "'turbulence_intensity' as "
392+ + "`standard_deviation_method` if "
393+ + "`turbulence_intensity` is not given"
394+ )
357395 # Get original power curve
358- power_curve = pd .DataFrame (row [' wind_turbine' ].power_curve )
396+ power_curve = pd .DataFrame (row [" wind_turbine" ].power_curve )
359397 # Editions to the power curves before the summation
360- if smoothing and smoothing_order == ' turbine_power_curves' :
398+ if smoothing and smoothing_order == " turbine_power_curves" :
361399 power_curve = power_curves .smooth_power_curve (
362- power_curve ['wind_speed' ], power_curve ['value' ],
400+ power_curve ["wind_speed" ],
401+ power_curve ["value" ],
363402 standard_deviation_method = standard_deviation_method ,
364- block_width = block_width , ** kwargs )
403+ block_width = block_width ,
404+ ** kwargs ,
405+ )
365406 else :
366407 # Add value zero to start and end of curve as otherwise
367408 # problems can occur during the aggregation
368- if power_curve .iloc [0 ][' wind_speed' ] != 0.0 :
409+ if power_curve .iloc [0 ][" wind_speed" ] != 0.0 :
369410 power_curve = pd .concat (
370- [pd .DataFrame (data = {
371- 'value' : [0.0 ], 'wind_speed' : [0.0 ]}),
372- power_curve ], join = 'inner' )
373- if power_curve .iloc [- 1 ]['value' ] != 0.0 :
411+ [
412+ pd .DataFrame (
413+ data = {"value" : [0.0 ], "wind_speed" : [0.0 ]}
414+ ),
415+ power_curve ,
416+ ],
417+ join = "inner" ,
418+ )
419+ if power_curve .iloc [- 1 ]["value" ] != 0.0 :
374420 power_curve = pd .concat (
375- [power_curve , pd .DataFrame (data = {
376- 'wind_speed' : [power_curve ['wind_speed' ].loc [
377- power_curve .index [- 1 ]] + 0.5 ],
378- 'value' : [0.0 ]})], join = 'inner' )
421+ [
422+ power_curve ,
423+ pd .DataFrame (
424+ data = {
425+ "wind_speed" : [
426+ power_curve ["wind_speed" ].loc [
427+ power_curve .index [- 1 ]
428+ ]
429+ + 0.5
430+ ],
431+ "value" : [0.0 ],
432+ }
433+ ),
434+ ],
435+ join = "inner" ,
436+ )
379437 # Add power curves of all turbine types to data frame
380438 # (multiplied by turbine amount)
381439 df = pd .concat (
382- [df , pd .DataFrame (power_curve .set_index (['wind_speed' ]) *
383- row ['number_of_turbines' ])], axis = 1 )
440+ [
441+ df ,
442+ pd .DataFrame (
443+ power_curve .set_index (["wind_speed" ])
444+ * row ["number_of_turbines" ]
445+ ),
446+ ],
447+ axis = 1 ,
448+ )
384449 # Aggregate all power curves
385450 wind_farm_power_curve = pd .DataFrame (
386- df .interpolate (method = 'index' ).sum (axis = 1 ))
387- wind_farm_power_curve .columns = ['value' ]
451+ df .interpolate (method = "index" ).sum (axis = 1 )
452+ )
453+ wind_farm_power_curve .columns = ["value" ]
388454 wind_farm_power_curve .reset_index (inplace = True )
389455 # Apply power curve smoothing and consideration of wake losses
390456 # after the summation
391- if smoothing and smoothing_order == ' wind_farm_power_curves' :
457+ if smoothing and smoothing_order == " wind_farm_power_curves" :
392458 wind_farm_power_curve = power_curves .smooth_power_curve (
393- wind_farm_power_curve [' wind_speed' ],
394- wind_farm_power_curve [' value' ],
459+ wind_farm_power_curve [" wind_speed" ],
460+ wind_farm_power_curve [" value" ],
395461 standard_deviation_method = standard_deviation_method ,
396- block_width = block_width , ** kwargs )
397- if wake_losses_model == 'wind_farm_efficiency' :
462+ block_width = block_width ,
463+ ** kwargs ,
464+ )
465+ if wake_losses_model == "wind_farm_efficiency" :
398466 if self .efficiency is not None :
399- wind_farm_power_curve = (
400- power_curves . wake_losses_to_power_curve (
401- wind_farm_power_curve ['wind_speed' ].values ,
402- wind_farm_power_curve [ 'value' ]. values ,
403- wind_farm_efficiency = self . efficiency ) )
467+ wind_farm_power_curve = power_curves . wake_losses_to_power_curve (
468+ wind_farm_power_curve [ "wind_speed" ]. values ,
469+ wind_farm_power_curve ["value" ].values ,
470+ wind_farm_efficiency = self . efficiency ,
471+ )
404472 else :
405473 msg = (
406474 "If you use `wake_losses_model` '{model}' your WindFarm "
407475 "needs an efficiency but `efficiency` is {eff}. \n \n "
408476 "Failing farm:\n {farm}"
409477 )
410- raise ValueError (msg .format (model = wake_losses_model , farm = self ,
411- eff = self .efficiency ))
478+ raise ValueError (
479+ msg .format (
480+ model = wake_losses_model , farm = self , eff = self .efficiency
481+ )
482+ )
412483 self .power_curve = wind_farm_power_curve
413484 return self
0 commit comments