{"record":{"id":"b08c6a48c54a845f","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset","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/catboost_model.py","lineNumber":44,"sourceCode":"        self.model = None\n\n    def fit(\n        self,\n        dataset: DatasetH,\n        num_boost_round=1000,\n        early_stopping_rounds=50,\n        verbose_eval=20,\n        evals_result=dict(),\n        reweighter=None,\n        **kwargs,\n    ):\n        df_train, df_valid = dataset.prepare(\n            [\"train\", \"valid\"],\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        x_train, y_train = df_train[\"feature\"], df_train[\"label\"]\n        x_valid, y_valid = df_valid[\"feature\"], df_valid[\"label\"]\n\n        # CatBoost needs 1D array as its label\n        if y_train.values.ndim == 2 and y_train.values.shape[1] == 1:\n            y_train_1d, y_valid_1d = np.squeeze(y_train.values), np.squeeze(y_valid.values)\n        else:\n            raise ValueError(\"CatBoost doesn't support multi-label training\")\n\n        if reweighter is None:\n            w_train = None\n            w_valid = None\n        elif isinstance(reweighter, Reweighter):\n            w_train = reweighter.reweight(df_train).values\n            w_valid = reweighter.reweight(df_valid).values\n        else:\n            raise ValueError(\"Unsupported reweighter type.\")\n","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/catboost_model.py#L26-L62","documentation":"Thrown by CatBoostModel.fit when dataset.prepare returns an empty train or valid DataFrame. CatBoost requires both a training and a validation split (the fit call requests [\"train\", \"valid\"] with DK_L data) because it uses eval_set with use_best_model=True and early stopping. If either segment yields zero rows after the handler's learn-time processing, the model refuses to train.","triggerScenarios":"Calling CatBoostModel.fit(dataset) where the DatasetH config lacks a 'valid' segment, has misaligned dates (train/valid ranges outside the calendar data), or where the learn-processing pipeline (data_key=DataHandlerLP.DK_L) drops all rows (e.g. dropna in process_type).","commonSituations":"Wrong handler start/end dates in the data handler config; segments defined over a date range with no traded instruments; a processor that filters out all samples; forgetting that CatBoost — unlike gbdt.py — makes the 'valid' segment mandatory.","solutions":["Verify dataset.segments contains both 'train' and 'valid' and each is non-empty: print(dataset.prepare('train').shape, dataset.prepare('valid').shape)","Check the data handler's start_time/end_time overlap the loaded bin data (calendar range)","Inspect processors in the handler config for dropna/filters that remove every row at learn time (DK_L)","If no validation data is available, switch to LGBModel (gbdt.py) which treats 'valid' as optional"],"exampleFix":"# before\nmodel = CatBoostModel()\nmodel.fit(dataset)  # ValueError: Empty data from dataset\n\n# after\n# ensure segments cover real dates and yield rows\nprint({seg: dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\").shape for seg in dataset.segments})\nmodel.fit(dataset)","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 and not df_valid.empty, \"train/valid segments are empty; check dataset config\"","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if \"Empty data\" in str(e):\n        raise RuntimeError(f\"Dataset segments empty: {dataset.segments}\") from e\n    raise","preventionTips":["Assert both 'train' and 'valid' segments are non-empty before fitting CatBoostModel — validation is mandatory for it","Validate handler start_time/end_time overlap the calendar data at workflow startup","Log dataset.prepare shapes for every segment in experiment scripts"],"tags":["catboost","dataset-config","empty-data","qlib"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}