microsoft/qlib · error · ValueError

The type of dataset is not DatasetH instead of

Error message

The type of dataset is not DatasetH instead of {:}

What it means

MultiSegRecord (qlib/contrib/workflow/record_temp.py) generates predictions per segment by calling model.predict(dataset, segment) and dataset.prepare(segments=..., ...), both of which are DatasetH APIs. The constructor therefore enforces isinstance(dataset, DatasetH) and raises ValueError naming the actual type otherwise.

Solutions

  1. Build your dataset with DatasetH (qlib.data.dataset.DatasetH) before creating MultiSegRecord
  2. If you use a custom dataset, either inherit from DatasetH or use a RecordTemp subclass that calls your own predict/prepare API
  3. Make sure you pass the dataset object itself, not its handler or the underlying DataFrame

Example fix

# before
from qlib.data.dataset.handler import DataHandlerLP
rec = MultiSegRecord(model=model, dataset=my_handler)

# after
from qlib.data.dataset import DatasetH
dataset = DatasetH(handler=my_handler, segments={"train": (...), "test": (...)})
rec = MultiSegRecord(model=model, dataset=dataset)
Defensive patterns

Strategy: type-guard

Validate before calling

from qlib.data.dataset import DatasetH

assert isinstance(dataset, DatasetH), f'MultiSegRecord needs DatasetH, got {type(dataset).__name__}'
rec = MultiSegRecord(model=model, dataset=dataset)

Type guard

from qlib.data.dataset import DatasetH

def is_dataset_h(obj) -> bool:
    return isinstance(obj, DatasetH)

Prevention

When it happens

Trigger: Passing anything other than a qlib.data.dataset.DatasetH instance to MultiSegRecord(model=..., dataset=...) — e.g. a plain DataFrame, a custom dataset class, or an DatasetH subclass imported from a different module path (isinstance still passes for real subclasses).

Common situations: Wiring record templates into a custom workflow whose dataset is a user-defined class; passing the handler instead of the dataset by mistake; newer qlib refactorings splitting DatasetH across modules.

Related errors


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/18cd37d787d57494. Report an issue: GitHub.

Appendix: source

Thrown at qlib/contrib/workflow/record_temp.py:28

from ...contrib.eva.alpha import calc_ic
from ...workflow.record_temp import RecordTemp
from ...workflow.record_temp import SignalRecord
from ...data import dataset as qlib_dataset
from ...log import get_module_logger

logger = get_module_logger("workflow", logging.INFO)


class MultiSegRecord(RecordTemp):
    """
    This is the multiple segments signal record class that generates the signal prediction.
    This class inherits the ``RecordTemp`` class.
    """

    def __init__(self, model, dataset, recorder=None):
        super().__init__(recorder=recorder)
        if not isinstance(dataset, qlib_dataset.DatasetH):
            raise ValueError("The type of dataset is not DatasetH instead of {:}".format(type(dataset)))
        self.model = model
        self.dataset = dataset

    def generate(self, segments: Dict[Text, Any], save: bool = False):
        for key, segment in segments.items():
            predics = self.model.predict(self.dataset, segment)
            if isinstance(predics, pd.Series):
                predics = predics.to_frame("score")
            labels = self.dataset.prepare(
                segments=segment, col_set="label", data_key=qlib_dataset.handler.DataHandlerLP.DK_R
            )
            # Compute the IC and Rank IC
            ic, ric = calc_ic(predics.iloc[:, 0], labels.iloc[:, 0])
            results = {"all-IC": ic, "mean-IC": ic.mean(), "all-Rank-IC": ric, "mean-Rank-IC": ric.mean()}
            logger.info("--- Results for {:} ({:}) ---".format(key, segment))
            ic_x100, ric_x100 = ic * 100, ric * 100
            logger.info("IC: {:.4f}%".format(ic_x100.mean()))
            logger.info("ICIR: {:.4f}%".format(ic_x100.mean() / ic_x100.std()))

View on GitHub (pinned to 79633dd950)