Skip to content

Commit 4ad8e3a

Browse files
authored
Merge pull request #34 from wind-python/rename_power_cp_curve_column
Rename columns of power an cp curves to value
2 parents 145a808 + d6a7fc5 commit 4ad8e3a

File tree

9 files changed

+46
-46
lines changed

9 files changed

+46
-46
lines changed

doc/whatsnew/v0-1-0.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ API changes
4343

4444
* renamed attribute `turbine_name` of WindTurbine class to `name` to match with `name` attribute of WindFarm and WindTurbineCluster class
4545
* renamed `basic_example` to `modelchain_example`
46-
* renamed column 'values' of power curves to 'power' and column 'values' of power coefficient curves to 'power coefficient'
46+
* renamed column 'values' of power (coefficient) curves to 'value' to prevent errors using df.value(s)
4747
* renamed `run_basic_example()` to `run_example()` in `modelchain_example`
4848
* renamed parameter `wind_turbine` of `ModelChain` object to `power_plant`
4949
* removed parameter `density_correction` from `power_plant.power_coefficient()`

example/modelchain_example.ipynb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@
237237
" 'hub_height': 105, # in m\n",
238238
" 'rotor_diameter': 90, # in m\n",
239239
" 'power_curve': pd.DataFrame(\n",
240-
" data={'power': [p * 1000 for p in [\n",
240+
" data={'value': [p * 1000 for p in [\n",
241241
" 0.0, 26.0, 180.0, 1500.0, 3000.0, 3000.0]], # in W\n",
242242
" 'wind_speed': [0.0, 3.0, 5.0, 10.0, 15.0, 25.0]}) # in m/s\n",
243243
" } \n",
@@ -525,20 +525,20 @@
525525
"if plt:\n",
526526
" if e126.power_coefficient_curve is not None:\n",
527527
" e126.power_coefficient_curve.plot(\n",
528-
" x='wind_speed', y='power coefficient', style='*',\n",
528+
" x='wind_speed', y='value', style='*',\n",
529529
" title='Enercon E126 power coefficient curve')\n",
530530
" plt.show()\n",
531531
" if e126.power_curve is not None:\n",
532-
" e126.power_curve.plot(x='wind_speed', y='power', style='*',\n",
532+
" e126.power_curve.plot(x='wind_speed', y='value', style='*',\n",
533533
" title='Enercon E126 power curve')\n",
534534
" plt.show()\n",
535535
" if my_turbine.power_coefficient_curve is not None:\n",
536536
" my_turbine.power_coefficient_curve.plot(\n",
537-
" x='wind_speed', y='power coefficient', style='*',\n",
537+
" x='wind_speed', y='value', style='*',\n",
538538
" title='myTurbine power coefficient curve')\n",
539539
" plt.show()\n",
540540
" if my_turbine.power_curve is not None:\n",
541-
" my_turbine.power_curve.plot(x='wind_speed', y='power', style='*',\n",
541+
" my_turbine.power_curve.plot(x='wind_speed', y='value', style='*',\n",
542542
" title='myTurbine power curve')\n",
543543
" plt.show()"
544544
]

