{"record":{"id":"500abacd6c561504","repo":"microsoft/qlib","slug":"the-size-of-fields-must-be-greater-than-0","errorCode":null,"errorMessage":"The size of fields must be greater than 0","messagePattern":"The size of fields must be greater than 0","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/data/dataset/loader.py","lineNumber":97,"sourceCode":"                    \"group_name1\": <fields_info1>\n                    \"group_name2\": <fields_info2>\n                }\n                or\n                <config> := <fields_info>\n\n                <fields_info> := [\"expr\", ...] | ([\"expr\", ...], [\"col_name\", ...])\n                # NOTE: list or tuple will be treated as the things when parsing\n        \"\"\"\n        self.is_group = isinstance(config, dict)\n\n        if self.is_group:\n            self.fields = {grp: self._parse_fields_info(fields_info) for grp, fields_info in config.items()}\n        else:\n            self.fields = self._parse_fields_info(config)\n\n    def _parse_fields_info(self, fields_info: Union[list, tuple]) -> Tuple[list, list]:\n        if len(fields_info) == 0:\n            raise ValueError(\"The size of fields must be greater than 0\")\n\n        if not isinstance(fields_info, (list, tuple)):\n            raise TypeError(\"Unsupported type\")\n\n        if isinstance(fields_info[0], str):\n            exprs = names = fields_info\n        elif isinstance(fields_info[0], (list, tuple)):\n            exprs, names = fields_info\n        else:\n            raise NotImplementedError(f\"This type of input is not supported\")\n        return exprs, names\n\n    @abc.abstractmethod\n    def load_group_df(\n        self,\n        instruments,\n        exprs: list,\n        names: list,","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/data/dataset/loader.py#L79-L115","documentation":"The data loaders (e.g. QlibDataLoader and friends) parse a `fields` config of the form [expr...] or ([expr...], [names...]). An empty fields list has no expressions to load, so `_parse_fields_info` raises ValueError immediately at loader construction.","triggerScenarios":"Passing `data_loader={'class': 'QlibDataLoader', 'kwargs': {'fields': [], ...}}` to DatasetH, or a fields list that a generator/feature-selection step returned empty.","commonSituations":"Automated feature pruning / selection pipelines that can return zero surviving features; YAML template configs where the fields block was left empty as a placeholder.","solutions":["Provide at least one expression: fields=['$close'] or the (exprs, names) tuple form.","Guard feature-generation code: raise your own descriptive error when selection returns []."],"exampleFix":"# before\nloader_kwargs = {'fields': [], 'names': []}\n\n# after\nloader_kwargs = {'fields': ['$close', '$volume'], 'names': ['close', 'volume']}","handlingStrategy":"validation","validationCode":"def valid_fields_config(fields_info) -> bool:\n    return isinstance(fields_info, (list, tuple)) and len(fields_info) > 0","typeGuard":"def is_nonempty_fields(cfg) -> bool:\n    return bool(cfg) if isinstance(cfg, (list, tuple)) else bool(cfg and all(bool(v) for v in cfg.values()))","tryCatchPattern":null,"preventionTips":["Assert non-empty fields when configs are generated dynamically.","Treat an empty feature-selection result as a pipeline error, not a pass-through."],"tags":["fields","loader","validation"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}