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
- Inspect dataset.prepare('train', col_set=['feature','label']) and the 'valid' result manually to identify the empty segment.
- Correct the segments config so train/valid ranges intersect the data covered by your Qlib data handler.
- Check the instruments list matches your data dump (market/instrument file).
- 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
- Pre-check all prepared segments in pipeline setup code.
- Validate segment date ranges against the data calendar at config load time.
- Use integration tests over a tiny known-good dataset to catch scope regressions.
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
- Empty data from dataset, please check your dataset config.
- optimizer {} is not supported!
- unknown loss `%s`
- unknown metric `%s`
- unknown base model name `%s`
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/333a7744083e366a.
Report an issue: GitHub.