example/modelchain_example.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def initialize_wind_turbines():
111111
'hub_height': 105, # in m
112112
'rotor_diameter': 90, # in m
113113
'power_curve': pd.DataFrame(
114-
data={'power': [p * 1000 for p in [
114+
data={'value': [p * 1000 for p in [
115115
0.0, 26.0, 180.0, 1500.0, 3000.0, 3000.0]], # in W
116116
'wind_speed': [0.0, 3.0, 5.0, 10.0, 15.0, 25.0]}) # in m/s
117117
}
@@ -246,7 +246,7 @@ def plot_or_print(my_turbine, e126, dummy_turbine):
246246
title='Enercon E126 power coefficient curve')
247247
plt.show()
248248
if e126.power_curve is not None:
249-
e126.power_curve.plot(x='wind_speed', y='power', style='*',
249+
e126.power_curve.plot(x='wind_speed', y='value', style='*',
250250
title='Enercon E126 power curve')
251251
plt.show()
252252
if my_turbine.power_coefficient_curve is not None:
@@ -255,7 +255,7 @@ def plot_or_print(my_turbine, e126, dummy_turbine):
255255
title='myTurbine power coefficient curve')
256256
plt.show()
257257
if my_turbine.power_curve is not None:
258-
my_turbine.power_curve.plot(x='wind_speed', y='power', style='*',
258+
my_turbine.power_curve.plot(x='wind_speed', y='value', style='*',
259259
title='myTurbine power curve')
260260
plt.show()
261261
else:

tests/test_power_curves.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def setup_class(self):
1818
def test_smooth_power_curve(self):
1919
test_curve = wt.WindTurbine(**self.test_turbine).power_curve
2020
parameters = {'power_curve_wind_speeds': test_curve['wind_speed'],
21-
'power_curve_values': test_curve['power'],
21+
'power_curve_values': test_curve['value'],
2222
'standard_deviation_method': 'turbulence_intensity'}
2323

2424
# Raise ValueError - `turbulence_intensity` missing
@@ -32,7 +32,7 @@ def test_smooth_power_curve(self):
3232
name='wind_speed')
3333
power_values_exp = pd.Series([
3434
1141906.9806766496, 1577536.8085282773, 1975480.993355767,
35-
2314059.4022704284, 2590216.6802602503], name='power')
35+
2314059.4022704284, 2590216.6802602503], name='value')
3636
smoothed_curve_exp = pd.DataFrame(data=pd.concat([
3737
wind_speed_values_exp, power_values_exp], axis=1))
3838
smoothed_curve_exp.index = np.arange(5, 10, 1)
@@ -43,7 +43,7 @@ def test_smooth_power_curve(self):
4343
parameters['standard_deviation_method'] = 'Staffell_Pfenninger'
4444
power_values_exp = pd.Series([
4545
929405.1348918702, 1395532.5468724659, 1904826.6851982325,
46-
2402659.118305521, 2844527.1732449625], name='power')
46+
2402659.118305521, 2844527.1732449625], name='value')
4747
smoothed_curve_exp = pd.DataFrame(
4848
data=pd.concat([wind_speed_values_exp, power_values_exp], axis=1))
4949
smoothed_curve_exp.index = np.arange(5, 10, 1)
@@ -58,13 +58,13 @@ def test_smooth_power_curve(self):
5858
def test_wake_losses_to_power_curve(self):
5959
test_curve = wt.WindTurbine(**self.test_turbine).power_curve
6060
parameters = {'power_curve_wind_speeds': test_curve['wind_speed'],
61-
'power_curve_values': test_curve['power'],
61+
'power_curve_values': test_curve['value'],
6262
'wind_farm_efficiency': 0.9,
6363
'wake_losses_model': 'constant_efficiency'}
6464

6565
# Test constant efficiency
6666
power_curve_exp = test_curve.copy(deep=True)
67-
power_curve_exp['power'] = power_curve_exp['power'].values * 0.9
67+
power_curve_exp['value'] = power_curve_exp['value'].values * 0.9
6868
assert_frame_equal(wake_losses_to_power_curve(**parameters),
6969
power_curve_exp)
7070

