def test_calculate_windturbine_power_output_realistic_values(self):
        power_v5 = weather_features.calculate_windturbine_power_output(5)
        self.assertAlmostEqual(power_v5, 0.11522159872442202)

        windspeed_v8 = weather_features.calculate_windturbine_power_output(8)
        self.assertAlmostEqual(windspeed_v8, 0.48838209152618717)

        # The generated  power should level off to the rated power for high wind speeds
        power_v100 = weather_features.calculate_windturbine_power_output(100)
        self.assertAlmostEqual(power_v100, 1)
def make_wind_forecast_pj(pj, context):
    """Make a wind prediction for a specific prediction job

    Args:
        pj: (dict) prediction job
    """
    context.logger.info("Get turbine data", turbine_type=pj["turbine_type"])
    turbine_data = context.database.get_power_curve(pj["turbine_type"])

    context.logger.info("Get windspeed",
                        location=[pj["lat"], pj["lon"]],
                        hub_height=pj["hub_height"])
    windspeed = context.database.get_wind_input(
        (pj["lat"], pj["lon"]),
        pj["hub_height"],
        pj["horizon_minutes"],
        pj["resolution_minutes"],
    )

    context.logger.info("Calculate windturbine power",
                        n_turbines=pj["n_turbines"])
    power = weather_features.calculate_windturbine_power_output(
        windspeed, pj["n_turbines"],
        turbine_data).rename(columns=dict(windspeed_100m="forecast"))

    context.logger.info("Store wind prediction in database")
    power["pid"] = pj["id"]
    power["type"] = "wind"
    power["algtype"] = "powerCurve"
    power["customer"] = pj["name"]
    power["description"] = pj["description"]
    context.database.write_forecast(power, t_ahead_series=True)
 def test_calculate_windturbine_power_output(self):
     windspeed = 20
     n_turbines = 1
     turbine_data = {"slope_center": 1, "rated_power": 1, "steepness": 0.1}
     power_output = weather_features.calculate_windturbine_power_output(
         windspeed, n_turbines, turbine_data)
     expected_power_output = 0.8698915256370021
     self.assertAlmostEqual(power_output, expected_power_output)
 def test_apply_power_curve_nan_wind(self):
     power = weather_features.calculate_windturbine_power_output(
         float("nan"))
     self.assertIsNAN(power)
 def test_calculate_windturbine_power_output_no_wind(self):
     power = weather_features.calculate_windturbine_power_output(0)
     self.assertAlmostEqual(power, 0, places=2)