{"record":{"id":"6f09b6ef0d3991f5","repo":"microsoft/qlib","slug":"unsupported-reweighter-type-6f09b6","errorCode":null,"errorMessage":"Unsupported reweighter type.","messagePattern":"Unsupported reweighter type\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_gru_ts.py","lineNumber":222,"sourceCode":"        save_path=None,\n        reweighter=None,\n    ):\n        dl_train = dataset.prepare(\"train\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n        dl_valid = dataset.prepare(\"valid\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n        if dl_train.empty or dl_valid.empty:\n            raise ValueError(\"Empty data from dataset, please check your dataset config.\")\n\n        dl_train.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\n        dl_valid.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\n\n        if reweighter is None:\n            wl_train = np.ones(len(dl_train))\n            wl_valid = np.ones(len(dl_valid))\n        elif isinstance(reweighter, Reweighter):\n            wl_train = reweighter.reweight(dl_train)\n            wl_valid = reweighter.reweight(dl_valid)\n        else:\n            raise ValueError(\"Unsupported reweighter type.\")\n\n        train_loader = DataLoader(\n            ConcatDataset(dl_train, wl_train),\n            batch_size=self.batch_size,\n            shuffle=True,\n            num_workers=self.n_jobs,\n            drop_last=True,\n        )\n        valid_loader = DataLoader(\n            ConcatDataset(dl_valid, wl_valid),\n            batch_size=self.batch_size,\n            shuffle=False,\n            num_workers=self.n_jobs,\n            drop_last=True,\n        )\n\n        save_path = get_or_create_path(save_path)\n","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_gru_ts.py#L204-L240","documentation":"Raised in GRUModelTS.fit when `reweighter` is neither None nor a qlib.model.base.Reweighter instance. The TS DataLoader pairs each sample with a weight from this reweighter, so the type check is strict isinstance-based; a callable or array is rejected.","triggerScenarios":"fit(dataset, reweighter=lambda df: ...) or passing a numpy weight array; also passing a Reweighter-like duck-typed object that does not subclass Reweighter.","commonSituations":"Custom sample weighting implemented as a plain function; migrating code that passed sample_weight arrays to sklearn-style APIs.","solutions":["Wrap weighting logic in a qlib.model.base.Reweighter subclass implementing reweight(df).","Pass reweighter=None for uniform weights."],"exampleFix":"# before\nmodel.fit(dataset, reweighter=np.linspace(0.1, 1.0, n))  # ValueError\n\n# after\nfrom qlib.model.base import Reweighter\nclass LinearReweighter(Reweighter):\n    def reweight(self, df):\n        return np.linspace(0.1, 1.0, len(df))\nmodel.fit(dataset, reweighter=LinearReweighter())","handlingStrategy":"type-guard","validationCode":"from qlib.model.base import Reweighter\nassert reweighter is None or isinstance(reweighter, Reweighter), \"reweighter must be None or Reweighter instance\"","typeGuard":"from qlib.model.base import Reweighter\n\ndef is_valid_reweighter(r) -> bool:\n    return r is None or isinstance(r, Reweighter)","tryCatchPattern":"try:\n    model.fit(dataset, reweighter=reweighter)\nexcept ValueError as e:\n    if \"Unsupported reweighter type\" in str(e):\n        model.fit(dataset)\n    else:\n        raise","preventionTips":["Always subclass qlib.model.base.Reweighter for custom weighting; isinstance is enforced.","Pass reweighter=None when weighting is not needed."],"tags":["qlib","reweighter","type-check","api-misuse"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}