{"record":{"id":"074e95388bbb89c0","repo":"microsoft/qlib","slug":"data-storage-should-be-pd-dataframe-hashingstockst","errorCode":null,"errorMessage":"data_storage should be pd.DataFrame|HashingStockStorage, not {type(data_storage)}","messagePattern":"data_storage should be pd\\.DataFrame\\|HashingStockStorage, not (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"qlib/data/dataset/handler.py","lineNumber":318,"sourceCode":"                get_module_logger(\"DataHandlerLP\").info(f\"Fail to converting to query to slice. It will used directly\")\n\n        if isinstance(data_storage, pd.DataFrame):\n            data_df = data_storage\n            if proc_func is not None:\n                # FIXME: fetching by time first will be more friendly to `proc_func`\n                # Copy in case of `proc_func` changing the data inplace....\n                data_df = proc_func(fetch_df_by_index(data_df, selector, level, fetch_orig=self.fetch_orig).copy())\n                data_df = fetch_df_by_col(data_df, col_set)\n            else:\n                # Fetch column  first will be more friendly to SepDataFrame\n                data_df = fetch_df_by_col(data_df, col_set)\n                data_df = fetch_df_by_index(data_df, selector, level, fetch_orig=self.fetch_orig)\n        elif isinstance(data_storage, BaseHandlerStorage):\n            if proc_func is not None:\n                raise ValueError(f\"proc_func is not supported by the storage {type(data_storage)}\")\n            data_df = data_storage.fetch(selector=selector, level=level, col_set=col_set, fetch_orig=self.fetch_orig)\n        else:\n            raise TypeError(f\"data_storage should be pd.DataFrame|HashingStockStorage, not {type(data_storage)}\")\n\n        if squeeze:\n            # squeeze columns\n            data_df = data_df.squeeze()\n            # squeeze index\n            if isinstance(selector, (str, pd.Timestamp)):\n                data_df = data_df.reset_index(level=level, drop=True)\n        return data_df\n\n    def get_cols(self, col_set=DataHandlerABC.CS_ALL) -> list:\n        \"\"\"\n        get the column names\n\n        Parameters\n        ----------\n        col_set : str\n            select a set of meaningful columns.(e.g. features, columns)\n","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/data/dataset/handler.py#L300-L336","documentation":"DataHandler.init/check of its data storage accepts only two kinds: a pd.DataFrame (classic in-memory handler) or a `BaseHandlerStorage` implementation (e.g. HashingStockStorage). Anything else — a path string, numpy array, dict, None — raises TypeError at fetch time.","triggerScenarios":"Setting `data_handler._data = '/path/to/data'` or constructing a handler subclass whose setup_data leaves _data as a non-DataFrame (e.g. a loader object or None after a failed load).","commonSituations":"Custom handler subclasses that skip calling super().setup_data, or partial loads that fail silently leaving None; passing file paths where a loaded object is expected.","solutions":["Ensure setup_data actually loads a pd.DataFrame into _data (call super().setup_data in overrides).","Wrap raw arrays: `pd.DataFrame(arr, columns=..., index=pd.MultiIndex.from_product([...]))`.","For out-of-core needs, pass a HashingStockStorage instance."],"exampleFix":"# before\nhandler._data = np.load('features.npy')\n\n# after\nimport pandas as pd\nhandler._data = pd.DataFrame(np.load('features.npy'), columns=['$close'], index=idx)","handlingStrategy":"type-guard","validationCode":"import pandas as pd\nfrom qlib.data.dataset.handler import BaseHandlerStorage\n\ndef is_valid_storage(obj) -> bool:\n    return isinstance(obj, (pd.DataFrame, BaseHandlerStorage))","typeGuard":"import pandas as pd\nfrom qlib.data.dataset.handler import BaseHandlerStorage\n\ndef is_valid_storage(obj) -> bool:\n    return isinstance(obj, pd.DataFrame) or isinstance(obj, BaseHandlerStorage)","tryCatchPattern":null,"preventionTips":["In handler subclasses, always populate _data via super().setup_data.","Validate storage type right after setup_data in custom code."],"tags":["data-handler","storage","type-error"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}