FinRiskGuard / src /data /ieee_cis /splitter.py
Sarvarbek13's picture
Add src pipeline code
2d2a96b
Raw
History Blame Contribute Delete
1.39 kB
import pandas as pd
from pathlib import Path
from sklearn.model_selection import TimeSeriesSplit
from typing import Tuple
import sys
sys.path.append(str(Path(__file__).resolve().parents[3]))
from src.logger import get_logger
logger = get_logger("ieee_cis.splitter")
TIME_COL = "TransactionDT"
VAL_RATIO = 0.20
def temporal_split(
df: pd.DataFrame,
val_ratio: float = VAL_RATIO,
) -> Tuple[pd.DataFrame, pd.DataFrame]:
logger.info("Starting temporal split...")
logger.info(f"Input shape: {df.shape}")
df_sorted = df.sort_values(TIME_COL).reset_index(drop=True)
n = len(df_sorted)
val_start = int(n * (1 - val_ratio))
train = df_sorted.iloc[:val_start].reset_index(drop=True)
val = df_sorted.iloc[val_start:].reset_index(drop=True)
logger.info(f"Train shape : {train.shape} | Date range: {train[TIME_COL].min()}{train[TIME_COL].max()}")
logger.info(f"Val shape : {val.shape} | Date range: {val[TIME_COL].min()}{val[TIME_COL].max()}")
if "isFraud" in train.columns:
logger.info(f"Train fraud rate: {train['isFraud'].mean()*100:.2f}%")
logger.info(f"Val fraud rate : {val['isFraud'].mean()*100:.2f}%")
return train, val
def get_tscv(n_splits: int = 5) -> TimeSeriesSplit:
logger.info(f"Creating TimeSeriesSplit with {n_splits} folds")
return TimeSeriesSplit(n_splits=n_splits)