{"record":{"id":"50c569f2097c7fc3","repo":"microsoft/qlib","slug":"empty-data-from-dataset-please-check-your-dataset-50c569","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_localformer_ts.py","lineNumber":149,"sourceCode":"                pred = self.model(feature.float())  # .float()\r\n                loss = self.loss_fn(pred, label)\r\n                losses.append(loss.item())\r\n\r\n                score = self.metric_fn(pred, label)\r\n                scores.append(score.item())\r\n\r\n        return np.mean(losses), np.mean(scores)\r\n\r\n    def fit(\r\n        self,\r\n        dataset: DatasetH,\r\n        evals_result=dict(),\r\n        save_path=None,\r\n    ):\r\n        dl_train = dataset.prepare(\"train\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\r\n        dl_valid = dataset.prepare(\"valid\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\r\n        if dl_train.empty or dl_valid.empty:\r\n            raise ValueError(\"Empty data from dataset, please check your dataset config.\")\r\n\r\n        dl_train.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\r\n        dl_valid.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\r\n\r\n        train_loader = DataLoader(\r\n            dl_train, batch_size=self.batch_size, shuffle=True, num_workers=self.n_jobs, drop_last=True\r\n        )\r\n        valid_loader = DataLoader(\r\n            dl_valid, batch_size=self.batch_size, shuffle=False, num_workers=self.n_jobs, drop_last=True\r\n        )\r\n\r\n        save_path = get_or_create_path(save_path)\r\n\r\n        stop_steps = 0\r\n        train_loss = 0\r\n        best_score = -np.inf\r\n        best_epoch = 0\r\n        evals_result[\"train\"] = []\r","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_localformer_ts.py#L131-L167","documentation":"LOCALTransformerModel.fit() prepares the 'train' and 'valid' segments (col_set=['feature','label'], data_key=DK_L) and immediately checks emptiness. If either prepared handler is empty it raises ValueError('Empty data from dataset, please check your dataset config.') before building DataLoaders — training cannot proceed on zero rows.","triggerScenarios":"model.fit(dataset) where dataset.prepare('train') or dataset.prepare('valid') returns an empty handler: segments whose date ranges select no data, a data handler with no instruments/dates loaded, or a learned/processed handler whose filters removed everything.","commonSituations":"Segments (train/valid) whose start/end dates fall outside the calibrated data range; handler created with instruments that were all dropped; DK_L (learned) data key empty because a prior processor consumed all rows; timezone/date-format mistakes in segment definitions.","solutions":["Inspect dataset.prepare('train', col_set=['feature','label'], data_key='learn') and the 'valid' equivalent directly — confirm which one is empty and check its index length.","Fix the segment date ranges in your DatasetH/handler config so they overlap the actual data calendar.","Verify the underlying data handler actually loaded data: check the raw dataframe (data_handler.fetch) is non-empty and your instrument list survives filtering.","If a processor dropped all rows (e.g. dropna-style processing), loosen it or extend the segment window."],"exampleFix":"# before\nhandler = Alpha158(instruments=instruments, start_time='2025-01-01', end_time='2025-01-31')\ndataset = DatasetH(handler, segments={'train': ('2024-01-01','2024-12-31'), ...})  # no data in range\nmodel.fit(dataset)  # ValueError: Empty data from dataset\n\n# after\ndataset = DatasetH(handler, segments={'train': ('2025-01-01','2025-01-15'), 'valid': ('2025-01-16','2025-01-31')})\nmodel.fit(dataset)","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}' prepared empty; fix segment/handler config before fit\")","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if \"Empty data\" in str(e):\n        # inspect dataset.prepare('train'/'valid') emptiness and fix segments/handler\n        raise\n    raise","preventionTips":["Always print dataset.segments and the handler's date coverage before fitting.","Align segment windows with the trading calendar actually present in the data.","Unit-test that prepare() returns non-empty frames for every segment in your config.","Watch processors that drop rows (dropna-style) — they can empty small segments."],"tags":["pytorch","qlib","dataset","data-config","transformer"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}