Source code for marivo.analysis.frames.exploration
"""Non-canonical scratch exploration result frame."""
from __future__ import annotations
# mypy: disable-error-code=import-untyped
import copy
from dataclasses import dataclass
from typing import Literal
import pandas as pd
from pandas.api.types import is_object_dtype
from pydantic import ConfigDict, Field
from marivo.analysis.frames.base import BaseFrame, BaseFrameMeta
class ExplorationResultMeta(BaseFrameMeta):
model_config = ConfigDict(extra="forbid")
kind: Literal["exploration_result"] = "exploration_result"
source_kind: Literal["pandas", "ibis"]
description: str | None = None
source_query: str | None = None
source_datasource: str | None = None
source_artifact_refs: list[str] = Field(default_factory=list)
promotion_refs: list[str] = Field(default_factory=list)
def _isolate_dataframe(df: pd.DataFrame) -> pd.DataFrame:
isolated = df.copy(deep=True)
for column in [col for col in isolated.columns if is_object_dtype(isolated[col].dtype)]:
isolated[column] = isolated[column].map(copy.deepcopy)
return isolated
[docs]
@dataclass(repr=False)
class ExplorationResult(BaseFrame):
meta: ExplorationResultMeta
def _repr_identity(self) -> str:
return (
f"ExplorationResult ref={self.meta.ref} "
f"source={self.meta.source_kind} rows={self.meta.row_count}"
)
[docs]
def to_pandas(self) -> pd.DataFrame:
"""Return a recursively isolated copy of the wrapped DataFrame."""
return _isolate_dataframe(self._df)