Source code for ds_provider_xledger_py_lib.utils.dataframe
"""
**File:** ``dataframe.py``
**Region:** ``ds_provider_xledger_py_lib/utils``
Description
-----------
Small dataframe helpers shared by serializer and deserializer.
"""
from __future__ import annotations
from typing import Any
import pandas as pd
[docs]
def dataframe_to_records(df: pd.DataFrame) -> list[dict[str, Any]]:
"""Convert dataframe rows to JSON-safe records with ``None`` for nulls.
Args:
df: Input dataframe.
Returns:
List of row dictionaries.
"""
records: list[dict[str, Any]] = []
for _, row in df.iterrows():
record: dict[str, Any] = {}
for key, value in row.items():
record[str(key)] = None if pd.isna(value) else value
records.append(record)
return records
[docs]
def edges_to_dataframe(
*,
edges: list[dict[str, Any]],
columns: list[str] | None = None,
) -> pd.DataFrame:
"""Flatten ``edges[].node`` payload into a dataframe.
Args:
edges: GraphQL connection edges.
columns: Optional explicit column order/filter.
Returns:
Flattened dataframe.
"""
nodes = [edge.get("node") for edge in edges if isinstance(edge, dict)]
normalized_nodes = [node for node in nodes if isinstance(node, dict)]
df = pd.json_normalize(normalized_nodes, sep="_")
if columns:
return df.reindex(columns=columns)
return df