def test_power_curve_7(self): """TODO: Explain this test""" self.parameters2["power_curve_values"] = np.array( self.parameters2["power_curve_values"]) self.parameters2["power_curve_wind_speeds"] = np.array( self.parameters2["power_curve_wind_speeds"]) assert_allclose(power_curve(**self.parameters2), self.power_output_exp2) assert isinstance(power_curve(**self.parameters2), np.ndarray)
def test_power_curve_3(self): """ Test wind_speed as np.array and power_curve as pd.Series and np.array """ power_output_exp = np.array(self.power_output_exp1) self.parameters2["wind_speed"] = np.array( self.parameters2["wind_speed"]) assert_allclose(power_curve(**self.parameters2), power_output_exp) assert isinstance(power_curve(**self.parameters2), np.ndarray)
def test_power_curve_5(self): """ Tests with density correction: Test wind_speed as np.array with density and power_curve as pd.Series and np.array """ power_output_exp = np.array(self.power_output_exp2) self.parameters2["density_correction"] = True assert_allclose(power_curve(**self.parameters2), power_output_exp) assert isinstance(power_curve(**self.parameters2), np.ndarray)
def test_wrong_spelling_density_correction(self): parameters = { "wind_speed": pd.Series(data=[2.0, 5.5, 7.0]), "density": pd.Series(data=[1.3, 1.3, 1.3]), "power_curve_wind_speeds": pd.Series([4.0, 5.0, 6.0]), "power_curve_values": pd.Series([300, 400, 500]), } msg = "is an invalid type. `density_correction` must be Boolean" with pytest.raises(TypeError, match=msg): parameters["density_correction"] = None power_curve(**parameters)
def check_theoretical_power(df, year, start=None, end=None): r""" This function was used to compare the theoretical power of ArgeNetz wind farms with the simulated power when the measured wind speed (of ArgeNetz data) is used. As no wind speed is added to the data of 2015 this function can only be used for the year 2015. """ wind_farm_names = ['wf_1', 'wf_3', 'wf_4', 'wf_5'] wind_turbine_amount = [(0, 16), (4, 13), (0, 22), (0, 14)] # Turbine data enerconE70 = { 'turbine_name': 'ENERCON E 70 2300', 'hub_height': 64, # in m 'rotor_diameter': 71 # in m } enerconE66 = { 'turbine_name': 'ENERCON E 66 1800', 'hub_height': 65, # in m 'rotor_diameter': 70 # in m } # Initialize WindTurbine objects e70 = wt.WindTurbine(**enerconE70) e66 = wt.WindTurbine(**enerconE66) for name, turbine_amount in zip(wind_farm_names, wind_turbine_amount): indices = tools.get_indices_for_series(1, 'Europe/Berlin', year) power_output_theo = df[name + '_theoretical_power'] / 1000 power_output_theo = pd.Series(data=power_output_theo.values, index=indices) power_output_by_wind_speed = ( turbine_amount[0] * power_output.power_curve( df[name + '_wind_speed'], e66.power_curve['wind_speed'], e66.power_curve['power']) + turbine_amount[1] * power_output.power_curve( df[name + '_wind_speed'], e70.power_curve['wind_speed'], e70.power_curve['power'])) / (1*10**6) power_output_by_wind_speed = pd.Series( data=power_output_by_wind_speed.values, index=indices) val_obj = analysis_tools.ValidationObject( 'validate_arge_4919', power_output_theo, power_output_by_wind_speed, weather_data_name='calculated by wind speed', validation_name='P_W theoretical') val_obj.output_method = 'power_output' visualization_tools.plot_feedin_comparison( val_obj, filename='../Plots/Test_Arge/{0}_{1}_feedin'.format( year, name), title='{0}'.format(name), start=start, end=end) visualization_tools.plot_correlation( val_obj, filename='../Plots/Test_Arge/{0}_{1}_corr'.format( year, name), title='{0}'.format(name))
def test_power_curve_density_correction(self): """TODO: Explain and split this test.""" parameters = { "wind_speed": pd.Series(data=[2.0, 5.5, 7.0]), "density": pd.Series(data=[1.3, 1.3, 1.3]), "power_curve_wind_speeds": pd.Series([4.0, 5.0, 6.0]), "power_curve_values": pd.Series([300, 400, 500]), } # Test wind_speed as pd.Series with density and power_curve as # pd.Series and np.array power_output_exp = pd.Series(data=[0.0, 461.00290572, 0.0], name="feedin_power_plant") assert_series_equal(power_curve_density_correction(**parameters), power_output_exp) parameters["density"] = np.array(parameters["density"]) assert_series_equal(power_curve_density_correction(**parameters), power_output_exp) parameters["power_curve_values"] = np.array( parameters["power_curve_values"]) parameters["power_curve_wind_speeds"] = np.array( parameters["power_curve_wind_speeds"]) assert_series_equal(power_curve_density_correction(**parameters), power_output_exp) # Test wind_speed as np.array with density and power_curve as np.array # and pd.Series parameters["wind_speed"] = np.array(parameters["wind_speed"]) power_output_exp = np.array([0.0, 461.00290572, 0.0]) assert_allclose(power_curve_density_correction(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters["density"] = pd.Series(data=parameters["density"]) assert_allclose(power_curve_density_correction(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters["power_curve_wind_speeds"] = pd.Series( data=parameters["power_curve_wind_speeds"]) parameters["power_curve_values"] = pd.Series( data=parameters["power_curve_values"]) assert_allclose(power_curve_density_correction(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) # Raise TypeError due to density is None with pytest.raises(TypeError): parameters["density"] = None power_curve_density_correction(**parameters)
def test_power_curve_density_correction(self): parameters = {'wind_speed': pd.Series(data=[2.0, 5.5, 7.0]), 'density': pd.Series(data=[1.3, 1.3, 1.3]), 'power_curve_wind_speeds': pd.Series([4.0, 5.0, 6.0]), 'power_curve_values': pd.Series([300, 400, 500]) } # Test wind_speed as pd.Series with density and power_curve as # pd.Series and np.array power_output_exp = pd.Series(data=[0.0, 461.00290572, 0.0], name='feedin_power_plant') assert_series_equal(power_curve_density_correction(**parameters), power_output_exp) parameters['density'] = np.array(parameters['density']) assert_series_equal(power_curve_density_correction(**parameters), power_output_exp) parameters['power_curve_values'] = np.array( parameters['power_curve_values']) parameters['power_curve_wind_speeds'] = np.array( parameters['power_curve_wind_speeds']) assert_series_equal(power_curve_density_correction(**parameters), power_output_exp) # Test wind_speed as np.array with density and power_curve as np.array # and pd.Series parameters['wind_speed'] = np.array(parameters['wind_speed']) power_output_exp = np.array([0.0, 461.00290572, 0.0]) assert_allclose(power_curve_density_correction(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters['density'] = pd.Series(data=parameters['density']) assert_allclose(power_curve_density_correction(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters['power_curve_wind_speeds'] = pd.Series( data=parameters['power_curve_wind_speeds']) parameters['power_curve_values'] = pd.Series( data=parameters['power_curve_values']) assert_allclose(power_curve_density_correction(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) # Raise TypeError due to density is None with pytest.raises(TypeError): parameters['density'] = None power_curve_density_correction(**parameters)
def test_power_curve_1(self): # Tests without density correction: # Test wind_speed as pd.Series and power_curve as pd.Series and # np.array assert_series_equal(power_curve(**self.parameters2), self.power_output_exp1)
def test_power_curve_2(self): """TODO: Explain this test""" self.parameters2["power_curve_values"] = np.array( self.parameters2["power_curve_values"]) self.parameters2["power_curve_wind_speeds"] = np.array( self.parameters2["power_curve_wind_speeds"]) assert_series_equal(power_curve(**self.parameters2), self.power_output_exp1)
def test_power_curve_10(self): """TODO: Explain this test""" self.parameters2["power_curve_wind_speeds"] = pd.Series( data=self.parameters2["power_curve_wind_speeds"]) self.parameters2["power_curve_values"] = pd.Series( data=self.parameters2["power_curve_values"]) assert_series_equal(power_curve(**self.parameters2), self.power_output_exp2)
def test_power_curve_8(self): """ Test wind_speed as pd.Series with density and power_curve as np. array and pd.Series """ self.parameters2["wind_speed"] = pd.Series( data=self.parameters2["wind_speed"]) assert_series_equal(power_curve(**self.parameters2), self.power_output_exp2)
def calculate_power_output(self, wind_speed_hub, density_hub): r""" Calculates the power output of the wind power plant. The method specified by the parameter `power_output_model` is used. Parameters ---------- wind_speed_hub : :pandas:`pandas.Series<series>` or numpy.array Wind speed at hub height in m/s. density_hub : :pandas:`pandas.Series<series>` or numpy.array Density of air at hub height in kg/m³. Returns ------- :pandas:`pandas.Series<series>` Electrical power output of the wind turbine in W. """ if self.power_output_model == "power_curve": if self.power_plant.power_curve is None: raise TypeError("Power curve values of {} are missing.".format( self.power_plant)) logging.debug("Calculating power output using power curve.") return power_output.power_curve( wind_speed_hub, self.power_plant.power_curve["wind_speed"], self.power_plant.power_curve["value"], density_hub, self.density_correction, ) elif self.power_output_model == "power_coefficient_curve": if self.power_plant.power_coefficient_curve is None: raise TypeError("Power coefficient curve values of {} are " "missing.".format(self.power_plant)) logging.debug("Calculating power output using power coefficient " "curve.") return power_output.power_coefficient_curve( wind_speed_hub, self.power_plant.power_coefficient_curve["wind_speed"], self.power_plant.power_coefficient_curve["value"], self.power_plant.rotor_diameter, density_hub, ) else: raise ValueError( "'{0}' is an invalid value. ".format(self.power_output_model) + "`power_output_model` must be " + "'power_curve' or 'power_coefficient_curve'.")
def power_output_simple(wind_turbine_fleet, weather_df, data_height): # TODO: add weather_data_name to these functions and use modelchain for # open_FRED data as there are different heights and this is easier # with the multiindex dataframe r""" Calculate power output of several wind turbines by a simple method. Simplest way to calculate the power output of a wind farm or other gathering of wind turbines. For the power_output of the single turbines a power_curve without density correction is used. The wind speed at hub height is calculated by the logarithmic wind profile. The power output of the wind farm is calculated by aggregation of the power output of the single turbines. Parameters ---------- wind_turbine_fleet : List of Dictionaries Wind turbines of wind farm. Dictionaries must have 'wind_turbine' (contains wind turbine object) and 'number_of_turbines' (number of turbine type in wind farm) as keys. weather_df : pandas.DataFrame DataFrame with time series for wind speed `wind_speed` in m/s and roughness length `roughness_length` in m. data_height : Dictionary Contains the heights of the weather measurements or weather model in meters with the keys of the data parameter. Returns ------- pd.Series Simulated power output of wind farm. """ for turbine_type in wind_turbine_fleet: wind_speed_hub = wind_speed.logarithmic_profile( weather_df.wind_speed, data_height['wind_speed'], turbine_type['wind_turbine'].hub_height, weather_df.roughness_length, obstacle_height=0.0) turbine_type['wind_turbine'].power_output = (power_output.power_curve( wind_speed_hub, turbine_type['wind_turbine'].power_curve['wind_speed'], turbine_type['wind_turbine'].power_curve['power'])) return power_output_simple_aggregation(wind_turbine_fleet)
def calculate_power_output(self, wind_speed_hub, density_hub): r""" Calculates the power output of the wind power plant. The method specified by the parameter `power_output_model` is used. Parameters ---------- wind_speed_hub : pandas.Series or numpy.array Wind speed at hub height in m/s. density_hub : pandas.Series or numpy.array Density of air at hub height in kg/m³. Returns ------- pandas.Series Electrical power output of the wind turbine in W. """ if self.power_output_model == 'power_curve': if self.power_plant.power_curve is None: raise TypeError("Power curve values of " + self.power_plant.name + " are missing.") logging.debug('Calculating power output using power curve.') return (power_output.power_curve( wind_speed_hub, self.power_plant.power_curve['wind_speed'], self.power_plant.power_curve['value'], density_hub, self.density_correction)) elif self.power_output_model == 'power_coefficient_curve': if self.power_plant.power_coefficient_curve is None: raise TypeError("Power coefficient curve values of " + self.power_plant.name + " are missing.") logging.debug('Calculating power output using power coefficient ' 'curve.') return (power_output.power_coefficient_curve( wind_speed_hub, self.power_plant.power_coefficient_curve['wind_speed'], self.power_plant.power_coefficient_curve['value'], self.power_plant.rotor_diameter, density_hub)) else: raise ValueError( "'{0}' is an invalid value. ".format(self.power_output_model) + "`power_output_model` must be " + "'power_curve' or 'power_coefficient_curve'.")
def test_power_curve(self): parameters = {'wind_speed': pd.Series(data=[2.0, 5.5, 7.0]), 'density': pd.Series(data=[1.3, 1.3, 1.3]), 'density_correction': False, 'power_curve_wind_speeds': pd.Series([4.0, 5.0, 6.0]), 'power_curve_values': pd.Series([300, 400, 500]) } # Tests without density correction: # Test wind_speed as pd.Series and power_curve as pd.Series and # np.array power_output_exp = pd.Series(data=[0.0, 450.0, 0.0], name='feedin_power_plant') assert_series_equal(power_curve(**parameters), power_output_exp) parameters['power_curve_values'] = np.array( parameters['power_curve_values']) parameters['power_curve_wind_speeds'] = np.array( parameters['power_curve_wind_speeds']) assert_series_equal(power_curve(**parameters), power_output_exp) # Test wind_speed as np.array and power_curve as pd.Series and np.array power_output_exp = np.array([0.0, 450.0, 0.0]) parameters['wind_speed'] = np.array(parameters['wind_speed']) assert_allclose(power_curve(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters['power_curve_wind_speeds'] = pd.Series( data=parameters['power_curve_wind_speeds']) parameters['power_curve_values'] = pd.Series( data=parameters['power_curve_values']) assert_allclose(power_curve(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) # Tests with density correction: # Test wind_speed as np.array with density and power_curve as pd.Series # and np.array power_output_exp = np.array([0.0, 461.00290572, 0.0]) parameters['density_correction'] = True assert_allclose(power_curve(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters['density'] = np.array(parameters['density']) assert_allclose(power_curve(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) parameters['power_curve_values'] = np.array( parameters['power_curve_values']) parameters['power_curve_wind_speeds'] = np.array( parameters['power_curve_wind_speeds']) assert_allclose(power_curve(**parameters), power_output_exp) assert isinstance(power_curve(**parameters), np.ndarray) # Test wind_speed as pd.Series with density and power_curve as # np. array and pd.Series power_output_exp = pd.Series(data=[0.0, 461.00290572, 0.0], name='feedin_power_plant') parameters['wind_speed'] = pd.Series(data=parameters['wind_speed']) assert_series_equal(power_curve(**parameters), power_output_exp) parameters['density'] = pd.Series(data=parameters['density']) assert_series_equal(power_curve(**parameters), power_output_exp) parameters['power_curve_wind_speeds'] = pd.Series( data=parameters['power_curve_wind_speeds']) parameters['power_curve_values'] = pd.Series( data=parameters['power_curve_values']) assert_series_equal(power_curve(**parameters), power_output_exp) # Raise TypeErrors due to wrong type of `density_correction` with pytest.raises(TypeError): parameters['density'] = 'wrong_type' power_curve(**parameters)
def test_power_curve_6(self): """TODO: Explain this test""" self.parameters2["density"] = np.array(self.parameters2["density"]) assert_allclose(power_curve(**self.parameters2), self.power_output_exp2) assert isinstance(power_curve(**self.parameters2), np.ndarray)
def test_power_curve_9(self): """TODO: Explain this test""" self.parameters2["density"] = pd.Series( data=self.parameters2["density"]) assert_series_equal(power_curve(**self.parameters2), self.power_output_exp2)