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

LocalTransformerModel.fit requires non-empty train and valid segments. dataset.prepare over ['train','valid','test'] with feature/label columns (DK_L) must return rows for at least train and valid; otherwise the run aborts with this dataset-config ValueError before training.

Source

Thrown at qlib/contrib/model/pytorch_localformer.py:170

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

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

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

        x_train, y_train = df_train["feature"], df_train["label"]
        x_valid, y_valid = df_valid["feature"], df_valid["label"]

        save_path = get_or_create_path(save_path)
        stop_steps = 0
        train_loss = 0
        best_score = -np.inf
        best_epoch = 0
        evals_result["train"] = []
        evals_result["valid"] = []

        # train
        self.logger.info("training...")
        self.fitted = True

        for step in range(self.n_epochs):
            self.logger.info("Epoch%d:", step)

View on GitHub (pinned to 79633dd950)

Solutions

  1. Verify dataset.prepare('train'/'valid') are non-empty and fix segment definitions
  2. Confirm data exists for the configured instruments and date range
  3. Check handler processors are not dropping every row (e.g. extreme dropna after normalization)

Example fix

# before
model.fit(dataset)

# after
for seg in ("train", "valid"):
    df = dataset.prepare(seg, col_set=["feature", "label"])
    assert not df.empty, f"{seg} is empty"
model.fit(dataset)
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)
    if df.empty:
        raise RuntimeError(f"{seg} empty; fix dataset segments or data")

Try / catch

try:
    model.fit(dataset)
except ValueError as e:
    if "Empty data" in str(e):
        raise RuntimeError("Dataset config produced empty train/valid") from e
    raise

Prevention

When it happens

Trigger: fit(dataset) with an empty train or valid frame: bad segment dates, unresolved instruments, or features/labels reduced to nothing by the data handler.

Common situations: Calendar mismatch between segments and dumped data; wrong provider_uri in qlib.init; handler processors (e.g. dropna) removing all rows.

Related errors


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