use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BankingFingerprint {
pub customer_count: usize,
pub account_count: usize,
pub transaction_count: usize,
#[serde(default)]
pub customer_type_dist: HashMap<String, f64>,
#[serde(default)]
pub risk_tier_dist: HashMap<String, f64>,
#[serde(default)]
pub retail_persona_dist: HashMap<String, f64>,
#[serde(default)]
pub account_type_dist: HashMap<String, f64>,
#[serde(default)]
pub channel_dist: HashMap<String, f64>,
#[serde(default)]
pub category_dist: HashMap<String, f64>,
pub suspicious_rate: f64,
pub false_positive_rate: f64,
#[serde(default)]
pub typology_dist: HashMap<String, f64>,
pub amount_log_mu: f64,
pub amount_log_sigma: f64,
pub amount_min: f64,
pub amount_max: f64,
pub bridged_payment_rate: f64,
pub network_rate: f64,
pub accounts_per_customer_mean: f64,
pub accounts_per_customer_std: f64,
pub txns_per_account_mean: f64,
pub txns_per_account_std: f64,
pub pep_rate: f64,
pub mule_rate: f64,
pub cross_border_rate: f64,
pub cash_rate: f64,
}
impl BankingFingerprint {
pub fn normalize_counts(counts: &HashMap<String, usize>) -> HashMap<String, f64> {
let total: usize = counts.values().sum();
if total == 0 {
return HashMap::new();
}
counts
.iter()
.map(|(k, v)| (k.clone(), *v as f64 / total as f64))
.collect()
}
}