{"record":{"id":"3230e1f138d2f55b","repo":"microsoft/qlib","slug":"datahandlerlp-has-not-attribute-data-please-set","errorCode":null,"errorMessage":"DataHandlerLP has not attribute _data, please set drop_raw = False if you want to use raw data","messagePattern":"DataHandlerLP has not attribute _data, please set drop_raw = False if you want to use raw data","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"qlib/data/dataset/handler.py","lineNumber":667,"sourceCode":"        # init raw data\n        super().setup_data(**kwargs)\n\n        with TimeInspector.logt(\"fit & process data\"):\n            if init_type == DataHandlerLP.IT_FIT_IND:\n                self.fit()\n                self.process_data()\n            elif init_type == DataHandlerLP.IT_LS:\n                self.process_data()\n            elif init_type == DataHandlerLP.IT_FIT_SEQ:\n                self.fit_process_data()\n            else:\n                raise NotImplementedError(f\"This type of input is not supported\")\n\n        # TODO: Be able to cache handler data. Save the memory for data processing\n\n    def _get_df_by_key(self, data_key: DATA_KEY_TYPE = DataHandlerABC.DK_I) -> pd.DataFrame:\n        if data_key == self.DK_R and self.drop_raw:\n            raise AttributeError(\n                \"DataHandlerLP has not attribute _data, please set drop_raw = False if you want to use raw data\"\n            )\n        df = getattr(self, self.ATTR_MAP[data_key])\n        return df\n\n    def fetch(\n        self,\n        selector: Union[pd.Timestamp, slice, str] = slice(None, None),\n        level: Union[str, int] = \"datetime\",\n        col_set=DataHandler.CS_ALL,\n        data_key: DATA_KEY_TYPE = DataHandler.DK_I,\n        squeeze: bool = False,\n        proc_func: Callable = None,\n    ) -> pd.DataFrame:\n        \"\"\"\n        fetch data from underlying data source\n\n        Parameters","sourceCodeStart":649,"sourceCodeEnd":685,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/data/dataset/handler.py#L649-L685","documentation":"DataHandlerLP with `drop_raw=True` deletes the original `_data` after processing to save memory. Later access to the raw key (`data_key=DataHandler.DK_R`, e.g. handler.fetch(..., data_key=DK_R) or get_infer_data-adjacent raw reads) raises AttributeError telling you to keep the raw data if you need it.","triggerScenarios":"Constructing a handler with `drop_raw: true` in config, then calling `handler.fetch(..., data_key=DataHandler.DK_R)` or anything requesting self.DK_R.","commonSituations":"Memory-tuned production configs that add drop_raw, while downstream code (e.g. some benchmarks or custom processors) still asks for raw data; also forgetting drop_raw was set in a base config.","solutions":["Set `drop_raw=False` in the handler config.","Or switch the request to DK_I (infer) / DK_L (learn) if raw is truly unneeded."],"exampleFix":"# before\nhandler = DataHandlerLP(..., drop_raw=True)\ndf = handler.fetch(data_key=DataHandler.DK_R)\n\n# after\nhandler = DataHandlerLP(..., drop_raw=False)\ndf = handler.fetch(data_key=DataHandler.DK_R)","handlingStrategy":"validation","validationCode":"from qlib.data.dataset.handler import DataHandler\n\ndef raw_available(handler) -> bool:\n    return not getattr(handler, 'drop_raw', False) or hasattr(handler, '_data')","typeGuard":"from qlib.data.dataset.handler import DataHandler\n\ndef can_fetch_raw(handler) -> bool:\n    return not getattr(handler, 'drop_raw', False)","tryCatchPattern":null,"preventionTips":["Only enable drop_raw when nothing downstream needs DK_R.","Grep your pipeline for data_key=DK_R before turning on drop_raw."],"tags":["memory","data-handler","config"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}