microsoft/qlib · error · NotImplementedError

Please implement the `create_exp` method.

Error message

Please implement the `create_exp` method.

What it means

ExpManager.create_exp is abstract: it must create an experiment with a unique name and return an Experiment object (raising ExpAlreadyExistError on duplicates in concrete backends). The base stub raising NotImplementedError means no concrete manager (e.g. MLflowExpManager) performed the creation.

Source

Thrown at qlib/workflow/expm.py:136

    def create_exp(self, experiment_name: Optional[Text] = None):
        """
        Create an experiment.

        Parameters
        ----------
        experiment_name : str
            the experiment name, which must be unique.

        Returns
        -------
        An experiment object.

        Raise
        -----
        ExpAlreadyExistError
        """
        raise NotImplementedError(f"Please implement the `create_exp` method.")

    def search_records(self, experiment_ids=None, **kwargs):
        """
        Get a pandas DataFrame of records that fit the search criteria of the experiment.
        Inputs are the search criteria user want to apply.

        Returns
        -------
        A pandas.DataFrame of records, where each metric, parameter, and tag
        are expanded into their own columns named metrics.*, params.*, and tags.*
        respectively. For records that don't have a particular metric, parameter, or tag, their
        value will be (NumPy) Nan, None, or None respectively.
        """
        raise NotImplementedError(f"Please implement the `search_records` method.")

    def get_exp(self, *, experiment_id=None, experiment_name=None, create: bool = True, start: bool = False):
        """
        Retrieve an experiment. This method includes getting an active experiment, and get_or_create a specific experiment.

View on GitHub (pinned to 79633dd950)

Solutions

  1. Keep C['exp_manager']['class'] = 'MLflowExpManager' (default) so creation goes to MLflow.
  2. Implement create_exp(self, experiment_name=None) in your subclass, raising ExpAlreadyExistError on duplicates.
  3. Use R.get_exp(experiment_name=..., create=True) which handles creation through the concrete manager.

Example fix

# before
ExpManager().create_exp('alpha158')  # NotImplementedError

# after
exp = R.get_exp(experiment_name='alpha158', create=True)  # via MLflowExpManager
Defensive patterns

Strategy: type-guard

Validate before calling

from qlib.workflow.expm import ExpManager
assert R.exp_manager.__class__.create_exp is not ExpManager.create_exp, 'creation unsupported'

Type guard

def manager_can_create(mgr) -> bool:
    from qlib.workflow.expm import ExpManager
    return mgr.__class__.create_exp is not ExpManager.create_exp

Prevention

When it happens

Trigger: exp_manager.create_exp('name') on a bare ExpManager; get_exp(create=True) routing creation through a custom manager subclass that lacks create_exp.

Common situations: Custom manager backends under construction; config switched away from MLflowExpManager while workflow code still assumes experiment auto-creation.

Related errors


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