{"record":{"id":"528e72938f9c754d","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-528e72","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/gbdt.py","lineNumber":39,"sourceCode":"            raise NotImplementedError\n        self.params = {\"objective\": loss, \"verbosity\": -1}\n        self.params.update(kwargs)\n        self.early_stopping_rounds = early_stopping_rounds\n        self.num_boost_round = num_boost_round\n        self.model = None\n\n    def _prepare_data(self, dataset: DatasetH, reweighter=None) -> List[Tuple[lgb.Dataset, str]]:\n        \"\"\"\n        The motivation of current version is to make validation optional\n        - train segment is necessary;\n        \"\"\"\n        ds_l = []\n        assert \"train\" in dataset.segments\n        for key in [\"train\", \"valid\"]:\n            if key in dataset.segments:\n                df = dataset.prepare(key, col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n                if df.empty:\n                    raise ValueError(\"Empty data from dataset, please check your dataset config.\")\n                x, y = df[\"feature\"], df[\"label\"]\n\n                # Lightgbm need 1D array as its label\n                if y.values.ndim == 2 and y.values.shape[1] == 1:\n                    y = np.squeeze(y.values)\n                else:\n                    raise ValueError(\"LightGBM doesn't support multi-label training\")\n\n                if reweighter is None:\n                    w = None\n                elif isinstance(reweighter, Reweighter):\n                    w = reweighter.reweight(df)\n                else:\n                    raise ValueError(\"Unsupported reweighter type.\")\n                ds_l.append((lgb.Dataset(x.values, label=y, weight=w, free_raw_data=False), key))\n        return ds_l\n\n    def fit(","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/gbdt.py#L21-L57","documentation":"Thrown by LGBModel._prepare_data when a present segment ('train' or, if defined, 'valid') yields an empty DataFrame from dataset.prepare at learn time. Unlike CatBoost, this model iterates over segments that exist and only requires 'train' (there is an assert for it); the error means a segment that exists in config still produced zero rows.","triggerScenarios":"Calling fit with a 'train' segment whose date range has no data; DK_L processing dropping all rows; an over-restrictive instrument filter (e.g. market filter matching nothing).","commonSituations":"Bad start_time/end_time in handler config; stock-pool/filter config selecting no instruments; NaN-heavy features removed by learn processors.","solutions":["Inspect dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\").shape for each segment before fit","Correct handler date ranges and instrument selection to overlap loaded data","Check learn processors (dropna etc.) are not removing every row"],"exampleFix":"# before\nmodel.fit(dataset)  # ValueError: Empty data from dataset\n\n# after\nfor seg in dataset.segments:\n    df = dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\")\n    assert not df.empty, f\"{seg} empty\"\nmodel.fit(dataset)","handlingStrategy":"validation","validationCode":"assert \"train\" in dataset.segments\nfor seg in dataset.segments:\n    if seg in (\"train\", \"valid\"):\n        assert not dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\").empty, f\"{seg} is empty\"","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if \"Empty data\" in str(e):\n        for seg in dataset.segments:\n            print(seg, dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\").shape)\n    raise","preventionTips":["Validate every segment's shape before fit","Ensure date ranges and instrument filters match the loaded data"],"tags":["lightgbm","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"}