microsoft/qlib · error · ValueError

Empty data from dataset, please check your dataset config.

Error message

Empty data from dataset, please check your dataset config.

What it means

Raised at the start of GRUModelTS.fit when either the train or valid segment prepared from a TSDatasetH is empty. The TS pipeline needs both segments to build DataLoaders immediately (both are configured with fillna_type and wrapped in DataLoader right after), so a missing/empty valid segment is fatal, unlike the tabular GRU.

Source

Thrown at qlib/contrib/model/pytorch_gru_ts.py:210

                loss = self.loss_fn(pred, label, weight.to(self.device))
                losses.append(loss.item())

                score = self.metric_fn(pred, label)
                scores.append(score.item())

        return np.mean(losses), np.mean(scores)

    def fit(
        self,
        dataset,
        evals_result=dict(),
        save_path=None,
        reweighter=None,
    ):
        dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
        dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
        if dl_train.empty or dl_valid.empty:
            raise ValueError("Empty data from dataset, please check your dataset config.")

        dl_train.config(fillna_type="ffill+bfill")  # process nan brought by dataloader
        dl_valid.config(fillna_type="ffill+bfill")  # process nan brought by dataloader

        if reweighter is None:
            wl_train = np.ones(len(dl_train))
            wl_valid = np.ones(len(dl_valid))
        elif isinstance(reweighter, Reweighter):
            wl_train = reweighter.reweight(dl_train)
            wl_valid = reweighter.reweight(dl_valid)
        else:
            raise ValueError("Unsupported reweighter type.")

        train_loader = DataLoader(
            ConcatDataset(dl_train, wl_train),
            batch_size=self.batch_size,
            shuffle=True,
            num_workers=self.n_jobs,

View on GitHub (pinned to 79633dd950)

Solutions

  1. Log len(dataset.prepare('train', ...)) and len(dataset.prepare('valid', ...)) before fit and fix whichever is 0.
  2. Ensure the valid segment has enough history for the rolling step windows of TSDatasetH (step length must fit inside the segment).
  3. Align segment dates with the bin-data calendar.

Example fix

# before
"segments": {
    "train": ("2008-01-01", "2014-12-31"),
    "valid": ("2015-01-01", "2015-12-31"),
}  # data starts 2010 -> valid windows empty after step

# after
"segments": {
    "train": ("2010-01-01", "2016-12-31"),
    "valid": ("2017-01-01", "2019-12-31"),
}
Defensive patterns

Strategy: validation

Validate before calling

for seg in ("train", "valid"):
    df = dataset.prepare(seg, col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
    assert not df.empty, f"TS segment '{seg}' is empty; check dates and step-window length"

Prevention

When it happens

Trigger: fit(dataset) where dataset.prepare("train" or "valid", ...) returns an empty DataFrame: segment dates outside the data calendar, step/hold-off settings leaving no valid samples, or wrong segment naming.

Common situations: TSDatasetH step windows consuming the tail of the calendar so the valid segment has no complete windows; date ranges beyond dumped data; missing "valid" key in segments.

Related errors


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/71dd76102252278e. Report an issue: GitHub.