Source code for mdreport.dataframe_formatting
from __future__ import annotations
import io
from typing import Any
import polars as pl
import polars.selectors as cs
__all__ = ["format_dataframe", "format_dataframe_csv", "format_table_cell"]
[docs]
def format_dataframe(dataframe: pl.DataFrame, decimal_places: int) -> pl.DataFrame:
"""Normalize list and float columns for report exports."""
formatted_dataframe = dataframe.with_columns(cs.by_dtype(pl.List(pl.String)).list.join(", "))
return formatted_dataframe.with_columns(
cs.by_dtype(pl.Float32, pl.Float64).cast(pl.Decimal(scale=decimal_places))
)
[docs]
def format_dataframe_csv(dataframe: pl.DataFrame, decimal_places: int = 2) -> str:
"""Serialize a normalized DataFrame as CSV without its record terminator."""
output = io.StringIO()
format_dataframe(dataframe, decimal_places).write_csv(output)
return output.getvalue().rstrip("\n")
def format_table_cell(cell: Any) -> str:
"""Format a complete DataFrame cell without display truncation."""
if cell is None:
return "null"
if isinstance(cell, bool):
return str(cell).lower()
cell_text = str(cell).replace("\r\n", "\n").replace("\r", "\n")
return cell_text.replace("\n", "<br>")