@@ -85,8 +85,8 @@ def test_wake_losses_to_power_curve(self):
8585
parameters['wind_farm_efficiency'].columns = ['wind_speed',
8686
'efficiency']
8787
power_curve_exp = test_curve.copy(deep=True)
88-
power_curve_exp['power'] = (
89-
power_curve_exp['power'].values * parameters[
88+
power_curve_exp['value'] = (
89+
power_curve_exp['value'].values * parameters[
9090
'wind_farm_efficiency']['efficiency'])
9191
assert_frame_equal(wake_losses_to_power_curve(**parameters),
9292
power_curve_exp)

windpowerlib/modelchain.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ def calculate_power_output(self, wind_speed_hub, density_hub):
344344
return (power_output.power_curve(
345345
wind_speed_hub,
346346
self.power_plant.power_curve['wind_speed'],
347-
self.power_plant.power_curve['power'],
347+
self.power_plant.power_curve['value'],
348348
density_hub, self.density_correction))
349349
elif self.power_output_model == 'power_coefficient_curve':
350350
if self.power_plant.power_coefficient_curve is None:
@@ -358,7 +358,7 @@ def calculate_power_output(self, wind_speed_hub, density_hub):
358358
self.power_plant.power_coefficient_curve[
359359
'wind_speed'],
360360
self.power_plant.power_coefficient_curve[
361-
'power_coefficient'],
361+
'value'],
362362
self.power_plant.rotor_diameter, density_hub))
363363
else:
364364
raise ValueError("'{0}' is an invalid value. ".format(

windpowerlib/power_curves.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def smooth_power_curve(power_curve_wind_speeds, power_curve_values,
5454
Returns
5555
-------
5656
smoothed_power_curve_df : pd.DataFrame
57-
Smoothed power curve. DataFrame has 'wind_speed' and 'power' columns
57+
Smoothed power curve. DataFrame has 'wind_speed' and 'value' columns
5858
with wind speeds in m/s and the corresponding power curve value in W.
5959
6060
Notes
@@ -168,7 +168,7 @@ def smooth_power_curve(power_curve_wind_speeds, power_curve_values,
168168
data=[list(power_curve_wind_speeds.values),
169169
smoothed_power_curve_values]).transpose()
170170
# Rename columns of the data frame
171-
smoothed_power_curve_df.columns = ['wind_speed', 'power']
171+
smoothed_power_curve_df.columns = ['wind_speed', 'value']
172172
return smoothed_power_curve_df
173173

174174

@@ -200,7 +200,7 @@ def wake_losses_to_power_curve(power_curve_wind_speeds, power_curve_values,
200200
-------
201201
power_curve_df : pd.DataFrame
202202
Power curve with power values reduced by a wind farm efficiency.
203-
DataFrame has 'wind_speed' and 'power' columns with wind speeds in m/s
203+
DataFrame has 'wind_speed' and 'value' columns with wind speeds in m/s
204204
and the corresponding power curve value in W.
205205
206206
"""
@@ -209,13 +209,13 @@ def wake_losses_to_power_curve(power_curve_wind_speeds, power_curve_values,
209209
data=[list(power_curve_wind_speeds),
210210
list(power_curve_values)]).transpose()
211211
# Rename columns of DataFrame
212-
power_curve_df.columns = ['wind_speed', 'power']
212+
power_curve_df.columns = ['wind_speed', 'value']
213213
if wake_losses_model == 'constant_efficiency':
214214
if not isinstance(wind_farm_efficiency, float):
215215
raise TypeError("'wind_farm_efficiency' must be float if " +
216216
"`wake_losses_model´ is '{}' but is {}".format(
217217
wake_losses_model, wind_farm_efficiency))
218-
power_curve_df['power'] = power_curve_values * wind_farm_efficiency
218+
power_curve_df['value'] = power_curve_values * wind_farm_efficiency
219219
elif wake_losses_model == 'power_efficiency_curve':
220220
if (not isinstance(wind_farm_efficiency, dict) and
221221
not isinstance(wind_farm_efficiency, pd.DataFrame)):
@@ -227,12 +227,12 @@ def wake_losses_to_power_curve(power_curve_wind_speeds, power_curve_values,
227227
wind_farm_efficiency.set_index('wind_speed')], axis=1)
228228
# Add column with reduced power (nan values of efficiency are
229229
# interpolated)
230-
df['reduced_power'] = df['power'] * df['efficiency'].interpolate(
230+
df['reduced_power'] = df['value'] * df['efficiency'].interpolate(
231231
method='index')
232232
reduced_power = df['reduced_power'].dropna()
233233
power_curve_df = pd.DataFrame([reduced_power.index,
234234
reduced_power.values]).transpose()
235-
power_curve_df.columns = ['wind_speed', 'power']
235+
power_curve_df.columns = ['wind_speed', 'value']
236236
else:
237237
raise ValueError(
238238
"`wake_losses_model` is {} but should be ".format(

windpowerlib/wind_farm.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ def assign_power_curve(self, wake_losses_model='power_efficiency_curve',
254254
# Editions to the power curves before the summation
255255
if smoothing and smoothing_order == 'turbine_power_curves':
256256
power_curve = power_curves.smooth_power_curve(
257-
power_curve['wind_speed'], power_curve['power'],
257+
power_curve['wind_speed'], power_curve['value'],
258258
standard_deviation_method=standard_deviation_method,
259259
block_width=block_width, **kwargs)
260260
else:
@@ -263,12 +263,12 @@ def assign_power_curve(self, wake_losses_model='power_efficiency_curve',
263263
if power_curve.iloc[0]['wind_speed'] != 0.0:
264264
power_curve = pd.concat(
265265
[pd.DataFrame(data={
266-
'power': [0.0], 'wind_speed': [0.0]}),
266+
'value': [0.0], 'wind_speed': [0.0]}),
267267
power_curve])
268-
if power_curve.iloc[-1]['power'] != 0.0:
268+
if power_curve.iloc[-1]['value'] != 0.0:
269269
power_curve = pd.concat(
270270
[power_curve, pd.DataFrame(data={
271-
'power': [0.0], 'wind_speed': [
271+
'value': [0.0], 'wind_speed': [
272272
power_curve['wind_speed'].loc[
273273
power_curve.index[-1]] + 0.5]})])
274274
# Add power curves of all turbine types to data frame
@@ -279,21 +279,21 @@ def assign_power_curve(self, wake_losses_model='power_efficiency_curve',
279279
# Aggregate all power curves
280280
wind_farm_power_curve = pd.DataFrame(
281281
df.interpolate(method='index').sum(axis=1))
282-
wind_farm_power_curve.columns = ['power']
282+
wind_farm_power_curve.columns = ['value']
283283
wind_farm_power_curve.reset_index('wind_speed', inplace=True)
284284
# Editions to the power curve after the summation
285285
if smoothing and smoothing_order == 'wind_farm_power_curves':
286286
wind_farm_power_curve = power_curves.smooth_power_curve(
287287
wind_farm_power_curve['wind_speed'],
288-
wind_farm_power_curve['power'],
288+
wind_farm_power_curve['value'],
289289
standard_deviation_method=standard_deviation_method,
290290
block_width=block_width, **kwargs)
291291
if (wake_losses_model == 'constant_efficiency' or
292292
wake_losses_model == 'power_efficiency_curve'):
293293
wind_farm_power_curve = (
294294
power_curves.wake_losses_to_power_curve(
295295
wind_farm_power_curve['wind_speed'].values,
296-
wind_farm_power_curve['power'].values,
296+
wind_farm_power_curve['value'].values,
297297
wake_losses_model=wake_losses_model,
298298
wind_farm_efficiency=self.efficiency))
299299
self.power_curve = wind_farm_power_curve

windpowerlib/wind_turbine.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ class WindTurbine(object):
3030
Diameter of the rotor in m. Default: None.
3131
power_coefficient_curve : None, pandas.DataFrame or dictionary
3232
Power coefficient curve of the wind turbine. DataFrame/dictionary must
33-
have 'wind_speed' and 'power_coefficient' columns/keys with wind speeds
33+
have 'wind_speed' and 'value' columns/keys with wind speeds
3434
in m/s and the corresponding power coefficients. Default: None.
3535
power_curve : None, pandas.DataFrame or dictionary
3636
Power curve of the wind turbine. DataFrame/dictionary must have
37-
'wind_speed' and 'power' columns/keys with wind speeds in m/s and the
37+
'wind_speed' and 'value' columns/keys with wind speeds in m/s and the
3838
corresponding power curve value in W. Default: None.
3939
nominal_power : None or float
4040
The nominal output of the wind turbine in W. Default: None.
@@ -65,11 +65,11 @@ class WindTurbine(object):
6565
Diameter of the rotor in m. Default: None.
6666
power_coefficient_curve : None, pandas.DataFrame or dictionary
6767
Power coefficient curve of the wind turbine. DataFrame/dictionary must
68-
have 'wind_speed' and 'power_coefficient' columns/keys with wind speeds
68+
have 'wind_speed' and 'value' columns/keys with wind speeds
6969
in m/s and the corresponding power coefficients. Default: None.
7070
power_curve : None, pandas.DataFrame or dictionary
7171
Power curve of the wind turbine. DataFrame/dictionary must have
72-
'wind_speed' and 'power' columns/keys with wind speeds in m/s and the
72+
'wind_speed' and 'value' columns/keys with wind speeds in m/s and the
7373
corresponding power curve value in W. Default: None.
7474
nominal_power : None or float
7575
The nominal output of the wind turbine in W. Default: None.
@@ -164,7 +164,7 @@ def fetch_turbine_data(self, fetch_curve, data_source):
164164
... 'fetch_curve': 'power_coefficient_curve',
165165
... 'data_source': 'oedb'}
166166
>>> e126 = wind_turbine.WindTurbine(**enerconE126)
167-
>>> print(e126.power_coefficient_curve['power_coefficient'][5])
167+
>>> print(e126.power_coefficient_curve['value'][5])
168168
0.44
169169
>>> print(e126.nominal_power)
170170
4200000.0
@@ -177,13 +177,8 @@ def fetch_turbine_data(self, fetch_curve, data_source):
177177
curve_df, nominal_power = get_turbine_data_from_file(
178178
turbine_type=self.name, file_=data_source)
179179
if fetch_curve == 'power_curve':
180-
curve_df.columns = ['wind_speed', 'power']
181-
if data_source == 'oedb':
182-
# power values in W
183-
curve_df['power'] = curve_df['power'] * 1000
184180
self.power_curve = curve_df
185181
elif fetch_curve == 'power_coefficient_curve':
186-
curve_df.columns = ['wind_speed', 'power_coefficient']
187182
self.power_coefficient_curve = curve_df
188183
else:
189184
raise ValueError("'{0}' is an invalid value. ".format(
@@ -233,7 +228,7 @@ def get_turbine_data_from_file(turbine_type, file_):
233228
... 'fetch_curve': 'power_curve',
234229
... 'data_source': source}
235230
>>> e_t_1 = wind_turbine.WindTurbine(**example_turbine)
236-
>>> print(e_t_1.power_curve['power'][7])
231+
>>> print(e_t_1.power_curve['value'][7])
237232
18000.0
238233
>>> print(e_t_1.nominal_power)
239234
150000
@@ -263,7 +258,8 @@ def isfloat(x):
263258
cols = [_ for _ in wpp_df.columns if isfloat(_)]
264259
curve_data = wpp_df[cols].dropna(axis=1)
265260
df = curve_data.transpose().reset_index()
266-
df['index'] = df['index'].apply(lambda x: float(x))
261+
df.columns = ['wind_speed', 'value']
262+
df['wind_speed'] = df['wind_speed'].apply(lambda x: float(x))
267263
nominal_power = wpp_df['p_nom'].iloc[0]
268264
return df, nominal_power
269265

@@ -307,6 +303,10 @@ def get_turbine_data_from_oedb(turbine_type, fetch_curve):
307303
"possible wind turbine types.")
308304
nominal_power = turbine_data.loc[turbine_type][
309305
'installed_capacity_kw'] * 1000
306+
df.columns = ['wind_speed', 'value']
307+
if fetch_curve == 'power_curve':
308+
# power in W
309+
df['value'] = df['value'] * 1000
310310
return df, nominal_power
311311

312312

windpowerlib/wind_turbine_cluster.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ def assign_power_curve(self, wake_losses_model='power_efficiency_curve',
181181
turbulence_intensity=turbulence_intensity, **kwargs)
182182
# Create data frame from power curves of all wind farms
183183
df = pd.concat([farm.power_curve.set_index(['wind_speed']).rename(
184-
columns={'power': farm.name}) for
184+
columns={'value': farm.name}) for
185185
farm in self.wind_farms], axis=1)
186186
# Sum up power curves
187187
cluster_power_curve = pd.DataFrame(
188188
df.interpolate(method='index').sum(axis=1))
189-
cluster_power_curve.columns = ['power']
189+
cluster_power_curve.columns = ['value']
190190
# Return wind speed (index) to a column of the data frame
191191
cluster_power_curve.reset_index('wind_speed', inplace=True)
192192
self.power_curve = cluster_power_curve

0 commit comments

Comments
 (0)