{"record":{"id":"dd4c508ef884b9b0","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-dd4c50","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":"error","filePath":"qlib/contrib/model/pytorch_tcts.py","lineNumber":247,"sourceCode":"            pred = self.fore_model(feature)\n            loss = torch.mean((pred - label[:, abs(self.target_label)]) ** 2)\n            losses.append(loss.item())\n\n        return np.mean(losses)\n\n    def fit(\n        self,\n        dataset: DatasetH,\n        verbose=True,\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        x_test, y_test = df_test[\"feature\"], df_test[\"label\"]\n\n        if save_path is None:\n            save_path = get_or_create_path(save_path)\n        best_loss = np.inf\n        while best_loss > self.lowest_valid_performance:\n            if best_loss < np.inf:\n                print(\"Failed! Start retraining.\")\n                self.seed = random.randint(0, 1000)  # reset random seed\n\n            if self.seed is not None:\n                np.random.seed(self.seed)\n                torch.manual_seed(self.seed)\n\n            best_loss = self.training(","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_tcts.py#L229-L265","documentation":"Thrown at the top of TCTSModel.fit after preparing the train/valid/test segments. If the prepared train or valid DataFrame is empty (zero rows), there is nothing to learn from or validate against, so fit aborts immediately with this ValueError. Note it checks segments prepared with data_key=DK_L (learn-process data).","triggerScenarios":"Calling fit(dataset) where dataset.prepare(['train','valid','test'], col_set=['feature','label'])[0 or 1] returns an empty DataFrame: misconfigured date ranges (segments outside the underlying calendar), segments named wrongly, or a handler whose processors dropped every row.","commonSituations":"Segment dates that don't overlap the loaded bar data (wrong market/exchange calendar, wrong start/end); typo'd segment keys so prepare returns empty; DropnaProcessor/DropnaLabel removing all samples when labels are all-NaN for that window.","solutions":["Check the dataset segments: print(dataset.prepare('train').shape) and dataset.prepare('valid').shape and confirm both are non-empty.","Align segment date strings with the data calendar (e.g. shrink/shift 'train'/'valid' start and end into the range covered by the handler's data).","Inspect processors (dropna etc.) — if labels are all NaN in the window, choose a segment where labels exist or adjust the label processor.","Verify the data handler actually loaded data (check underlying df shape / data source config) before fitting."],"exampleFix":"# before\nsegments = {\"train\": (\"2010-01-01\", \"2012-12-31\"), ...}  # dates absent from loaded data\n\n# after\nsegments = {\"train\": (\"2017-01-01\", \"2019-12-31\"), ...}  # inside the handler's calendar\nassert not dataset.prepare(\"train\").empty and not dataset.prepare(\"valid\").empty","handlingStrategy":"validation","validationCode":"df_train = dataset.prepare(\"train\", col_set=[\"feature\", \"label\"], data_key=\"learn\")\ndf_valid = dataset.prepare(\"valid\", col_set=[\"feature\", \"label\"], data_key=\"learn\")\nassert not df_train.empty, \"train segment is empty — check segment dates/processors\"\nassert not df_valid.empty, \"valid segment is empty — check segment dates/processors\"","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if \"Empty data\" in str(e):\n        # inspect segments and data calendar, then fix config and retry\n        raise RuntimeError(\"Dataset segments empty; adjust segment dates / processors\") from e\n    raise","preventionTips":["Always assert non-empty prepared segments before fit in experiment drivers.","Cross-check segment date ranges against the handler's calendar coverage when setting up a new market/universe."],"tags":["qlib","dataset","data-quality","configuration"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}