windkit 1.0.2__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {windkit-1.0.2 → windkit-2.0.1}/CHANGELOG.md +57 -2
- windkit-2.0.1/PKG-INFO +137 -0
- windkit-2.0.1/README.md +66 -0
- windkit-2.0.1/pyproject.toml +113 -0
- windkit-2.0.1/setup.cfg +4 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/__init__.py +18 -3
- {windkit-1.0.2 → windkit-2.0.1}/windkit/_version.py +16 -3
- windkit-2.0.1/windkit/integrations/_earth_engine.py +337 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/__init__.py +1 -1
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/_colormaps.py +17 -16
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/elevation_map.py +2 -10
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/landcover_map.py +5 -13
- windkit-2.0.1/windkit/plot/time_series.py +254 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/__init__.py +1 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_bbox.py +1 -5
- windkit-2.0.1/windkit/spatial/_conversions.py +42 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_interpolation.py +27 -27
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_point.py +25 -30
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_struct.py +27 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/spatial.py +1 -1
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversions.py +13 -7
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/vector_map.py +6 -2
- windkit-2.0.1/windkit/tutorial_data.py +276 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/weibull.py +30 -15
- windkit-2.0.1/windkit/wind.py +968 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/binned_wind_climate.py +20 -6
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/generalized_wind_climate.py +0 -149
- windkit-2.0.1/windkit/wind_climate/geostrophic_wind_climate.py +178 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/time_series_wind_climate.py +22 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/wind_climate.py +48 -4
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_data.py +2 -2
- windkit-2.0.1/windkit/wind_farm/power_curve.py +124 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/uncertainty.py +4 -2
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/wind_turbine_generator.py +41 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/wind_turbines.py +143 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/metadata.py +13 -7
- {windkit-1.0.2 → windkit-2.0.1}/windkit.egg-info/SOURCES.txt +3 -1
- windkit-1.0.2/PKG-INFO +0 -93
- windkit-1.0.2/README.md +0 -45
- windkit-1.0.2/pyproject.toml +0 -14
- windkit-1.0.2/setup.cfg +0 -65
- windkit-1.0.2/windkit/integrations/_earth_engine.py +0 -241
- windkit-1.0.2/windkit/tutorial_data.py +0 -185
- windkit-1.0.2/windkit/wind.py +0 -469
- windkit-1.0.2/windkit/wind_climate/geostrophic_wind_climate.py +0 -75
- {windkit-1.0.2 → windkit-2.0.1}/LICENSE +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/_errors.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/_rvea_xml.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/_weibull_nb.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/cfd.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/config.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/all_vars.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/color_table_roughness.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/CGLS-LC100.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/CORINE.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/ESA_CCI.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/GWA4_micro.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/Globcover.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/MODIS.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/NEWA_micro_v2.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/WorldCover.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/loss_tables/dtu_loss_table.csv +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/map_file_header_to_epsg.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/map_file_header_to_epsg_read.json +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/data/uncertainty_tables/dtu_uncertainty_table.csv +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/import_manager.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/integrations/__init__.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/integrations/_gwa_map_api.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/integrations/_planetary_computer.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/__init__.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/_validation.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/mcp.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/regression.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/scores.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/_helpers.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/color.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/histogram.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/operational_curves.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/raster_plot.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/roughness_rose.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/vertical_profile.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/wind_rose.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/wind_turbine.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/README.md +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_crs.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_cuboid.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_dimensions.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_latitude.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_metpy_natural_neighbors.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_raster.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_utm.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_vector.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_vertical.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/decorators.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/__init__.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/_vectormap_gml.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/_vectormap_helpers.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/get_map.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/landcover.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/__init__.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/_polygons_constraints.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/helper_functions.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/lines_to_poly.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/poly_to_lines.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/raster_map.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/topography.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/utils.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/weng_workspace.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/__init__.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/predicted_wind_climate.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/weibull_wind_climate.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/__init__.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/loss.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/workspace.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/_validate.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/data_structures.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/direction.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/empty.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/sector.py +0 -0
- {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/wsbin.py +0 -0
|
@@ -2,7 +2,62 @@
|
|
|
2
2
|
|
|
3
3
|
All major changes are listed here.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## [2.0.1 (2026-01-29)](https://docs.wasp.dk/windkit/v2.0.1/)
|
|
6
|
+
|
|
7
|
+
### Highlights
|
|
8
|
+
|
|
9
|
+
#### Performance improvements
|
|
10
|
+
* Significantly reduced import time by lazy loading some packages and data. Should be approx 1/3 of previous import time.
|
|
11
|
+
|
|
12
|
+
#### Documentation
|
|
13
|
+
* Restructured user guide into focused, object-based documentation pages:
|
|
14
|
+
- Wind climates section with dedicated pages for TSWC, BWC, WWC, and GWC including I/O formats and usage examples
|
|
15
|
+
- Topography section with elevation, roughness, and landcover map documentation including format support tables
|
|
16
|
+
- Spatial section explaining point, stacked_point, raster, and cuboid structures with operation examples
|
|
17
|
+
- Wind farms section documenting wind turbine datasets and WTG objects
|
|
18
|
+
- New overview section with data structures, schemas, and tutorial data documentation
|
|
19
|
+
|
|
20
|
+
#### Sheer and veer functionality
|
|
21
|
+
|
|
22
|
+
* Added new function `wk.shear_extrapolate` to extrapolate wind speeds to different heights using a power law shear profile.
|
|
23
|
+
* Added new function `wk.shear_exponent` to calculate a shear exponent from wind speeds
|
|
24
|
+
* Added guidance about `wk.shear_exponent` into shear extrapolation example.
|
|
25
|
+
|
|
26
|
+
* Added new function `wk.veer_extrapolate` to extrapolate wind direction linearly to different heights, accounting for circular discontinuities.
|
|
27
|
+
* Added new function `wk.wind_veer` to calculate wind veer from wind direction
|
|
28
|
+
* Added guidance about `wk.wind_veer` into shear extrapolation example.
|
|
29
|
+
|
|
30
|
+
### Support for PyWAsP's Geostrophic wind climate objects
|
|
31
|
+
|
|
32
|
+
* new function `create_geowc`, which creates a dummy geostrophic wind climate
|
|
33
|
+
* functions `mean_wind_speed`, `mean_power_density`, `ws_freq_gt_mean`, `ws_cdf` and `mean_ws_moment` are now also working when a geostrophic wind climate is passed.
|
|
34
|
+
|
|
35
|
+
### New features
|
|
36
|
+
* Added new function `wk.extrapolate_to_height` to extrapolate wind climate objects to different heights. Currently, only works for time-series wind climates (TSWC).
|
|
37
|
+
* `wk.roughness_map_to_file` now allows to write to a old fashioned `.map` file for the special case where these is a single polygon and the external roughness length is not specified (None). For this case we assume that the external roughness length is the same as the roughness length inside the polygon.
|
|
38
|
+
* `wk.roughness_map_to_file` now allows users to write to a `.map` as long all displacement heights in the map are zero.
|
|
39
|
+
* For `wv_count` objects (thus also geostrophic wind climates) if all of the bins have nan's, the result of function `mean_wind_speed`, `mean_power_density`, `ws_freq_gt_mean` and `mean_ws_moment` operating on such a function is also nan, whereas before it would be 0.
|
|
40
|
+
* Added new function `wk.load_tutorial_data` to download and load tutorial data directly into memory as windkit-compatible objects (xarray.Dataset and geopandas.GeoDataFrame).
|
|
41
|
+
* Changed `wk.get_tutorial_data` to return a `Path` to the extracted tutorial data folder, allowing users to load files manually using windkit readers or generic loaders. The function now includes detailed docstrings describing all available files for each dataset, including .nc, .omwc, .wtg, .map, and .csv.
|
|
42
|
+
* Added `wk.read_wind_turbines` and `wk.wind_turbines_to_file` functions to read and write wind turbine datasets in various formats. Both only support CSV for now. The CSV should follow the windkit wind turbine format specification.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
### Bug fixes
|
|
46
|
+
* Fixed pixel misalignment when downloading raster maps from Google Earth Engine. Downloads now use `crs_transform` instead of `scale` to preserve exact pixel alignment with source datasets (e.g., Globcover, SRTM, WorldCover). This fixes half-pixel offsets (~150m for Globcover) and ~12-15m offsets for elevation data.
|
|
47
|
+
* Bugfix in `read_bwc`: it now opens `bwc` stored in netcdf correctly.
|
|
48
|
+
but some of this functionality was only available in pywasp, so it has been moved there.
|
|
49
|
+
* Fixed bug where a point dataset with several horizontal locations would be converted to a single horizontal location when using the function `to_stacked_point`
|
|
50
|
+
* bug fix to interpolation, which would create invalid spatial structures when a dimension was in exclude dims but not present in the target structure (e.g. when doing interpolation from `stacked_point` to `point`).
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
### Changes
|
|
54
|
+
* Changed default value of `use_bounds` to `True` in `wk.spatial.BBox.reproject` method.
|
|
55
|
+
|
|
56
|
+
### Breaking changes
|
|
57
|
+
|
|
58
|
+
* `spatial_interpolate_gwc` has been removed. This functionality is now only available in PyWAsP through its `interpolate_gwc` function.
|
|
59
|
+
|
|
60
|
+
## [1.0.2 (2025-07-21)](https://docs.wasp.dk/windkit/v1.0.2/)
|
|
6
61
|
|
|
7
62
|
WindKit 1.0.2 is a patch release to ensure consistent config and app data paths on windows. Both the config and app data paths are now set by default to ``C:\\Users\\<user>\\AppData\\Roaming\\DTU Wind Energy\\windkit``.
|
|
8
63
|
|
|
@@ -277,7 +332,7 @@ as required in the `stacked_point` structure.
|
|
|
277
332
|
* Switched configuration file from ini to toml, old file will be automatically migrated
|
|
278
333
|
|
|
279
334
|
|
|
280
|
-
## 0.8.0 (2024-06-10)
|
|
335
|
+
## [0.8.0 (2024-06-10)](https://docs.wasp.dk/windkit/v0.8.0/)
|
|
281
336
|
|
|
282
337
|
### New features
|
|
283
338
|
|
windkit-2.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: windkit
|
|
3
|
+
Version: 2.0.1
|
|
4
|
+
Summary: WindKit provides core functionalities for working with wind resource data
|
|
5
|
+
Author: DTU Wind Energy
|
|
6
|
+
License-Expression: BSD-3-Clause
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Requires-Python: >=3.11
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Dist: geopandas>=1.0
|
|
13
|
+
Requires-Dist: h5netcdf
|
|
14
|
+
Requires-Dist: lxml>=5.0
|
|
15
|
+
Requires-Dist: netcdf4>=1.6
|
|
16
|
+
Requires-Dist: numpy>=1.26
|
|
17
|
+
Requires-Dist: packaging>=23
|
|
18
|
+
Requires-Dist: pandas>=2.1
|
|
19
|
+
Requires-Dist: platformdirs>=4.3
|
|
20
|
+
Requires-Dist: pydantic>=2.7
|
|
21
|
+
Requires-Dist: pydantic-settings>=2.3
|
|
22
|
+
Requires-Dist: pyproj>=3.6
|
|
23
|
+
Requires-Dist: pyyaml
|
|
24
|
+
Requires-Dist: rasterio>=1.3
|
|
25
|
+
Requires-Dist: requests
|
|
26
|
+
Requires-Dist: rioxarray>=0.17
|
|
27
|
+
Requires-Dist: scipy>=1.12
|
|
28
|
+
Requires-Dist: shapely>=2.0
|
|
29
|
+
Requires-Dist: toml
|
|
30
|
+
Requires-Dist: xarray>=2023.9
|
|
31
|
+
Provides-Extra: plots
|
|
32
|
+
Requires-Dist: matplotlib>=3.8; extra == "plots"
|
|
33
|
+
Requires-Dist: plotly>=5.12.0; extra == "plots"
|
|
34
|
+
Requires-Dist: kaleido; extra == "plots"
|
|
35
|
+
Provides-Extra: performance
|
|
36
|
+
Requires-Dist: numba>=0.57.0; extra == "performance"
|
|
37
|
+
Provides-Extra: data-apis
|
|
38
|
+
Requires-Dist: adlfs; extra == "data-apis"
|
|
39
|
+
Requires-Dist: earthengine-api; extra == "data-apis"
|
|
40
|
+
Requires-Dist: fsspec; extra == "data-apis"
|
|
41
|
+
Requires-Dist: planetary-computer; extra == "data-apis"
|
|
42
|
+
Requires-Dist: pystac-client; extra == "data-apis"
|
|
43
|
+
Requires-Dist: zarr>2.15; extra == "data-apis"
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: dash; extra == "dev"
|
|
46
|
+
Requires-Dist: ipython; extra == "dev"
|
|
47
|
+
Requires-Dist: nbval; extra == "dev"
|
|
48
|
+
Requires-Dist: pre-commit; extra == "dev"
|
|
49
|
+
Requires-Dist: pytest; extra == "dev"
|
|
50
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
51
|
+
Requires-Dist: pytest-xdist; extra == "dev"
|
|
52
|
+
Requires-Dist: windIO; extra == "dev"
|
|
53
|
+
Provides-Extra: doc
|
|
54
|
+
Requires-Dist: docutils; extra == "doc"
|
|
55
|
+
Requires-Dist: jupyter; extra == "doc"
|
|
56
|
+
Requires-Dist: jupyter-dash; extra == "doc"
|
|
57
|
+
Requires-Dist: jupyter-sphinx; extra == "doc"
|
|
58
|
+
Requires-Dist: myst-parser; extra == "doc"
|
|
59
|
+
Requires-Dist: nbsphinx; extra == "doc"
|
|
60
|
+
Requires-Dist: nbsphinx-link; extra == "doc"
|
|
61
|
+
Requires-Dist: pydata-sphinx-theme; extra == "doc"
|
|
62
|
+
Requires-Dist: recommonmark; extra == "doc"
|
|
63
|
+
Requires-Dist: sphinx; extra == "doc"
|
|
64
|
+
Requires-Dist: sphinx-argparse; extra == "doc"
|
|
65
|
+
Requires-Dist: sphinx-copybutton; extra == "doc"
|
|
66
|
+
Requires-Dist: sphinx-design; extra == "doc"
|
|
67
|
+
Requires-Dist: sphinx-gallery; extra == "doc"
|
|
68
|
+
Requires-Dist: sphinxcontrib-bibtex; extra == "doc"
|
|
69
|
+
Requires-Dist: sphinxext-opengraph; extra == "doc"
|
|
70
|
+
Dynamic: license-file
|
|
71
|
+
|
|
72
|
+
# WindKit
|
|
73
|
+
|
|
74
|
+
[](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
|
|
75
|
+
[](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
|
|
76
|
+
[](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/releases)
|
|
77
|
+
[](LICENSE)
|
|
78
|
+
[](https://www.python.org/downloads/)
|
|
79
|
+
[](https://docs.wasp.dk/windkit)
|
|
80
|
+
|
|
81
|
+
[](https://pypi.org/project/windkit/)
|
|
82
|
+
[](https://pypi.org/project/windkit/)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
WindKit provides core functionalities for working with wind resource data, built on top of [xarray](https://xarray.dev/) and [geopandas](https://geopandas.org/).
|
|
86
|
+
|
|
87
|
+
## Installation
|
|
88
|
+
|
|
89
|
+
**pip:**
|
|
90
|
+
```bash
|
|
91
|
+
pip install windkit
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**conda:**
|
|
95
|
+
```bash
|
|
96
|
+
conda install -c https://conda.windenergy.dtu.dk/channel/open windkit
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Quick Start
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
import windkit as wk
|
|
103
|
+
|
|
104
|
+
# Read a binned wind climate
|
|
105
|
+
bwc = wk.read_bwc("hovsore.tab")
|
|
106
|
+
|
|
107
|
+
# Calculate mean wind speed
|
|
108
|
+
mean_ws = wk.mean_wind_speed(bwc)
|
|
109
|
+
print(f"Mean wind speed: {mean_ws.values:.2f} m/s")
|
|
110
|
+
|
|
111
|
+
# Fit Weibull distribution and convert to Weibull wind climate
|
|
112
|
+
wwc = wk.weibull_fit(bwc)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Features
|
|
116
|
+
|
|
117
|
+
- **Wind Climate I/O** - Read/write binned, Weibull, generalized, and time-series wind climates (NetCDF, .lib, .tab, .rsf, .wrg)
|
|
118
|
+
- **Map I/O** - Read/write elevation, roughness, and landcover maps (raster and vector formats)
|
|
119
|
+
- **WAsP Integration** - Read WAsP Workspace files and WAsP Engineering project files
|
|
120
|
+
- **Spatial Processing** - Clip, reproject, and interpolate spatial data with full CRS support
|
|
121
|
+
- **Wind Statistics** - Calculate mean wind speed, power density, Weibull parameters, and more
|
|
122
|
+
- **Plotting** - Interactive plots with Plotly, static plots with Matplotlib
|
|
123
|
+
- **Remote Data Access** - Download ERA5 reanalysis data and satellite-derived maps
|
|
124
|
+
|
|
125
|
+
## Documentation
|
|
126
|
+
|
|
127
|
+
Full documentation: [docs.wasp.dk/windkit](https://docs.wasp.dk/windkit)
|
|
128
|
+
|
|
129
|
+
Community forum: [WAsP Python tools](https://www.wasptechnical.dk/forum/forum/19-wasp-python-tools/)
|
|
130
|
+
|
|
131
|
+
## Contributing
|
|
132
|
+
|
|
133
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
|
|
134
|
+
|
|
135
|
+
## License
|
|
136
|
+
|
|
137
|
+
BSD-3-Clause - see [LICENSE](LICENSE) for details.
|
windkit-2.0.1/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# WindKit
|
|
2
|
+
|
|
3
|
+
[](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
|
|
4
|
+
[](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
|
|
5
|
+
[](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/releases)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://www.python.org/downloads/)
|
|
8
|
+
[](https://docs.wasp.dk/windkit)
|
|
9
|
+
|
|
10
|
+
[](https://pypi.org/project/windkit/)
|
|
11
|
+
[](https://pypi.org/project/windkit/)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
WindKit provides core functionalities for working with wind resource data, built on top of [xarray](https://xarray.dev/) and [geopandas](https://geopandas.org/).
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
**pip:**
|
|
19
|
+
```bash
|
|
20
|
+
pip install windkit
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**conda:**
|
|
24
|
+
```bash
|
|
25
|
+
conda install -c https://conda.windenergy.dtu.dk/channel/open windkit
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
import windkit as wk
|
|
32
|
+
|
|
33
|
+
# Read a binned wind climate
|
|
34
|
+
bwc = wk.read_bwc("hovsore.tab")
|
|
35
|
+
|
|
36
|
+
# Calculate mean wind speed
|
|
37
|
+
mean_ws = wk.mean_wind_speed(bwc)
|
|
38
|
+
print(f"Mean wind speed: {mean_ws.values:.2f} m/s")
|
|
39
|
+
|
|
40
|
+
# Fit Weibull distribution and convert to Weibull wind climate
|
|
41
|
+
wwc = wk.weibull_fit(bwc)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Features
|
|
45
|
+
|
|
46
|
+
- **Wind Climate I/O** - Read/write binned, Weibull, generalized, and time-series wind climates (NetCDF, .lib, .tab, .rsf, .wrg)
|
|
47
|
+
- **Map I/O** - Read/write elevation, roughness, and landcover maps (raster and vector formats)
|
|
48
|
+
- **WAsP Integration** - Read WAsP Workspace files and WAsP Engineering project files
|
|
49
|
+
- **Spatial Processing** - Clip, reproject, and interpolate spatial data with full CRS support
|
|
50
|
+
- **Wind Statistics** - Calculate mean wind speed, power density, Weibull parameters, and more
|
|
51
|
+
- **Plotting** - Interactive plots with Plotly, static plots with Matplotlib
|
|
52
|
+
- **Remote Data Access** - Download ERA5 reanalysis data and satellite-derived maps
|
|
53
|
+
|
|
54
|
+
## Documentation
|
|
55
|
+
|
|
56
|
+
Full documentation: [docs.wasp.dk/windkit](https://docs.wasp.dk/windkit)
|
|
57
|
+
|
|
58
|
+
Community forum: [WAsP Python tools](https://www.wasptechnical.dk/forum/forum/19-wasp-python-tools/)
|
|
59
|
+
|
|
60
|
+
## Contributing
|
|
61
|
+
|
|
62
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
BSD-3-Clause - see [LICENSE](LICENSE) for details.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "windkit"
|
|
7
|
+
description = "WindKit provides core functionalities for working with wind resource data"
|
|
8
|
+
readme = "README.md"
|
|
9
|
+
license = "BSD-3-Clause"
|
|
10
|
+
authors = [
|
|
11
|
+
{name = "DTU Wind Energy"}
|
|
12
|
+
]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
"Operating System :: OS Independent",
|
|
16
|
+
]
|
|
17
|
+
dynamic = ["version"]
|
|
18
|
+
requires-python = ">=3.11"
|
|
19
|
+
dependencies = [
|
|
20
|
+
"geopandas>=1.0",
|
|
21
|
+
"h5netcdf",
|
|
22
|
+
"lxml>=5.0",
|
|
23
|
+
"netcdf4>=1.6",
|
|
24
|
+
"numpy>=1.26",
|
|
25
|
+
"packaging>=23",
|
|
26
|
+
"pandas>=2.1",
|
|
27
|
+
"platformdirs>=4.3",
|
|
28
|
+
"pydantic>=2.7",
|
|
29
|
+
"pydantic-settings>=2.3",
|
|
30
|
+
"pyproj>=3.6",
|
|
31
|
+
"pyyaml",
|
|
32
|
+
"rasterio>=1.3",
|
|
33
|
+
"requests",
|
|
34
|
+
"rioxarray>=0.17",
|
|
35
|
+
"scipy>=1.12",
|
|
36
|
+
"shapely>=2.0",
|
|
37
|
+
"toml",
|
|
38
|
+
"xarray>=2023.9",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[project.optional-dependencies]
|
|
42
|
+
plots = [
|
|
43
|
+
"matplotlib>=3.8",
|
|
44
|
+
"plotly>=5.12.0",
|
|
45
|
+
"kaleido",
|
|
46
|
+
]
|
|
47
|
+
performance = [
|
|
48
|
+
"numba>=0.57.0",
|
|
49
|
+
]
|
|
50
|
+
data_apis = [
|
|
51
|
+
"adlfs",
|
|
52
|
+
"earthengine-api",
|
|
53
|
+
"fsspec",
|
|
54
|
+
"planetary-computer",
|
|
55
|
+
"pystac-client",
|
|
56
|
+
"zarr>2.15",
|
|
57
|
+
]
|
|
58
|
+
dev = [
|
|
59
|
+
"dash",
|
|
60
|
+
"ipython",
|
|
61
|
+
"nbval",
|
|
62
|
+
"pre-commit",
|
|
63
|
+
"pytest",
|
|
64
|
+
"pytest-cov",
|
|
65
|
+
"pytest-xdist",
|
|
66
|
+
"windIO",
|
|
67
|
+
]
|
|
68
|
+
doc = [
|
|
69
|
+
"docutils",
|
|
70
|
+
"jupyter",
|
|
71
|
+
"jupyter-dash",
|
|
72
|
+
"jupyter-sphinx",
|
|
73
|
+
"myst-parser",
|
|
74
|
+
"nbsphinx",
|
|
75
|
+
"nbsphinx-link",
|
|
76
|
+
"pydata-sphinx-theme",
|
|
77
|
+
"recommonmark",
|
|
78
|
+
"sphinx",
|
|
79
|
+
"sphinx-argparse",
|
|
80
|
+
"sphinx-copybutton",
|
|
81
|
+
"sphinx-design",
|
|
82
|
+
"sphinx-gallery",
|
|
83
|
+
"sphinxcontrib-bibtex",
|
|
84
|
+
"sphinxext-opengraph",
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
[project.scripts]
|
|
88
|
+
split_combomap = "windkit.topography.vector_map:_split_combo"
|
|
89
|
+
|
|
90
|
+
[tool.setuptools_scm]
|
|
91
|
+
write_to = "windkit/_version.py"
|
|
92
|
+
|
|
93
|
+
[tool.setuptools]
|
|
94
|
+
include-package-data = true
|
|
95
|
+
|
|
96
|
+
[tool.setuptools.packages.find]
|
|
97
|
+
namespaces = true
|
|
98
|
+
|
|
99
|
+
[tool.setuptools.package-data]
|
|
100
|
+
"windkit.data" = ["*.json"]
|
|
101
|
+
"windkit.data.landcover_tables" = ["*.json"]
|
|
102
|
+
"windkit.data.plot" = ["*.json"]
|
|
103
|
+
"windkit.data.loss_tables" = ["*.csv"]
|
|
104
|
+
"windkit.data.uncertainty_tables" = ["*.csv"]
|
|
105
|
+
|
|
106
|
+
[tool.pytest.ini_options]
|
|
107
|
+
minversion = "6.0"
|
|
108
|
+
norecursedirs = "dist build .tox"
|
|
109
|
+
testpaths = ["test",]
|
|
110
|
+
markers = [
|
|
111
|
+
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
112
|
+
"performance: marks tests as performance tests (run with '-m performance')",
|
|
113
|
+
]
|
windkit-2.0.1/setup.cfg
ADDED
|
@@ -20,6 +20,10 @@ __all__ = [
|
|
|
20
20
|
"vinterp_wind_speed",
|
|
21
21
|
"rotor_equivalent_wind_speed",
|
|
22
22
|
"tswc_resample",
|
|
23
|
+
"shear_extrapolate",
|
|
24
|
+
"shear_exponent",
|
|
25
|
+
"veer_extrapolate",
|
|
26
|
+
"wind_veer",
|
|
23
27
|
# Time Series Wind Climate
|
|
24
28
|
"validate_tswc",
|
|
25
29
|
"is_tswc",
|
|
@@ -50,10 +54,10 @@ __all__ = [
|
|
|
50
54
|
"create_gwc",
|
|
51
55
|
"read_gwc",
|
|
52
56
|
"gwc_to_file",
|
|
53
|
-
"spatial_interpolate_gwc",
|
|
54
57
|
# Geostrophic wind climate
|
|
55
58
|
"validate_geowc",
|
|
56
59
|
"is_geowc",
|
|
60
|
+
"create_geowc",
|
|
57
61
|
# Predicted Wind Climate
|
|
58
62
|
"create_pwc",
|
|
59
63
|
# Wind Climate
|
|
@@ -64,6 +68,7 @@ __all__ = [
|
|
|
64
68
|
"mean_wind_speed",
|
|
65
69
|
"mean_power_density",
|
|
66
70
|
"get_cross_predictions",
|
|
71
|
+
"extrapolate_to_height",
|
|
67
72
|
# Landcover
|
|
68
73
|
"LandCoverTable",
|
|
69
74
|
"get_landcover_table",
|
|
@@ -100,6 +105,8 @@ __all__ = [
|
|
|
100
105
|
"create_wind_turbines_from_dataframe",
|
|
101
106
|
"create_wind_turbines_from_arrays",
|
|
102
107
|
"wind_turbines_to_geodataframe",
|
|
108
|
+
"read_wind_turbines",
|
|
109
|
+
"wind_turbines_to_file",
|
|
103
110
|
# workspace
|
|
104
111
|
"Workspace",
|
|
105
112
|
# weng_workspace
|
|
@@ -137,6 +144,7 @@ __all__ = [
|
|
|
137
144
|
"total_uncertainty_factor",
|
|
138
145
|
# tutorial_data
|
|
139
146
|
"get_tutorial_data",
|
|
147
|
+
"load_tutorial_data",
|
|
140
148
|
]
|
|
141
149
|
|
|
142
150
|
from windkit._version import version as __version__
|
|
@@ -153,6 +161,10 @@ from windkit.wind import (
|
|
|
153
161
|
vinterp_wind_speed,
|
|
154
162
|
rotor_equivalent_wind_speed,
|
|
155
163
|
tswc_resample,
|
|
164
|
+
shear_extrapolate,
|
|
165
|
+
shear_exponent,
|
|
166
|
+
veer_extrapolate,
|
|
167
|
+
wind_veer,
|
|
156
168
|
)
|
|
157
169
|
from windkit.wind_climate.time_series_wind_climate import (
|
|
158
170
|
validate_tswc,
|
|
@@ -190,13 +202,13 @@ from windkit.wind_climate.generalized_wind_climate import (
|
|
|
190
202
|
create_gwc,
|
|
191
203
|
read_gwc,
|
|
192
204
|
gwc_to_file,
|
|
193
|
-
spatial_interpolate_gwc,
|
|
194
205
|
_reproject_gwc,
|
|
195
206
|
)
|
|
196
207
|
from windkit.wind_climate import generalized_wind_climate # noqa: F401
|
|
197
208
|
from windkit.wind_climate.geostrophic_wind_climate import (
|
|
198
209
|
validate_geowc,
|
|
199
210
|
is_geowc,
|
|
211
|
+
create_geowc,
|
|
200
212
|
)
|
|
201
213
|
from windkit.wind_climate import geostrophic_wind_climate # noqa: F401
|
|
202
214
|
from windkit.wind_climate.predicted_wind_climate import create_pwc
|
|
@@ -209,6 +221,7 @@ from windkit.wind_climate.wind_climate import (
|
|
|
209
221
|
mean_wind_speed,
|
|
210
222
|
mean_power_density,
|
|
211
223
|
get_cross_predictions,
|
|
224
|
+
extrapolate_to_height,
|
|
212
225
|
)
|
|
213
226
|
from windkit.cfd import read_cfdres
|
|
214
227
|
from windkit.wind_farm.wind_turbine_generator import (
|
|
@@ -228,6 +241,8 @@ from windkit.wind_farm.wind_turbines import (
|
|
|
228
241
|
create_wind_turbines_from_dataframe,
|
|
229
242
|
create_wind_turbines_from_arrays,
|
|
230
243
|
wind_turbines_to_geodataframe,
|
|
244
|
+
read_wind_turbines,
|
|
245
|
+
wind_turbines_to_file,
|
|
231
246
|
)
|
|
232
247
|
from windkit.workspace import Workspace
|
|
233
248
|
from windkit.weng_workspace import WengWorkspace
|
|
@@ -291,4 +306,4 @@ from windkit.xarray_structures.direction import (
|
|
|
291
306
|
from windkit.xarray_structures.wsbin import (
|
|
292
307
|
create_wsbin_coords,
|
|
293
308
|
)
|
|
294
|
-
from windkit.tutorial_data import get_tutorial_data
|
|
309
|
+
from windkit.tutorial_data import get_tutorial_data, load_tutorial_data
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
# file generated by setuptools-scm
|
|
2
2
|
# don't change, don't track in version control
|
|
3
3
|
|
|
4
|
-
__all__ = [
|
|
4
|
+
__all__ = [
|
|
5
|
+
"__version__",
|
|
6
|
+
"__version_tuple__",
|
|
7
|
+
"version",
|
|
8
|
+
"version_tuple",
|
|
9
|
+
"__commit_id__",
|
|
10
|
+
"commit_id",
|
|
11
|
+
]
|
|
5
12
|
|
|
6
13
|
TYPE_CHECKING = False
|
|
7
14
|
if TYPE_CHECKING:
|
|
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
|
|
|
9
16
|
from typing import Union
|
|
10
17
|
|
|
11
18
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
+
COMMIT_ID = Union[str, None]
|
|
12
20
|
else:
|
|
13
21
|
VERSION_TUPLE = object
|
|
22
|
+
COMMIT_ID = object
|
|
14
23
|
|
|
15
24
|
version: str
|
|
16
25
|
__version__: str
|
|
17
26
|
__version_tuple__: VERSION_TUPLE
|
|
18
27
|
version_tuple: VERSION_TUPLE
|
|
28
|
+
commit_id: COMMIT_ID
|
|
29
|
+
__commit_id__: COMMIT_ID
|
|
19
30
|
|
|
20
|
-
__version__ = version = '
|
|
21
|
-
__version_tuple__ = version_tuple = (
|
|
31
|
+
__version__ = version = '2.0.1'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 0, 1)
|
|
33
|
+
|
|
34
|
+
__commit_id__ = commit_id = None
|