from typing import Any, Collection, Mapping, Union
import pandas as pd
from ._multi_case_timer import CandFunc, MultiCaseTimer
from ._util import plot_run, to_dataframe
[docs]def run_multivariate_test(
candidate_method: Union[CandFunc, Collection[CandFunc], Mapping[str, CandFunc]],
test_data: Union[Any, Mapping[str, Any]],
time_per_candidate: float = 6.0,
plot: bool = True,
**figure_kwargs: Any,
) -> pd.DataFrame:
"""Run performance tests for multiple candidate methods on collections of test data.
This is a convenience method which combines :meth:`MultiCaseTimer.run() <rics.performance.MultiCaseTimer.run>`,
:meth:`~rics.performance.to_dataframe` and -- if plotting is enabled -- :meth:`~rics.performance.plot_run`. For full
functionally these methods should be use directly.
Args:
candidate_method: Candidate methods to evaluate.
test_data: Test data to evaluate.
time_per_candidate: Desired runtime for each repetition per candidate label.
plot: If ``True``, plot a figure using :meth:`~rics.performance.plot_run`.
**figure_kwargs: Keyword arguments for the barplot. Ignored if ``plot=False``.
Returns:
A long-format DataFrame of results.
Raises:
ModuleNotFoundError: If Seaborn isn't installed and ``plot=True``.
"""
run_results = MultiCaseTimer(candidate_method, test_data).run(time_per_candidate=time_per_candidate)
data = to_dataframe(run_results)
if plot:
from matplotlib.pyplot import show
plot_run(data, **figure_kwargs)
show(block=False)
else:
pass # pragma: no cover
return data