Overview: Wind Power Workflows¶
This example demonstrates how to use each of the three wind power workflows provided by RESKit.
Workflow:
- Import required packages
- Simulates wind turbine locations onshore and offshore using ECMWF's ERA5 database [1], with an optional correction loop to ensure that generated capacity factors for historic wind fleets meet reported generation/capacity based on Renewables Market Report [2] by the International Energy Agency (IEA).
- Simulates onshore wind generation in Europe using NASA's MERRA2 database
- Simulates offshore wind generation using NASA's MERRA2 database
In [1]:
Copied!
import reskit as rk
import pandas as pd
import reskit as rk
import pandas as pd
In [2]:
Copied!
### placement includes predefined capacity, hub height, rotor diameter and location (lon, lat) for different wind turbines
xds = rk.wind.wind_era5_PenaSanchezDunkelWinklerEtAl2025(
placements=pd.read_csv(rk.TEST_DATA["turbine_placements.csv"]),
era5_path=rk.TEST_DATA["era5-like"],
gwa_100m_path=rk.TEST_DATA["gwa100-like.tif"],
height_scaling_data={
50: rk.TEST_DATA["gwa50-like.tif"],
200: rk.TEST_DATA["gwa200-like.tif"],
},
)
# Mean value and standard deviation of the capacity factor across all placements
xds["capacity_factor"].values.mean(), xds["capacity_factor"].values.std()
### placement includes predefined capacity, hub height, rotor diameter and location (lon, lat) for different wind turbines
xds = rk.wind.wind_era5_PenaSanchezDunkelWinklerEtAl2025(
placements=pd.read_csv(rk.TEST_DATA["turbine_placements.csv"]),
era5_path=rk.TEST_DATA["era5-like"],
gwa_100m_path=rk.TEST_DATA["gwa100-like.tif"],
height_scaling_data={
50: rk.TEST_DATA["gwa50-like.tif"],
200: rk.TEST_DATA["gwa200-like.tif"],
},
)
# Mean value and standard deviation of the capacity factor across all placements
xds["capacity_factor"].values.mean(), xds["capacity_factor"].values.std()
2026-07-27 16:54:58.376392 Now extracting correction factors for a total of 560 placements from /home/docs/checkouts/readthedocs.org/user_builds/ethos-reskit/checkouts/align-docs-branding/reskit/wind/core/data/cf_correction_factors_PSDW2025.tif: 2026-07-27 16:54:58.407696 Based on max_batch_size=560, the total of 560 placements were split into 1 sub batches. Proceeding with batch 1/1 (id=0) with 560 placements. 2026-07-27 16:54:58.413708 Maximum rel. deviation after initial simulation is 0.2742, Number/share of placements with deviation > tolerance (0.01): 560/560. More iterations required. 2026-07-27 16:54:58.418845 Maximum rel. deviation after 1 additional iteration(s) is 0.0803, Number/share of placements with deviation > tolerance (0.01): 560/560. More iterations required. 2026-07-27 16:54:58.423954 Maximum rel. deviation after 2 additional iteration(s) is 0.0236, Number/share of placements with deviation > tolerance (0.01): 536/560. More iterations required. 2026-07-27 16:54:58.428717 Required tolerance of 0.01 reached after 3 additional iteration(s). Maximum remaining rel. deviation: 0.0099.
Out[2]:
(0.248575775, 0.26940074975331707)
In [3]:
Copied!
xds = rk.wind.onshore_wind_merra_ryberg2019_europe(
placements=pd.read_csv(rk.TEST_DATA["turbine_placements.csv"]),
merra_path=rk.TEST_DATA["merra-like"],
gwa_50m_path=rk.TEST_DATA["gwa50-like.tif"],
clc2012_path=rk.TEST_DATA["clc-aachen_clipped.tif"],
)
xds["capacity_factor"].values.mean(), xds["capacity_factor"].values.std()
xds = rk.wind.onshore_wind_merra_ryberg2019_europe(
placements=pd.read_csv(rk.TEST_DATA["turbine_placements.csv"]),
merra_path=rk.TEST_DATA["merra-like"],
gwa_50m_path=rk.TEST_DATA["gwa50-like.tif"],
clc2012_path=rk.TEST_DATA["clc-aachen_clipped.tif"],
)
xds["capacity_factor"].values.mean(), xds["capacity_factor"].values.std()
DeprecationWarning: /home/docs/checkouts/readthedocs.org/user_builds/ethos-reskit/checkouts/align-docs-branding/reskit/workflow_manager.py:413 'nan' value for 'nodata_fallback' is deprecated and will be removed soon. Use np.nan instead.
2026-07-27 16:55:00.851515 Based on max_batch_size=560, the total of 560 placements were split into 1 sub batches. Proceeding with batch 1/1 (id=0) with 560 placements. 2026-07-27 16:55:00.856635 Required tolerance of 0.01 reached after 0 additional iteration(s). Maximum remaining rel. deviation: 0.0.
RuntimeWarning: /home/docs/checkouts/readthedocs.org/user_builds/ethos-reskit/checkouts/align-docs-branding/reskit/wind/workflows/wind_workflow_manager.py:770 divide by zero encountered in divide
Out[3]:
(0.40453476151581985, 0.33833291495805234)
In [4]:
Copied!
xds = rk.wind.offshore_wind_merra_caglayan2019(
placements=pd.read_csv(rk.TEST_DATA["turbine_placements.csv"]),
merra_path=rk.TEST_DATA["merra-like"],
)
xds["capacity_factor"].values.mean(), xds["capacity_factor"].values.std()
xds = rk.wind.offshore_wind_merra_caglayan2019(
placements=pd.read_csv(rk.TEST_DATA["turbine_placements.csv"]),
merra_path=rk.TEST_DATA["merra-like"],
)
xds["capacity_factor"].values.mean(), xds["capacity_factor"].values.std()
2026-07-27 16:55:02.800354 Based on max_batch_size=560, the total of 560 placements were split into 1 sub batches. Proceeding with batch 1/1 (id=0) with 560 placements. 2026-07-27 16:55:02.805798 Required tolerance of 0.01 reached after 0 additional iteration(s). Maximum remaining rel. deviation: 0.0.
RuntimeWarning: /home/docs/checkouts/readthedocs.org/user_builds/ethos-reskit/checkouts/align-docs-branding/reskit/wind/workflows/wind_workflow_manager.py:770 divide by zero encountered in divide
Out[4]:
(0.5903571299452285, 0.33158702401102186)