{"record":{"id":"76cf1ea96ff27271","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-76cf1e","errorCode":null,"errorMessage":"Empty data from dataset, please check your dataset config.","messagePattern":"Empty data from dataset, please check your dataset config\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_sandwich.py","lineNumber":314,"sourceCode":"\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: DatasetH,\n        evals_result=dict(),\n        save_path=None,\n    ):\n        df_train, df_valid, df_test = dataset.prepare(\n            [\"train\", \"valid\", \"test\"],\n            col_set=[\"feature\", \"label\"],\n            data_key=DataHandlerLP.DK_L,\n        )\n        if df_train.empty or df_valid.empty:\n            raise ValueError(\"Empty data from dataset, please check your dataset config.\")\n\n        x_train, y_train = df_train[\"feature\"], df_train[\"label\"]\n        x_valid, y_valid = df_valid[\"feature\"], df_valid[\"label\"]\n\n        save_path = get_or_create_path(save_path)\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\"] = []\n\n        # train\n        self.logger.info(\"training...\")\n        self.fitted = True\n\n        for step in range(self.n_epochs):\n            self.logger.info(\"Epoch%d:\", step)","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_sandwich.py#L296-L332","documentation":"Raised by SANDWICH model fit() in qlib/contrib/model/pytorch_sandwich.py:314 when the train or valid DataFrame returned by dataset.prepare(['train','valid','test'], ...) is empty. This is a data/config guard: it means the DatasetH segments produced zero rows (bad date ranges, missing instruments, or wrong segment names), not a model bug.","triggerScenarios":"Workflow handler_config with date ranges outside the dumped bin data; segments named differently than what the dataset defines (prepare returns empty); an expression filter that drops all samples; forgetting qlib.dump_bin / using an uninitialized provider so no data is found.","commonSituations":"Wrong calendar (e.g. CSI300 dates against a CSI500 dump); train/valid segments swapped with custom names never registered in DatasetH; learning/valid boundaries set beyond the data end date; running without qlib.init() or with a broken provider URI.","solutions":["Inspect dataset.prepare('train', col_set=['feature','label']) yourself in a REPL to see which segment is empty and why.","Fix segment date ranges in the handler/dataset config so they overlap the dumped data calendar.","Run qlib.init() with the correct provider_uri and verify data exists with qlib.data.calendar and instrument checking.","Register custom segment names on the DatasetH (kwargs.segments) so prepare can resolve them."],"exampleFix":"# before\nsegments:\n  train: [2010-01-01, 2020-12-31]   # data dump ends 2018\n\n# after\nsegments:\n  train: [2010-01-01, 2016-12-31]\n  valid: [2017-01-01, 2018-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 ValueError(f\"Segment '{seg}' is empty; fix handler/dataset config before fit()\")","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if \"Empty data\" in str(e):\n        for seg in (\"train\", \"valid\"):\n            print(seg, dataset.prepare(seg, col_set=[\"feature\", \"label\"]).shape)\n        raise\n    raise","preventionTips":["Smoke-test each segment with dataset.prepare(...).empty before launching long training runs.","Keep segment boundaries within the dumped data calendar (verify with qlib.calendar).","Always qlib.init() with a provider_uri you have verified contains your instruments."],"tags":["qlib","dataset","empty-data","config","data-validation","sandwich"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}