microsoft/qlib · critical · ValueError

Empty data from dataset, please check your dataset config.

Error message

Empty data from dataset, please check your dataset config.

What it means

GATsModel.fit() prepares the 'train', 'valid', and 'test' segments in one call, then checks that df_train and df_valid are non-empty. If either is empty it raises ValueError before training starts. Like all qlib empty-data errors the cause is dataset scope (segments/instruments/handler), not the GAT model itself.

Source

Thrown at qlib/contrib/model/pytorch_gats.py:236

            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
        best_score = -np.inf
        best_epoch = 0
        evals_result["train"] = []
        evals_result["valid"] = []

        # load pretrained base_model
        if self.base_model == "LSTM":
            pretrained_model = LSTMModel()
        elif self.base_model == "GRU":
            pretrained_model = GRUModel()
        else:
            raise ValueError("unknown base model name `%s`" % self.base_model)

View on GitHub (pinned to 79633dd950)

Solutions

  1. Inspect dataset.prepare('train', col_set=['feature','label']) and the 'valid' result manually to identify the empty segment.
  2. Correct the segments config so train/valid ranges intersect the data covered by your Qlib data handler.
  3. Check the instruments list matches your data dump (market/instrument file).
  4. Ensure handler label expressions and drop-row processing leave usable rows.

Example fix

# before
segments = {'train': ('2008-01-01', '2010-12-31'), 'valid': ('2011-01-01', '2999-12-31')}

# after
segments = {'train': ('2008-01-01', '2010-12-31'), 'valid': ('2011-01-01', '2012-12-31')}
Defensive patterns

Strategy: validation

Validate before calling

for seg in ('train', 'valid'):
    df = dataset.prepare(seg, col_set=['feature', 'label'], data_key='learn')
    if df.empty:
        raise RuntimeError(f"segment '{seg}' is empty; check dataset config before fit")

Try / catch

try:
    model.fit(dataset)
except ValueError as e:
    if 'Empty data from dataset' in str(e):
        # log prepared segment shapes, fix segments/instruments, then retry fit
        ...
    raise

Prevention

When it happens

Trigger: fit(dataset) where dataset.prepare(['train','valid','test'], ...) yields an empty train or valid DataFrame: bad segment date ranges, instruments with no data, or handler processing dropping all rows.

Common situations: Valid segment dates falling outside the dumped qlib bin data range; wrong market instrument file; a custom handler whose label processing produces all-NaN and rows get dropped; date-string formats that silently parse to the wrong range.

Related errors


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