| import pandas as pd |
| from datetime import datetime |
| from typing import Dict, Any |
| import json |
|
|
| class CustomerRiskProfiler: |
| def __init__(self, storage_path="data/customer_profiles.json"): |
| self.storage_path = storage_path |
| try: |
| with open(storage_path, 'r') as f: |
| self.profiles = json.load(f) |
| except FileNotFoundError: |
| self.profiles = {} |
| |
| def update_profile(self, customer_id: str, transaction: Dict[str, Any]): |
| if customer_id not in self.profiles: |
| self.profiles[customer_id] = { |
| "first_seen": datetime.now().isoformat(), |
| "last_activity": datetime.now().isoformat(), |
| "transaction_count": 0, |
| "total_amount": 0, |
| "risk_score": 0.5, |
| "behavior_pattern": {}, |
| "flags": [] |
| } |
| |
| profile = self.profiles[customer_id] |
| profile['last_activity'] = datetime.now().isoformat() |
| profile['transaction_count'] += 1 |
| profile['total_amount'] += transaction['amount'] |
| |
| |
| tx_type = transaction['type'] |
| profile['behavior_pattern'].setdefault(tx_type, 0) |
| profile['behavior_pattern'][tx_type] += 1 |
| |
| |
| amount_deviation = self._calculate_amount_deviation(customer_id, transaction['amount']) |
| freq_deviation = self._calculate_frequency_deviation(customer_id) |
| |
| profile['risk_score'] = min(0.9, 0.3 + amount_deviation * 0.4 + freq_deviation * 0.3) |
| |
| self._save_profiles() |
| |
| def _calculate_amount_deviation(self, customer_id, amount): |
| """Calculate deviation from customer's typical transaction amount""" |
| profile = self.profiles[customer_id] |
| avg_amount = profile['total_amount'] / profile['transaction_count'] |
| return min(1.0, abs(amount - avg_amount) / (avg_amount + 1e-6)) |
| |
| def _calculate_frequency_deviation(self, customer_id): |
| """Calculate deviation from customer's typical transaction frequency""" |
| |
| return 0.5 |
| |
| def _save_profiles(self): |
| with open(self.storage_path, 'w') as f: |
| json.dump(self.profiles, f) |
| |
| def get_risk_profile(self, customer_id): |
| return self.profiles.get(customer_id, None) |