Python SDK
Profile Models
SDK Reference: profiling result objects
fs.profile() returns a single frozen ProfileResult. All nested models below live in featuresmith.core.profile_result and are re-exported as values on the result, so they are reached via attribute access rather than imports.
ProfileResult
@dataclass(frozen=True, slots=True)class ProfileResult: dataset_summary: DatasetSummary column_profiles: Mapping[str, ColumnProfile] numeric_profiles: Mapping[str, NumericProfile] categorical_profiles: Mapping[str, CategoricalProfile] datetime_profiles: Mapping[str, DatetimeProfile] text_profiles: Mapping[str, TextProfile] missing_value_summary: MissingValueSummary duplicate_summary: DuplicateSummary correlation_summary: CorrelationSummary dataset_metadata: DatasetMetadata execution_metadata: ExecutionMetadata def to_dict(self) -> dict[str, Any]: ...The typed profile mappings are keyed by column name and only contain columns of the matching logical_type.
DatasetSummary
High-level dataset statistics.
@dataclass(frozen=True, slots=True)class DatasetSummary: row_count: int column_count: int size_in_bytes: int | None missing_percentage: float duplicate_percentage: float num_numeric_columns: int num_categorical_columns: int num_datetime_columns: int num_text_columns: int num_constant_columns: int num_fully_empty_columns: intColumnProfile
General profile summary present for every column in the dataset.
@dataclass(frozen=True, slots=True)class ColumnProfile: name: str dtype: str logical_type: str # "numeric" | "categorical" | "datetime" | "text" missing_count: int missing_percentage: float is_constant: bool is_fully_empty: boolNumericProfile
Detailed statistics for a numeric column.
@dataclass(frozen=True, slots=True)class NumericProfile: column_name: str count: int missing_count: int missing_percentage: float unique_count: int mean: float | None median: float | None mode: float | None minimum: float | None maximum: float | None range: float | None variance: float | None std_dev: float | None q1: float | None q2: float | None q3: float | None iqr: float | None sum: float | None zero_count: int negative_count: int positive_count: int skewness: float | None kurtosis: float | NoneCategoricalProfile
Detailed statistics for a categorical column. The frequency_table is capped by the max_frequency_table_size profiling option (default 1000).
@dataclass(frozen=True, slots=True)class CategoricalProfile: column_name: str cardinality: int unique_count: int missing_count: int frequency_table: Mapping[str, int] top_values: Sequence[tuple[str, int]] least_frequent_values: Sequence[tuple[str, int]] most_common_category: str | None entropy: float | None # Shannon entropy, base 2DatetimeProfile
@dataclass(frozen=True, slots=True)class DatetimeProfile: column_name: str minimum: str | None # ISO 8601 maximum: str | None # ISO 8601 range_days: float | None missing_count: int earliest_record: str | None latest_record: str | NoneTextProfile
@dataclass(frozen=True, slots=True)class TextProfile: column_name: str avg_length: float | None min_length: int | None max_length: int | None empty_strings: int whitespace_only: int char_count: int word_count: intAggregate Summaries
@dataclass(frozen=True, slots=True)class MissingValueSummary: column_missing_counts: Mapping[str, int] column_missing_percentages: Mapping[str, float] total_missing: int dataset_missing_percentage: float@dataclass(frozen=True, slots=True)class DuplicateSummary: duplicate_rows_count: int duplicate_percentage: float constant_columns: Sequence[str] fully_empty_columns: Sequence[str]@dataclass(frozen=True, slots=True)class CorrelationSummary: pearson: Mapping[str, Mapping[str, float | None]] spearman: Mapping[str, Mapping[str, float | None]] # reserved kendall: Mapping[str, Mapping[str, float | None]] # reservedpearson maps column A to column B to the correlation coefficient (or None when undefined). spearman and kendall are reserved and currently empty.
Metadata Records
@dataclass(frozen=True, slots=True)class DatasetMetadata: source: str | None file_size: int | None backend: str # "pandas" | "polars" custom_metadata: Mapping[str, Any]@dataclass(frozen=True, slots=True)class ExecutionMetadata: start_time: str # ISO 8601 duration_seconds: float featuresmith_version: strExample
import featuresmith as fsprofile = fs.profile("customers.csv")print(profile.dataset_summary.row_count)print(profile.numeric_profiles["age"].mean)print(profile.categorical_profiles["city"].most_common_category)print(profile.missing_value_summary.dataset_missing_percentage)