Spaces:
Sleeping
Sleeping
| # AI-assisted (Claude Code, claude.ai) -- https://claude.ai | |
| """Build interaction matrix and train/test split from subsampled data.""" | |
| import pandas as pd | |
| import numpy as np | |
| from pathlib import Path | |
| def build_interaction_matrix(data_dir: str = "data/processed"): | |
| data_dir = Path(data_dir) | |
| transactions = pd.read_csv(data_dir / "transactions_subset.csv", dtype={"article_id": str}) | |
| transactions["t_dat"] = pd.to_datetime(transactions["t_dat"]) | |
| # Binary interaction matrix | |
| interactions = ( | |
| transactions.groupby(["customer_id", "article_id"]) | |
| .size() | |
| .reset_index(name="purchase_count") | |
| ) | |
| interactions["purchased"] = 1 | |
| # Temporal train/test split — last 14 days as test | |
| cutoff = transactions["t_dat"].max() - pd.Timedelta(days=14) | |
| train = transactions[transactions["t_dat"] < cutoff] | |
| test = transactions[transactions["t_dat"] >= cutoff] | |
| # Save splits | |
| train.to_csv(data_dir / "train.csv", index=False) | |
| test.to_csv(data_dir / "test.csv", index=False) | |
| interactions.to_csv(data_dir / "interactions.csv", index=False) | |
| print(f"Train: {len(train):,} transactions ({train['t_dat'].min()} to {train['t_dat'].max()})") | |
| print(f"Test: {len(test):,} transactions ({test['t_dat'].min()} to {test['t_dat'].max()})") | |
| print(f"Interactions: {len(interactions):,} unique user-item pairs") | |
| n_users = interactions["customer_id"].nunique() | |
| n_items = interactions["article_id"].nunique() | |
| sparsity = 1 - len(interactions) / (n_users * n_items) | |
| print(f"Matrix sparsity: {sparsity:.4%}") | |
| return train, test, interactions | |
| if __name__ == "__main__": | |
| build_interaction_matrix() | |