Source code for openstef_beam.analysis.plots.summary_table_plotter
# SPDX-FileCopyrightText: 2025 Contributors to the OpenSTEF project <openstef@lfenergy.org>
#
# SPDX-License-Identifier: MPL-2.0
"""Summary table generation for evaluation metrics display.
This module provides formatted HTML table generation from evaluation metrics,
creating professional-looking summary reports for model comparison.
"""
import pandas as pd
[docs]
class SummaryTablePlotter:
"""Creates formatted HTML tables from evaluation metrics data.
This plotter transforms evaluation metrics into HTML tables suitable for
reports and dashboards. The tables help answer questions like:
- Which model has the best overall performance across all metrics?
- How do metric values compare between different targets or runs?
- What are the summary statistics for forecast accuracy?
The generated tables include:
- Styled headers and borders for professional appearance
- Left-aligned text for readability
- Consistent formatting across all metrics
- HTML output suitable for embedding in reports
Example:
Creating a summary table from metrics
>>> import pandas as pd
>>> metrics_data = pd.DataFrame({
... 'Model': ['XGBoost', 'Random Forest', 'LSTM'],
... 'RMSE': [0.12, 0.15, 0.14],
... 'MAE': [0.08, 0.11, 0.10],
... 'R²': [0.85, 0.78, 0.82]
... })
>>> plotter = SummaryTablePlotter(metrics_data)
>>> html_table = plotter.plot()
>>> # html_table contains styled HTML ready for display
"""
[docs]
def __init__(self, data: pd.DataFrame):
"""Initialize the SummaryTablePlotter with data.
Args:
data (pd.DataFrame): DataFrame containing the data to be plotted.
"""
self.data = data
[docs]
def plot(self) -> str:
"""Creates a formatted HTML table from the DataFrame.
Returns:
str: A formatted HTML table
"""
# Apply basic styling to the HTML table
return (
self.data.style.set_table_attributes('class="dataframe"')
.set_properties(**{"text-align": "left", "padding": "5px", "border": "1px solid #ddd"}) # type: ignore[arg-type]
.set_table_styles([
{
"selector": "thead th",
"props": [
("font-weight", "bold"),
("text-align", "left"),
("padding", "8px"),
("border-bottom", "2px solid #ddd"),
],
},
])
.hide(axis="index")
.to_html()
)
__all__ = ["SummaryTablePlotter"]