33
44from bencher .results .holoview_results .holoview_result import HoloviewResult
55
6+ from param import Parameter
7+ import hvplot .xarray # noqa pylint: disable=duplicate-code,unused-import
8+ import xarray as xr
9+ import pandas as pd
10+
611
712class TabulatorResult (HoloviewResult ):
813 def to_plot (self , ** kwargs ) -> pn .widgets .Tabulator : # pylint:disable=unused-argument
@@ -17,4 +22,54 @@ def to_plot(self, **kwargs) -> pn.widgets.Tabulator: # pylint:disable=unused-ar
1722 Returns:
1823 pn.widgets.Tabulator: An interactive table widget.
1924 """
20- return pn .widgets .Tabulator (self .to_pandas ())
25+ return self .to_tabulator (** kwargs )
26+
27+ def to_tabulator (self , result_var : Parameter = None , ** kwargs ) -> pn .widgets .Tabulator :
28+ """Generates a Tabulator widget from benchmark data.
29+
30+ This is a convenience method that calls to_tabulator_ds() with the same parameters.
31+
32+ Args:
33+ result_var (Parameter, optional): The result variable to include in the table. If None, uses the default.
34+ **kwargs: Additional keyword arguments passed to the Tabulator constructor.
35+
36+ Returns:
37+ pn.widgets.Tabulator: An interactive table widget.
38+ """
39+ return self .filter (
40+ self .to_tabulator_ds ,
41+ result_var = result_var ,
42+ ** kwargs ,
43+ )
44+
45+ def to_tabulator_ds (
46+ self , dataset : xr .Dataset , result_var : Parameter , ** kwargs
47+ ) -> pn .widgets .Tabulator :
48+ """Creates a Tabulator widget from the provided dataset.
49+
50+ Given a filtered dataset, this method generates an interactive table visualization.
51+
52+ Args:
53+ dataset (xr.Dataset): The filtered dataset to visualize.
54+ result_var (Parameter): The result variable to include in the table.
55+ **kwargs: Additional keyword arguments passed to the Tabulator constructor.
56+
57+ Returns:
58+ pn.widgets.Tabulator: An interactive table widget.
59+ """
60+
61+ # Assume input is an xarray.Dataset. Keep Dataset throughout.
62+ ds : xr .Dataset = dataset if isinstance (dataset , xr .Dataset ) else xr .Dataset (dataset )
63+
64+ # Step 1: If a result variable is specified, select it and keep as Dataset
65+ if result_var is not None and result_var .name in ds .data_vars :
66+ ds = ds [[result_var .name ]]
67+
68+ # Step 2: Build a flat pandas DataFrame
69+ if len (ds .dims ) == 0 :
70+ df = pd .DataFrame ({name : [da .values .item ()] for name , da in ds .data_vars .items ()})
71+ else :
72+ # N-D: to DataFrame and reset the index so coordinates become columns
73+ df = ds .to_dataframe ().reset_index ()
74+
75+ return pn .widgets .Tabulator (df , ** kwargs )
0 commit comments