{"record":{"id":"f25e557ab7b96c58","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-f25e55","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_alstm_ts.py","lineNumber":216,"sourceCode":"                loss = self.loss_fn(pred, label, weight.to(self.device))\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        reweighter=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        if reweighter is None:\n            wl_train = np.ones(len(dl_train))\n            wl_valid = np.ones(len(dl_valid))\n        elif isinstance(reweighter, Reweighter):\n            wl_train = reweighter.reweight(dl_train)\n            wl_valid = reweighter.reweight(dl_valid)\n        else:\n            raise ValueError(\"Unsupported reweighter type.\")\n\n        train_loader = DataLoader(\n            ConcatDataset(dl_train, wl_train),\n            batch_size=self.batch_size,\n            shuffle=True,\n            num_workers=self.n_jobs,","sourceCodeStart":198,"sourceCodeEnd":234,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_alstm_ts.py#L198-L234","documentation":"At the start of fit(), ALSTMTSModel prepares both the 'train' and 'valid' segments of the DatasetH and immediately checks .empty on each. If either DataFrame comes back empty, it raises ValueError with this message, because training or early-stopping validation on zero rows is impossible. The root cause is almost always in the dataset configuration (segments date ranges, instruments, handler), not the model.","triggerScenarios":"Calling fit(dataset) where dataset.prepare('train' ...) or dataset.prepare('valid' ...) returns an empty DataFrame: date segment outside the handler's data coverage, an instrument list whose stocks have no data in range, a handler with learn/process labels that drop every row, or a misnamed segment key.","commonSituations":"Calendaring mistakes such as segments: valid ending before the data starts; using an instrument file for a different market/exchange; a DataHandler config whose label expression yields all-NaN so processed labels drop all rows; switching from alpha158/alpha360 datasets with incompatible date ranges.","solutions":["Print dataset.prepare('train', col_set=['feature','label']) and the 'valid' equivalent before fit() to see which segment is empty.","Fix the segments in your DatasetH config so train and valid ranges overlap actual data in the underlying QlibDataLoader.","Verify the instruments argument resolves to stock codes that exist in your dumped qlib data directory.","Check handler label/process_drop_rows configuration is not removing every row (e.g. all-NaN labels)."],"exampleFix":"# before\nsegments = {'train': ('2010-01-01', '2012-12-31'), 'valid': ('2030-01-01', '2031-12-31')}\n\n# after\nsegments = {'train': ('2010-01-01', '2012-12-31'), 'valid': ('2013-01-01', '2014-12-31')}","handlingStrategy":"validation","validationCode":"for seg in ('train', 'valid'):\n    df = dataset.prepare(seg, col_set=['feature', 'label'], data_key='learn')\n    if df.empty:\n        raise RuntimeError(f\"segment '{seg}' is empty; fix segments/instruments config before fit\")","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if 'Empty data from dataset' in str(e):\n        # inspect dataset.prepare('train'/'valid') and correct segment/instrument config, then retry\n        ...\n    raise","preventionTips":["Always assert non-empty prepared segments before fit() in pipeline code.","Keep segment date ranges within the calendar coverage of your dumped qlib data.","Smoke-test dataset preparation in a unit test whenever dataset config changes."],"tags":["qlib","dataset","config-validation","empty-data","training"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}