|
| 1 | +import pandas as pd |
| 2 | +import numpy as np |
| 3 | +import pytest |
| 4 | +from pandas.util.testing import assert_frame_equal |
| 5 | + |
| 6 | +from windpowerlib.power_curves import smooth_power_curve, wake_losses_to_power_curve |
| 7 | +import windpowerlib.wind_turbine as wt |
| 8 | + |
| 9 | +class TestPowerCurves: |
| 10 | + |
| 11 | + def test_smooth_power_curve(self): |
| 12 | + self.test_turbine = {'hub_height': 100, |
| 13 | + 'name': 'ENERCON E 126 7500', |
| 14 | + 'fetch_curve': 'power_curve'} |
| 15 | + test_curve = wt.WindTurbine(**self.test_turbine).power_curve |
| 16 | + parameters = {'power_curve_wind_speeds': test_curve['wind_speed'], 'power_curve_values': test_curve['power'], |
| 17 | + 'standard_deviation_method': 'turbulence_intensity'} |
| 18 | + |
| 19 | + # Raise ValueError - `turbulence_intensity` missing |
| 20 | + with pytest.raises(ValueError): |
| 21 | + parameters['standard_deviation_method'] = 'turbulence_intensity' |
| 22 | + smooth_power_curve(**parameters) |
| 23 | + |
| 24 | + # Test turbulence_intensity method |
| 25 | + parameters['turbulence_intensity'] = 0.5 |
| 26 | + wind_speed_values_exp = pd.Series([ |
| 27 | + 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, |
| 28 | + 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 25.5, 26.0, 26.5, 27.0, 27.5, 28.0, 28.5, 29.0, 29.5, 30.0, 30.5, |
| 29 | + 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 38.5, 39.0, 39.5, |
| 30 | + 40.0, 40.5], name='wind_speed') |
| 31 | + power_values_exp = pd.Series([ |
| 32 | + 0.00000000e+00, 1.29408532e+02, 2.74537745e+04, 1.40329364e+05, 3.81419979e+05, 7.79535308e+05, |
| 33 | + 1.32843968e+06, 1.97212403e+06, 2.63632973e+06, 3.26229343e+06, 3.81677075e+06, 4.27224440e+06, |
| 34 | + 4.61366043e+06, 4.83323795e+06, 4.93460775e+06, 4.93159174e+06, 4.84407865e+06, 4.69360159e+06, |
| 35 | + 4.50002765e+06, 4.27955843e+06, 4.04440559e+06, 3.80280303e+06, 3.55991998e+06, 3.31829062e+06, |
| 36 | + 3.07856896e+06, 2.83995558e+06, 2.72036897e+06, 2.60052999e+06, 2.48050066e+06, 2.36108653e+06, |
| 37 | + 2.24229318e+06, 2.12469193e+06, 2.00824913e+06, 1.89389472e+06, 1.78155356e+06, 1.67173211e+06, |
| 38 | + 1.56433223e+06, 1.46003624e+06, 1.35872165e+06, 1.26054125e+06, 1.16536872e+06, 1.07339238e+06, |
| 39 | + 9.84482922e+05, 8.98515461e+05, 8.15369663e+05, 7.34929771e+05, 6.57084612e+05, 5.81727543e+05, |
| 40 | + 5.08756385e+05, 4.38073320e+05, 3.69584779e+05, 3.03201313e+05, 2.38837454e+05, 1.76411574e+05, |
| 41 | + 1.15845735e+05, 5.70655434e+04, 0.00000000e+00], name='power') |
| 42 | + smoothed_curve_exp = pd.DataFrame(data=pd.concat([wind_speed_values_exp, power_values_exp], axis=1)) |
| 43 | + assert_frame_equal(smooth_power_curve(**parameters), smoothed_curve_exp) |
| 44 | + # Test Staffel_Pfenninger method |
| 45 | + parameters['standard_deviation_method'] = 'Staffell_Pfenninger' |
| 46 | + power_values_exp = pd.Series([ |
| 47 | + 1.622617624147696, 2046.0790594164896, 27453.77446698656, 110797.97957354058, 283160.33899177634, |
| 48 | + 569897.5962815176, 991242.9728229153, 1557220.5881869125, 2251719.594235872, 3026232.4980683727, |
| 49 | + 3815395.4208982917, 4559077.054622287, 5216030.835333325, 5766491.4918826725, 6206745.153382668, |
| 50 | + 6539199.922991546, 6762561.3266230915, 6867856.564678423, 6842759.478226526, 6680474.614754306, |
| 51 | + 6386743.355370536, 5981168.352724711, 5493368.359927479, 4956804.542587387, 4403075.69268235, |
| 52 | + 3858130.00551364, 3595063.4934183094, 3340640.9697569, 3096127.02360098, 2862525.3109403835, |
| 53 | + 2640396.750509171, 2430122.0448174304, 2231742.4070679806, 2045310.6869086046, 1870526.2443415099, |
| 54 | + 1707112.9695448321, 1554567.6486531352, 1412544.1278254208, 1280443.9792064743, 1157734.4493543901, |
| 55 | + 1043792.3491461624, 938109.6060543727, 840084.3465088347, 749136.1522378596, 664710.6144769953, |
| 56 | + 586282.3766447674, 513356.9551039379, 445471.58855416544, 382195.32945327926, 323128.55669016804, |
| 57 | + 267902.0580718591, 216175.80422289658, 167637.51216986368, 122001.07699036643, 79004.93315009678, |
| 58 | + 38410.393198714024, 0.0], name='power') |
| 59 | + smoothed_curve_exp = pd.DataFrame(data=pd.concat([wind_speed_values_exp, power_values_exp], axis=1)) |
| 60 | + assert_frame_equal(smooth_power_curve(**parameters), smoothed_curve_exp) |
| 61 | + |
| 62 | + # Raise ValueError - misspelling |
| 63 | + with pytest.raises(ValueError): |
| 64 | + parameters['standard_deviation_method'] = 'misspelled' |
| 65 | + smooth_power_curve(**parameters) |
| 66 | + |
| 67 | + def test_wake_losses_to_power_curve(self): |
| 68 | + self.test_turbine = {'hub_height': 100, |
| 69 | + 'name': 'ENERCON E 126 7500', |
| 70 | + 'fetch_curve': 'power_curve'} |
| 71 | + test_curve = wt.WindTurbine(**self.test_turbine).power_curve |
| 72 | + parameters = {'power_curve_wind_speeds': test_curve['wind_speed'], 'power_curve_values': test_curve['power'], |
| 73 | + 'wind_farm_efficiency': 0.9, 'wake_losses_model': 'constant_efficiency'} |
| 74 | + |
| 75 | + # Test constant efficiency |
| 76 | + power_curve_exp = test_curve.copy(deep=True) |
| 77 | + power_curve_exp['power'] = power_curve_exp['power'].values * 0.9 |
| 78 | + assert_frame_equal(wake_losses_to_power_curve(**parameters), power_curve_exp) |
| 79 | + |
| 80 | + # Raise TypeError if wind farm efficiency is not float |
| 81 | + with pytest.raises(TypeError): |
| 82 | + parameters['wind_farm_efficiency'] = 1 |
| 83 | + wake_losses_to_power_curve(**parameters) |
| 84 | + |
| 85 | + # Test efficiency curve |
| 86 | + parameters['wake_losses_model'] = 'power_efficiency_curve' |
| 87 | + parameters['wind_farm_efficiency'] = pd.DataFrame( |
| 88 | + pd.concat([pd.Series(np.arange(0, 27, 1)), |
| 89 | + pd.Series([1.0, 1.0, 1.0, 0.84, 0.85, 0.86, 0.85, 0.85, 0.85, 0.86, 0.87, 0.89, 0.92, 0.95, 0.95, |
| 90 | + 0.96, 0.99, 0.95, 0.98, 0.97, 0.99, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])], axis=1)) |
| 91 | + parameters['wind_farm_efficiency'].columns = ['wind_speed', 'efficiency'] |
| 92 | + power_curve_exp = test_curve.copy(deep=True) |
| 93 | + power_curve_exp['power'] = power_curve_exp['power'].values * parameters['wind_farm_efficiency']['efficiency'] |
| 94 | + assert_frame_equal(wake_losses_to_power_curve(**parameters), power_curve_exp) |
| 95 | + |
| 96 | + # Raise TypeError if efficiency is not DataFrame |
| 97 | + with pytest.raises(TypeError): |
| 98 | + parameters['wind_farm_efficiency'] = pd.Series([1, 2, 3]) |
| 99 | + wake_losses_to_power_curve(**parameters) |
| 100 | + |
| 101 | + # Raise ValueError - misspelling |
| 102 | + with pytest.raises(ValueError): |
| 103 | + parameters['wake_losses_model'] = 'misspelled' |
| 104 | + wake_losses_to_power_curve(**parameters) |
| 105 | + |
0 commit comments