{"record":{"id":"547a0a77376ef404","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-547a0a","errorCode":null,"errorMessage":"Empty data from dataset, please check your dataset config.","messagePattern":"Empty data from dataset, please check your dataset config\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"critical","filePath":"qlib/contrib/model/pytorch_gats_ts.py","lineNumber":242,"sourceCode":"            pred = self.GAT_model(feature.float())\n            loss = self.loss_fn(pred, label)\n            losses.append(loss.item())\n\n            score = self.metric_fn(pred, label)\n            scores.append(score.item())\n\n        return np.mean(losses), np.mean(scores)\n\n    def fit(\n        self,\n        dataset,\n        evals_result=dict(),\n        save_path=None,\n    ):\n        dl_train = dataset.prepare(\"train\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n        dl_valid = dataset.prepare(\"valid\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n        if dl_train.empty or dl_valid.empty:\n            raise ValueError(\"Empty data from dataset, please check your dataset config.\")\n\n        dl_train.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\n        dl_valid.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\n\n        sampler_train = DailyBatchSampler(dl_train)\n        sampler_valid = DailyBatchSampler(dl_valid)\n\n        train_loader = DataLoader(dl_train, sampler=sampler_train, num_workers=self.n_jobs, drop_last=True)\n        valid_loader = DataLoader(dl_valid, sampler=sampler_valid, num_workers=self.n_jobs, drop_last=True)\n\n        save_path = get_or_create_path(save_path)\n\n        stop_steps = 0\n        train_loss = 0\n        best_score = -np.inf\n        best_epoch = 0\n        evals_result[\"train\"] = []\n        evals_result[\"valid\"] = []","sourceCodeStart":224,"sourceCodeEnd":260,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_gats_ts.py#L224-L260","documentation":"GATsTSModel.fit() prepares the 'train' and 'valid' segments as time-series dataloaders and raises ValueError if either is empty, before any DailyBatchSampler or DataLoader is built. The ts variant slices fixed-length history windows, so an empty segment can also result from a valid range shorter than the step/history length even when raw data exists.","triggerScenarios":"fit(dataset) with an empty train or valid DataFrame: segment dates outside data coverage, no matching instruments, handler dropping all rows, or a valid segment too short for the TSDataHandler's step size to produce any sample.","commonSituations":"Short valid windows (e.g. one month) that get fully consumed by history-window lookback; instrument lists for a different market; date-format parsing issues in segment config; alpha360-style handlers needing long history before the first usable sample.","solutions":["Manually check dataset.prepare('train', ...) and dataset.prepare('valid', ...) for emptiness.","Widen the valid segment or shift its start earlier so at least one full history window fits.","Verify instruments and date ranges against your dumped qlib data.","Reduce the handler's step/history length if it exceeds the segment length."],"exampleFix":"# before\nsegments = {'train': ('2010-01-01', '2014-12-31'), 'valid': ('2015-01-01', '2015-01-10')}\n\n# after\nsegments = {'train': ('2010-01-01', '2014-12-31'), 'valid': ('2015-01-01', '2015-06-30')}","handlingStrategy":"validation","validationCode":"for seg in ('train', 'valid'):\n    dl = dataset.prepare(seg, col_set=['feature', 'label'], data_key='learn')\n    if dl.empty:\n        raise RuntimeError(f\"segment '{seg}' empty before fit; check segments and history-window length\")","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if 'Empty data from dataset' in str(e):\n        # shorten handler step or widen segments, then retry\n        ...\n    raise","preventionTips":["For time-series models, ensure each segment is longer than the handler's history/step length.","Pre-check prepared segments in pipeline code.","Keep a minimal known-good dataset integration test to validate config changes."],"tags":["qlib","dataset","empty-data","time-series","gats-ts"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}