from typing import Optional from pydantic import BaseModel, Field, field_validator class ModelFeatures(BaseModel): SK_ID_CURR: int CNT_CHILDREN: Optional[int] = None AMT_INCOME_TOTAL: Optional[float] = Field(None, ge=0) AMT_CREDIT: Optional[float] = Field(None, ge=0) AMT_ANNUITY: Optional[float] = Field(None, ge=0) AMT_GOODS_PRICE: Optional[float] = Field(None, ge=0) REGION_POPULATION_RELATIVE: Optional[float] = None DAYS_BIRTH: Optional[int] = None DAYS_EMPLOYED: Optional[int] = None DAYS_REGISTRATION: Optional[int] = None DAYS_ID_PUBLISH: Optional[int] = None OWN_CAR_AGE: Optional[float] = None FLAG_MOBIL: Optional[int] = None FLAG_EMP_PHONE: Optional[int] = None FLAG_WORK_PHONE: Optional[int] = None FLAG_CONT_MOBILE: Optional[int] = None FLAG_PHONE: Optional[int] = None FLAG_EMAIL: Optional[int] = None CNT_FAM_MEMBERS: Optional[float] = None REGION_RATING_CLIENT: Optional[int] = None REGION_RATING_CLIENT_W_CITY: Optional[int] = None HOUR_APPR_PROCESS_START: Optional[int] = None REG_REGION_NOT_LIVE_REGION: Optional[int] = None REG_REGION_NOT_WORK_REGION: Optional[int] = None LIVE_REGION_NOT_WORK_REGION: Optional[int] = None REG_CITY_NOT_LIVE_CITY: Optional[int] = None REG_CITY_NOT_WORK_CITY: Optional[int] = None LIVE_CITY_NOT_WORK_CITY: Optional[int] = None EXT_SOURCE_1: Optional[float] = None EXT_SOURCE_2: Optional[float] = None EXT_SOURCE_3: Optional[float] = None APARTMENTS_AVG: Optional[float] = None BASEMENTAREA_AVG: Optional[float] = None YEARS_BEGINEXPLUATATION_AVG: Optional[float] = None YEARS_BUILD_AVG: Optional[float] = None COMMONAREA_AVG: Optional[float] = None ELEVATORS_AVG: Optional[float] = None ENTRANCES_AVG: Optional[float] = None FLOORSMAX_AVG: Optional[float] = None FLOORSMIN_AVG: Optional[float] = None LANDAREA_AVG: Optional[float] = None LIVINGAPARTMENTS_AVG: Optional[float] = None LIVINGAREA_AVG: Optional[float] = None NONLIVINGAPARTMENTS_AVG: Optional[float] = None NONLIVINGAREA_AVG: Optional[float] = None TOTALAREA_MODE: Optional[float] = None OBS_30_CNT_SOCIAL_CIRCLE: Optional[float] = None DEF_30_CNT_SOCIAL_CIRCLE: Optional[float] = None OBS_60_CNT_SOCIAL_CIRCLE: Optional[float] = None DEF_60_CNT_SOCIAL_CIRCLE: Optional[float] = None DAYS_LAST_PHONE_CHANGE: Optional[int] = None FLAG_DOCUMENT_2: Optional[int] = None FLAG_DOCUMENT_3: Optional[int] = None FLAG_DOCUMENT_4: Optional[int] = None FLAG_DOCUMENT_5: Optional[int] = None FLAG_DOCUMENT_6: Optional[int] = None FLAG_DOCUMENT_7: Optional[int] = None FLAG_DOCUMENT_8: Optional[int] = None FLAG_DOCUMENT_9: Optional[int] = None FLAG_DOCUMENT_10: Optional[int] = None FLAG_DOCUMENT_11: Optional[int] = None FLAG_DOCUMENT_12: Optional[int] = None FLAG_DOCUMENT_13: Optional[int] = None FLAG_DOCUMENT_14: Optional[int] = None FLAG_DOCUMENT_15: Optional[int] = None FLAG_DOCUMENT_16: Optional[int] = None FLAG_DOCUMENT_17: Optional[int] = None FLAG_DOCUMENT_18: Optional[int] = None FLAG_DOCUMENT_19: Optional[int] = None FLAG_DOCUMENT_20: Optional[int] = None FLAG_DOCUMENT_21: Optional[int] = None AMT_REQ_CREDIT_BUREAU_HOUR: Optional[float] = None AMT_REQ_CREDIT_BUREAU_DAY: Optional[float] = None AMT_REQ_CREDIT_BUREAU_WEEK: Optional[float] = None AMT_REQ_CREDIT_BUREAU_MON: Optional[float] = None AMT_REQ_CREDIT_BUREAU_QRT: Optional[float] = None AMT_REQ_CREDIT_BUREAU_YEAR: Optional[float] = None nb_loans: Optional[float] = None sum_debt: Optional[float] = None AGE: Optional[float] = None # Features engineering CHILDREN_RATIO: Optional[float] = None INCOME_PER_PERSON: Optional[float] = None AGE_PER_MEMBER: Optional[float] = None DAYS_EMPLOYED_PERC: Optional[float] = None INCOME_CREDIT_PERC: Optional[float] = None ANNUITY_INCOME_PERC: Optional[float] = None PAYMENT_RATE: Optional[float] = None # --- Catégorielles --- NAME_CONTRACT_TYPE: Optional[str] = None CODE_GENDER: Optional[str] = None FLAG_OWN_CAR: Optional[str] = None FLAG_OWN_REALTY: Optional[str] = None NAME_TYPE_SUITE: Optional[str] = None NAME_INCOME_TYPE: Optional[str] = None NAME_EDUCATION_TYPE: Optional[str] = None NAME_FAMILY_STATUS: Optional[str] = None NAME_HOUSING_TYPE: Optional[str] = None OCCUPATION_TYPE: Optional[str] = None WEEKDAY_APPR_PROCESS_START: Optional[str] = None ORGANIZATION_TYPE: Optional[str] = None FONDKAPREMONT_MODE: Optional[str] = None HOUSETYPE_MODE: Optional[str] = None WALLSMATERIAL_MODE: Optional[str] = None EMERGENCYSTATE_MODE: Optional[str] = None CNT_CHILDREN_BIN: Optional[str] = None @field_validator("*", mode="before") @classmethod def _strip_strings(cls, v): if isinstance(v, str): s = v.strip() return s if len(s) <= 255 else s[:255] return v