paza-bench / src /display /styling.py
muchai-mercy's picture
update pazabench space
53a73e0
"""Styling and color utilities for the leaderboard display."""
import pandas as pd
def format_metric_value(value: float | None, fmt: str) -> str:
"""Format a metric value for display."""
if value is None or pd.isna(value):
return "--"
try:
return fmt.format(float(value))
except Exception:
return f"{value}"
def hex_to_rgb(code: str) -> tuple[int, int, int]:
"""Convert hex color code to RGB tuple."""
code = code.lstrip("#")
return tuple(int(code[i:i + 2], 16) for i in (0, 2, 4))
def rgb_to_hex(rgb: tuple[float, float, float]) -> str:
"""Convert RGB tuple to hex color code."""
return "#" + "".join(f"{max(0, min(255, int(round(channel)))):02x}" for channel in rgb)
def interpolate_color(start_hex: str, end_hex: str, ratio: float) -> str:
"""Interpolate between two colors based on ratio."""
ratio = max(0.0, min(1.0, ratio))
start = hex_to_rgb(start_hex)
end = hex_to_rgb(end_hex)
blended = tuple(start[i] + (end[i] - start[i]) * ratio for i in range(3))
return rgb_to_hex(blended)
def cell_color(value: float | None, minimum: float | None, maximum: float | None, better: str) -> str:
"""Get cell background color based on value and metric direction."""
if value is None or pd.isna(value) or minimum is None or maximum is None:
return "#f3f4f6"
if abs(maximum - minimum) < 1e-9:
ratio = 0.5
else:
ratio = (float(value) - minimum) / (maximum - minimum)
if better == "higher":
ratio = 1.0 - ratio
return interpolate_color("#d9f7be", "#ffccc7", ratio)