Source code for instancelib.export.pandas

from typing import Any, Callable, Iterator, Mapping, Optional, Sequence, Tuple, TypeVar

import pandas as pd

from instancelib.utils.func import flatten_dicts

from ..instances.base import (
    Instance,
    InstanceProvider,
    default_instance_viewer,
)
from ..labels.base import LabelProvider, default_label_viewer
from ..typehints.typevars import DT, KT, LT, RT, VT

IT = TypeVar("IT", bound="Instance[Any, Any, Any, Any]", covariant=True)


[docs]def to_pandas( provider: InstanceProvider[IT, KT, DT, VT, RT], labels: LabelProvider[KT, LT], instance_viewer: Callable[ [Instance[KT, DT, VT, RT]], Mapping[str, Any] ] = default_instance_viewer, label_viewer: Callable[ [KT, LabelProvider[KT, LT]], Mapping[str, Any] ] = default_label_viewer, provider_hooks: Sequence[ Callable[ [InstanceProvider[IT, KT, DT, VT, RT]], Mapping[KT, Mapping[str, Any]], ] ] = list(), ) -> pd.DataFrame: def row_yielder() -> Iterator[Tuple[KT, Mapping[str, Any]]]: provider_result = [hook(provider) for hook in provider_hooks] for idx, ins in provider.items(): key_prov_results = flatten_dicts(*[result[idx] for result in provider_result if idx in result]) data_values = {**instance_viewer(ins), **label_viewer(idx, labels), **key_prov_results} yield idx, data_values results = dict(row_yielder()) df = pd.DataFrame.from_dict(results, orient="index") return df