WindFMForecaster
WindFM zero-shot forecaster for wind power data.
This forecaster wraps WindFM [1], a foundation model for wind power forecasting [2], through the sktime forecasting interface. This implementation is inference-only and uses the upstream WindFMPredictor preprocessing and autoregressive inference path internally.
Quickstart
from sktime.forecasting.windfm import WindFMForecaster
estimator = WindFMForecaster(model_path='NeoQuasar/WindFM', tokenizer_path='NeoQuasar/WindFM-Tokenizer', device='cpu', columns=None, freq='1h', start='2000-01-01', clip=5.0, predict_kwargs=None, deterministic=False)Parameters(9)
- model_pathstr, default=”NeoQuasar/WindFM”
Hugging Face repository identifier or local path for the WindFM model. The default is the WindFM checkpoint [3]. Other released checkpoints include WindFM-robust [4].
- tokenizer_pathstr, default=”NeoQuasar/WindFM-Tokenizer”
Hugging Face repository identifier or local path for the WindFM tokenizer. The default is the WindFM-Tokenizer checkpoint [5]. The released WindFM-Tokenizer-robust is also available [6].
- devicestr, default=”cpu”
- Device used for model and tokenizer inference.
- columnslist of str or None, default=None
Optional mapping from columns in
Xto WindFM weather covariates. If provided, it must contain five entries ordered as"wind_speed","wind_direction","density","temperature", and"pressure". IfNone,Xmust contain the literal WindFM covariate names.- freqstr or pandas offset, default=”1h”
Frequency used to synthesize timestamps for WindFM when the training index is not a
pd.PeriodIndexorpd.DatetimeIndex. The default is one hour, matching the example data distributed by WindFM.- startstr or pd.Timestamp, default=”2000-01-01”
Start timestamp used with
freqto synthesize timestamps for WindFM when the training index is not datetime-like. The default date is arbitrary; it provides deterministic calendar fields for WindFM while keeping the synthetic timestamp path independent of the original index.- clipfloat, default=5.0
Input normalization clipping value passed to
WindFMPredictor.- predict_kwargsdict or None, default=None
Additional keyword arguments passed directly to
WindFMPredictor.predict. Examples areT,top_k,top_p,sample_count, andverbose.- deterministicbool, default=False
- Whether predictions should reset the PyTorch random seed before autoregressive sampling.
Examples
>>> import pandas as pd
>>> import torch
>>> from sktime.forecasting.base import ForecastingHorizon
>>> from sktime.forecasting.windfm import WindFMForecaster
>>> df = pd. read_csv (
... "https://raw.githubusercontent.com/shiyu-coder/WindFM/"
... "refs/heads/master/examples/data/121522.csv",
... parse_dates = ["time" ],
... index_col = "time",
... )
>>> lookback, pred_len = 240, 80
>>> covariate_cols = [
... "wind_speed",
... "wind_direction",
... "density",
... "temperature",
... "pressure",
... ]
>>> y_train = df ["power" ]. iloc [: lookback ]
>>> X_train = df [covariate_cols ]. iloc [: lookback ]
>>> fh = ForecastingHorizon (
... df. index [lookback: lookback + pred_len ],
... is_relative = False,
... )
>>> device = "cuda:0" if torch. cuda. is_available () else "cpu"
>>> forecaster = WindFMForecaster (
... model_path = "NeoQuasar/WindFM",
... tokenizer_path = "NeoQuasar/WindFM-Tokenizer",
... # robust variants:
... # model_path="NeoQuasar/WindFM-robust",
... # tokenizer_path="NeoQuasar/WindFM-Tokenizer-robust",
... device = device,
... deterministic = True,
... predict_kwargs = {
... "T": 1.0,
... "top_k": 0,
... "top_p": 0.9,
... "sample_count": 100,
... "verbose": True,
... },
... )
>>> forecaster. fit (y_train, X = X_train) WindFMForecaster(
... )
>>> y_pred = forecaster. predict (fh = fh)
>>> y_quantiles = forecaster. predict_quantiles (
... fh = fh,
... alpha = [0.1, 0.5, 0.9 ],
... )References
WindFM GitHub repository: https://github.com/shiyu-coder/WindFM
Hang Fan, Yu Shi, Zongliang Fu, Shuo Chen, Wei Wei, Wei Xu, Jian Li (2025). WindFM: An Open-Source Foundation Model for Zero-Shot Wind Power Forecasting. arXiv. https://arxiv.org/abs/2509.06311
WindFM model card: https://huggingface.co/NeoQuasar/WindFM
WindFM-robust model card: https://huggingface.co/NeoQuasar/WindFM-robust
WindFM-Tokenizer model card: https://huggingface.co/NeoQuasar/WindFM-Tokenizer
WindFM-Tokenizer-robust model card: https://huggingface.co/NeoQuasar/WindFM-Tokenizer-robust