Source code for biogeme.bayesian_estimation.pandas_output

"""Store results in Pandas databases

Michel Bierlaire
Thu Oct 30 2025, 10:02:39
"""

import pandas as pd

from .bayesian_results import BayesianResults


def _build_parameters_dataframe(
    estimation_results: BayesianResults,
    *,
    estimated_parameters: bool = True,
    renaming_parameters: dict[str, str] | None = None,
    sort_by_name: bool = False,
) -> pd.DataFrame:
    """
    Return a pandas DataFrame with the same content as the HTML table of parameters.

    Columns:
        Id, Name, Value (mean), Value (median), Value (mode), std err., z-value, p-value, HDI low, HDI high, R hat, ESS (bulk), ESS (tail)
    """
    if renaming_parameters is not None:
        name_values = list(renaming_parameters.values())
        if len(name_values) != len(set(name_values)):
            # Optional: log a warning if you have a logger; here we stay silent as requested
            pass

    param_keys = (
        estimation_results.parameter_estimates()
        if estimated_parameters
        else estimation_results.other_variables()
    )

    rows: list[dict] = []
    for param_idx, original_name in enumerate(param_keys):
        est = estimation_results.parameters.get(original_name)
        if est is None:
            continue
        display_name = (
            renaming_parameters.get(original_name, original_name)
            if renaming_parameters is not None
            else original_name
        )
        rows.append(
            {
                "Id": param_idx,
                "Name": display_name,
                "Value (mean)": est.mean,
                "Value (median)": est.median,
                "Value (mode)": est.mode,
                "std err.": est.std_err,
                "z-value": est.z_value,
                "p-value": est.p_value,
                "HDI low": est.hdi_low,
                "HDI high": est.hdi_high,
                "R hat": est.rhat,
                "ESS (bulk)": est.effective_sample_size_bulk,
                "ESS (tail)": est.effective_sample_size_tail,
            }
        )

    df = pd.DataFrame(
        rows,
        columns=[
            "Id",
            "Name",
            "Value (mean)",
            "Value (median)",
            "Value (mode)",
            "std err.",
            "z-value",
            "p-value",
            "HDI low",
            "HDI high",
            "R hat",
            "ESS (bulk)",
            "ESS (tail)",
        ],
    )

    if sort_by_name and not df.empty:
        df = df.sort_values(by=["Name", "Id"], kind="mergesort").reset_index(drop=True)

    df.set_index('Id', inplace=True)
    df.index.name = None
    return df


[docs] def get_pandas_estimated_parameters( estimation_results: BayesianResults, renaming_parameters: dict[str, str] | None = None, sort_by_name: bool = False, ) -> pd.DataFrame: """DataFrame of *estimated parameters* (same content as the HTML table).""" return _build_parameters_dataframe( estimation_results=estimation_results, estimated_parameters=True, renaming_parameters=renaming_parameters, sort_by_name=sort_by_name, )
[docs] def get_pandas_other_variables( estimation_results: BayesianResults, renaming_parameters: dict[str, str] | None = None, sort_by_name: bool = False, ) -> pd.DataFrame: """DataFrame of *other simulated variables* (same content as the HTML table).""" return _build_parameters_dataframe( estimation_results=estimation_results, estimated_parameters=False, renaming_parameters=renaming_parameters, sort_by_name=sort_by_name, )