{"record":{"id":"7794784516e6ba47","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-779478","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/double_ensemble.py","lineNumber":70,"sourceCode":"        if not len(sub_weights) == num_models:\n            raise ValueError(\"The length of sub_weights should be equal to num_models.\")\n        self.sub_weights = sub_weights\n        self.epochs = epochs\n        self.logger = get_module_logger(\"DEnsembleModel\")\n        self.logger.info(\"Double Ensemble Model...\")\n        self.ensemble = []  # the current ensemble model, a list contains all the sub-models\n        self.sub_features = []  # the features for each sub model in the form of pandas.Index\n        self.params = {\"objective\": loss}\n        self.params.update(kwargs)\n        self.loss = loss\n        self.early_stopping_rounds = early_stopping_rounds\n\n    def fit(self, dataset: DatasetH):\n        df_train, df_valid = dataset.prepare(\n            [\"train\", \"valid\"], col_set=[\"feature\", \"label\"], 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        # initialize the sample weights\n        N, F = x_train.shape\n        weights = pd.Series(np.ones(N, dtype=float))\n        # initialize the features\n        features = x_train.columns\n        pred_sub = pd.DataFrame(np.zeros((N, self.num_models), dtype=float), index=x_train.index)\n        # train sub-models\n        for k in range(self.num_models):\n            self.sub_features.append(features)\n            self.logger.info(\"Training sub-model: ({}/{})\".format(k + 1, self.num_models))\n            model_k = self.train_submodel(df_train, df_valid, weights, features)\n            self.ensemble.append(model_k)\n            # no further sample re-weight and feature selection needed for the last sub-model\n            if k + 1 == self.num_models:\n                break\n\n            self.logger.info(\"Retrieving loss curve and loss values...\")","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/double_ensemble.py#L52-L88","documentation":"Thrown by DEnsembleModel.fit when dataset.prepare returns an empty train or valid segment. Double Ensemble trains a sequence of LightGBM sub-models each validated on the 'valid' segment with early stopping, so both splits must contain rows.","triggerScenarios":"Calling fit with a DatasetH whose 'train' or 'valid' segment is empty after learn-time processing (DK_L), e.g. date ranges outside the calendar, an over-aggressive dropna processor, or a missing 'valid' segment.","commonSituations":"Same family of config mistakes as other GBM models: bad start_time/end_time, handler segments not overlapping data, processors eliminating all rows, or forgetting the valid segment is mandatory here.","solutions":["Check dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\").shape for seg in ['train','valid'] before fit","Fix handler start/end times to overlap the loaded data","Review learn-processors for filters/dropna that empty the frame"],"exampleFix":"# before\nmodel.fit(dataset)  # ValueError: Empty data from dataset\n\n# after\nassert all(len(dataset.prepare(s, col_set=[\"feature\",\"label\"], data_key=\"learn\"]) > 0 for s in [\"train\", \"valid\"])\nmodel.fit(dataset)","handlingStrategy":"validation","validationCode":"for seg in [\"train\", \"valid\"]:\n    df = dataset.prepare(seg, col_set=[\"feature\",\"label\"], data_key=\"learn\")\n    assert not df.empty, f\"segment '{seg}' is empty; check dataset config\"","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if \"Empty data\" in str(e):\n        # log segment shapes and abort rather than retry\n        ...\n    raise","preventionTips":["Validate segment shapes before every fit in experiment harnesses","Keep handler date ranges synchronized with the data calendar"],"tags":["double-ensemble","dataset-config","empty-data","qlib"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}