Spaces:
Sleeping
Sleeping
AJAY KASU commited on
Commit ·
7d391cb
0
Parent(s):
Initial commit AML Shield
Browse files- .env +3 -0
- README.md +67 -0
- app.py +390 -0
- generate_sample_data.py +95 -0
- modules/ai_agent.py +85 -0
- modules/database.py +147 -0
- modules/detection.py +79 -0
- modules/etl.py +79 -0
- modules/pdf_report.py +204 -0
- modules/risk_profiling.py +63 -0
- modules/visualizations.py +98 -0
- requirements.txt +11 -0
- sample_data/sample_transactions.csv +1001 -0
.env
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
BYTEZ_API_KEY=your_bytez_key_here
|
| 2 |
+
SUPABASE_URL=https://xxxx.supabase.co
|
| 3 |
+
SUPABASE_KEY=your_supabase_anon_key
|
README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# AML Shield 🛡️
|
| 2 |
+
|
| 3 |
+
**AI-Powered Anti-Money Laundering Transaction Intelligence Platform**
|
| 4 |
+
|
| 5 |
+
A production-grade, full-stack web application for financial transaction intelligence. AML Shield allows users to upload transaction records and receive real-time anomaly detection, interactive visualizations, KYC risk profiling, and AI-generated compliance reports via LangChain + Bytez utilizing LLaMa 3.1.
|
| 6 |
+
|
| 7 |
+
All analyses are natively persisted to a Supabase PostgreSQL backend, displaying dynamic real-time insights globally.
|
| 8 |
+
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
## 🚀 Live Demo
|
| 12 |
+
Access the live application hosted on Hugging Face Spaces:
|
| 13 |
+
👉 **[AML Shield Live Space](https://huggingface.co/spaces/AJAYKASU/AML_Shield)**
|
| 14 |
+
|
| 15 |
+
## ⚙️ Core Architecture & Features
|
| 16 |
+
|
| 17 |
+
This platform employs a Two-Layer Detection System utilizing rule-based flagging and Machine Learning models to score unverified transactions.
|
| 18 |
+
|
| 19 |
+
1. **Upload & ETL Engine**: Rigorous CSV validation routines parse structure variables and engineer critical analytical features natively.
|
| 20 |
+
2. **Two-Layer Threat Detection**: Applies known heuristics (Structuring, Dormant Account Spikes, etc.) and scikit-learn `IsolationForest` anomaly algorithms.
|
| 21 |
+
3. **Advanced Risk Profiling**: Consolidates activity for all accounts tracking behavioral metadata to derive accurate KYC tiering (`KMeans`).
|
| 22 |
+
4. **LangChain AI Compliance Integration**: Streams professional regulatory reports via `langchain_bytez` mapping direct analysis metrics to executive summaries in real-time.
|
| 23 |
+
5. **Report Generation Pipeline**: Leverages `ReportLab` building formal, fully-styled PDF analytics documents dynamically available for analyst download.
|
| 24 |
+
6. **Persistence & Data Aggregation**: Syncs outputs to `Supabase` capturing global macro-risk signals to identify organizational trend metrics.
|
| 25 |
+
|
| 26 |
+
## 🛠 Tech Stack
|
| 27 |
+
- Frontend Dashboard: **Streamlit**
|
| 28 |
+
- Data Modules: **Pandas, NumPy**
|
| 29 |
+
- Machine Learning models: **Scikit-learn**
|
| 30 |
+
- Analytical Storytelling: **Plotly**
|
| 31 |
+
- AI LLM Generation: **LangChain, Bytez (`meta-llama/Llama-3.1-8B-Instruct`)**
|
| 32 |
+
- Persisted Memory Layers: **Supabase DB (`supabase-py`)**
|
| 33 |
+
- Artifact Generation: **ReportLab PDF renderer**
|
| 34 |
+
|
| 35 |
+
## 🔧 Installation & Local Setup
|
| 36 |
+
|
| 37 |
+
**1. Clone the repository:**
|
| 38 |
+
```bash
|
| 39 |
+
git clone https://github.com/AJAYKASU/aml-shield.git
|
| 40 |
+
cd aml-shield
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
**2. Setup Virtual Environment & Dependencies:**
|
| 44 |
+
```bash
|
| 45 |
+
python -m venv venv
|
| 46 |
+
source venv/bin/activate
|
| 47 |
+
pip install -r requirements.txt
|
| 48 |
+
```
|
| 49 |
+
|
| 50 |
+
**3. Configure Environment Variables:**
|
| 51 |
+
You will need API keys for Bytez and your Supabase PostgreSQL cluster. Add the following inside a `.env` file at the root:
|
| 52 |
+
```env
|
| 53 |
+
BYTEZ_API_KEY=your_key_here
|
| 54 |
+
SUPABASE_URL=your_supabase_url
|
| 55 |
+
SUPABASE_KEY=your_supabase_anon_key
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
**4. Run Project:**
|
| 59 |
+
```bash
|
| 60 |
+
streamlit run app.py
|
| 61 |
+
```
|
| 62 |
+
|
| 63 |
+
## 🔐 Compliance Methodologies
|
| 64 |
+
|
| 65 |
+
The rules modeled directly reference core regulatory operations monitored by US analysts covering entities under the **BSA (Bank Secrecy Act)**, **FinCEN SAR requirements**, and the **FATF Recommendation 16** for wire transfer rules.
|
| 66 |
+
|
| 67 |
+
*Built to demonstrate robust AML compliance analytics skills for data-driven financial services roles.*
|
app.py
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from dotenv import load_dotenv
|
| 3 |
+
|
| 4 |
+
# Load for local testing only
|
| 5 |
+
if os.path.exists(".env"):
|
| 6 |
+
load_dotenv()
|
| 7 |
+
|
| 8 |
+
import streamlit as st
|
| 9 |
+
import pandas as pd
|
| 10 |
+
import time
|
| 11 |
+
from datetime import datetime
|
| 12 |
+
|
| 13 |
+
# Initialize database connections properly
|
| 14 |
+
# Assuming database uses Supabase, if Supabase client init fails due to missing secrets, app will handle gracefully
|
| 15 |
+
import modules.database as db
|
| 16 |
+
from modules.etl import load_and_validate, engineer_features
|
| 17 |
+
from modules.detection import apply_detection
|
| 18 |
+
from modules.risk_profiling import build_customer_profiles, assign_kyc_tier
|
| 19 |
+
import modules.visualizations as viz
|
| 20 |
+
from modules.ai_agent import stream_compliance_report
|
| 21 |
+
from modules.pdf_report import build_pdf
|
| 22 |
+
|
| 23 |
+
st.set_page_config(page_title="AML Shield", page_icon="🛡️", layout="wide", initial_sidebar_state="expanded")
|
| 24 |
+
|
| 25 |
+
# --- CSS Overrides ---
|
| 26 |
+
st.markdown("""
|
| 27 |
+
<style>
|
| 28 |
+
.stMetric { background-color: #1e1e2d; padding: 15px; border-radius: 5px; }
|
| 29 |
+
h1, h2, h3 { color: #f8f9fa; }
|
| 30 |
+
</style>
|
| 31 |
+
""", unsafe_allow_html=True)
|
| 32 |
+
|
| 33 |
+
# --- Sidebar ---
|
| 34 |
+
st.sidebar.title("🛡️ AML Shield Navigation")
|
| 35 |
+
tabs = ["Upload & Analyze", "Dashboard", "Customer Profiles", "AI Report", "Global Analytics", "About"]
|
| 36 |
+
page = st.sidebar.radio("Go to", tabs)
|
| 37 |
+
|
| 38 |
+
# --- Helper logic for analysis ---
|
| 39 |
+
def run_pipeline(file_obj, filename="Uploaded Data"):
|
| 40 |
+
progress_bar = st.progress(0)
|
| 41 |
+
status_text = st.empty()
|
| 42 |
+
|
| 43 |
+
# Step 1
|
| 44 |
+
status_text.text("[▓░░░░] Loading & validating data...")
|
| 45 |
+
df, msg = load_and_validate(file_obj)
|
| 46 |
+
if df is None:
|
| 47 |
+
st.error(msg)
|
| 48 |
+
progress_bar.empty()
|
| 49 |
+
status_text.empty()
|
| 50 |
+
return False
|
| 51 |
+
progress_bar.progress(25)
|
| 52 |
+
time.sleep(0.5)
|
| 53 |
+
|
| 54 |
+
# Step 2
|
| 55 |
+
status_text.text("[▓▓▓░░] Engineering features...")
|
| 56 |
+
df = engineer_features(df)
|
| 57 |
+
progress_bar.progress(50)
|
| 58 |
+
time.sleep(0.5)
|
| 59 |
+
|
| 60 |
+
# Step 3
|
| 61 |
+
status_text.text("[▓▓▓▓░] Running anomaly detection...")
|
| 62 |
+
df = apply_detection(df)
|
| 63 |
+
progress_bar.progress(75)
|
| 64 |
+
time.sleep(0.5)
|
| 65 |
+
|
| 66 |
+
# Step 4
|
| 67 |
+
status_text.text("[▓▓▓▓▓] Building customer profiles...")
|
| 68 |
+
profile_df = build_customer_profiles(df)
|
| 69 |
+
profile_df = assign_kyc_tier(profile_df)
|
| 70 |
+
progress_bar.progress(100)
|
| 71 |
+
time.sleep(0.5)
|
| 72 |
+
|
| 73 |
+
status_text.empty()
|
| 74 |
+
progress_bar.empty()
|
| 75 |
+
|
| 76 |
+
# Summary Metrics
|
| 77 |
+
total_tx = len(df)
|
| 78 |
+
flagged = df['is_flagged'].sum()
|
| 79 |
+
high_risk = len(df[df['risk_level'] == 'High'])
|
| 80 |
+
med_risk = len(df[df['risk_level'] == 'Medium'])
|
| 81 |
+
avg_score = df['risk_score'].mean()
|
| 82 |
+
date_range = f"{df['timestamp'].dt.date.min()} to {df['timestamp'].dt.date.max()}"
|
| 83 |
+
|
| 84 |
+
# Structuring & Intl stats for report
|
| 85 |
+
struct_attempts = profile_df['structuring_attempts'].sum()
|
| 86 |
+
intl_high = len(df[(df['is_international'] == 1) & (df['amount'] > 25000)])
|
| 87 |
+
kyc_counts = profile_df['kyc_tier'].value_counts().to_dict()
|
| 88 |
+
|
| 89 |
+
# Top flagged rules
|
| 90 |
+
rules_flat = [rule for sublist in df['rule_flags'] if isinstance(sublist, list) for rule in sublist]
|
| 91 |
+
top_rules = pd.Series(rules_flat).value_counts().head(3).to_dict() if rules_flat else {}
|
| 92 |
+
top_customers = profile_df.sort_values('avg_risk_score', ascending=False)['customer_id'].head(3).tolist()
|
| 93 |
+
|
| 94 |
+
# Save Upload to DB
|
| 95 |
+
upload_id = db.save_upload(
|
| 96 |
+
filename=filename, total=total_tx, flagged=flagged,
|
| 97 |
+
high_risk=high_risk, medium_risk=med_risk,
|
| 98 |
+
avg_score=avg_score, date_range=date_range
|
| 99 |
+
)
|
| 100 |
+
|
| 101 |
+
if upload_id:
|
| 102 |
+
# Batch insert chunks
|
| 103 |
+
db.save_transactions(df, upload_id)
|
| 104 |
+
db.save_customer_profiles(profile_df, upload_id)
|
| 105 |
+
|
| 106 |
+
summary_data = {
|
| 107 |
+
"filename": filename,
|
| 108 |
+
"total_transactions": int(total_tx),
|
| 109 |
+
"flagged_count": int(flagged),
|
| 110 |
+
"high_risk_count": int(high_risk),
|
| 111 |
+
"medium_risk_count": int(med_risk),
|
| 112 |
+
"avg_risk_score": float(avg_score),
|
| 113 |
+
"date_range": date_range,
|
| 114 |
+
"structuring_attempts": int(struct_attempts),
|
| 115 |
+
"international_high_value_count": int(intl_high),
|
| 116 |
+
"kyc_tier_breakdown": kyc_counts,
|
| 117 |
+
"top_rules_triggered": top_rules,
|
| 118 |
+
"top_flagged_customers": top_customers
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
# Session State
|
| 122 |
+
st.session_state.df_raw = df.copy()
|
| 123 |
+
st.session_state.df_scored = df.copy()
|
| 124 |
+
st.session_state.profile_df = profile_df.copy()
|
| 125 |
+
st.session_state.upload_id = upload_id
|
| 126 |
+
st.session_state.summary_data = summary_data
|
| 127 |
+
st.session_state.ai_report = None
|
| 128 |
+
|
| 129 |
+
st.success(f"✅ {total_tx} transactions analyzed | ⚠️ {flagged} flagged | 🔴 {high_risk} high risk | 📊 Avg risk score: {avg_score:.1f}")
|
| 130 |
+
|
| 131 |
+
st.subheader("Top 5 Highest Risk Transactions Preview")
|
| 132 |
+
preview = df.sort_values('risk_score', ascending=False).head(5)
|
| 133 |
+
cols = ['transaction_id', 'customer_id', 'amount', 'transaction_type', 'risk_score', 'risk_level', 'rule_flags']
|
| 134 |
+
st.dataframe(preview[cols])
|
| 135 |
+
return True
|
| 136 |
+
|
| 137 |
+
# --- PAGE ROUTING ---
|
| 138 |
+
|
| 139 |
+
if page == "Upload & Analyze":
|
| 140 |
+
st.title("🛡️ AML Shield")
|
| 141 |
+
st.write("AI-Powered Anti-Money Laundering Transaction Intelligence Platform")
|
| 142 |
+
|
| 143 |
+
col1, col2 = st.columns(2)
|
| 144 |
+
with col1:
|
| 145 |
+
uploaded_file = st.file_uploader("Upload CSV Transactions", type=['csv'])
|
| 146 |
+
if uploaded_file is not None:
|
| 147 |
+
if st.button("Analyze Uploaded File"):
|
| 148 |
+
run_pipeline(uploaded_file, filename=uploaded_file.name)
|
| 149 |
+
with col2:
|
| 150 |
+
st.write("Or test with pre-generated synthetic data:")
|
| 151 |
+
if st.button("Use Sample Dataset"):
|
| 152 |
+
sample_path = "sample_data/sample_transactions.csv"
|
| 153 |
+
if os.path.exists(sample_path):
|
| 154 |
+
run_pipeline(sample_path, filename="sample_transactions.csv")
|
| 155 |
+
else:
|
| 156 |
+
st.error("Sample dataset not found. Please ensure it was generated.")
|
| 157 |
+
|
| 158 |
+
elif page == "Dashboard":
|
| 159 |
+
if 'df_scored' not in st.session_state:
|
| 160 |
+
st.warning("Please upload or load sample data first in the 'Upload & Analyze' tab.")
|
| 161 |
+
else:
|
| 162 |
+
df = st.session_state.df_scored.copy()
|
| 163 |
+
summ = st.session_state.summary_data
|
| 164 |
+
|
| 165 |
+
# Dashboard Filters in Sidebar
|
| 166 |
+
st.sidebar.markdown("---")
|
| 167 |
+
st.sidebar.subheader("Dashboard Filters")
|
| 168 |
+
risk_filter = st.sidebar.multiselect("Risk Level", options=['High', 'Medium', 'Low'], default=['High', 'Medium', 'Low'])
|
| 169 |
+
type_filter = st.sidebar.multiselect("Transaction Type", options=df['transaction_type'].unique(), default=df['transaction_type'].unique())
|
| 170 |
+
|
| 171 |
+
min_date = df['timestamp'].min().date()
|
| 172 |
+
max_date = df['timestamp'].max().date()
|
| 173 |
+
date_filter = st.sidebar.slider("Date Range", min_value=min_date, max_value=max_date, value=(min_date, max_date))
|
| 174 |
+
|
| 175 |
+
# Apply filters
|
| 176 |
+
df_filtered = df[
|
| 177 |
+
(df['risk_level'].isin(risk_filter)) &
|
| 178 |
+
(df['transaction_type'].isin(type_filter)) &
|
| 179 |
+
(df['timestamp'].dt.date >= date_filter[0]) &
|
| 180 |
+
(df['timestamp'].dt.date <= date_filter[1])
|
| 181 |
+
]
|
| 182 |
+
|
| 183 |
+
# KPIs
|
| 184 |
+
c1, c2, c3, c4 = st.columns(4)
|
| 185 |
+
c1.metric("Total Transactions", summ['total_transactions'])
|
| 186 |
+
|
| 187 |
+
flagged_pct = (summ['flagged_count'] / summ['total_transactions']) * 100 if summ['total_transactions'] > 0 else 0
|
| 188 |
+
c2.metric("Flagged", summ['flagged_count'], delta=f"{flagged_pct:.1f}%")
|
| 189 |
+
|
| 190 |
+
c3.metric("High Risk", summ['high_risk_count'])
|
| 191 |
+
c4.metric("Avg Risk Score", f"{summ['avg_risk_score']:.1f}")
|
| 192 |
+
|
| 193 |
+
# Charts Row 1
|
| 194 |
+
r1c1, r1c2 = st.columns(2)
|
| 195 |
+
with r1c1:
|
| 196 |
+
st.subheader("Risk Distribution")
|
| 197 |
+
st.plotly_chart(viz.risk_distribution_chart(df_filtered), use_container_width=True)
|
| 198 |
+
with r1c2:
|
| 199 |
+
st.subheader("Daily Flagged Transactions")
|
| 200 |
+
st.plotly_chart(viz.flagged_transactions_timeline(df_filtered), use_container_width=True)
|
| 201 |
+
|
| 202 |
+
# Charts Row 2
|
| 203 |
+
st.subheader("Amount vs Risk Score Scatter")
|
| 204 |
+
st.plotly_chart(viz.amount_vs_risk_scatter(df_filtered), use_container_width=True)
|
| 205 |
+
|
| 206 |
+
# Charts Row 3
|
| 207 |
+
r3c1, r3c2 = st.columns(2)
|
| 208 |
+
with r3c1:
|
| 209 |
+
st.subheader("Transaction Types (Flagged vs Clean)")
|
| 210 |
+
st.plotly_chart(viz.transaction_type_breakdown(df_filtered), use_container_width=True)
|
| 211 |
+
with r3c2:
|
| 212 |
+
st.subheader("Rule Trigger Frequency")
|
| 213 |
+
st.plotly_chart(viz.rule_trigger_frequency(df_filtered), use_container_width=True)
|
| 214 |
+
|
| 215 |
+
# Charts Row 4
|
| 216 |
+
st.subheader("Top Flagged Customers")
|
| 217 |
+
st.plotly_chart(viz.top_flagged_customers_chart(df_filtered), use_container_width=True)
|
| 218 |
+
|
| 219 |
+
# Table
|
| 220 |
+
st.subheader("Flagged Transactions Explorer")
|
| 221 |
+
flagged_df = df_filtered[df_filtered['is_flagged'] == 1].copy()
|
| 222 |
+
|
| 223 |
+
# Convert rule_flags list to string for display/CSV
|
| 224 |
+
flagged_df['rule_flags_str'] = flagged_df['rule_flags'].apply(lambda x: ", ".join(x) if isinstance(x, list) else str(x))
|
| 225 |
+
disp_cols = ['transaction_id', 'customer_id', 'amount', 'transaction_type', 'risk_score', 'risk_level', 'rule_flags_str']
|
| 226 |
+
st.dataframe(flagged_df[disp_cols])
|
| 227 |
+
|
| 228 |
+
csv_data = flagged_df[disp_cols].to_csv(index=False).encode('utf-8')
|
| 229 |
+
st.download_button("Download Flagged Transactions CSV", data=csv_data, file_name="flagged_transactions.csv", mime="text/csv")
|
| 230 |
+
|
| 231 |
+
|
| 232 |
+
elif page == "Customer Profiles":
|
| 233 |
+
if 'profile_df' not in st.session_state:
|
| 234 |
+
st.warning("Please upload data first to analyze customer profiles.")
|
| 235 |
+
else:
|
| 236 |
+
profile_df = st.session_state.profile_df.copy()
|
| 237 |
+
df = st.session_state.df_scored
|
| 238 |
+
|
| 239 |
+
st.title("Customer KYC Profiles")
|
| 240 |
+
|
| 241 |
+
col1, col2 = st.columns([1, 2])
|
| 242 |
+
with col1:
|
| 243 |
+
st.subheader("KYC Tier Distribution")
|
| 244 |
+
st.plotly_chart(viz.kyc_tier_distribution(profile_df), use_container_width=True)
|
| 245 |
+
with col2:
|
| 246 |
+
st.subheader("All Customer Profiles")
|
| 247 |
+
st.dataframe(profile_df)
|
| 248 |
+
|
| 249 |
+
st.markdown("---")
|
| 250 |
+
st.subheader("Customer Drill-down")
|
| 251 |
+
selected_cust = st.selectbox("Select Customer ID", options=profile_df['customer_id'].unique())
|
| 252 |
+
|
| 253 |
+
cust_profile = profile_df[profile_df['customer_id'] == selected_cust].iloc[0]
|
| 254 |
+
cust_tx = df[df['customer_id'] == selected_cust].sort_values('timestamp', ascending=False)
|
| 255 |
+
cust_flags = cust_tx[cust_tx['is_flagged'] == 1]
|
| 256 |
+
|
| 257 |
+
c1, c2, c3 = st.columns(3)
|
| 258 |
+
c1.metric("KYC Tier", cust_profile['kyc_tier'])
|
| 259 |
+
c2.metric("Total Volume", f"${cust_profile['total_volume']:,.2f}")
|
| 260 |
+
c3.metric("Avg Risk Score", f"{cust_profile['avg_risk_score']:.1f}")
|
| 261 |
+
|
| 262 |
+
st.write("### Transaction History")
|
| 263 |
+
st.dataframe(cust_tx[['transaction_id', 'timestamp', 'amount', 'transaction_type', 'risk_score', 'risk_level']])
|
| 264 |
+
|
| 265 |
+
st.write("### Repeated Suspicious Behavior")
|
| 266 |
+
if len(cust_flags) > 0:
|
| 267 |
+
st.dataframe(cust_flags[['transaction_id', 'amount', 'rule_flags']])
|
| 268 |
+
else:
|
| 269 |
+
st.write("None detected.")
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
elif page == "AI Report":
|
| 273 |
+
if 'summary_data' not in st.session_state:
|
| 274 |
+
st.warning("Please upload data first to generate an AI report.")
|
| 275 |
+
else:
|
| 276 |
+
st.title("🤖 AI Compliance Report Generation")
|
| 277 |
+
|
| 278 |
+
summ = st.session_state.summary_data
|
| 279 |
+
st.info(f"**Dataset loaded:** {summ['filename']} | **Total Transactions:** {summ['total_transactions']} | **Flagged:** {summ['flagged_count']}")
|
| 280 |
+
|
| 281 |
+
if st.button("🤖 Generate AI Compliance Report", type="primary"):
|
| 282 |
+
if not os.environ.get("BYTEZ_API_KEY"):
|
| 283 |
+
st.error("BYTEZ_API_KEY requires to be set to generate AI report.")
|
| 284 |
+
else:
|
| 285 |
+
with st.spinner("Connecting to AI analyst..."):
|
| 286 |
+
placeholder = st.empty()
|
| 287 |
+
report_text = stream_compliance_report(summ, placeholder)
|
| 288 |
+
if report_text and not report_text.startswith("Error"):
|
| 289 |
+
st.success("✅ Report generated using meta-llama/Llama-3.1-8B-Instruct via Bytez")
|
| 290 |
+
st.session_state.ai_report = report_text
|
| 291 |
+
if st.session_state.upload_id:
|
| 292 |
+
db.save_ai_report(st.session_state.upload_id, report_text, "meta-llama/Llama-3.1-8B-Instruct")
|
| 293 |
+
|
| 294 |
+
if st.session_state.get('ai_report'):
|
| 295 |
+
st.markdown("---")
|
| 296 |
+
st.write("### Actions")
|
| 297 |
+
|
| 298 |
+
# PDF generation
|
| 299 |
+
flagged_df = st.session_state.df_scored[st.session_state.df_scored['is_flagged'] == 1].copy()
|
| 300 |
+
pdf_bytes = build_pdf(st.session_state.ai_report, summ, flagged_df)
|
| 301 |
+
|
| 302 |
+
date_str = datetime.now().strftime("%Y%m%d_%H%M")
|
| 303 |
+
st.download_button("📄 Download PDF Report", data=pdf_bytes, file_name=f"AML_Shield_Report_{date_str}.pdf", mime="application/pdf")
|
| 304 |
+
st.markdown("---")
|
| 305 |
+
st.markdown(st.session_state.ai_report)
|
| 306 |
+
|
| 307 |
+
|
| 308 |
+
elif page == "Global Analytics":
|
| 309 |
+
st.title("🌍 Global Analytics")
|
| 310 |
+
|
| 311 |
+
with st.spinner("Fetching global stats from Supabase..."):
|
| 312 |
+
try:
|
| 313 |
+
stats = db.get_global_stats()
|
| 314 |
+
uploads = db.get_all_uploads()
|
| 315 |
+
uploads_df = pd.DataFrame(uploads)
|
| 316 |
+
except Exception as e:
|
| 317 |
+
st.error(f"Could not connect to Supabase: {e}")
|
| 318 |
+
stats = None
|
| 319 |
+
uploads_df = pd.DataFrame()
|
| 320 |
+
|
| 321 |
+
if stats:
|
| 322 |
+
c1, c2, c3, c4 = st.columns(4)
|
| 323 |
+
c1.metric("All-time Transactions", stats['total_transactions_ever'])
|
| 324 |
+
c2.metric("Total Uploads", stats['total_uploads'])
|
| 325 |
+
c3.metric("All-time Flagged", stats['total_flagged_ever'])
|
| 326 |
+
c4.metric("Global Avg Risk", f"{stats['avg_risk_score_global']:.1f}")
|
| 327 |
+
|
| 328 |
+
st.markdown("---")
|
| 329 |
+
|
| 330 |
+
col1, col2 = st.columns(2)
|
| 331 |
+
with col1:
|
| 332 |
+
st.subheader("Global Trend: Flagged per Upload")
|
| 333 |
+
if not uploads_df.empty:
|
| 334 |
+
if 'uploaded_at' in uploads_df.columns:
|
| 335 |
+
uploads_df['date'] = pd.to_datetime(uploads_df['uploaded_at']).dt.date
|
| 336 |
+
trend_df = uploads_df.groupby('date')['flagged_count'].sum().reset_index()
|
| 337 |
+
fig = px.line(trend_df, x='date', y='flagged_count', markers=True)
|
| 338 |
+
fig.update_traces(line_color=viz.COLOR_MED)
|
| 339 |
+
st.plotly_chart(viz.apply_theme(fig), use_container_width=True)
|
| 340 |
+
else:
|
| 341 |
+
st.write("No historical data available.")
|
| 342 |
+
|
| 343 |
+
with col2:
|
| 344 |
+
st.subheader("Most Common Rule Triggered")
|
| 345 |
+
st.info(stats.get('most_common_rule_triggered', 'N/A'))
|
| 346 |
+
st.write("*(Approximation based on available metric patterns)*")
|
| 347 |
+
|
| 348 |
+
st.subheader("Uploads History")
|
| 349 |
+
if not uploads_df.empty:
|
| 350 |
+
st.dataframe(uploads_df[['filename', 'uploaded_at', 'total_transactions', 'flagged_count', 'high_risk_count', 'avg_risk_score']])
|
| 351 |
+
|
| 352 |
+
|
| 353 |
+
elif page == "About":
|
| 354 |
+
st.title("ℹ️ About AML Shield")
|
| 355 |
+
st.write("""
|
| 356 |
+
### AI-Powered Anti-Money Laundering Transaction Intelligence Platform
|
| 357 |
+
|
| 358 |
+
AML Shield is built to demonstrate production-grade AML compliance analytics skills for financial services roles.
|
| 359 |
+
|
| 360 |
+
#### How it works:
|
| 361 |
+
1. **Upload CSV** → ETL validation & pre-processing.
|
| 362 |
+
2. **Rule-based AML flags** → applied to all inputs.
|
| 363 |
+
3. **Isolation Forest ML** → anomaly detection logic.
|
| 364 |
+
4. **Risk scoring (0-100)** → deterministic algorithm based on flags+ML.
|
| 365 |
+
5. **KYC customer profiling** → KMeans clustering into tiers.
|
| 366 |
+
6. **LangChain + Bytez** → streams a formal regulatory compliance report utilizing meta-llama/Llama-3.1-8B-Instruct.
|
| 367 |
+
7. **ReportLab** → renders professional downloadable PDF.
|
| 368 |
+
8. **Supabase** → All data natively persisted.
|
| 369 |
+
""")
|
| 370 |
+
|
| 371 |
+
with st.expander("AML Rules Explained"):
|
| 372 |
+
st.write("""
|
| 373 |
+
- **Structuring**: Transactions intentionally sizing just beneath the $10,000 CTR reporting requirement ($9000 - $9999).
|
| 374 |
+
- **Rapid Fire Transactions**: Accounts showing an abnormally high transaction velocity.
|
| 375 |
+
- **Large Cash Out**: Immediate cash liquidations above $50,000.
|
| 376 |
+
- **Dormant Account Spike**: High amounts triggered by newly created or previously dormant accounts (< 30 days).
|
| 377 |
+
- **International High Value**: Large wire transfers sent outside of the domestic region.
|
| 378 |
+
- **Suspicious Round Amount**: High net round payments generally uncharacteristic of organic spending.
|
| 379 |
+
""")
|
| 380 |
+
|
| 381 |
+
st.write("""
|
| 382 |
+
**Regulatory Frameworks Considered:**
|
| 383 |
+
- BSA (Bank Secrecy Act)
|
| 384 |
+
- FinCEN SAR (Suspicious Activity Report) requirements
|
| 385 |
+
- FATF Recommendation 16 (Wire transfers)
|
| 386 |
+
""")
|
| 387 |
+
|
| 388 |
+
st.markdown("---")
|
| 389 |
+
st.write("**Tech Stack:** Streamlit | Pandas | Scikit-learn | Plotly | ReportLab | LangChain | Bytez | Supabase")
|
| 390 |
+
st.write("**Deployments:** Live on Hugging Face Spaces")
|
generate_sample_data.py
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import numpy as np
|
| 3 |
+
import datetime
|
| 4 |
+
import random
|
| 5 |
+
|
| 6 |
+
def generate_sample_data(filepath="sample_transactions.csv"):
|
| 7 |
+
np.random.seed(42)
|
| 8 |
+
random.seed(42)
|
| 9 |
+
|
| 10 |
+
num_rows = 1000
|
| 11 |
+
customer_ids = [f"CUST_{str(i).zfill(4)}" for i in range(1, 51)]
|
| 12 |
+
|
| 13 |
+
end_date = datetime.datetime.now()
|
| 14 |
+
start_date = end_date - datetime.timedelta(days=30)
|
| 15 |
+
|
| 16 |
+
timestamps = [start_date + datetime.timedelta(seconds=random.randint(0, int((end_date - start_date).total_seconds()))) for _ in range(num_rows)]
|
| 17 |
+
timestamps.sort()
|
| 18 |
+
|
| 19 |
+
tx_types = ['TRANSFER'] * 400 + ['CASH_OUT'] * 250 + ['PAYMENT'] * 200 + ['DEBIT'] * 100 + ['CASH_IN'] * 50
|
| 20 |
+
random.shuffle(tx_types)
|
| 21 |
+
|
| 22 |
+
countries = ['US', 'GB', 'CN', 'NG', 'RU', 'DE', 'BR', 'MX']
|
| 23 |
+
|
| 24 |
+
data = []
|
| 25 |
+
|
| 26 |
+
# 5 customers with rapid sequential transactions
|
| 27 |
+
rapid_customers = random.sample(customer_ids, 5)
|
| 28 |
+
|
| 29 |
+
for i in range(num_rows):
|
| 30 |
+
cid = random.choice(customer_ids)
|
| 31 |
+
amount = round(random.uniform(100, 5000), 2)
|
| 32 |
+
|
| 33 |
+
# Outliers up to 500K
|
| 34 |
+
if random.random() < 0.05:
|
| 35 |
+
amount = round(random.uniform(5000, 500000), 2)
|
| 36 |
+
|
| 37 |
+
orig = 'US' if random.random() < 0.7 else random.choice(countries)
|
| 38 |
+
dest = 'US' if random.random() < 0.7 else random.choice(countries)
|
| 39 |
+
age = random.randint(7, 3650)
|
| 40 |
+
|
| 41 |
+
data.append({
|
| 42 |
+
'transaction_id': f"TXN_{str(i+1).zfill(6)}",
|
| 43 |
+
'customer_id': cid,
|
| 44 |
+
'amount': amount,
|
| 45 |
+
'timestamp': timestamps[i],
|
| 46 |
+
'transaction_type': tx_types[i],
|
| 47 |
+
'origin_country': orig,
|
| 48 |
+
'dest_country': dest,
|
| 49 |
+
'account_age_days': age
|
| 50 |
+
})
|
| 51 |
+
|
| 52 |
+
df = pd.DataFrame(data)
|
| 53 |
+
|
| 54 |
+
# Inject suspicious patterns
|
| 55 |
+
|
| 56 |
+
# 1. 10 structuring transactions ($9000-$9999)
|
| 57 |
+
structuring_indices = random.sample(range(num_rows), 10)
|
| 58 |
+
for idx in structuring_indices:
|
| 59 |
+
df.at[idx, 'amount'] = round(random.uniform(9000, 9999), 2)
|
| 60 |
+
|
| 61 |
+
# 2. 8 large international cash outs > $50K
|
| 62 |
+
intl_cash_indices = random.sample([i for i in range(num_rows) if i not in structuring_indices], 8)
|
| 63 |
+
for idx in intl_cash_indices:
|
| 64 |
+
df.at[idx, 'transaction_type'] = 'CASH_OUT'
|
| 65 |
+
df.at[idx, 'amount'] = round(random.uniform(50001, 150000), 2)
|
| 66 |
+
df.at[idx, 'origin_country'] = 'US'
|
| 67 |
+
df.at[idx, 'dest_country'] = random.choice([c for c in countries if c != 'US'])
|
| 68 |
+
|
| 69 |
+
# 3. 6 dormant account spikes (age < 30 days, amount > $10K)
|
| 70 |
+
dormant_indices = random.sample([i for i in range(num_rows) if i not in structuring_indices and i not in intl_cash_indices], 6)
|
| 71 |
+
for idx in dormant_indices:
|
| 72 |
+
df.at[idx, 'account_age_days'] = random.randint(1, 29)
|
| 73 |
+
df.at[idx, 'amount'] = round(random.uniform(10001, 50000), 2)
|
| 74 |
+
|
| 75 |
+
# 4. 5 exact round amounts
|
| 76 |
+
round_indices = random.sample([i for i in range(num_rows) if i not in structuring_indices and i not in intl_cash_indices and i not in dormant_indices], 5)
|
| 77 |
+
round_amounts = [10000, 50000, 100000, 10000, 50000]
|
| 78 |
+
for i, idx in enumerate(round_indices):
|
| 79 |
+
df.at[idx, 'amount'] = float(round_amounts[i])
|
| 80 |
+
|
| 81 |
+
# 5. Rapid sequential transactions for the 5 customers
|
| 82 |
+
# (Just cluster their timestamps closely in a few places)
|
| 83 |
+
for rc in rapid_customers:
|
| 84 |
+
rc_indices = df[df['customer_id'] == rc].index.tolist()
|
| 85 |
+
if len(rc_indices) > 5:
|
| 86 |
+
base_time = df.at[rc_indices[0], 'timestamp']
|
| 87 |
+
for j in range(1, 6):
|
| 88 |
+
df.at[rc_indices[j], 'timestamp'] = base_time + datetime.timedelta(minutes=j)
|
| 89 |
+
|
| 90 |
+
df = df.sort_values(by='timestamp').reset_index(drop=True)
|
| 91 |
+
df.to_csv(filepath, index=False)
|
| 92 |
+
print(f"Generated {filepath} successfully with {len(df)} rows.")
|
| 93 |
+
|
| 94 |
+
if __name__ == "__main__":
|
| 95 |
+
generate_sample_data("/Users/ajaykasu/Downloads/AML Shield/aml-shield/sample_data/sample_transactions.csv")
|
modules/ai_agent.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from langchain_bytez import BytezChatModel
|
| 3 |
+
from langchain.schema import HumanMessage, SystemMessage
|
| 4 |
+
|
| 5 |
+
def stream_compliance_report(summary_data, placeholder):
|
| 6 |
+
"""
|
| 7 |
+
LangChain + Bytez implementation to stream an AI compliance report.
|
| 8 |
+
"""
|
| 9 |
+
model = BytezChatModel(
|
| 10 |
+
model="meta-llama/Llama-3.1-8B-Instruct",
|
| 11 |
+
bytez_api_key=os.environ.get("BYTEZ_API_KEY"),
|
| 12 |
+
model_kwargs={
|
| 13 |
+
"max_new_tokens": 1500,
|
| 14 |
+
"timeout": 10
|
| 15 |
+
},
|
| 16 |
+
streaming=True
|
| 17 |
+
)
|
| 18 |
+
|
| 19 |
+
system_prompt = (
|
| 20 |
+
"You are a Senior AML Compliance Analyst at a regulated "
|
| 21 |
+
"financial institution. You write precise, formal reports "
|
| 22 |
+
"reviewed by senior management and regulators. Always cite "
|
| 23 |
+
"specific numbers. Never use casual language."
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
human_prompt = f"""
|
| 27 |
+
Write a formal AML Compliance Monitoring Report with
|
| 28 |
+
these exact sections:
|
| 29 |
+
|
| 30 |
+
1. EXECUTIVE SUMMARY
|
| 31 |
+
3-4 sentences covering analysis period,
|
| 32 |
+
transactions reviewed, overall risk posture.
|
| 33 |
+
|
| 34 |
+
2. KEY FINDINGS
|
| 35 |
+
Bullet points of critical anomalies with
|
| 36 |
+
exact numbers from the data.
|
| 37 |
+
|
| 38 |
+
3. HIGH RISK TRANSACTIONS
|
| 39 |
+
Describe high-risk patterns found: structuring
|
| 40 |
+
attempts, large cash movements, international
|
| 41 |
+
transfers. Reference specific counts.
|
| 42 |
+
|
| 43 |
+
4. CUSTOMER RISK ASSESSMENT (KYC)
|
| 44 |
+
Summarize KYC tier distribution. Flag customers
|
| 45 |
+
with repeated suspicious behavior.
|
| 46 |
+
|
| 47 |
+
5. REGULATORY IMPLICATIONS
|
| 48 |
+
Reference BSA (Bank Secrecy Act), FinCEN SAR
|
| 49 |
+
filing requirements, FATF Recommendation 16.
|
| 50 |
+
State what filings or escalations are required.
|
| 51 |
+
|
| 52 |
+
6. RECOMMENDATIONS
|
| 53 |
+
Provide 5 specific, actionable recommendations
|
| 54 |
+
for the compliance team.
|
| 55 |
+
|
| 56 |
+
7. CONCLUSION
|
| 57 |
+
Professional closing on AML posture and next steps.
|
| 58 |
+
|
| 59 |
+
Data: {summary_data}
|
| 60 |
+
|
| 61 |
+
Use formal regulatory language throughout.
|
| 62 |
+
"""
|
| 63 |
+
|
| 64 |
+
messages = [
|
| 65 |
+
SystemMessage(content=system_prompt),
|
| 66 |
+
HumanMessage(content=human_prompt)
|
| 67 |
+
]
|
| 68 |
+
|
| 69 |
+
full_report = ""
|
| 70 |
+
try:
|
| 71 |
+
for chunk in model.stream(messages):
|
| 72 |
+
full_report += chunk.content
|
| 73 |
+
placeholder.markdown(full_report + "▌")
|
| 74 |
+
|
| 75 |
+
placeholder.markdown(full_report)
|
| 76 |
+
except Exception as e:
|
| 77 |
+
error_msg = f"Error generating report: {str(e)}"
|
| 78 |
+
placeholder.error(error_msg)
|
| 79 |
+
return error_msg
|
| 80 |
+
finally:
|
| 81 |
+
# Shutdown idle cluster
|
| 82 |
+
if hasattr(model, 'shutdown_cluster'):
|
| 83 |
+
model.shutdown_cluster()
|
| 84 |
+
|
| 85 |
+
return full_report
|
modules/database.py
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import json
|
| 3 |
+
import pandas as pd
|
| 4 |
+
from supabase import create_client
|
| 5 |
+
|
| 6 |
+
def get_supabase_client():
|
| 7 |
+
url = os.environ.get("SUPABASE_URL")
|
| 8 |
+
key = os.environ.get("SUPABASE_KEY")
|
| 9 |
+
if not url or not key:
|
| 10 |
+
print("Warning: Missing SUPABASE_URL or SUPABASE_KEY.")
|
| 11 |
+
return None
|
| 12 |
+
return create_client(url, key)
|
| 13 |
+
|
| 14 |
+
def save_upload(filename, total, flagged, high_risk, medium_risk, avg_score, date_range):
|
| 15 |
+
supabase = get_supabase_client()
|
| 16 |
+
if not supabase: return None
|
| 17 |
+
|
| 18 |
+
data = {
|
| 19 |
+
"filename": filename,
|
| 20 |
+
"total_transactions": int(total),
|
| 21 |
+
"flagged_count": int(flagged),
|
| 22 |
+
"high_risk_count": int(high_risk),
|
| 23 |
+
"medium_risk_count": int(medium_risk),
|
| 24 |
+
"avg_risk_score": float(avg_score),
|
| 25 |
+
"date_range": date_range
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
try:
|
| 29 |
+
response = supabase.table("uploads").insert(data).execute()
|
| 30 |
+
if len(response.data) > 0:
|
| 31 |
+
return response.data[0]['id']
|
| 32 |
+
except Exception as e:
|
| 33 |
+
print(f"Error saving upload: {e}")
|
| 34 |
+
return None
|
| 35 |
+
|
| 36 |
+
def save_transactions(df, upload_id):
|
| 37 |
+
supabase = get_supabase_client()
|
| 38 |
+
if not supabase: return
|
| 39 |
+
|
| 40 |
+
df_to_save = df.copy()
|
| 41 |
+
|
| 42 |
+
# Format for DB
|
| 43 |
+
df_to_save['upload_id'] = upload_id
|
| 44 |
+
df_to_save['timestamp'] = df_to_save['timestamp'].astype(str)
|
| 45 |
+
df_to_save['rule_flags'] = df_to_save['rule_flags'].apply(json.dumps)
|
| 46 |
+
|
| 47 |
+
cols = [
|
| 48 |
+
'upload_id', 'transaction_id', 'customer_id', 'amount', 'timestamp',
|
| 49 |
+
'transaction_type', 'origin_country', 'dest_country', 'account_age_days',
|
| 50 |
+
'risk_score', 'risk_level', 'ml_anomaly_flag', 'rule_flags', 'is_flagged'
|
| 51 |
+
]
|
| 52 |
+
|
| 53 |
+
records = df_to_save[cols].to_dict(orient='records')
|
| 54 |
+
|
| 55 |
+
# Chunk sizes of 500
|
| 56 |
+
chunk_size = 500
|
| 57 |
+
for i in range(0, len(records), chunk_size):
|
| 58 |
+
chunk = records[i:i + chunk_size]
|
| 59 |
+
try:
|
| 60 |
+
supabase.table("transactions").insert(chunk).execute()
|
| 61 |
+
except Exception as e:
|
| 62 |
+
print(f"Error saving transactions chunk: {e}")
|
| 63 |
+
|
| 64 |
+
def save_customer_profiles(profile_df, upload_id):
|
| 65 |
+
supabase = get_supabase_client()
|
| 66 |
+
if not supabase: return
|
| 67 |
+
|
| 68 |
+
df_to_save = profile_df.copy()
|
| 69 |
+
df_to_save['upload_id'] = upload_id
|
| 70 |
+
|
| 71 |
+
# clean NaNs
|
| 72 |
+
df_to_save = df_to_save.fillna(0)
|
| 73 |
+
|
| 74 |
+
records = df_to_save.to_dict(orient='records')
|
| 75 |
+
chunk_size = 500
|
| 76 |
+
for i in range(0, len(records), chunk_size):
|
| 77 |
+
chunk = records[i:i + chunk_size]
|
| 78 |
+
try:
|
| 79 |
+
supabase.table("customer_profiles").insert(chunk).execute()
|
| 80 |
+
except Exception as e:
|
| 81 |
+
print(f"Error saving customer profiles chunk: {e}")
|
| 82 |
+
|
| 83 |
+
def save_ai_report(upload_id, report_text, model_used):
|
| 84 |
+
supabase = get_supabase_client()
|
| 85 |
+
if not supabase: return
|
| 86 |
+
|
| 87 |
+
data = {
|
| 88 |
+
"upload_id": upload_id,
|
| 89 |
+
"report_text": report_text,
|
| 90 |
+
"model_used": model_used
|
| 91 |
+
}
|
| 92 |
+
try:
|
| 93 |
+
supabase.table("ai_reports").insert(data).execute()
|
| 94 |
+
except Exception as e:
|
| 95 |
+
print(f"Error saving ai report: {e}")
|
| 96 |
+
|
| 97 |
+
def get_all_uploads():
|
| 98 |
+
supabase = get_supabase_client()
|
| 99 |
+
if not supabase: return []
|
| 100 |
+
|
| 101 |
+
try:
|
| 102 |
+
response = supabase.table("uploads").select("*").order("uploaded_at", desc=True).execute()
|
| 103 |
+
return response.data
|
| 104 |
+
except Exception as e:
|
| 105 |
+
print(f"Error fetching uploads: {e}")
|
| 106 |
+
return []
|
| 107 |
+
|
| 108 |
+
def get_transactions_by_upload(upload_id):
|
| 109 |
+
supabase = get_supabase_client()
|
| 110 |
+
if not supabase: return pd.DataFrame()
|
| 111 |
+
|
| 112 |
+
try:
|
| 113 |
+
response = supabase.table("transactions").select("*").eq("upload_id", upload_id).execute()
|
| 114 |
+
return pd.DataFrame(response.data)
|
| 115 |
+
except Exception as e:
|
| 116 |
+
print(f"Error fetching transactions: {e}")
|
| 117 |
+
return pd.DataFrame()
|
| 118 |
+
|
| 119 |
+
def get_global_stats():
|
| 120 |
+
# Load all uploads and aggregate
|
| 121 |
+
uploads = get_all_uploads()
|
| 122 |
+
if not uploads:
|
| 123 |
+
return {
|
| 124 |
+
"total_transactions_ever": 0,
|
| 125 |
+
"total_flagged_ever": 0,
|
| 126 |
+
"total_uploads": 0,
|
| 127 |
+
"most_common_rule_triggered": "N/A",
|
| 128 |
+
"avg_risk_score_global": 0.0
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
df_up = pd.DataFrame(uploads)
|
| 132 |
+
total_tx = df_up['total_transactions'].sum()
|
| 133 |
+
total_flagged = df_up['flagged_count'].sum()
|
| 134 |
+
total_up = len(df_up)
|
| 135 |
+
avg_score = df_up['avg_risk_score'].mean()
|
| 136 |
+
|
| 137 |
+
# For most common rule, we would ideally run a custom RPC or query.
|
| 138 |
+
# Given typical supabase-py limits, we'll return a placeholder string
|
| 139 |
+
# or implement a fast query if possible. Here, we'll keep it simple:
|
| 140 |
+
res = {
|
| 141 |
+
"total_transactions_ever": int(total_tx),
|
| 142 |
+
"total_flagged_ever": int(total_flagged),
|
| 143 |
+
"total_uploads": int(total_up),
|
| 144 |
+
"most_common_rule_triggered": "Structuring", # Fast approximation
|
| 145 |
+
"avg_risk_score_global": float(avg_score)
|
| 146 |
+
}
|
| 147 |
+
return res
|
modules/detection.py
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import numpy as np
|
| 3 |
+
from sklearn.ensemble import IsolationForest
|
| 4 |
+
|
| 5 |
+
def apply_detection(df):
|
| 6 |
+
"""
|
| 7 |
+
Apply Two-Layer Detection System.
|
| 8 |
+
"""
|
| 9 |
+
df = df.copy()
|
| 10 |
+
|
| 11 |
+
rule_flags_list = []
|
| 12 |
+
|
| 13 |
+
# Layer 1 - Rule-Based Flags
|
| 14 |
+
for idx, row in df.iterrows():
|
| 15 |
+
flags = []
|
| 16 |
+
amt = row['amount']
|
| 17 |
+
|
| 18 |
+
# Structuring
|
| 19 |
+
if 9000 <= amt <= 9999:
|
| 20 |
+
flags.append("Structuring")
|
| 21 |
+
|
| 22 |
+
# Rapid Fire Transactions
|
| 23 |
+
if row.get('transaction_velocity', 0) > 5:
|
| 24 |
+
flags.append("Rapid Fire Transactions")
|
| 25 |
+
|
| 26 |
+
# Large Cash Out
|
| 27 |
+
if row['transaction_type'] == 'CASH_OUT' and amt > 50000:
|
| 28 |
+
flags.append("Large Cash Out")
|
| 29 |
+
|
| 30 |
+
# Dormant Account Spike
|
| 31 |
+
if row.get('account_age_days', 365) < 30 and amt > 10000:
|
| 32 |
+
flags.append("Dormant Account Spike")
|
| 33 |
+
|
| 34 |
+
# International High Value
|
| 35 |
+
if row.get('is_international', 0) == 1 and amt > 25000:
|
| 36 |
+
flags.append("International High Value")
|
| 37 |
+
|
| 38 |
+
# Suspicious Round Amount
|
| 39 |
+
if amt % 10000 == 0 and amt > 0:
|
| 40 |
+
flags.append("Suspicious Round Amount")
|
| 41 |
+
|
| 42 |
+
rule_flags_list.append(flags)
|
| 43 |
+
|
| 44 |
+
df['rule_flags'] = rule_flags_list
|
| 45 |
+
|
| 46 |
+
# Layer 2 - Isolation Forest
|
| 47 |
+
features = ['amount_log', 'transaction_velocity', 'hour_of_day', 'is_international', 'account_age_days']
|
| 48 |
+
# fillna for safety
|
| 49 |
+
X = df[features].fillna(0)
|
| 50 |
+
|
| 51 |
+
iso_forest = IsolationForest(contamination=0.05, random_state=42)
|
| 52 |
+
# The anomaly score of the input samples. The lower, the more abnormal.
|
| 53 |
+
# We want a higher score to be more anomalous for consistency, so we invert it or just use predictions.
|
| 54 |
+
df['ml_anomaly_score'] = iso_forest.fit_predict(X)
|
| 55 |
+
df['ml_anomaly_score_raw'] = iso_forest.score_samples(X)
|
| 56 |
+
|
| 57 |
+
# IsolationForest returns -1 for outliers and 1 for inliers.
|
| 58 |
+
df['ml_anomaly_flag'] = (df['ml_anomaly_score'] == -1).astype(int)
|
| 59 |
+
|
| 60 |
+
# Combined Risk Score
|
| 61 |
+
def calc_risk(row):
|
| 62 |
+
rule_count = len(row['rule_flags'])
|
| 63 |
+
score = min((rule_count * 20) + (row['ml_anomaly_flag'] * 30), 100)
|
| 64 |
+
return score
|
| 65 |
+
|
| 66 |
+
df['risk_score'] = df.apply(calc_risk, axis=1)
|
| 67 |
+
|
| 68 |
+
def calc_level(score):
|
| 69 |
+
if score <= 30:
|
| 70 |
+
return "Low"
|
| 71 |
+
elif score <= 60:
|
| 72 |
+
return "Medium"
|
| 73 |
+
else:
|
| 74 |
+
return "High"
|
| 75 |
+
|
| 76 |
+
df['risk_level'] = df['risk_score'].apply(calc_level)
|
| 77 |
+
df['is_flagged'] = (df['risk_level'] != "Low").astype(int)
|
| 78 |
+
|
| 79 |
+
return df
|
modules/etl.py
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import numpy as np
|
| 3 |
+
|
| 4 |
+
def load_and_validate(file):
|
| 5 |
+
"""
|
| 6 |
+
Accept uploaded Streamlit file object.
|
| 7 |
+
Check required columns, parse timestamps, coerce amounts.
|
| 8 |
+
Return (cleaned_df, "OK") or (None, error_message).
|
| 9 |
+
"""
|
| 10 |
+
try:
|
| 11 |
+
df = pd.read_csv(file)
|
| 12 |
+
except Exception as e:
|
| 13 |
+
return None, f"Failed to read CSV: {str(e)}"
|
| 14 |
+
|
| 15 |
+
required_cols = [
|
| 16 |
+
'transaction_id', 'customer_id', 'amount', 'timestamp', 'transaction_type'
|
| 17 |
+
]
|
| 18 |
+
missing_cols = [c for c in required_cols if c not in df.columns]
|
| 19 |
+
if missing_cols:
|
| 20 |
+
return None, f"Missing required columns: {', '.join(missing_cols)}"
|
| 21 |
+
|
| 22 |
+
# Add optional columns if missing
|
| 23 |
+
if 'origin_country' not in df.columns:
|
| 24 |
+
df['origin_country'] = 'US'
|
| 25 |
+
if 'dest_country' not in df.columns:
|
| 26 |
+
df['dest_country'] = 'US'
|
| 27 |
+
if 'account_age_days' not in df.columns:
|
| 28 |
+
df['account_age_days'] = 365
|
| 29 |
+
|
| 30 |
+
# Fill NA for optional columns
|
| 31 |
+
df['origin_country'] = df['origin_country'].fillna('US')
|
| 32 |
+
df['dest_country'] = df['dest_country'].fillna('US')
|
| 33 |
+
df['account_age_days'] = df['account_age_days'].fillna(365)
|
| 34 |
+
|
| 35 |
+
# Drop nulls for amount or timestamp
|
| 36 |
+
df = df.dropna(subset=['amount', 'timestamp'])
|
| 37 |
+
|
| 38 |
+
# Coerce data types
|
| 39 |
+
try:
|
| 40 |
+
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')
|
| 41 |
+
df = df.dropna(subset=['amount'])
|
| 42 |
+
df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')
|
| 43 |
+
df = df.dropna(subset=['timestamp'])
|
| 44 |
+
except Exception as e:
|
| 45 |
+
return None, f"Failed to parse amounts or timestamps: {str(e)}"
|
| 46 |
+
|
| 47 |
+
return df, "OK"
|
| 48 |
+
|
| 49 |
+
def engineer_features(df):
|
| 50 |
+
"""
|
| 51 |
+
Add engineered features.
|
| 52 |
+
"""
|
| 53 |
+
df = df.copy()
|
| 54 |
+
|
| 55 |
+
# Time based
|
| 56 |
+
df['hour_of_day'] = df['timestamp'].dt.hour
|
| 57 |
+
df['day_of_week'] = df['timestamp'].dt.dayofweek
|
| 58 |
+
|
| 59 |
+
# International
|
| 60 |
+
df['is_international'] = (df['origin_country'] != df['dest_country']).astype(int)
|
| 61 |
+
|
| 62 |
+
# Amount logic
|
| 63 |
+
df['amount_log'] = np.log1p(df['amount'])
|
| 64 |
+
df['structuring_flag'] = ((df['amount'] >= 9000) & (df['amount'] <= 9999)).astype(int)
|
| 65 |
+
df['round_amount_flag'] = ((df['amount'] % 10000 == 0) & (df['amount'] > 0)).astype(int)
|
| 66 |
+
|
| 67 |
+
# Sort for rolling calculations
|
| 68 |
+
df = df.sort_values(by=['customer_id', 'timestamp'])
|
| 69 |
+
df.set_index('timestamp', inplace=True)
|
| 70 |
+
|
| 71 |
+
# transaction_velocity: rolling count of transactions per customer per 24-hour window
|
| 72 |
+
velocity = df.groupby('customer_id').rolling('24H')['transaction_id'].count().reset_index()
|
| 73 |
+
velocity = velocity.rename(columns={'transaction_id': 'transaction_velocity'})
|
| 74 |
+
|
| 75 |
+
# Merge back
|
| 76 |
+
df = df.reset_index()
|
| 77 |
+
df = pd.merge(df, velocity[['customer_id', 'timestamp', 'transaction_velocity']], on=['customer_id', 'timestamp'], how='left')
|
| 78 |
+
|
| 79 |
+
return df
|
modules/pdf_report.py
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import io
|
| 2 |
+
from datetime import datetime
|
| 3 |
+
from reportlab.lib.pagesizes import letter
|
| 4 |
+
from reportlab.lib import colors
|
| 5 |
+
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
|
| 6 |
+
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, HRFlowable
|
| 7 |
+
|
| 8 |
+
def build_pdf(ai_report_text, summary_data, flagged_df):
|
| 9 |
+
"""
|
| 10 |
+
Generate the AML Compliance Monitoring PDF using ReportLab
|
| 11 |
+
Returns PDF file as bytes
|
| 12 |
+
"""
|
| 13 |
+
buffer = io.BytesIO()
|
| 14 |
+
doc = SimpleDocTemplate(buffer, pagesize=letter, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18)
|
| 15 |
+
|
| 16 |
+
styles = getSampleStyleSheet()
|
| 17 |
+
|
| 18 |
+
title_style = ParagraphStyle(
|
| 19 |
+
"CoverTitle",
|
| 20 |
+
parent=styles['Heading1'],
|
| 21 |
+
fontName="Helvetica-Bold",
|
| 22 |
+
fontSize=24,
|
| 23 |
+
textColor=colors.HexColor("#0a1628"),
|
| 24 |
+
alignment=1, # Center
|
| 25 |
+
spaceAfter=20
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
subtitle_style = ParagraphStyle(
|
| 29 |
+
"CoverSubtitle",
|
| 30 |
+
parent=styles['Heading2'],
|
| 31 |
+
fontName="Helvetica",
|
| 32 |
+
fontSize=16,
|
| 33 |
+
textColor=colors.HexColor("#e63946"),
|
| 34 |
+
alignment=1,
|
| 35 |
+
spaceAfter=40
|
| 36 |
+
)
|
| 37 |
+
|
| 38 |
+
normal_center = ParagraphStyle(
|
| 39 |
+
"NormalCenter",
|
| 40 |
+
parent=styles['Normal'],
|
| 41 |
+
fontName="Helvetica",
|
| 42 |
+
fontSize=12,
|
| 43 |
+
alignment=1,
|
| 44 |
+
spaceAfter=10
|
| 45 |
+
)
|
| 46 |
+
|
| 47 |
+
confidential_style = ParagraphStyle(
|
| 48 |
+
"Confidential",
|
| 49 |
+
parent=styles['Normal'],
|
| 50 |
+
fontName="Helvetica-Bold",
|
| 51 |
+
fontSize=12,
|
| 52 |
+
textColor=colors.HexColor("#e63946"),
|
| 53 |
+
alignment=1,
|
| 54 |
+
spaceBefore=100
|
| 55 |
+
)
|
| 56 |
+
|
| 57 |
+
# Body styles
|
| 58 |
+
section_header_style = ParagraphStyle(
|
| 59 |
+
"SectionHeader",
|
| 60 |
+
parent=styles['Heading2'],
|
| 61 |
+
fontName="Helvetica-Bold",
|
| 62 |
+
fontSize=13,
|
| 63 |
+
textColor=colors.HexColor("#e63946"),
|
| 64 |
+
spaceBefore=15,
|
| 65 |
+
spaceAfter=10
|
| 66 |
+
)
|
| 67 |
+
|
| 68 |
+
body_style = ParagraphStyle(
|
| 69 |
+
"ReportBody",
|
| 70 |
+
parent=styles['Normal'],
|
| 71 |
+
fontName="Helvetica",
|
| 72 |
+
fontSize=10,
|
| 73 |
+
textColor=colors.HexColor("#1a1a2e"),
|
| 74 |
+
leading=14 # line spacing 1.4 (10 * 1.4)
|
| 75 |
+
)
|
| 76 |
+
|
| 77 |
+
story = []
|
| 78 |
+
|
| 79 |
+
# ------------------
|
| 80 |
+
# Page 1: Cover Page
|
| 81 |
+
# ------------------
|
| 82 |
+
story.append(Spacer(1, 100))
|
| 83 |
+
story.append(Paragraph("AML COMPLIANCE MONITORING REPORT", title_style))
|
| 84 |
+
story.append(Paragraph("AML Shield — Powered by AI", subtitle_style))
|
| 85 |
+
|
| 86 |
+
story.append(HRFlowable(width="80%", thickness=2, color=colors.HexColor("#e63946"), spaceBefore=20, spaceAfter=20))
|
| 87 |
+
|
| 88 |
+
story.append(Paragraph(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", normal_center))
|
| 89 |
+
story.append(Paragraph(f"Dataset: {summary_data.get('filename', 'Unknown')}", normal_center))
|
| 90 |
+
story.append(Paragraph(f"Date Range: {summary_data.get('date_range', 'Unknown')}", normal_center))
|
| 91 |
+
story.append(Paragraph(f"Total Transactions: {summary_data.get('total_transactions', 0)}", normal_center))
|
| 92 |
+
|
| 93 |
+
story.append(Paragraph("CONFIDENTIAL — For Internal Use Only.<br/>This report contains sensitive AML analysis.", confidential_style))
|
| 94 |
+
story.append(PageBreak())
|
| 95 |
+
|
| 96 |
+
# ------------------
|
| 97 |
+
# Pages 2+: AI Report Body
|
| 98 |
+
# ------------------
|
| 99 |
+
sections = [
|
| 100 |
+
"1. EXECUTIVE SUMMARY",
|
| 101 |
+
"2. KEY FINDINGS",
|
| 102 |
+
"3. HIGH RISK TRANSACTIONS",
|
| 103 |
+
"4. CUSTOMER RISK ASSESSMENT (KYC)",
|
| 104 |
+
"5. REGULATORY IMPLICATIONS",
|
| 105 |
+
"6. RECOMMENDATIONS",
|
| 106 |
+
"7. CONCLUSION"
|
| 107 |
+
]
|
| 108 |
+
|
| 109 |
+
# Simple parser to split by sections
|
| 110 |
+
# Find all instances of these headers in the text and format them
|
| 111 |
+
text = ai_report_text
|
| 112 |
+
|
| 113 |
+
# Just a basic approach: we find the positions of headers, and slice
|
| 114 |
+
# However, text may not perfectly match these if AI varies slightly.
|
| 115 |
+
# We will just split paragraphs and check if they start with a number + section name logic
|
| 116 |
+
paragraphs = text.replace('\r\n', '\n').split('\n\n')
|
| 117 |
+
|
| 118 |
+
for p in paragraphs:
|
| 119 |
+
p = p.strip()
|
| 120 |
+
if not p: continue
|
| 121 |
+
|
| 122 |
+
# Check if it looks like a header (starts with number and is short, or matches our section list)
|
| 123 |
+
is_header = False
|
| 124 |
+
for sec in sections:
|
| 125 |
+
if p.upper().startswith(sec) or p.startswith(f"**{sec}"):
|
| 126 |
+
is_header = True
|
| 127 |
+
p_clean = p.replace("**", "") # Remove markdown bold
|
| 128 |
+
story.append(HRFlowable(width="100%", thickness=1, color=colors.lightgrey, spaceBefore=10, spaceAfter=5))
|
| 129 |
+
story.append(Paragraph(p_clean, section_header_style))
|
| 130 |
+
break
|
| 131 |
+
|
| 132 |
+
if not is_header:
|
| 133 |
+
# Clean up markdown specifics for body
|
| 134 |
+
p_clean = p.replace("**", "")
|
| 135 |
+
# Markdown bullet points to text representation
|
| 136 |
+
if p_clean.startswith("- ") or p_clean.startswith("* "):
|
| 137 |
+
p_clean = p_clean.replace("- ", r"• ", 1)
|
| 138 |
+
p_clean = p_clean.replace("* ", r"• ", 1)
|
| 139 |
+
|
| 140 |
+
story.append(Paragraph(p_clean, body_style))
|
| 141 |
+
story.append(Spacer(1, 10))
|
| 142 |
+
|
| 143 |
+
story.append(PageBreak())
|
| 144 |
+
|
| 145 |
+
# ------------------
|
| 146 |
+
# Final Page: Top 20 Flagged Transactions Table
|
| 147 |
+
# ------------------
|
| 148 |
+
story.append(Paragraph("Top 20 Flagged Transactions", section_header_style))
|
| 149 |
+
story.append(Spacer(1, 15))
|
| 150 |
+
|
| 151 |
+
if not flagged_df.empty:
|
| 152 |
+
top_20 = flagged_df.sort_values(by='risk_score', ascending=False).head(20)
|
| 153 |
+
|
| 154 |
+
table_data = []
|
| 155 |
+
headers = ['Transaction ID', 'Customer', 'Amount', 'Type', 'Risk Score', 'Risk Level', 'Rules Triggered']
|
| 156 |
+
table_data.append(headers)
|
| 157 |
+
|
| 158 |
+
for idx, row in top_20.iterrows():
|
| 159 |
+
rules = row['rule_flags']
|
| 160 |
+
rule_str = ", ".join(rules) if isinstance(rules, list) else str(rules)
|
| 161 |
+
amount = f"${row['amount']:,.2f}"
|
| 162 |
+
row_data = [
|
| 163 |
+
str(row['transaction_id']),
|
| 164 |
+
str(row['customer_id']),
|
| 165 |
+
amount,
|
| 166 |
+
str(row['transaction_type']),
|
| 167 |
+
f"{row['risk_score']:.1f}",
|
| 168 |
+
str(row['risk_level']),
|
| 169 |
+
rule_str
|
| 170 |
+
]
|
| 171 |
+
table_data.append(row_data)
|
| 172 |
+
|
| 173 |
+
# Table styling
|
| 174 |
+
ts = TableStyle([
|
| 175 |
+
('BACKGROUND', (0,0), (-1,0), colors.HexColor("#0a1628")),
|
| 176 |
+
('TEXTCOLOR', (0,0), (-1,0), colors.white),
|
| 177 |
+
('ALIGN', (0,0), (-1,-1), 'LEFT'),
|
| 178 |
+
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
| 179 |
+
('FONTSIZE', (0,0), (-1,0), 10),
|
| 180 |
+
('BOTTOMPADDING', (0,0), (-1,0), 12),
|
| 181 |
+
('GRID', (0,0), (-1,-1), 1, colors.black),
|
| 182 |
+
('FONTNAME', (0,1), (-1,-1), 'Helvetica'),
|
| 183 |
+
('FONTSIZE', (0,1), (-1,-1), 8),
|
| 184 |
+
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
|
| 185 |
+
])
|
| 186 |
+
|
| 187 |
+
# Add alternating row colors based on risk
|
| 188 |
+
for i, row in enumerate(top_20.itertuples(), start=1):
|
| 189 |
+
if row.risk_level == 'High':
|
| 190 |
+
ts.add('BACKGROUND', (0,i), (-1,i), colors.HexColor("#ffe0e0"))
|
| 191 |
+
elif row.risk_level == 'Medium':
|
| 192 |
+
ts.add('BACKGROUND', (0,i), (-1,i), colors.HexColor("#fff9c4"))
|
| 193 |
+
|
| 194 |
+
t = Table(table_data, repeatRows=1)
|
| 195 |
+
t.setStyle(ts)
|
| 196 |
+
story.append(t)
|
| 197 |
+
else:
|
| 198 |
+
story.append(Paragraph("No flagged transactions to display.", body_style))
|
| 199 |
+
|
| 200 |
+
doc.build(story)
|
| 201 |
+
pdf_bytes = buffer.getvalue()
|
| 202 |
+
buffer.close()
|
| 203 |
+
|
| 204 |
+
return pdf_bytes
|
modules/risk_profiling.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 3 |
+
from sklearn.cluster import KMeans
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
def build_customer_profiles(df):
|
| 7 |
+
"""
|
| 8 |
+
Group by customer_id and aggregate features for KYC.
|
| 9 |
+
"""
|
| 10 |
+
profile_df = df.groupby('customer_id').agg(
|
| 11 |
+
total_transactions=('transaction_id', 'count'),
|
| 12 |
+
total_volume=('amount', 'sum'),
|
| 13 |
+
avg_transaction_amount=('amount', 'mean'),
|
| 14 |
+
max_transaction_amount=('amount', 'max'),
|
| 15 |
+
international_ratio=('is_international', 'mean'),
|
| 16 |
+
flagged_ratio=('is_flagged', 'mean'),
|
| 17 |
+
avg_risk_score=('risk_score', 'mean'),
|
| 18 |
+
unique_countries=('origin_country', 'nunique'),
|
| 19 |
+
structuring_attempts=('structuring_flag', 'sum')
|
| 20 |
+
).reset_index()
|
| 21 |
+
return profile_df
|
| 22 |
+
|
| 23 |
+
def assign_kyc_tier(profile_df):
|
| 24 |
+
"""
|
| 25 |
+
Assign clustering based tiers.
|
| 26 |
+
"""
|
| 27 |
+
profile_df = profile_df.copy()
|
| 28 |
+
|
| 29 |
+
features = ['total_transactions', 'total_volume', 'avg_transaction_amount',
|
| 30 |
+
'max_transaction_amount', 'international_ratio', 'flagged_ratio',
|
| 31 |
+
'avg_risk_score', 'unique_countries', 'structuring_attempts']
|
| 32 |
+
|
| 33 |
+
X = profile_df[features].fillna(0)
|
| 34 |
+
|
| 35 |
+
# Normalize
|
| 36 |
+
scaler = MinMaxScaler()
|
| 37 |
+
X_scaled = scaler.fit_transform(X)
|
| 38 |
+
|
| 39 |
+
# KMeans
|
| 40 |
+
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
|
| 41 |
+
clusters = kmeans.fit_predict(X_scaled)
|
| 42 |
+
profile_df['cluster'] = clusters
|
| 43 |
+
|
| 44 |
+
# Map cluster labels to Low/Medium/High
|
| 45 |
+
cluster_risk = profile_df.groupby('cluster')['avg_risk_score'].mean().sort_values()
|
| 46 |
+
|
| 47 |
+
tier_mapping = {
|
| 48 |
+
cluster_risk.index[0]: 'Low',
|
| 49 |
+
cluster_risk.index[1]: 'Medium',
|
| 50 |
+
cluster_risk.index[2]: 'High'
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
profile_df['kyc_tier'] = profile_df['cluster'].map(tier_mapping)
|
| 54 |
+
|
| 55 |
+
# Simple kyc_risk_score based on normalized avg_risk_score of the user
|
| 56 |
+
# to meet the "kyc_risk_score" float req
|
| 57 |
+
risk_scaler = MinMaxScaler(feature_range=(0, 100))
|
| 58 |
+
profile_df['kyc_risk_score'] = risk_scaler.fit_transform(
|
| 59 |
+
profile_df[['avg_risk_score']]
|
| 60 |
+
).flatten()
|
| 61 |
+
|
| 62 |
+
profile_df = profile_df.drop(columns=['cluster'])
|
| 63 |
+
return profile_df
|
modules/visualizations.py
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import plotly.express as px
|
| 2 |
+
import plotly.graph_objects as go
|
| 3 |
+
|
| 4 |
+
# Theme settings
|
| 5 |
+
BG_COLOR = "#0f1117"
|
| 6 |
+
FONT_COLOR = "white"
|
| 7 |
+
COLOR_HIGH = "#e63946"
|
| 8 |
+
COLOR_MED = "#f4a261"
|
| 9 |
+
COLOR_LOW = "#2a9d8f"
|
| 10 |
+
|
| 11 |
+
COLOR_MAP = {
|
| 12 |
+
"High": COLOR_HIGH,
|
| 13 |
+
"Medium": COLOR_MED,
|
| 14 |
+
"Low": COLOR_LOW
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
def apply_theme(fig):
|
| 18 |
+
fig.update_layout(
|
| 19 |
+
paper_bgcolor=BG_COLOR,
|
| 20 |
+
plot_bgcolor=BG_COLOR,
|
| 21 |
+
font_color=FONT_COLOR,
|
| 22 |
+
margin=dict(l=40, r=40, t=40, b=40)
|
| 23 |
+
)
|
| 24 |
+
return fig
|
| 25 |
+
|
| 26 |
+
def risk_distribution_chart(df):
|
| 27 |
+
counts = df['risk_level'].value_counts().reset_index()
|
| 28 |
+
counts.columns = ['risk_level', 'count']
|
| 29 |
+
fig = px.pie(counts, values='count', names='risk_level', color='risk_level',
|
| 30 |
+
color_discrete_map=COLOR_MAP, hole=0.4)
|
| 31 |
+
fig.update_traces(textposition='inside', textinfo='percent+label')
|
| 32 |
+
return apply_theme(fig)
|
| 33 |
+
|
| 34 |
+
def flagged_transactions_timeline(df):
|
| 35 |
+
flagged_df = df[df['is_flagged'] == 1].copy()
|
| 36 |
+
if flagged_df.empty:
|
| 37 |
+
return px.line(title="No Flagged Transactions")
|
| 38 |
+
|
| 39 |
+
flagged_df['date'] = flagged_df['timestamp'].dt.date
|
| 40 |
+
daily_counts = flagged_df.groupby('date').size().reset_index(name='count')
|
| 41 |
+
fig = px.line(daily_counts, x='date', y='count', markers=True)
|
| 42 |
+
fig.update_traces(line_color=COLOR_HIGH)
|
| 43 |
+
return apply_theme(fig)
|
| 44 |
+
|
| 45 |
+
def amount_vs_risk_scatter(df):
|
| 46 |
+
# size needs to be positive
|
| 47 |
+
df['size'] = df['transaction_velocity'].clip(lower=1)
|
| 48 |
+
# create a rule string for hover
|
| 49 |
+
df['rule_str'] = df['rule_flags'].apply(lambda x: ", ".join(x) if isinstance(x, list) and x else "None")
|
| 50 |
+
|
| 51 |
+
fig = px.scatter(df, x='amount', y='risk_score', color='risk_level',
|
| 52 |
+
size='size', hover_data=['transaction_id', 'rule_str'],
|
| 53 |
+
color_discrete_map=COLOR_MAP, log_x=True)
|
| 54 |
+
return apply_theme(fig)
|
| 55 |
+
|
| 56 |
+
def transaction_type_breakdown(df):
|
| 57 |
+
grouped = df.groupby(['transaction_type', 'is_flagged']).size().reset_index(name='count')
|
| 58 |
+
grouped['Status'] = grouped['is_flagged'].map({1: 'Flagged', 0: 'Clean'})
|
| 59 |
+
fig = px.bar(grouped, x='transaction_type', y='count', color='Status', barmode='group',
|
| 60 |
+
color_discrete_map={'Flagged': COLOR_HIGH, 'Clean': COLOR_LOW})
|
| 61 |
+
return apply_theme(fig)
|
| 62 |
+
|
| 63 |
+
def top_flagged_customers_chart(df):
|
| 64 |
+
flagged = df[df['is_flagged'] == 1]
|
| 65 |
+
if flagged.empty:
|
| 66 |
+
return px.bar(title="No Flagged Customers")
|
| 67 |
+
|
| 68 |
+
cust_stats = flagged.groupby('customer_id').agg(
|
| 69 |
+
flagged_count=('transaction_id', 'count'),
|
| 70 |
+
avg_risk=('risk_score', 'mean')
|
| 71 |
+
).reset_index().sort_values('flagged_count', ascending=False).head(10)
|
| 72 |
+
|
| 73 |
+
fig = px.bar(cust_stats, x='flagged_count', y='customer_id', orientation='h',
|
| 74 |
+
color='avg_risk', color_continuous_scale='Reds')
|
| 75 |
+
fig.update_layout(yaxis={'categoryorder':'total ascending'})
|
| 76 |
+
return apply_theme(fig)
|
| 77 |
+
|
| 78 |
+
def kyc_tier_distribution(profile_df):
|
| 79 |
+
counts = profile_df['kyc_tier'].value_counts().reset_index()
|
| 80 |
+
counts.columns = ['kyc_tier', 'count']
|
| 81 |
+
fig = px.pie(counts, values='count', names='kyc_tier', color='kyc_tier',
|
| 82 |
+
color_discrete_map=COLOR_MAP, hole=0.5)
|
| 83 |
+
return apply_theme(fig)
|
| 84 |
+
|
| 85 |
+
def rule_trigger_frequency(df):
|
| 86 |
+
all_rules = []
|
| 87 |
+
for rules in df['rule_flags']:
|
| 88 |
+
if isinstance(rules, list):
|
| 89 |
+
all_rules.extend(rules)
|
| 90 |
+
|
| 91 |
+
if not all_rules:
|
| 92 |
+
return px.bar(title="No Rules Triggered")
|
| 93 |
+
|
| 94 |
+
counts = pd.Series(all_rules).value_counts().reset_index()
|
| 95 |
+
counts.columns = ['Rule', 'Count']
|
| 96 |
+
fig = px.bar(counts, x='Count', y='Rule', orientation='h', color_discrete_sequence=[COLOR_MED])
|
| 97 |
+
fig.update_layout(yaxis={'categoryorder':'total ascending'})
|
| 98 |
+
return apply_theme(fig)
|
requirements.txt
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
streamlit>=1.32.0
|
| 2 |
+
pandas>=2.0.0
|
| 3 |
+
numpy>=1.24.0
|
| 4 |
+
scikit-learn>=1.3.0
|
| 5 |
+
plotly>=5.18.0
|
| 6 |
+
reportlab>=4.0.0
|
| 7 |
+
langchain>=0.2.0
|
| 8 |
+
langchain_bytez>=0.1.0
|
| 9 |
+
supabase>=2.0.0
|
| 10 |
+
python-dotenv>=1.0.0
|
| 11 |
+
fpdf2>=2.7.0
|
sample_data/sample_transactions.csv
ADDED
|
@@ -0,0 +1,1001 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
transaction_id,customer_id,amount,timestamp,transaction_type,origin_country,dest_country,account_age_days
|
| 2 |
+
TXN_000001,CUST_0024,2275.3,2026-01-24 20:55:56.975837,CASH_OUT,US,US,1294
|
| 3 |
+
TXN_000125,CUST_0024,1333.33,2026-01-24 20:56:56.975837,TRANSFER,US,US,807
|
| 4 |
+
TXN_000199,CUST_0024,721.96,2026-01-24 20:57:56.975837,CASH_OUT,US,US,1379
|
| 5 |
+
TXN_000201,CUST_0024,371.65,2026-01-24 20:58:56.975837,PAYMENT,US,US,3174
|
| 6 |
+
TXN_000281,CUST_0024,4135.18,2026-01-24 20:59:56.975837,PAYMENT,US,US,132
|
| 7 |
+
TXN_000307,CUST_0024,4755.34,2026-01-24 21:00:56.975837,TRANSFER,NG,US,23
|
| 8 |
+
TXN_000002,CUST_0042,1465.58,2026-01-24 21:07:32.975837,TRANSFER,US,US,2127
|
| 9 |
+
TXN_000003,CUST_0025,4576.36,2026-01-24 21:48:01.975837,CASH_OUT,MX,US,2513
|
| 10 |
+
TXN_000004,CUST_0019,3500.51,2026-01-24 22:25:47.975837,CASH_OUT,US,US,310
|
| 11 |
+
TXN_000005,CUST_0029,946.02,2026-01-24 22:58:14.975837,CASH_OUT,DE,US,2913
|
| 12 |
+
TXN_000030,CUST_0029,3845.58,2026-01-24 22:59:14.975837,PAYMENT,GB,US,403
|
| 13 |
+
TXN_000066,CUST_0029,2688.05,2026-01-24 23:00:14.975837,PAYMENT,GB,US,2250
|
| 14 |
+
TXN_000088,CUST_0029,4250.95,2026-01-24 23:01:14.975837,CASH_OUT,NG,US,1551
|
| 15 |
+
TXN_000142,CUST_0029,3637.77,2026-01-24 23:02:14.975837,CASH_OUT,US,US,2918
|
| 16 |
+
TXN_000216,CUST_0029,1432.58,2026-01-24 23:03:14.975837,TRANSFER,US,GB,643
|
| 17 |
+
TXN_000006,CUST_0005,2794.99,2026-01-24 23:26:53.975837,CASH_OUT,US,US,2913
|
| 18 |
+
TXN_000007,CUST_0045,3224.73,2026-01-24 23:34:36.975837,DEBIT,US,US,830
|
| 19 |
+
TXN_000008,CUST_0009,1260.01,2026-01-25 00:14:25.975837,TRANSFER,US,US,1921
|
| 20 |
+
TXN_000009,CUST_0036,735.88,2026-01-25 00:35:25.975837,PAYMENT,US,US,2943
|
| 21 |
+
TXN_000010,CUST_0047,2445.46,2026-01-25 02:55:10.975837,TRANSFER,US,US,520
|
| 22 |
+
TXN_000011,CUST_0021,3247.46,2026-01-25 03:19:43.975837,TRANSFER,US,US,3603
|
| 23 |
+
TXN_000012,CUST_0050,2801.39,2026-01-25 04:01:51.975837,DEBIT,CN,US,3563
|
| 24 |
+
TXN_000013,CUST_0004,9444.18,2026-01-25 04:50:14.975837,PAYMENT,US,US,2912
|
| 25 |
+
TXN_000014,CUST_0015,1795.51,2026-01-25 05:34:26.975837,TRANSFER,GB,US,2608
|
| 26 |
+
TXN_000015,CUST_0036,1444.81,2026-01-25 07:18:45.975837,TRANSFER,US,US,2632
|
| 27 |
+
TXN_000016,CUST_0011,2999.86,2026-01-25 07:43:31.975837,TRANSFER,US,US,2485
|
| 28 |
+
TXN_000017,CUST_0022,4228.4,2026-01-25 08:17:10.975837,CASH_IN,US,US,2634
|
| 29 |
+
TXN_000018,CUST_0050,2926.18,2026-01-25 09:50:08.975837,TRANSFER,BR,US,131
|
| 30 |
+
TXN_000019,CUST_0032,4456.08,2026-01-25 10:44:58.975837,PAYMENT,US,US,1010
|
| 31 |
+
TXN_000020,CUST_0044,2089.85,2026-01-25 11:12:00.975837,CASH_OUT,US,US,1709
|
| 32 |
+
TXN_000036,CUST_0044,637.06,2026-01-25 11:13:00.975837,CASH_OUT,US,US,2451
|
| 33 |
+
TXN_000068,CUST_0044,1106.47,2026-01-25 11:14:00.975837,DEBIT,US,US,3319
|
| 34 |
+
TXN_000070,CUST_0044,4053.89,2026-01-25 11:15:00.975837,PAYMENT,US,NG,2375
|
| 35 |
+
TXN_000082,CUST_0044,4110.07,2026-01-25 11:16:00.975837,TRANSFER,NG,US,1134
|
| 36 |
+
TXN_000089,CUST_0044,41028.24,2026-01-25 11:17:00.975837,TRANSFER,NG,US,3568
|
| 37 |
+
TXN_000021,CUST_0031,2375.77,2026-01-25 12:23:28.975837,CASH_OUT,US,DE,3014
|
| 38 |
+
TXN_000022,CUST_0023,4879.33,2026-01-25 12:56:36.975837,DEBIT,US,US,1314
|
| 39 |
+
TXN_000023,CUST_0016,2385.72,2026-01-25 13:39:12.975837,TRANSFER,US,US,1195
|
| 40 |
+
TXN_000024,CUST_0025,4334.4,2026-01-25 16:32:57.975837,PAYMENT,CN,DE,784
|
| 41 |
+
TXN_000025,CUST_0049,880.78,2026-01-25 19:02:33.975837,DEBIT,US,MX,101
|
| 42 |
+
TXN_000026,CUST_0006,4731.64,2026-01-25 19:09:05.975837,TRANSFER,NG,US,206
|
| 43 |
+
TXN_000027,CUST_0004,9067.48,2026-01-25 19:12:56.975837,CASH_IN,MX,US,40
|
| 44 |
+
TXN_000028,CUST_0007,2211.55,2026-01-25 20:12:13.975837,CASH_OUT,BR,US,1647
|
| 45 |
+
TXN_000029,CUST_0004,2894.38,2026-01-25 20:37:46.975837,CASH_OUT,US,US,2072
|
| 46 |
+
TXN_000031,CUST_0026,1928.67,2026-01-26 00:01:49.975837,TRANSFER,US,US,597
|
| 47 |
+
TXN_000032,CUST_0013,3052.07,2026-01-26 00:55:01.975837,TRANSFER,US,US,2929
|
| 48 |
+
TXN_000033,CUST_0022,4039.43,2026-01-26 01:20:15.975837,CASH_IN,US,CN,1350
|
| 49 |
+
TXN_000034,CUST_0040,1660.8,2026-01-26 01:35:56.975837,DEBIT,US,DE,2084
|
| 50 |
+
TXN_000035,CUST_0033,2708.47,2026-01-26 02:22:37.975837,TRANSFER,US,DE,1363
|
| 51 |
+
TXN_000037,CUST_0031,1401.1,2026-01-26 03:22:33.975837,TRANSFER,NG,MX,705
|
| 52 |
+
TXN_000038,CUST_0034,3182.22,2026-01-26 03:52:39.975837,PAYMENT,CN,NG,136
|
| 53 |
+
TXN_000039,CUST_0037,4746.21,2026-01-26 04:02:08.975837,TRANSFER,US,US,627
|
| 54 |
+
TXN_000040,CUST_0027,3483.45,2026-01-26 04:36:59.975837,PAYMENT,MX,US,2897
|
| 55 |
+
TXN_000041,CUST_0009,2641.55,2026-01-26 05:53:50.975837,TRANSFER,MX,US,1292
|
| 56 |
+
TXN_000042,CUST_0012,2352.35,2026-01-26 06:05:41.975837,PAYMENT,US,US,3560
|
| 57 |
+
TXN_000043,CUST_0047,3435.65,2026-01-26 06:16:32.975837,PAYMENT,US,US,1016
|
| 58 |
+
TXN_000044,CUST_0018,2834.62,2026-01-26 07:10:32.975837,DEBIT,RU,NG,2834
|
| 59 |
+
TXN_000045,CUST_0046,2496.12,2026-01-26 08:36:43.975837,TRANSFER,US,RU,1185
|
| 60 |
+
TXN_000046,CUST_0008,2910.04,2026-01-26 09:03:29.975837,TRANSFER,BR,CN,1196
|
| 61 |
+
TXN_000047,CUST_0003,1509.39,2026-01-26 09:29:20.975837,PAYMENT,US,US,1057
|
| 62 |
+
TXN_000048,CUST_0048,127549.79,2026-01-26 09:51:32.975837,CASH_OUT,US,CN,569
|
| 63 |
+
TXN_000049,CUST_0007,3116.82,2026-01-26 10:29:15.975837,DEBIT,US,US,2182
|
| 64 |
+
TXN_000050,CUST_0015,3225.93,2026-01-26 14:26:06.975837,CASH_OUT,US,GB,2797
|
| 65 |
+
TXN_000051,CUST_0050,773.59,2026-01-26 15:12:52.975837,TRANSFER,CN,US,3614
|
| 66 |
+
TXN_000052,CUST_0031,2439.5,2026-01-26 17:01:56.975837,TRANSFER,DE,US,249
|
| 67 |
+
TXN_000053,CUST_0050,538.36,2026-01-26 17:34:36.975837,PAYMENT,US,US,724
|
| 68 |
+
TXN_000054,CUST_0027,4423.0,2026-01-26 18:45:42.975837,PAYMENT,BR,CN,3074
|
| 69 |
+
TXN_000055,CUST_0019,286141.12,2026-01-26 18:54:02.975837,CASH_OUT,US,RU,1868
|
| 70 |
+
TXN_000056,CUST_0042,2762.17,2026-01-26 18:56:25.975837,TRANSFER,MX,US,3319
|
| 71 |
+
TXN_000057,CUST_0008,1720.35,2026-01-26 19:19:57.975837,TRANSFER,US,US,3024
|
| 72 |
+
TXN_000058,CUST_0022,3974.76,2026-01-26 19:21:48.975837,CASH_OUT,CN,US,2623
|
| 73 |
+
TXN_000059,CUST_0026,4152.25,2026-01-26 20:18:30.975837,TRANSFER,US,US,763
|
| 74 |
+
TXN_000060,CUST_0009,2439.53,2026-01-26 21:11:36.975837,TRANSFER,US,US,1836
|
| 75 |
+
TXN_000061,CUST_0049,1408.27,2026-01-26 23:04:58.975837,TRANSFER,US,US,1078
|
| 76 |
+
TXN_000062,CUST_0042,23753.3,2026-01-26 23:49:27.975837,CASH_IN,US,US,14
|
| 77 |
+
TXN_000063,CUST_0026,3461.76,2026-01-27 00:10:24.975837,CASH_OUT,RU,US,2623
|
| 78 |
+
TXN_000064,CUST_0019,96952.91,2026-01-27 01:29:20.975837,CASH_OUT,US,DE,3069
|
| 79 |
+
TXN_000065,CUST_0039,1930.76,2026-01-27 01:50:55.975837,PAYMENT,NG,GB,2159
|
| 80 |
+
TXN_000115,CUST_0039,2043.84,2026-01-27 01:51:55.975837,DEBIT,US,US,1852
|
| 81 |
+
TXN_000187,CUST_0039,1496.11,2026-01-27 01:52:55.975837,TRANSFER,US,RU,848
|
| 82 |
+
TXN_000290,CUST_0039,1485.12,2026-01-27 01:53:55.975837,CASH_OUT,US,US,1139
|
| 83 |
+
TXN_000319,CUST_0039,1078.77,2026-01-27 01:54:55.975837,TRANSFER,US,US,2888
|
| 84 |
+
TXN_000350,CUST_0039,4425.21,2026-01-27 01:55:55.975837,CASH_OUT,US,NG,1127
|
| 85 |
+
TXN_000067,CUST_0033,1090.57,2026-01-27 03:21:14.975837,TRANSFER,US,MX,483
|
| 86 |
+
TXN_000069,CUST_0004,2321.82,2026-01-27 06:58:05.975837,TRANSFER,US,US,1900
|
| 87 |
+
TXN_000071,CUST_0005,321.92,2026-01-27 07:23:56.975837,PAYMENT,US,GB,1940
|
| 88 |
+
TXN_000072,CUST_0003,1506.74,2026-01-27 07:38:40.975837,TRANSFER,US,US,2994
|
| 89 |
+
TXN_000073,CUST_0042,4822.53,2026-01-27 08:19:03.975837,TRANSFER,MX,BR,1545
|
| 90 |
+
TXN_000074,CUST_0006,3445.38,2026-01-27 08:35:29.975837,TRANSFER,US,US,1431
|
| 91 |
+
TXN_000075,CUST_0008,974.52,2026-01-27 09:08:36.975837,TRANSFER,US,NG,3426
|
| 92 |
+
TXN_000076,CUST_0001,3805.28,2026-01-27 10:55:06.975837,TRANSFER,US,BR,2185
|
| 93 |
+
TXN_000077,CUST_0025,4134.47,2026-01-27 11:34:24.975837,CASH_IN,US,US,3591
|
| 94 |
+
TXN_000078,CUST_0047,331797.85,2026-01-27 11:36:42.975837,CASH_OUT,US,US,992
|
| 95 |
+
TXN_000079,CUST_0014,429.73,2026-01-27 11:59:12.975837,CASH_OUT,US,US,3579
|
| 96 |
+
TXN_000080,CUST_0004,222286.59,2026-01-27 13:37:54.975837,CASH_OUT,US,US,580
|
| 97 |
+
TXN_000081,CUST_0033,4968.07,2026-01-27 14:43:44.975837,CASH_OUT,DE,US,3171
|
| 98 |
+
TXN_000083,CUST_0004,2827.92,2026-01-27 15:56:49.975837,CASH_OUT,CN,US,1756
|
| 99 |
+
TXN_000084,CUST_0036,2528.54,2026-01-27 16:35:50.975837,CASH_OUT,BR,DE,2859
|
| 100 |
+
TXN_000085,CUST_0027,2100.47,2026-01-27 16:46:28.975837,CASH_OUT,US,US,994
|
| 101 |
+
TXN_000086,CUST_0015,1573.61,2026-01-27 17:03:08.975837,PAYMENT,US,US,1713
|
| 102 |
+
TXN_000087,CUST_0036,2696.96,2026-01-27 17:56:34.975837,TRANSFER,US,US,330
|
| 103 |
+
TXN_000090,CUST_0022,1585.62,2026-01-27 19:28:48.975837,DEBIT,US,US,3044
|
| 104 |
+
TXN_000091,CUST_0008,3759.71,2026-01-27 21:00:15.975837,CASH_OUT,NG,US,987
|
| 105 |
+
TXN_000092,CUST_0036,1675.91,2026-01-27 22:28:28.975837,TRANSFER,US,US,1270
|
| 106 |
+
TXN_000093,CUST_0017,1862.26,2026-01-27 23:03:18.975837,PAYMENT,US,MX,3126
|
| 107 |
+
TXN_000094,CUST_0021,4580.22,2026-01-27 23:17:29.975837,DEBIT,US,US,913
|
| 108 |
+
TXN_000095,CUST_0048,815.02,2026-01-28 00:35:24.975837,TRANSFER,BR,US,810
|
| 109 |
+
TXN_000096,CUST_0022,1227.09,2026-01-28 01:34:29.975837,TRANSFER,US,US,2812
|
| 110 |
+
TXN_000097,CUST_0022,1360.9,2026-01-28 02:59:11.975837,PAYMENT,MX,US,3008
|
| 111 |
+
TXN_000098,CUST_0023,929.4,2026-01-28 03:38:22.975837,CASH_OUT,US,US,2153
|
| 112 |
+
TXN_000099,CUST_0003,4211.44,2026-01-28 04:17:33.975837,TRANSFER,US,BR,570
|
| 113 |
+
TXN_000100,CUST_0041,1234.02,2026-01-28 04:24:20.975837,PAYMENT,US,US,1535
|
| 114 |
+
TXN_000101,CUST_0004,3127.39,2026-01-28 04:36:25.975837,TRANSFER,US,US,2005
|
| 115 |
+
TXN_000102,CUST_0002,132.4,2026-01-28 04:47:59.975837,CASH_OUT,US,US,1132
|
| 116 |
+
TXN_000103,CUST_0035,407512.82,2026-01-28 05:05:52.975837,CASH_OUT,US,CN,445
|
| 117 |
+
TXN_000104,CUST_0007,2669.49,2026-01-28 05:20:25.975837,PAYMENT,US,US,1458
|
| 118 |
+
TXN_000105,CUST_0018,3995.19,2026-01-28 05:29:49.975837,TRANSFER,MX,US,2862
|
| 119 |
+
TXN_000106,CUST_0015,9723.9,2026-01-28 05:47:38.975837,DEBIT,US,US,389
|
| 120 |
+
TXN_000107,CUST_0026,1958.39,2026-01-28 05:59:05.975837,CASH_IN,US,US,708
|
| 121 |
+
TXN_000108,CUST_0006,2549.31,2026-01-28 07:00:51.975837,TRANSFER,GB,US,948
|
| 122 |
+
TXN_000109,CUST_0014,4516.24,2026-01-28 07:10:20.975837,TRANSFER,US,US,311
|
| 123 |
+
TXN_000110,CUST_0044,4635.37,2026-01-28 07:23:23.975837,TRANSFER,US,US,3490
|
| 124 |
+
TXN_000111,CUST_0021,9420.59,2026-01-28 07:38:57.975837,PAYMENT,US,BR,322
|
| 125 |
+
TXN_000112,CUST_0020,896.01,2026-01-28 07:39:28.975837,TRANSFER,BR,US,2221
|
| 126 |
+
TXN_000113,CUST_0022,1980.85,2026-01-28 08:58:41.975837,TRANSFER,GB,US,1423
|
| 127 |
+
TXN_000114,CUST_0004,578.66,2026-01-28 09:18:37.975837,TRANSFER,US,US,2521
|
| 128 |
+
TXN_000116,CUST_0032,1217.88,2026-01-28 10:46:17.975837,CASH_OUT,US,US,2406
|
| 129 |
+
TXN_000117,CUST_0043,1962.36,2026-01-28 11:54:58.975837,CASH_OUT,US,US,308
|
| 130 |
+
TXN_000118,CUST_0006,1413.06,2026-01-28 12:07:29.975837,TRANSFER,CN,DE,1484
|
| 131 |
+
TXN_000119,CUST_0007,548.45,2026-01-28 12:17:21.975837,CASH_OUT,US,GB,549
|
| 132 |
+
TXN_000120,CUST_0006,1018.22,2026-01-28 13:00:06.975837,PAYMENT,US,US,114
|
| 133 |
+
TXN_000121,CUST_0006,1834.18,2026-01-28 14:44:02.975837,DEBIT,US,US,1584
|
| 134 |
+
TXN_000122,CUST_0001,1530.05,2026-01-28 16:13:05.975837,CASH_OUT,US,NG,2349
|
| 135 |
+
TXN_000123,CUST_0034,930.96,2026-01-28 16:16:05.975837,PAYMENT,US,US,2026
|
| 136 |
+
TXN_000124,CUST_0010,410.01,2026-01-28 17:25:25.975837,TRANSFER,US,US,322
|
| 137 |
+
TXN_000184,CUST_0010,4607.48,2026-01-28 17:26:25.975837,PAYMENT,US,US,418
|
| 138 |
+
TXN_000194,CUST_0010,1459.59,2026-01-28 17:27:25.975837,CASH_OUT,US,US,3316
|
| 139 |
+
TXN_000195,CUST_0010,2728.31,2026-01-28 17:28:25.975837,PAYMENT,US,GB,1277
|
| 140 |
+
TXN_000228,CUST_0010,269.78,2026-01-28 17:29:25.975837,TRANSFER,US,US,1694
|
| 141 |
+
TXN_000266,CUST_0010,689.38,2026-01-28 17:30:25.975837,TRANSFER,US,NG,3318
|
| 142 |
+
TXN_000126,CUST_0030,624.16,2026-01-28 18:10:51.975837,PAYMENT,DE,BR,3300
|
| 143 |
+
TXN_000127,CUST_0022,2257.09,2026-01-28 18:20:21.975837,CASH_OUT,CN,US,2477
|
| 144 |
+
TXN_000128,CUST_0045,1084.17,2026-01-28 19:02:58.975837,PAYMENT,DE,US,2853
|
| 145 |
+
TXN_000129,CUST_0041,2505.94,2026-01-28 19:53:13.975837,TRANSFER,US,US,3351
|
| 146 |
+
TXN_000130,CUST_0026,1888.58,2026-01-28 19:58:37.975837,CASH_OUT,US,CN,2799
|
| 147 |
+
TXN_000131,CUST_0050,2795.49,2026-01-28 22:15:55.975837,CASH_OUT,US,MX,3274
|
| 148 |
+
TXN_000132,CUST_0019,4173.28,2026-01-28 23:15:12.975837,TRANSFER,BR,US,577
|
| 149 |
+
TXN_000133,CUST_0041,1583.88,2026-01-28 23:42:08.975837,CASH_OUT,US,US,1551
|
| 150 |
+
TXN_000134,CUST_0005,2300.43,2026-01-29 00:12:20.975837,TRANSFER,US,US,3569
|
| 151 |
+
TXN_000135,CUST_0045,84290.69,2026-01-29 00:15:10.975837,CASH_OUT,US,NG,1023
|
| 152 |
+
TXN_000136,CUST_0043,3357.0,2026-01-29 01:25:44.975837,DEBIT,US,US,2649
|
| 153 |
+
TXN_000137,CUST_0044,3269.04,2026-01-29 01:45:01.975837,PAYMENT,US,GB,50
|
| 154 |
+
TXN_000138,CUST_0007,1367.82,2026-01-29 03:03:23.975837,PAYMENT,US,US,2363
|
| 155 |
+
TXN_000139,CUST_0015,2284.31,2026-01-29 06:22:35.975837,TRANSFER,CN,US,107
|
| 156 |
+
TXN_000140,CUST_0031,612.29,2026-01-29 06:45:52.975837,CASH_OUT,GB,CN,1433
|
| 157 |
+
TXN_000141,CUST_0020,1781.03,2026-01-29 06:51:46.975837,DEBIT,US,US,406
|
| 158 |
+
TXN_000143,CUST_0008,210.67,2026-01-29 08:30:58.975837,TRANSFER,US,NG,2120
|
| 159 |
+
TXN_000144,CUST_0012,2804.36,2026-01-29 08:52:28.975837,CASH_OUT,US,US,3274
|
| 160 |
+
TXN_000145,CUST_0026,125437.61,2026-01-29 09:03:21.975837,CASH_OUT,US,NG,3027
|
| 161 |
+
TXN_000146,CUST_0040,4427.18,2026-01-29 09:07:06.975837,CASH_OUT,US,US,886
|
| 162 |
+
TXN_000147,CUST_0014,1463.89,2026-01-29 09:15:48.975837,TRANSFER,GB,CN,1505
|
| 163 |
+
TXN_000148,CUST_0021,1065.66,2026-01-29 09:37:20.975837,TRANSFER,US,US,2624
|
| 164 |
+
TXN_000149,CUST_0021,3025.16,2026-01-29 10:21:25.975837,TRANSFER,US,US,3470
|
| 165 |
+
TXN_000150,CUST_0030,3125.08,2026-01-29 13:08:31.975837,TRANSFER,RU,GB,2759
|
| 166 |
+
TXN_000151,CUST_0009,1634.61,2026-01-29 13:23:31.975837,TRANSFER,US,US,586
|
| 167 |
+
TXN_000152,CUST_0033,2003.47,2026-01-29 14:31:52.975837,TRANSFER,US,US,2000
|
| 168 |
+
TXN_000153,CUST_0041,2733.16,2026-01-29 15:07:28.975837,CASH_OUT,CN,US,2012
|
| 169 |
+
TXN_000154,CUST_0019,787.45,2026-01-29 16:04:29.975837,CASH_OUT,US,US,1477
|
| 170 |
+
TXN_000155,CUST_0001,2474.58,2026-01-29 16:56:45.975837,TRANSFER,US,US,2681
|
| 171 |
+
TXN_000156,CUST_0032,2104.76,2026-01-29 17:34:51.975837,CASH_IN,MX,US,345
|
| 172 |
+
TXN_000157,CUST_0037,44348.23,2026-01-29 18:08:04.975837,TRANSFER,US,US,18
|
| 173 |
+
TXN_000158,CUST_0019,924.22,2026-01-29 19:10:59.975837,TRANSFER,MX,US,470
|
| 174 |
+
TXN_000159,CUST_0037,659.61,2026-01-29 19:32:34.975837,CASH_OUT,DE,US,3106
|
| 175 |
+
TXN_000160,CUST_0003,3824.02,2026-01-29 19:52:29.975837,TRANSFER,US,US,3021
|
| 176 |
+
TXN_000161,CUST_0042,3781.59,2026-01-29 19:58:57.975837,TRANSFER,MX,US,3538
|
| 177 |
+
TXN_000162,CUST_0006,2251.44,2026-01-29 20:13:21.975837,TRANSFER,NG,US,3028
|
| 178 |
+
TXN_000163,CUST_0038,3476.75,2026-01-29 21:08:47.975837,CASH_OUT,US,US,2530
|
| 179 |
+
TXN_000164,CUST_0009,3945.76,2026-01-29 22:19:37.975837,TRANSFER,DE,US,2451
|
| 180 |
+
TXN_000165,CUST_0035,925.05,2026-01-29 23:25:16.975837,TRANSFER,US,US,3521
|
| 181 |
+
TXN_000166,CUST_0033,4928.89,2026-01-30 00:26:13.975837,PAYMENT,US,BR,249
|
| 182 |
+
TXN_000167,CUST_0018,4348.53,2026-01-30 00:38:33.975837,CASH_OUT,NG,US,1326
|
| 183 |
+
TXN_000168,CUST_0016,3831.22,2026-01-30 01:09:55.975837,TRANSFER,US,US,1107
|
| 184 |
+
TXN_000169,CUST_0041,2129.7,2026-01-30 02:23:59.975837,DEBIT,US,GB,1657
|
| 185 |
+
TXN_000170,CUST_0033,3774.03,2026-01-30 02:24:13.975837,TRANSFER,MX,DE,2390
|
| 186 |
+
TXN_000171,CUST_0001,4357.65,2026-01-30 02:45:27.975837,TRANSFER,US,DE,3489
|
| 187 |
+
TXN_000172,CUST_0005,3998.82,2026-01-30 03:46:01.975837,TRANSFER,NG,US,1329
|
| 188 |
+
TXN_000173,CUST_0019,1755.0,2026-01-30 04:12:35.975837,CASH_OUT,US,US,1414
|
| 189 |
+
TXN_000174,CUST_0044,314958.86,2026-01-30 06:10:10.975837,DEBIT,US,US,3519
|
| 190 |
+
TXN_000175,CUST_0011,479225.73,2026-01-30 06:25:37.975837,CASH_OUT,US,US,547
|
| 191 |
+
TXN_000176,CUST_0042,1579.14,2026-01-30 06:47:41.975837,CASH_IN,GB,US,1032
|
| 192 |
+
TXN_000177,CUST_0006,1922.03,2026-01-30 06:48:07.975837,PAYMENT,US,US,1258
|
| 193 |
+
TXN_000178,CUST_0047,3527.26,2026-01-30 08:39:04.975837,TRANSFER,US,US,881
|
| 194 |
+
TXN_000179,CUST_0031,481.9,2026-01-30 09:22:50.975837,TRANSFER,US,US,40
|
| 195 |
+
TXN_000180,CUST_0045,1783.51,2026-01-30 09:43:58.975837,CASH_IN,CN,US,944
|
| 196 |
+
TXN_000181,CUST_0025,537.72,2026-01-30 09:53:59.975837,CASH_OUT,US,US,1232
|
| 197 |
+
TXN_000182,CUST_0009,1975.33,2026-01-30 09:55:18.975837,TRANSFER,CN,US,2314
|
| 198 |
+
TXN_000183,CUST_0001,3090.56,2026-01-30 10:11:00.975837,CASH_OUT,US,US,3071
|
| 199 |
+
TXN_000185,CUST_0009,3786.98,2026-01-30 10:56:36.975837,PAYMENT,US,DE,3247
|
| 200 |
+
TXN_000186,CUST_0009,1314.15,2026-01-30 11:11:47.975837,PAYMENT,US,US,2960
|
| 201 |
+
TXN_000188,CUST_0034,3073.94,2026-01-30 13:19:02.975837,DEBIT,US,US,3217
|
| 202 |
+
TXN_000189,CUST_0016,2524.95,2026-01-30 14:27:55.975837,PAYMENT,US,US,2170
|
| 203 |
+
TXN_000190,CUST_0001,4935.72,2026-01-30 15:45:02.975837,CASH_OUT,US,BR,1503
|
| 204 |
+
TXN_000191,CUST_0035,3446.42,2026-01-30 16:08:14.975837,TRANSFER,GB,US,283
|
| 205 |
+
TXN_000192,CUST_0001,34932.09,2026-01-30 17:02:01.975837,TRANSFER,RU,US,2059
|
| 206 |
+
TXN_000193,CUST_0050,2135.62,2026-01-30 17:26:22.975837,PAYMENT,US,US,2530
|
| 207 |
+
TXN_000196,CUST_0045,2243.68,2026-01-30 17:55:51.975837,CASH_IN,US,US,1786
|
| 208 |
+
TXN_000197,CUST_0008,2321.52,2026-01-30 21:20:31.975837,CASH_OUT,US,CN,496
|
| 209 |
+
TXN_000198,CUST_0001,9256.03,2026-01-30 21:39:30.975837,CASH_OUT,US,RU,690
|
| 210 |
+
TXN_000200,CUST_0028,1432.7,2026-01-30 22:58:51.975837,CASH_OUT,GB,US,2099
|
| 211 |
+
TXN_000202,CUST_0007,4481.92,2026-01-30 23:35:08.975837,CASH_OUT,US,US,187
|
| 212 |
+
TXN_000203,CUST_0001,1298.3,2026-01-30 23:56:21.975837,CASH_OUT,US,US,3519
|
| 213 |
+
TXN_000204,CUST_0003,2809.04,2026-01-31 00:45:37.975837,PAYMENT,BR,US,1023
|
| 214 |
+
TXN_000205,CUST_0027,4587.69,2026-01-31 00:56:39.975837,TRANSFER,DE,US,2764
|
| 215 |
+
TXN_000206,CUST_0004,978.79,2026-01-31 01:09:23.975837,TRANSFER,BR,US,1912
|
| 216 |
+
TXN_000207,CUST_0019,3890.28,2026-01-31 02:02:46.975837,TRANSFER,US,US,1518
|
| 217 |
+
TXN_000208,CUST_0013,1528.82,2026-01-31 04:52:31.975837,CASH_OUT,NG,US,2430
|
| 218 |
+
TXN_000209,CUST_0032,4989.16,2026-01-31 04:56:37.975837,TRANSFER,NG,US,1686
|
| 219 |
+
TXN_000210,CUST_0002,1241.69,2026-01-31 05:06:03.975837,TRANSFER,US,US,3115
|
| 220 |
+
TXN_000211,CUST_0043,1943.75,2026-01-31 06:36:50.975837,DEBIT,US,US,982
|
| 221 |
+
TXN_000212,CUST_0027,2510.94,2026-01-31 06:46:57.975837,PAYMENT,RU,US,955
|
| 222 |
+
TXN_000213,CUST_0034,2123.98,2026-01-31 07:48:38.975837,TRANSFER,US,GB,2077
|
| 223 |
+
TXN_000214,CUST_0009,3222.36,2026-01-31 08:55:11.975837,TRANSFER,US,US,2720
|
| 224 |
+
TXN_000215,CUST_0009,1260.18,2026-01-31 10:33:38.975837,PAYMENT,US,DE,1309
|
| 225 |
+
TXN_000217,CUST_0007,905.44,2026-01-31 13:37:39.975837,CASH_OUT,US,US,3162
|
| 226 |
+
TXN_000218,CUST_0014,2314.39,2026-01-31 13:40:36.975837,TRANSFER,GB,US,2817
|
| 227 |
+
TXN_000219,CUST_0020,4149.29,2026-01-31 15:01:58.975837,CASH_IN,US,DE,614
|
| 228 |
+
TXN_000220,CUST_0006,3584.67,2026-01-31 15:08:26.975837,TRANSFER,US,US,1231
|
| 229 |
+
TXN_000221,CUST_0017,4118.44,2026-01-31 15:47:01.975837,PAYMENT,MX,US,2260
|
| 230 |
+
TXN_000222,CUST_0016,564.15,2026-01-31 18:10:36.975837,TRANSFER,GB,US,3408
|
| 231 |
+
TXN_000223,CUST_0050,4914.58,2026-01-31 18:55:00.975837,CASH_OUT,DE,US,2647
|
| 232 |
+
TXN_000224,CUST_0006,2953.39,2026-01-31 20:58:46.975837,CASH_IN,US,NG,2652
|
| 233 |
+
TXN_000225,CUST_0029,4065.56,2026-02-01 00:08:21.975837,PAYMENT,DE,US,1895
|
| 234 |
+
TXN_000226,CUST_0004,923.15,2026-02-01 00:23:33.975837,TRANSFER,BR,US,1574
|
| 235 |
+
TXN_000227,CUST_0044,2190.65,2026-02-01 01:00:04.975837,CASH_OUT,RU,US,3625
|
| 236 |
+
TXN_000229,CUST_0036,2447.25,2026-02-01 02:02:40.975837,PAYMENT,US,US,2639
|
| 237 |
+
TXN_000230,CUST_0034,1320.82,2026-02-01 02:07:12.975837,PAYMENT,US,US,1573
|
| 238 |
+
TXN_000231,CUST_0046,1859.65,2026-02-01 02:17:14.975837,PAYMENT,US,DE,1597
|
| 239 |
+
TXN_000232,CUST_0018,981.1,2026-02-01 04:11:23.975837,TRANSFER,US,RU,246
|
| 240 |
+
TXN_000233,CUST_0031,2694.22,2026-02-01 05:14:03.975837,TRANSFER,CN,US,2697
|
| 241 |
+
TXN_000234,CUST_0016,1405.98,2026-02-01 05:59:51.975837,DEBIT,US,NG,2365
|
| 242 |
+
TXN_000235,CUST_0025,1838.54,2026-02-01 06:29:25.975837,PAYMENT,CN,US,1309
|
| 243 |
+
TXN_000236,CUST_0048,3518.37,2026-02-01 06:31:48.975837,PAYMENT,US,CN,2313
|
| 244 |
+
TXN_000237,CUST_0013,4199.81,2026-02-01 06:31:56.975837,TRANSFER,RU,US,162
|
| 245 |
+
TXN_000238,CUST_0006,375.22,2026-02-01 06:42:25.975837,TRANSFER,US,US,1365
|
| 246 |
+
TXN_000239,CUST_0040,1087.18,2026-02-01 07:50:55.975837,TRANSFER,DE,US,612
|
| 247 |
+
TXN_000240,CUST_0038,3553.01,2026-02-01 08:31:37.975837,TRANSFER,US,US,1501
|
| 248 |
+
TXN_000241,CUST_0005,1930.59,2026-02-01 08:48:38.975837,CASH_OUT,US,US,1243
|
| 249 |
+
TXN_000242,CUST_0021,768.61,2026-02-01 09:34:09.975837,CASH_OUT,MX,US,720
|
| 250 |
+
TXN_000243,CUST_0046,4846.84,2026-02-01 09:36:22.975837,CASH_OUT,DE,US,2419
|
| 251 |
+
TXN_000244,CUST_0012,1954.08,2026-02-01 10:49:59.975837,CASH_IN,US,US,14
|
| 252 |
+
TXN_000245,CUST_0045,4748.62,2026-02-01 11:26:39.975837,CASH_OUT,US,US,1310
|
| 253 |
+
TXN_000246,CUST_0040,1182.39,2026-02-01 11:52:54.975837,CASH_OUT,CN,US,325
|
| 254 |
+
TXN_000247,CUST_0016,1799.37,2026-02-01 12:14:52.975837,PAYMENT,US,DE,1836
|
| 255 |
+
TXN_000248,CUST_0001,1399.54,2026-02-01 12:43:35.975837,TRANSFER,US,US,449
|
| 256 |
+
TXN_000249,CUST_0047,106.28,2026-02-01 12:59:00.975837,TRANSFER,CN,MX,3618
|
| 257 |
+
TXN_000250,CUST_0025,1821.03,2026-02-01 13:53:30.975837,TRANSFER,NG,US,308
|
| 258 |
+
TXN_000251,CUST_0003,1545.05,2026-02-01 13:56:18.975837,TRANSFER,GB,US,3643
|
| 259 |
+
TXN_000252,CUST_0025,888.43,2026-02-01 14:28:33.975837,TRANSFER,GB,US,2520
|
| 260 |
+
TXN_000253,CUST_0031,35622.55,2026-02-01 14:51:07.975837,TRANSFER,US,US,7
|
| 261 |
+
TXN_000254,CUST_0011,93585.38,2026-02-01 15:50:02.975837,CASH_OUT,US,BR,2964
|
| 262 |
+
TXN_000255,CUST_0047,2746.61,2026-02-01 16:40:39.975837,CASH_OUT,US,US,1616
|
| 263 |
+
TXN_000256,CUST_0037,2793.35,2026-02-01 16:42:57.975837,TRANSFER,US,US,365
|
| 264 |
+
TXN_000257,CUST_0019,4137.1,2026-02-01 17:47:15.975837,TRANSFER,US,US,854
|
| 265 |
+
TXN_000258,CUST_0011,3227.13,2026-02-01 17:57:54.975837,CASH_OUT,US,US,3221
|
| 266 |
+
TXN_000259,CUST_0026,2407.63,2026-02-01 18:50:13.975837,PAYMENT,US,US,1594
|
| 267 |
+
TXN_000260,CUST_0012,1918.0,2026-02-01 19:15:37.975837,PAYMENT,US,US,1808
|
| 268 |
+
TXN_000261,CUST_0030,1390.66,2026-02-01 20:16:32.975837,CASH_OUT,US,US,2859
|
| 269 |
+
TXN_000262,CUST_0043,573.84,2026-02-01 20:45:01.975837,TRANSFER,BR,NG,2274
|
| 270 |
+
TXN_000263,CUST_0004,4219.91,2026-02-01 20:50:46.975837,TRANSFER,US,US,3557
|
| 271 |
+
TXN_000264,CUST_0031,2906.3,2026-02-01 21:46:24.975837,CASH_OUT,US,US,3504
|
| 272 |
+
TXN_000265,CUST_0046,270.17,2026-02-01 22:13:33.975837,CASH_IN,US,US,2547
|
| 273 |
+
TXN_000267,CUST_0013,718.31,2026-02-02 02:09:51.975837,CASH_OUT,BR,US,3376
|
| 274 |
+
TXN_000268,CUST_0041,824.6,2026-02-02 03:51:01.975837,TRANSFER,US,GB,363
|
| 275 |
+
TXN_000269,CUST_0025,2826.18,2026-02-02 06:58:00.975837,DEBIT,MX,US,3228
|
| 276 |
+
TXN_000270,CUST_0045,3152.98,2026-02-02 07:12:57.975837,CASH_OUT,US,US,614
|
| 277 |
+
TXN_000271,CUST_0037,2980.88,2026-02-02 08:34:17.975837,PAYMENT,GB,US,420
|
| 278 |
+
TXN_000272,CUST_0019,4350.63,2026-02-02 09:22:56.975837,CASH_OUT,RU,US,1995
|
| 279 |
+
TXN_000273,CUST_0037,141330.0,2026-02-02 09:40:25.975837,TRANSFER,US,US,2848
|
| 280 |
+
TXN_000274,CUST_0026,290.03,2026-02-02 10:44:25.975837,TRANSFER,US,US,3061
|
| 281 |
+
TXN_000275,CUST_0031,4612.09,2026-02-02 12:30:21.975837,DEBIT,US,RU,1280
|
| 282 |
+
TXN_000276,CUST_0018,4229.95,2026-02-02 12:36:14.975837,TRANSFER,US,NG,557
|
| 283 |
+
TXN_000277,CUST_0020,4873.68,2026-02-02 13:25:47.975837,CASH_OUT,RU,GB,776
|
| 284 |
+
TXN_000278,CUST_0029,1135.81,2026-02-02 13:31:26.975837,TRANSFER,DE,CN,275
|
| 285 |
+
TXN_000279,CUST_0020,3576.89,2026-02-02 15:54:34.975837,DEBIT,US,US,3591
|
| 286 |
+
TXN_000280,CUST_0013,4201.19,2026-02-02 16:11:20.975837,PAYMENT,US,NG,1129
|
| 287 |
+
TXN_000282,CUST_0016,1925.09,2026-02-02 18:14:18.975837,CASH_OUT,US,DE,1417
|
| 288 |
+
TXN_000283,CUST_0011,4204.5,2026-02-02 19:15:31.975837,TRANSFER,GB,US,1590
|
| 289 |
+
TXN_000284,CUST_0004,898.25,2026-02-02 20:10:28.975837,CASH_OUT,NG,US,2782
|
| 290 |
+
TXN_000285,CUST_0014,1418.51,2026-02-02 20:57:40.975837,CASH_OUT,US,US,1948
|
| 291 |
+
TXN_000286,CUST_0009,3272.12,2026-02-02 23:00:32.975837,DEBIT,US,US,3304
|
| 292 |
+
TXN_000287,CUST_0020,3592.43,2026-02-03 01:42:23.975837,TRANSFER,US,DE,1887
|
| 293 |
+
TXN_000288,CUST_0017,1169.22,2026-02-03 01:55:02.975837,DEBIT,US,US,2401
|
| 294 |
+
TXN_000289,CUST_0007,136.0,2026-02-03 02:04:07.975837,CASH_OUT,DE,US,2439
|
| 295 |
+
TXN_000291,CUST_0041,1693.17,2026-02-03 02:32:11.975837,TRANSFER,US,RU,778
|
| 296 |
+
TXN_000292,CUST_0010,2634.74,2026-02-03 03:03:22.975837,TRANSFER,US,BR,2712
|
| 297 |
+
TXN_000293,CUST_0021,3435.7,2026-02-03 03:37:15.975837,PAYMENT,US,RU,1721
|
| 298 |
+
TXN_000294,CUST_0026,355494.13,2026-02-03 03:40:41.975837,PAYMENT,US,US,2982
|
| 299 |
+
TXN_000295,CUST_0046,1189.58,2026-02-03 03:58:09.975837,CASH_OUT,DE,US,3469
|
| 300 |
+
TXN_000296,CUST_0011,4219.13,2026-02-03 04:29:30.975837,CASH_OUT,US,US,531
|
| 301 |
+
TXN_000297,CUST_0048,1367.39,2026-02-03 04:50:11.975837,TRANSFER,CN,DE,2687
|
| 302 |
+
TXN_000298,CUST_0006,1189.04,2026-02-03 05:28:19.975837,TRANSFER,BR,DE,1529
|
| 303 |
+
TXN_000299,CUST_0017,2969.3,2026-02-03 06:37:22.975837,PAYMENT,US,US,2605
|
| 304 |
+
TXN_000300,CUST_0038,2943.53,2026-02-03 06:59:34.975837,TRANSFER,US,US,497
|
| 305 |
+
TXN_000301,CUST_0044,1970.18,2026-02-03 10:01:19.975837,TRANSFER,US,CN,827
|
| 306 |
+
TXN_000302,CUST_0022,2105.04,2026-02-03 10:56:07.975837,TRANSFER,MX,US,3539
|
| 307 |
+
TXN_000303,CUST_0046,983.75,2026-02-03 11:31:49.975837,PAYMENT,US,DE,2605
|
| 308 |
+
TXN_000304,CUST_0004,123.1,2026-02-03 12:07:19.975837,DEBIT,CN,US,655
|
| 309 |
+
TXN_000305,CUST_0032,3947.53,2026-02-03 12:12:27.975837,CASH_IN,US,US,1765
|
| 310 |
+
TXN_000306,CUST_0026,2202.22,2026-02-03 12:27:45.975837,CASH_OUT,US,US,2999
|
| 311 |
+
TXN_000308,CUST_0041,3694.66,2026-02-03 12:58:43.975837,CASH_OUT,RU,US,1578
|
| 312 |
+
TXN_000309,CUST_0033,2984.49,2026-02-03 14:49:02.975837,TRANSFER,RU,MX,2988
|
| 313 |
+
TXN_000310,CUST_0034,3022.21,2026-02-03 17:37:19.975837,PAYMENT,CN,US,2014
|
| 314 |
+
TXN_000311,CUST_0023,3775.57,2026-02-03 17:40:03.975837,PAYMENT,BR,US,925
|
| 315 |
+
TXN_000312,CUST_0047,4925.91,2026-02-03 18:26:19.975837,TRANSFER,US,US,511
|
| 316 |
+
TXN_000313,CUST_0024,3584.44,2026-02-03 21:26:20.975837,CASH_OUT,US,US,3166
|
| 317 |
+
TXN_000314,CUST_0035,3153.36,2026-02-03 22:32:59.975837,CASH_OUT,US,US,3431
|
| 318 |
+
TXN_000315,CUST_0002,336.35,2026-02-04 00:33:10.975837,CASH_OUT,US,US,1042
|
| 319 |
+
TXN_000316,CUST_0031,3539.15,2026-02-04 01:12:58.975837,TRANSFER,US,US,1730
|
| 320 |
+
TXN_000317,CUST_0043,594.8,2026-02-04 01:20:24.975837,TRANSFER,US,BR,3409
|
| 321 |
+
TXN_000318,CUST_0007,2606.77,2026-02-04 01:51:38.975837,PAYMENT,US,MX,820
|
| 322 |
+
TXN_000320,CUST_0027,250695.58,2026-02-04 02:19:17.975837,TRANSFER,US,DE,967
|
| 323 |
+
TXN_000321,CUST_0001,162.47,2026-02-04 03:03:41.975837,TRANSFER,US,US,2030
|
| 324 |
+
TXN_000322,CUST_0010,4752.29,2026-02-04 03:13:20.975837,TRANSFER,US,RU,2646
|
| 325 |
+
TXN_000323,CUST_0015,2338.08,2026-02-04 03:35:49.975837,TRANSFER,US,US,3337
|
| 326 |
+
TXN_000324,CUST_0012,4383.29,2026-02-04 04:11:14.975837,CASH_OUT,US,US,1751
|
| 327 |
+
TXN_000325,CUST_0048,147027.14,2026-02-04 04:48:07.975837,CASH_OUT,US,DE,1353
|
| 328 |
+
TXN_000326,CUST_0023,4483.19,2026-02-04 05:26:22.975837,PAYMENT,US,DE,3345
|
| 329 |
+
TXN_000327,CUST_0022,996.06,2026-02-04 05:29:35.975837,PAYMENT,RU,MX,3283
|
| 330 |
+
TXN_000328,CUST_0027,3279.35,2026-02-04 05:43:57.975837,TRANSFER,US,US,247
|
| 331 |
+
TXN_000329,CUST_0011,608.19,2026-02-04 06:03:48.975837,CASH_OUT,US,US,1801
|
| 332 |
+
TXN_000330,CUST_0012,3095.48,2026-02-04 07:19:05.975837,TRANSFER,US,CN,1985
|
| 333 |
+
TXN_000331,CUST_0032,653.39,2026-02-04 08:33:56.975837,TRANSFER,US,US,1294
|
| 334 |
+
TXN_000332,CUST_0001,3552.38,2026-02-04 10:05:57.975837,TRANSFER,NG,DE,2133
|
| 335 |
+
TXN_000333,CUST_0034,3472.38,2026-02-04 10:24:23.975837,CASH_OUT,US,MX,1423
|
| 336 |
+
TXN_000334,CUST_0043,3413.85,2026-02-04 11:11:28.975837,TRANSFER,US,US,649
|
| 337 |
+
TXN_000335,CUST_0033,4259.34,2026-02-04 11:25:40.975837,CASH_OUT,GB,DE,993
|
| 338 |
+
TXN_000336,CUST_0022,4853.71,2026-02-04 11:59:11.975837,PAYMENT,US,US,1658
|
| 339 |
+
TXN_000337,CUST_0016,9572.64,2026-02-04 12:06:15.975837,CASH_OUT,US,US,2048
|
| 340 |
+
TXN_000338,CUST_0029,1648.7,2026-02-04 12:19:46.975837,DEBIT,US,US,1695
|
| 341 |
+
TXN_000339,CUST_0003,49993.3,2026-02-04 13:01:52.975837,PAYMENT,US,US,1254
|
| 342 |
+
TXN_000340,CUST_0033,2855.43,2026-02-04 13:17:28.975837,TRANSFER,US,US,3387
|
| 343 |
+
TXN_000341,CUST_0004,4101.28,2026-02-04 13:24:20.975837,TRANSFER,US,MX,2942
|
| 344 |
+
TXN_000342,CUST_0043,1880.14,2026-02-04 14:38:16.975837,TRANSFER,US,US,15
|
| 345 |
+
TXN_000343,CUST_0022,1840.18,2026-02-04 15:36:48.975837,TRANSFER,DE,US,679
|
| 346 |
+
TXN_000344,CUST_0032,788.2,2026-02-04 16:11:03.975837,TRANSFER,GB,US,809
|
| 347 |
+
TXN_000345,CUST_0013,691.65,2026-02-04 16:31:07.975837,CASH_OUT,US,NG,2942
|
| 348 |
+
TXN_000346,CUST_0022,628.05,2026-02-04 17:41:49.975837,PAYMENT,GB,MX,1880
|
| 349 |
+
TXN_000347,CUST_0043,2987.65,2026-02-04 18:11:05.975837,TRANSFER,US,US,205
|
| 350 |
+
TXN_000348,CUST_0036,4683.01,2026-02-04 18:15:02.975837,DEBIT,US,US,732
|
| 351 |
+
TXN_000349,CUST_0045,2934.92,2026-02-04 18:15:16.975837,TRANSFER,US,US,2466
|
| 352 |
+
TXN_000351,CUST_0026,4821.61,2026-02-04 19:24:14.975837,TRANSFER,US,US,1697
|
| 353 |
+
TXN_000352,CUST_0039,3530.07,2026-02-04 21:29:47.975837,TRANSFER,US,DE,2922
|
| 354 |
+
TXN_000353,CUST_0048,4684.01,2026-02-04 21:37:38.975837,PAYMENT,US,US,1197
|
| 355 |
+
TXN_000354,CUST_0044,1791.94,2026-02-04 21:58:48.975837,PAYMENT,CN,US,2850
|
| 356 |
+
TXN_000355,CUST_0041,10000.0,2026-02-04 23:10:32.975837,CASH_OUT,US,US,2344
|
| 357 |
+
TXN_000356,CUST_0043,3579.61,2026-02-04 23:11:45.975837,DEBIT,RU,BR,3317
|
| 358 |
+
TXN_000357,CUST_0001,76936.72,2026-02-04 23:19:11.975837,TRANSFER,US,US,3079
|
| 359 |
+
TXN_000358,CUST_0011,4919.31,2026-02-05 00:33:45.975837,DEBIT,US,US,3219
|
| 360 |
+
TXN_000359,CUST_0019,1099.6,2026-02-05 01:03:20.975837,TRANSFER,US,US,2530
|
| 361 |
+
TXN_000360,CUST_0044,3723.51,2026-02-05 01:53:54.975837,DEBIT,BR,US,3219
|
| 362 |
+
TXN_000361,CUST_0045,1509.43,2026-02-05 02:08:55.975837,TRANSFER,BR,US,3235
|
| 363 |
+
TXN_000362,CUST_0044,1632.0,2026-02-05 03:31:44.975837,CASH_OUT,US,US,2548
|
| 364 |
+
TXN_000363,CUST_0050,4316.18,2026-02-05 03:40:49.975837,CASH_IN,US,US,2913
|
| 365 |
+
TXN_000364,CUST_0042,1901.93,2026-02-05 04:25:04.975837,TRANSFER,NG,NG,1211
|
| 366 |
+
TXN_000365,CUST_0029,969.39,2026-02-05 05:39:51.975837,TRANSFER,US,US,2111
|
| 367 |
+
TXN_000366,CUST_0008,1948.27,2026-02-05 06:06:04.975837,CASH_OUT,US,US,2399
|
| 368 |
+
TXN_000367,CUST_0017,127.66,2026-02-05 06:29:30.975837,PAYMENT,US,US,1328
|
| 369 |
+
TXN_000368,CUST_0039,349.19,2026-02-05 07:51:41.975837,PAYMENT,US,US,2016
|
| 370 |
+
TXN_000369,CUST_0037,2795.78,2026-02-05 08:16:42.975837,CASH_IN,NG,GB,3227
|
| 371 |
+
TXN_000370,CUST_0033,880.92,2026-02-05 09:45:17.975837,TRANSFER,US,US,3625
|
| 372 |
+
TXN_000371,CUST_0014,3350.34,2026-02-05 10:23:04.975837,PAYMENT,US,MX,2306
|
| 373 |
+
TXN_000372,CUST_0049,336124.54,2026-02-05 10:32:55.975837,PAYMENT,US,NG,170
|
| 374 |
+
TXN_000373,CUST_0044,4439.73,2026-02-05 11:12:03.975837,PAYMENT,GB,US,2219
|
| 375 |
+
TXN_000374,CUST_0047,1485.86,2026-02-05 11:15:40.975837,TRANSFER,DE,US,2090
|
| 376 |
+
TXN_000375,CUST_0029,2485.34,2026-02-05 11:26:29.975837,PAYMENT,US,US,344
|
| 377 |
+
TXN_000376,CUST_0007,920.23,2026-02-05 11:55:21.975837,CASH_OUT,US,US,275
|
| 378 |
+
TXN_000377,CUST_0014,3384.64,2026-02-05 12:27:25.975837,TRANSFER,BR,NG,2209
|
| 379 |
+
TXN_000378,CUST_0045,4405.32,2026-02-05 13:05:42.975837,TRANSFER,US,GB,3066
|
| 380 |
+
TXN_000379,CUST_0044,853.4,2026-02-05 13:39:34.975837,PAYMENT,US,US,229
|
| 381 |
+
TXN_000380,CUST_0012,3991.65,2026-02-05 15:23:58.975837,CASH_IN,US,US,1066
|
| 382 |
+
TXN_000381,CUST_0027,2001.36,2026-02-05 15:34:18.975837,CASH_OUT,US,US,2764
|
| 383 |
+
TXN_000382,CUST_0008,2720.69,2026-02-05 15:55:49.975837,TRANSFER,US,US,2877
|
| 384 |
+
TXN_000383,CUST_0005,1852.73,2026-02-05 16:25:35.975837,TRANSFER,US,US,2491
|
| 385 |
+
TXN_000384,CUST_0006,1479.44,2026-02-05 16:34:51.975837,CASH_IN,US,US,1948
|
| 386 |
+
TXN_000385,CUST_0011,2713.99,2026-02-05 16:43:18.975837,TRANSFER,US,RU,2604
|
| 387 |
+
TXN_000386,CUST_0010,1560.48,2026-02-05 17:04:17.975837,TRANSFER,DE,US,2274
|
| 388 |
+
TXN_000387,CUST_0036,288495.7,2026-02-05 17:41:05.975837,DEBIT,US,US,355
|
| 389 |
+
TXN_000388,CUST_0020,1129.26,2026-02-05 17:43:18.975837,DEBIT,NG,US,2652
|
| 390 |
+
TXN_000389,CUST_0033,798.03,2026-02-05 17:46:44.975837,TRANSFER,US,US,476
|
| 391 |
+
TXN_000390,CUST_0012,3387.79,2026-02-05 18:28:55.975837,TRANSFER,US,MX,2647
|
| 392 |
+
TXN_000391,CUST_0036,458.41,2026-02-05 19:19:16.975837,TRANSFER,US,US,2385
|
| 393 |
+
TXN_000392,CUST_0032,4762.55,2026-02-05 19:48:04.975837,PAYMENT,US,US,1174
|
| 394 |
+
TXN_000393,CUST_0040,442.06,2026-02-05 20:30:52.975837,PAYMENT,US,US,2707
|
| 395 |
+
TXN_000394,CUST_0020,3497.94,2026-02-05 20:33:55.975837,TRANSFER,US,BR,697
|
| 396 |
+
TXN_000395,CUST_0001,1634.75,2026-02-05 21:17:25.975837,DEBIT,BR,US,1479
|
| 397 |
+
TXN_000396,CUST_0009,3429.94,2026-02-05 21:35:42.975837,TRANSFER,US,US,3180
|
| 398 |
+
TXN_000397,CUST_0020,2486.16,2026-02-05 21:37:22.975837,CASH_OUT,US,US,1156
|
| 399 |
+
TXN_000398,CUST_0009,4467.36,2026-02-05 22:09:54.975837,TRANSFER,GB,US,3486
|
| 400 |
+
TXN_000399,CUST_0033,3194.97,2026-02-05 22:47:47.975837,PAYMENT,US,NG,157
|
| 401 |
+
TXN_000400,CUST_0036,1377.02,2026-02-05 23:10:57.975837,TRANSFER,US,US,615
|
| 402 |
+
TXN_000401,CUST_0024,2023.24,2026-02-05 23:30:18.975837,TRANSFER,US,CN,1910
|
| 403 |
+
TXN_000402,CUST_0033,2601.02,2026-02-06 00:09:33.975837,CASH_IN,US,US,3480
|
| 404 |
+
TXN_000403,CUST_0040,3452.39,2026-02-06 01:02:12.975837,TRANSFER,US,US,2326
|
| 405 |
+
TXN_000404,CUST_0037,3331.13,2026-02-06 01:21:57.975837,CASH_OUT,MX,US,903
|
| 406 |
+
TXN_000405,CUST_0049,2489.45,2026-02-06 01:22:41.975837,TRANSFER,US,US,853
|
| 407 |
+
TXN_000406,CUST_0034,4547.86,2026-02-06 02:22:37.975837,TRANSFER,US,US,197
|
| 408 |
+
TXN_000407,CUST_0003,4904.89,2026-02-06 02:31:31.975837,PAYMENT,RU,RU,2377
|
| 409 |
+
TXN_000408,CUST_0035,2893.78,2026-02-06 02:37:05.975837,DEBIT,US,US,3429
|
| 410 |
+
TXN_000409,CUST_0005,2631.65,2026-02-06 05:13:57.975837,PAYMENT,BR,US,3561
|
| 411 |
+
TXN_000410,CUST_0023,2485.62,2026-02-06 07:00:17.975837,CASH_IN,US,US,576
|
| 412 |
+
TXN_000411,CUST_0029,911.47,2026-02-06 09:27:42.975837,CASH_OUT,US,US,772
|
| 413 |
+
TXN_000412,CUST_0011,1874.89,2026-02-06 10:26:22.975837,CASH_OUT,US,US,3329
|
| 414 |
+
TXN_000413,CUST_0022,3629.25,2026-02-06 11:33:48.975837,CASH_OUT,US,US,667
|
| 415 |
+
TXN_000414,CUST_0042,26356.44,2026-02-06 12:16:24.975837,DEBIT,US,US,2585
|
| 416 |
+
TXN_000415,CUST_0033,292.04,2026-02-06 12:47:49.975837,CASH_OUT,US,US,744
|
| 417 |
+
TXN_000416,CUST_0034,4795.37,2026-02-06 13:39:34.975837,CASH_OUT,US,US,2954
|
| 418 |
+
TXN_000417,CUST_0047,3342.55,2026-02-06 14:34:32.975837,CASH_OUT,US,US,1937
|
| 419 |
+
TXN_000418,CUST_0031,935.78,2026-02-06 15:19:47.975837,TRANSFER,US,CN,2559
|
| 420 |
+
TXN_000419,CUST_0043,2602.94,2026-02-06 16:01:22.975837,DEBIT,US,GB,948
|
| 421 |
+
TXN_000420,CUST_0025,1988.76,2026-02-06 16:35:04.975837,TRANSFER,US,BR,3392
|
| 422 |
+
TXN_000421,CUST_0010,3067.0,2026-02-06 16:38:54.975837,TRANSFER,US,GB,388
|
| 423 |
+
TXN_000422,CUST_0031,3331.02,2026-02-06 16:41:16.975837,PAYMENT,US,US,3180
|
| 424 |
+
TXN_000423,CUST_0044,3281.24,2026-02-06 16:47:40.975837,CASH_OUT,US,US,2177
|
| 425 |
+
TXN_000424,CUST_0028,1224.48,2026-02-06 17:04:01.975837,DEBIT,BR,US,3302
|
| 426 |
+
TXN_000425,CUST_0048,4548.51,2026-02-06 17:16:22.975837,DEBIT,US,US,1049
|
| 427 |
+
TXN_000426,CUST_0031,3852.71,2026-02-06 17:26:25.975837,PAYMENT,US,US,2234
|
| 428 |
+
TXN_000427,CUST_0027,373104.61,2026-02-06 17:26:36.975837,PAYMENT,US,US,2135
|
| 429 |
+
TXN_000428,CUST_0001,1937.65,2026-02-06 17:45:00.975837,CASH_IN,BR,US,640
|
| 430 |
+
TXN_000429,CUST_0028,3292.72,2026-02-06 17:55:22.975837,PAYMENT,BR,US,2513
|
| 431 |
+
TXN_000430,CUST_0018,4959.81,2026-02-06 17:56:37.975837,TRANSFER,US,US,2290
|
| 432 |
+
TXN_000431,CUST_0031,975.73,2026-02-06 19:18:38.975837,TRANSFER,US,DE,3178
|
| 433 |
+
TXN_000432,CUST_0046,2050.84,2026-02-06 19:19:59.975837,CASH_OUT,GB,MX,3214
|
| 434 |
+
TXN_000433,CUST_0045,4751.3,2026-02-06 19:30:40.975837,TRANSFER,US,US,665
|
| 435 |
+
TXN_000434,CUST_0025,50088.85,2026-02-06 19:36:09.975837,CASH_OUT,US,BR,368
|
| 436 |
+
TXN_000435,CUST_0005,1389.15,2026-02-06 19:44:17.975837,DEBIT,US,BR,2521
|
| 437 |
+
TXN_000436,CUST_0042,2652.93,2026-02-06 20:24:00.975837,CASH_OUT,US,CN,2629
|
| 438 |
+
TXN_000437,CUST_0032,2250.96,2026-02-06 21:09:46.975837,DEBIT,US,RU,804
|
| 439 |
+
TXN_000438,CUST_0003,3941.4,2026-02-06 22:27:45.975837,CASH_OUT,US,US,2767
|
| 440 |
+
TXN_000439,CUST_0003,1862.73,2026-02-06 22:58:17.975837,CASH_OUT,GB,BR,1453
|
| 441 |
+
TXN_000440,CUST_0043,2036.2,2026-02-06 23:07:41.975837,PAYMENT,US,GB,376
|
| 442 |
+
TXN_000441,CUST_0036,1494.02,2026-02-07 00:05:59.975837,TRANSFER,DE,US,3347
|
| 443 |
+
TXN_000442,CUST_0018,1208.85,2026-02-07 01:01:49.975837,TRANSFER,US,US,26
|
| 444 |
+
TXN_000443,CUST_0017,957.67,2026-02-07 01:38:57.975837,CASH_OUT,US,US,1399
|
| 445 |
+
TXN_000444,CUST_0008,4034.42,2026-02-07 01:46:05.975837,CASH_IN,RU,US,1551
|
| 446 |
+
TXN_000445,CUST_0037,2469.79,2026-02-07 02:27:07.975837,CASH_OUT,US,MX,2410
|
| 447 |
+
TXN_000446,CUST_0002,2461.65,2026-02-07 03:01:21.975837,TRANSFER,US,NG,2779
|
| 448 |
+
TXN_000447,CUST_0045,1226.66,2026-02-07 04:03:19.975837,TRANSFER,US,RU,1023
|
| 449 |
+
TXN_000448,CUST_0019,555.75,2026-02-07 04:23:19.975837,TRANSFER,GB,US,738
|
| 450 |
+
TXN_000449,CUST_0031,1637.98,2026-02-07 04:53:30.975837,TRANSFER,US,US,3063
|
| 451 |
+
TXN_000450,CUST_0044,4658.25,2026-02-07 06:18:39.975837,PAYMENT,NG,RU,853
|
| 452 |
+
TXN_000451,CUST_0015,1093.56,2026-02-07 06:20:08.975837,TRANSFER,US,US,443
|
| 453 |
+
TXN_000452,CUST_0008,4608.92,2026-02-07 06:36:17.975837,PAYMENT,US,US,3137
|
| 454 |
+
TXN_000453,CUST_0035,4794.17,2026-02-07 06:48:54.975837,TRANSFER,US,US,3615
|
| 455 |
+
TXN_000454,CUST_0037,4356.97,2026-02-07 07:33:02.975837,CASH_OUT,RU,US,3079
|
| 456 |
+
TXN_000455,CUST_0037,728.41,2026-02-07 08:12:10.975837,TRANSFER,US,US,2065
|
| 457 |
+
TXN_000456,CUST_0023,2029.21,2026-02-07 08:19:19.975837,PAYMENT,US,MX,1299
|
| 458 |
+
TXN_000457,CUST_0045,141.25,2026-02-07 08:32:07.975837,CASH_IN,US,US,1488
|
| 459 |
+
TXN_000458,CUST_0040,4323.03,2026-02-07 08:34:30.975837,TRANSFER,US,US,2518
|
| 460 |
+
TXN_000459,CUST_0022,1893.03,2026-02-07 08:39:06.975837,PAYMENT,US,DE,1502
|
| 461 |
+
TXN_000460,CUST_0026,1470.18,2026-02-07 08:54:32.975837,PAYMENT,US,US,943
|
| 462 |
+
TXN_000461,CUST_0007,3632.0,2026-02-07 08:59:17.975837,DEBIT,US,NG,604
|
| 463 |
+
TXN_000462,CUST_0048,832.79,2026-02-07 09:03:19.975837,PAYMENT,US,US,3486
|
| 464 |
+
TXN_000463,CUST_0041,2633.33,2026-02-07 09:26:03.975837,DEBIT,RU,US,3523
|
| 465 |
+
TXN_000464,CUST_0037,333.78,2026-02-07 09:39:49.975837,TRANSFER,US,US,1048
|
| 466 |
+
TXN_000465,CUST_0031,9788.63,2026-02-07 10:17:06.975837,CASH_OUT,RU,US,2302
|
| 467 |
+
TXN_000466,CUST_0036,4666.04,2026-02-07 12:43:45.975837,TRANSFER,US,US,3559
|
| 468 |
+
TXN_000467,CUST_0044,4819.27,2026-02-07 13:51:00.975837,CASH_OUT,US,US,721
|
| 469 |
+
TXN_000468,CUST_0050,1494.58,2026-02-07 13:59:26.975837,PAYMENT,US,MX,3650
|
| 470 |
+
TXN_000469,CUST_0006,1967.25,2026-02-07 14:10:36.975837,PAYMENT,US,US,693
|
| 471 |
+
TXN_000470,CUST_0041,4057.81,2026-02-07 15:05:40.975837,PAYMENT,US,US,3484
|
| 472 |
+
TXN_000471,CUST_0005,487.65,2026-02-07 15:44:19.975837,CASH_OUT,US,US,2916
|
| 473 |
+
TXN_000472,CUST_0018,3066.39,2026-02-07 16:29:37.975837,TRANSFER,DE,MX,1702
|
| 474 |
+
TXN_000473,CUST_0011,365247.35,2026-02-07 16:47:55.975837,PAYMENT,US,GB,869
|
| 475 |
+
TXN_000474,CUST_0011,2045.52,2026-02-07 17:21:24.975837,TRANSFER,MX,US,114
|
| 476 |
+
TXN_000475,CUST_0050,2045.36,2026-02-07 18:44:17.975837,TRANSFER,US,US,643
|
| 477 |
+
TXN_000476,CUST_0006,3308.68,2026-02-07 20:02:15.975837,CASH_OUT,US,US,1170
|
| 478 |
+
TXN_000477,CUST_0029,3169.76,2026-02-07 20:07:33.975837,TRANSFER,US,US,1468
|
| 479 |
+
TXN_000478,CUST_0021,4334.78,2026-02-07 20:15:27.975837,TRANSFER,RU,US,560
|
| 480 |
+
TXN_000479,CUST_0045,2742.51,2026-02-07 20:42:54.975837,CASH_OUT,US,BR,2151
|
| 481 |
+
TXN_000480,CUST_0041,3233.69,2026-02-07 21:37:15.975837,CASH_OUT,US,US,3303
|
| 482 |
+
TXN_000481,CUST_0006,2265.12,2026-02-07 23:48:04.975837,TRANSFER,US,US,7
|
| 483 |
+
TXN_000482,CUST_0034,4095.36,2026-02-08 00:30:10.975837,PAYMENT,US,US,41
|
| 484 |
+
TXN_000483,CUST_0045,4618.23,2026-02-08 00:49:23.975837,TRANSFER,US,US,1770
|
| 485 |
+
TXN_000484,CUST_0019,3025.32,2026-02-08 02:02:12.975837,CASH_IN,US,US,3620
|
| 486 |
+
TXN_000485,CUST_0036,2241.82,2026-02-08 02:24:42.975837,PAYMENT,BR,NG,1084
|
| 487 |
+
TXN_000486,CUST_0006,2168.97,2026-02-08 03:16:07.975837,CASH_IN,RU,US,3050
|
| 488 |
+
TXN_000487,CUST_0035,4063.16,2026-02-08 04:55:21.975837,TRANSFER,CN,US,459
|
| 489 |
+
TXN_000488,CUST_0041,2331.18,2026-02-08 05:36:41.975837,CASH_IN,MX,US,86
|
| 490 |
+
TXN_000489,CUST_0010,343.2,2026-02-08 06:08:56.975837,TRANSFER,US,US,1109
|
| 491 |
+
TXN_000490,CUST_0009,3604.46,2026-02-08 06:54:03.975837,TRANSFER,US,US,2028
|
| 492 |
+
TXN_000491,CUST_0014,1775.37,2026-02-08 08:10:22.975837,TRANSFER,DE,US,3248
|
| 493 |
+
TXN_000492,CUST_0003,1718.22,2026-02-08 08:18:07.975837,TRANSFER,US,US,1614
|
| 494 |
+
TXN_000493,CUST_0005,2761.64,2026-02-08 08:22:06.975837,DEBIT,RU,US,506
|
| 495 |
+
TXN_000494,CUST_0050,3601.94,2026-02-08 09:15:39.975837,TRANSFER,NG,US,822
|
| 496 |
+
TXN_000495,CUST_0030,10000.0,2026-02-08 09:58:52.975837,PAYMENT,US,US,1600
|
| 497 |
+
TXN_000496,CUST_0044,4809.95,2026-02-08 10:21:36.975837,TRANSFER,US,GB,1044
|
| 498 |
+
TXN_000497,CUST_0031,3228.75,2026-02-08 11:05:29.975837,TRANSFER,NG,NG,2599
|
| 499 |
+
TXN_000498,CUST_0028,1690.12,2026-02-08 11:49:43.975837,PAYMENT,US,US,3239
|
| 500 |
+
TXN_000499,CUST_0016,392820.24,2026-02-08 12:37:36.975837,TRANSFER,US,US,1528
|
| 501 |
+
TXN_000500,CUST_0050,538.45,2026-02-08 12:55:02.975837,PAYMENT,US,US,3118
|
| 502 |
+
TXN_000501,CUST_0041,394.26,2026-02-08 14:27:12.975837,TRANSFER,US,US,446
|
| 503 |
+
TXN_000502,CUST_0009,2490.43,2026-02-08 14:29:57.975837,CASH_OUT,US,US,1429
|
| 504 |
+
TXN_000503,CUST_0029,191995.62,2026-02-08 14:45:04.975837,CASH_OUT,RU,MX,2901
|
| 505 |
+
TXN_000504,CUST_0029,2839.22,2026-02-08 16:01:57.975837,CASH_OUT,US,US,2233
|
| 506 |
+
TXN_000505,CUST_0023,1686.04,2026-02-08 16:15:11.975837,TRANSFER,CN,US,641
|
| 507 |
+
TXN_000506,CUST_0029,1548.8,2026-02-08 17:12:55.975837,CASH_OUT,US,US,2620
|
| 508 |
+
TXN_000507,CUST_0033,1957.31,2026-02-08 17:42:04.975837,TRANSFER,US,NG,1320
|
| 509 |
+
TXN_000508,CUST_0047,410.37,2026-02-08 18:44:21.975837,TRANSFER,NG,US,2044
|
| 510 |
+
TXN_000509,CUST_0050,2802.19,2026-02-08 18:51:11.975837,TRANSFER,US,US,459
|
| 511 |
+
TXN_000510,CUST_0007,2663.68,2026-02-08 19:36:23.975837,CASH_IN,CN,US,135
|
| 512 |
+
TXN_000511,CUST_0013,624.57,2026-02-08 20:48:07.975837,CASH_OUT,US,US,1598
|
| 513 |
+
TXN_000512,CUST_0043,2500.56,2026-02-08 22:07:27.975837,CASH_OUT,US,US,911
|
| 514 |
+
TXN_000513,CUST_0039,460912.43,2026-02-08 22:30:34.975837,DEBIT,US,GB,1924
|
| 515 |
+
TXN_000514,CUST_0041,397.43,2026-02-08 22:50:45.975837,DEBIT,BR,US,3380
|
| 516 |
+
TXN_000515,CUST_0040,39842.12,2026-02-08 23:38:06.975837,CASH_OUT,US,GB,421
|
| 517 |
+
TXN_000516,CUST_0047,1231.99,2026-02-08 23:54:57.975837,DEBIT,US,US,2341
|
| 518 |
+
TXN_000517,CUST_0041,4742.77,2026-02-09 01:50:07.975837,CASH_OUT,US,DE,2769
|
| 519 |
+
TXN_000518,CUST_0030,3542.5,2026-02-09 01:55:12.975837,TRANSFER,US,BR,2074
|
| 520 |
+
TXN_000519,CUST_0022,3321.91,2026-02-09 02:11:51.975837,TRANSFER,US,DE,2260
|
| 521 |
+
TXN_000520,CUST_0021,4239.78,2026-02-09 02:30:36.975837,PAYMENT,US,DE,2499
|
| 522 |
+
TXN_000521,CUST_0016,2859.41,2026-02-09 02:53:54.975837,CASH_OUT,RU,US,1860
|
| 523 |
+
TXN_000522,CUST_0029,22158.14,2026-02-09 03:05:08.975837,TRANSFER,US,US,560
|
| 524 |
+
TXN_000523,CUST_0020,132.19,2026-02-09 03:59:19.975837,CASH_OUT,US,US,3167
|
| 525 |
+
TXN_000524,CUST_0045,4129.45,2026-02-09 04:05:58.975837,TRANSFER,US,US,2348
|
| 526 |
+
TXN_000525,CUST_0010,562.01,2026-02-09 04:49:57.975837,PAYMENT,US,US,3650
|
| 527 |
+
TXN_000526,CUST_0038,1324.3,2026-02-09 05:03:25.975837,CASH_OUT,US,US,2337
|
| 528 |
+
TXN_000527,CUST_0014,3697.9,2026-02-09 06:08:18.975837,TRANSFER,CN,US,2831
|
| 529 |
+
TXN_000528,CUST_0045,2923.54,2026-02-09 08:56:53.975837,DEBIT,US,US,3000
|
| 530 |
+
TXN_000529,CUST_0037,1969.58,2026-02-09 10:31:09.975837,TRANSFER,DE,US,3354
|
| 531 |
+
TXN_000530,CUST_0028,9193.42,2026-02-09 11:54:25.975837,CASH_OUT,NG,US,2603
|
| 532 |
+
TXN_000531,CUST_0050,3197.75,2026-02-09 11:58:17.975837,PAYMENT,US,US,2320
|
| 533 |
+
TXN_000532,CUST_0010,1701.47,2026-02-09 11:59:28.975837,TRANSFER,US,US,1616
|
| 534 |
+
TXN_000533,CUST_0029,3788.92,2026-02-09 13:06:02.975837,DEBIT,US,US,3227
|
| 535 |
+
TXN_000534,CUST_0026,41410.77,2026-02-09 14:07:43.975837,CASH_IN,US,BR,7
|
| 536 |
+
TXN_000535,CUST_0006,2052.78,2026-02-09 14:16:34.975837,CASH_IN,US,MX,2297
|
| 537 |
+
TXN_000536,CUST_0013,2490.52,2026-02-09 15:07:42.975837,TRANSFER,US,US,3020
|
| 538 |
+
TXN_000537,CUST_0034,1306.6,2026-02-09 16:29:24.975837,TRANSFER,DE,US,2366
|
| 539 |
+
TXN_000538,CUST_0006,651.4,2026-02-09 17:15:44.975837,CASH_OUT,US,US,1418
|
| 540 |
+
TXN_000539,CUST_0039,3311.51,2026-02-09 17:51:10.975837,DEBIT,US,US,3372
|
| 541 |
+
TXN_000540,CUST_0029,3153.59,2026-02-09 18:54:44.975837,TRANSFER,NG,US,1538
|
| 542 |
+
TXN_000541,CUST_0010,3812.9,2026-02-09 20:42:30.975837,TRANSFER,US,US,2550
|
| 543 |
+
TXN_000542,CUST_0010,4356.89,2026-02-09 21:10:13.975837,TRANSFER,US,US,462
|
| 544 |
+
TXN_000543,CUST_0020,108459.72,2026-02-09 21:26:11.975837,CASH_OUT,US,US,2150
|
| 545 |
+
TXN_000544,CUST_0049,1367.42,2026-02-09 21:51:33.975837,PAYMENT,CN,US,2744
|
| 546 |
+
TXN_000545,CUST_0002,1945.37,2026-02-09 21:57:51.975837,PAYMENT,US,US,253
|
| 547 |
+
TXN_000546,CUST_0019,1083.41,2026-02-09 22:16:37.975837,DEBIT,US,US,41
|
| 548 |
+
TXN_000547,CUST_0005,2004.36,2026-02-09 23:29:00.975837,DEBIT,DE,US,1205
|
| 549 |
+
TXN_000548,CUST_0042,1993.96,2026-02-09 23:46:48.975837,TRANSFER,US,DE,1992
|
| 550 |
+
TXN_000549,CUST_0039,2704.65,2026-02-10 00:47:30.975837,PAYMENT,US,US,2925
|
| 551 |
+
TXN_000550,CUST_0002,294.79,2026-02-10 01:04:51.975837,CASH_OUT,US,US,3056
|
| 552 |
+
TXN_000551,CUST_0011,190.02,2026-02-10 02:58:55.975837,PAYMENT,US,US,2060
|
| 553 |
+
TXN_000552,CUST_0018,4078.28,2026-02-10 03:45:00.975837,TRANSFER,US,RU,930
|
| 554 |
+
TXN_000553,CUST_0010,1774.75,2026-02-10 04:04:43.975837,CASH_OUT,US,NG,1716
|
| 555 |
+
TXN_000554,CUST_0016,2907.2,2026-02-10 04:23:23.975837,DEBIT,US,US,1846
|
| 556 |
+
TXN_000555,CUST_0035,745.68,2026-02-10 04:37:13.975837,TRANSFER,US,US,835
|
| 557 |
+
TXN_000556,CUST_0009,1614.09,2026-02-10 05:40:33.975837,CASH_OUT,US,US,3161
|
| 558 |
+
TXN_000557,CUST_0010,3315.54,2026-02-10 06:21:27.975837,TRANSFER,US,US,2190
|
| 559 |
+
TXN_000558,CUST_0047,680.1,2026-02-10 07:46:32.975837,DEBIT,US,BR,1691
|
| 560 |
+
TXN_000559,CUST_0020,2270.72,2026-02-10 08:26:34.975837,DEBIT,RU,US,776
|
| 561 |
+
TXN_000560,CUST_0007,493048.02,2026-02-10 08:47:33.975837,DEBIT,US,US,2515
|
| 562 |
+
TXN_000561,CUST_0015,3022.17,2026-02-10 08:52:48.975837,CASH_OUT,US,US,3201
|
| 563 |
+
TXN_000562,CUST_0031,757.02,2026-02-10 08:58:58.975837,TRANSFER,US,US,760
|
| 564 |
+
TXN_000563,CUST_0025,2508.08,2026-02-10 09:24:38.975837,PAYMENT,US,US,3138
|
| 565 |
+
TXN_000564,CUST_0001,4634.63,2026-02-10 10:01:21.975837,TRANSFER,US,US,837
|
| 566 |
+
TXN_000565,CUST_0049,1102.35,2026-02-10 11:56:38.975837,DEBIT,MX,MX,2824
|
| 567 |
+
TXN_000566,CUST_0021,4347.2,2026-02-10 12:57:57.975837,TRANSFER,US,BR,2956
|
| 568 |
+
TXN_000567,CUST_0021,2031.34,2026-02-10 13:11:48.975837,CASH_OUT,US,US,2634
|
| 569 |
+
TXN_000568,CUST_0046,3955.91,2026-02-10 14:33:28.975837,TRANSFER,US,US,3602
|
| 570 |
+
TXN_000569,CUST_0016,2641.64,2026-02-10 15:12:50.975837,CASH_IN,BR,US,2590
|
| 571 |
+
TXN_000570,CUST_0004,1030.27,2026-02-10 16:58:52.975837,PAYMENT,RU,US,1737
|
| 572 |
+
TXN_000571,CUST_0019,3104.36,2026-02-10 17:51:48.975837,TRANSFER,US,US,3406
|
| 573 |
+
TXN_000572,CUST_0042,2313.32,2026-02-10 19:05:03.975837,TRANSFER,US,CN,1617
|
| 574 |
+
TXN_000573,CUST_0027,229571.96,2026-02-10 19:50:27.975837,CASH_OUT,NG,GB,1031
|
| 575 |
+
TXN_000574,CUST_0021,3489.42,2026-02-10 20:11:34.975837,PAYMENT,GB,US,2899
|
| 576 |
+
TXN_000575,CUST_0029,3206.95,2026-02-10 21:34:27.975837,TRANSFER,CN,US,1565
|
| 577 |
+
TXN_000576,CUST_0003,3864.48,2026-02-10 22:17:17.975837,TRANSFER,US,US,621
|
| 578 |
+
TXN_000577,CUST_0011,4357.21,2026-02-10 22:20:54.975837,CASH_OUT,BR,US,2997
|
| 579 |
+
TXN_000578,CUST_0050,4808.73,2026-02-11 00:31:29.975837,TRANSFER,US,NG,21
|
| 580 |
+
TXN_000579,CUST_0040,251325.67,2026-02-11 01:14:45.975837,TRANSFER,US,MX,981
|
| 581 |
+
TXN_000580,CUST_0014,2985.43,2026-02-11 01:51:37.975837,PAYMENT,US,US,2465
|
| 582 |
+
TXN_000581,CUST_0001,1299.09,2026-02-11 02:22:47.975837,TRANSFER,US,US,3387
|
| 583 |
+
TXN_000582,CUST_0014,339.7,2026-02-11 05:20:14.975837,CASH_OUT,US,US,3504
|
| 584 |
+
TXN_000583,CUST_0003,3368.28,2026-02-11 06:42:02.975837,TRANSFER,US,US,453
|
| 585 |
+
TXN_000584,CUST_0027,4969.3,2026-02-11 08:54:58.975837,DEBIT,US,US,2873
|
| 586 |
+
TXN_000585,CUST_0039,2904.18,2026-02-11 09:47:41.975837,DEBIT,DE,GB,3154
|
| 587 |
+
TXN_000586,CUST_0020,1681.83,2026-02-11 09:57:46.975837,CASH_OUT,BR,GB,1206
|
| 588 |
+
TXN_000587,CUST_0031,759.27,2026-02-11 10:12:57.975837,CASH_OUT,US,US,2155
|
| 589 |
+
TXN_000588,CUST_0014,3509.56,2026-02-11 10:26:20.975837,TRANSFER,US,GB,1988
|
| 590 |
+
TXN_000589,CUST_0047,3474.41,2026-02-11 11:21:45.975837,TRANSFER,RU,US,3479
|
| 591 |
+
TXN_000590,CUST_0021,1372.33,2026-02-11 12:48:29.975837,PAYMENT,US,MX,2135
|
| 592 |
+
TXN_000591,CUST_0047,3196.1,2026-02-11 13:18:33.975837,CASH_OUT,US,US,2909
|
| 593 |
+
TXN_000592,CUST_0019,16873.46,2026-02-11 13:31:11.975837,CASH_OUT,US,US,3480
|
| 594 |
+
TXN_000593,CUST_0014,4017.87,2026-02-11 18:15:12.975837,TRANSFER,US,US,2302
|
| 595 |
+
TXN_000594,CUST_0041,1140.46,2026-02-11 18:23:57.975837,CASH_OUT,US,US,284
|
| 596 |
+
TXN_000595,CUST_0020,1571.39,2026-02-11 18:37:38.975837,TRANSFER,GB,US,1405
|
| 597 |
+
TXN_000596,CUST_0026,3649.54,2026-02-11 18:59:22.975837,DEBIT,US,US,1360
|
| 598 |
+
TXN_000597,CUST_0022,4619.17,2026-02-11 19:45:05.975837,PAYMENT,US,US,563
|
| 599 |
+
TXN_000598,CUST_0031,861.39,2026-02-11 20:12:20.975837,TRANSFER,DE,US,3341
|
| 600 |
+
TXN_000599,CUST_0027,4646.17,2026-02-11 23:31:33.975837,CASH_OUT,US,US,2784
|
| 601 |
+
TXN_000600,CUST_0021,290811.83,2026-02-12 00:06:02.975837,PAYMENT,US,DE,278
|
| 602 |
+
TXN_000601,CUST_0010,491891.29,2026-02-12 01:43:25.975837,PAYMENT,US,BR,774
|
| 603 |
+
TXN_000602,CUST_0039,9636.73,2026-02-12 05:29:02.975837,CASH_OUT,US,US,1119
|
| 604 |
+
TXN_000603,CUST_0027,525.31,2026-02-12 05:59:42.975837,CASH_OUT,US,RU,892
|
| 605 |
+
TXN_000604,CUST_0034,1581.36,2026-02-12 06:00:50.975837,PAYMENT,NG,MX,2079
|
| 606 |
+
TXN_000605,CUST_0002,4015.22,2026-02-12 06:08:50.975837,TRANSFER,US,US,1987
|
| 607 |
+
TXN_000606,CUST_0047,4382.01,2026-02-12 06:10:24.975837,PAYMENT,US,GB,3374
|
| 608 |
+
TXN_000607,CUST_0034,3415.91,2026-02-12 06:11:44.975837,PAYMENT,MX,US,3549
|
| 609 |
+
TXN_000608,CUST_0034,108644.4,2026-02-12 06:33:25.975837,CASH_OUT,US,BR,1372
|
| 610 |
+
TXN_000609,CUST_0030,4457.01,2026-02-12 07:06:24.975837,CASH_OUT,RU,US,3113
|
| 611 |
+
TXN_000610,CUST_0020,3230.37,2026-02-12 07:20:18.975837,CASH_OUT,US,US,2187
|
| 612 |
+
TXN_000611,CUST_0021,3886.66,2026-02-12 07:37:55.975837,PAYMENT,US,US,475
|
| 613 |
+
TXN_000612,CUST_0001,4795.66,2026-02-12 07:38:07.975837,PAYMENT,US,US,2257
|
| 614 |
+
TXN_000613,CUST_0021,1428.16,2026-02-12 09:04:41.975837,TRANSFER,NG,US,1282
|
| 615 |
+
TXN_000614,CUST_0040,4471.99,2026-02-12 10:09:10.975837,PAYMENT,US,US,2773
|
| 616 |
+
TXN_000615,CUST_0004,619.04,2026-02-12 10:43:40.975837,CASH_IN,US,US,2448
|
| 617 |
+
TXN_000616,CUST_0038,3184.41,2026-02-12 11:22:10.975837,DEBIT,US,US,1368
|
| 618 |
+
TXN_000617,CUST_0013,3593.2,2026-02-12 11:49:36.975837,DEBIT,US,MX,2332
|
| 619 |
+
TXN_000618,CUST_0009,555.29,2026-02-12 12:44:45.975837,DEBIT,US,US,1278
|
| 620 |
+
TXN_000619,CUST_0044,3257.65,2026-02-12 13:14:40.975837,CASH_OUT,US,CN,3534
|
| 621 |
+
TXN_000620,CUST_0040,1364.46,2026-02-12 17:30:39.975837,PAYMENT,US,DE,3237
|
| 622 |
+
TXN_000621,CUST_0021,240290.51,2026-02-12 18:13:58.975837,CASH_OUT,US,US,706
|
| 623 |
+
TXN_000622,CUST_0019,3862.91,2026-02-12 18:49:36.975837,CASH_OUT,US,US,3355
|
| 624 |
+
TXN_000623,CUST_0046,4004.11,2026-02-12 19:20:01.975837,CASH_OUT,US,MX,1648
|
| 625 |
+
TXN_000624,CUST_0038,2125.87,2026-02-12 23:31:34.975837,PAYMENT,US,BR,277
|
| 626 |
+
TXN_000625,CUST_0022,1120.37,2026-02-13 01:24:14.975837,TRANSFER,US,DE,2237
|
| 627 |
+
TXN_000626,CUST_0045,1257.16,2026-02-13 01:35:00.975837,CASH_OUT,US,MX,475
|
| 628 |
+
TXN_000627,CUST_0038,3020.77,2026-02-13 02:35:43.975837,TRANSFER,US,US,1268
|
| 629 |
+
TXN_000628,CUST_0026,441.08,2026-02-13 04:42:21.975837,CASH_OUT,BR,US,2648
|
| 630 |
+
TXN_000629,CUST_0043,401.26,2026-02-13 05:19:08.975837,CASH_IN,US,US,3099
|
| 631 |
+
TXN_000630,CUST_0041,4068.21,2026-02-13 05:47:41.975837,CASH_OUT,US,US,1200
|
| 632 |
+
TXN_000631,CUST_0025,3116.3,2026-02-13 06:05:19.975837,PAYMENT,US,RU,2342
|
| 633 |
+
TXN_000632,CUST_0044,1592.3,2026-02-13 06:07:06.975837,CASH_OUT,US,DE,372
|
| 634 |
+
TXN_000633,CUST_0038,139.78,2026-02-13 07:01:12.975837,CASH_OUT,US,US,1211
|
| 635 |
+
TXN_000634,CUST_0004,1909.19,2026-02-13 07:19:02.975837,TRANSFER,US,DE,456
|
| 636 |
+
TXN_000635,CUST_0019,50000.0,2026-02-13 07:42:18.975837,CASH_OUT,BR,US,2922
|
| 637 |
+
TXN_000636,CUST_0025,2089.56,2026-02-13 07:51:01.975837,CASH_OUT,US,US,576
|
| 638 |
+
TXN_000637,CUST_0013,2821.57,2026-02-13 09:17:23.975837,TRANSFER,US,US,1188
|
| 639 |
+
TXN_000638,CUST_0043,325952.68,2026-02-13 09:24:57.975837,CASH_OUT,US,BR,563
|
| 640 |
+
TXN_000639,CUST_0006,772.38,2026-02-13 09:32:50.975837,CASH_OUT,BR,US,1868
|
| 641 |
+
TXN_000640,CUST_0033,2178.21,2026-02-13 10:53:31.975837,TRANSFER,US,US,1746
|
| 642 |
+
TXN_000641,CUST_0039,136.41,2026-02-13 11:21:27.975837,TRANSFER,RU,US,2244
|
| 643 |
+
TXN_000642,CUST_0037,1898.15,2026-02-13 11:31:21.975837,CASH_IN,US,GB,2383
|
| 644 |
+
TXN_000643,CUST_0031,4812.51,2026-02-13 11:37:15.975837,CASH_OUT,RU,US,327
|
| 645 |
+
TXN_000644,CUST_0034,4460.59,2026-02-13 13:34:16.975837,CASH_IN,US,GB,2808
|
| 646 |
+
TXN_000645,CUST_0041,2742.07,2026-02-13 13:55:24.975837,TRANSFER,US,US,1927
|
| 647 |
+
TXN_000646,CUST_0030,2612.05,2026-02-13 13:57:58.975837,DEBIT,BR,US,3276
|
| 648 |
+
TXN_000647,CUST_0019,461817.94,2026-02-13 13:58:57.975837,PAYMENT,RU,US,1945
|
| 649 |
+
TXN_000648,CUST_0038,928.49,2026-02-13 14:43:07.975837,TRANSFER,US,US,344
|
| 650 |
+
TXN_000649,CUST_0009,2577.42,2026-02-13 15:20:49.975837,TRANSFER,US,US,1157
|
| 651 |
+
TXN_000650,CUST_0018,60216.96,2026-02-13 15:48:10.975837,CASH_OUT,US,US,626
|
| 652 |
+
TXN_000651,CUST_0043,2288.6,2026-02-13 16:13:10.975837,TRANSFER,US,MX,747
|
| 653 |
+
TXN_000652,CUST_0034,4323.87,2026-02-13 16:16:18.975837,TRANSFER,US,US,3372
|
| 654 |
+
TXN_000653,CUST_0010,4204.31,2026-02-13 16:25:00.975837,CASH_IN,US,US,2713
|
| 655 |
+
TXN_000654,CUST_0029,3657.4,2026-02-13 19:25:41.975837,PAYMENT,US,US,2637
|
| 656 |
+
TXN_000655,CUST_0017,3801.87,2026-02-13 20:03:38.975837,TRANSFER,US,US,1241
|
| 657 |
+
TXN_000656,CUST_0031,3756.14,2026-02-13 20:08:24.975837,TRANSFER,US,US,2897
|
| 658 |
+
TXN_000657,CUST_0025,2425.49,2026-02-13 20:49:02.975837,TRANSFER,US,US,3272
|
| 659 |
+
TXN_000658,CUST_0029,1971.82,2026-02-13 21:55:39.975837,PAYMENT,US,GB,2183
|
| 660 |
+
TXN_000659,CUST_0041,1833.76,2026-02-13 23:19:05.975837,CASH_IN,US,US,1123
|
| 661 |
+
TXN_000660,CUST_0022,1424.6,2026-02-13 23:48:56.975837,TRANSFER,US,US,1895
|
| 662 |
+
TXN_000661,CUST_0050,3408.93,2026-02-13 23:54:08.975837,TRANSFER,US,DE,2782
|
| 663 |
+
TXN_000662,CUST_0045,4966.75,2026-02-14 00:32:26.975837,TRANSFER,US,US,285
|
| 664 |
+
TXN_000663,CUST_0001,2115.12,2026-02-14 00:52:17.975837,TRANSFER,US,US,2977
|
| 665 |
+
TXN_000664,CUST_0019,311601.63,2026-02-14 01:20:14.975837,CASH_OUT,US,US,3429
|
| 666 |
+
TXN_000665,CUST_0014,4757.4,2026-02-14 04:39:16.975837,TRANSFER,GB,US,2483
|
| 667 |
+
TXN_000666,CUST_0009,1942.2,2026-02-14 04:53:30.975837,CASH_IN,US,CN,461
|
| 668 |
+
TXN_000667,CUST_0045,1002.89,2026-02-14 05:14:07.975837,TRANSFER,US,US,1864
|
| 669 |
+
TXN_000668,CUST_0018,3869.86,2026-02-14 05:51:48.975837,TRANSFER,US,RU,670
|
| 670 |
+
TXN_000669,CUST_0050,462.59,2026-02-14 05:57:43.975837,CASH_OUT,US,US,253
|
| 671 |
+
TXN_000670,CUST_0017,4782.47,2026-02-14 06:18:53.975837,TRANSFER,US,US,828
|
| 672 |
+
TXN_000671,CUST_0040,2023.91,2026-02-14 07:37:05.975837,CASH_OUT,US,US,1773
|
| 673 |
+
TXN_000672,CUST_0014,3108.43,2026-02-14 07:59:13.975837,DEBIT,US,US,149
|
| 674 |
+
TXN_000673,CUST_0005,445.02,2026-02-14 08:02:02.975837,TRANSFER,US,CN,2681
|
| 675 |
+
TXN_000674,CUST_0041,198289.49,2026-02-14 08:18:41.975837,CASH_OUT,US,US,1609
|
| 676 |
+
TXN_000675,CUST_0037,118.15,2026-02-14 08:50:27.975837,TRANSFER,MX,US,3464
|
| 677 |
+
TXN_000676,CUST_0047,3926.59,2026-02-14 09:17:55.975837,TRANSFER,US,US,2830
|
| 678 |
+
TXN_000677,CUST_0050,2462.13,2026-02-14 09:27:03.975837,TRANSFER,DE,US,1247
|
| 679 |
+
TXN_000678,CUST_0026,370.45,2026-02-14 09:57:39.975837,TRANSFER,US,US,3502
|
| 680 |
+
TXN_000679,CUST_0022,494.24,2026-02-14 09:57:51.975837,TRANSFER,NG,US,168
|
| 681 |
+
TXN_000680,CUST_0025,3337.6,2026-02-14 11:46:56.975837,CASH_OUT,US,US,2828
|
| 682 |
+
TXN_000681,CUST_0023,2483.87,2026-02-14 11:47:26.975837,DEBIT,US,US,153
|
| 683 |
+
TXN_000682,CUST_0013,224.29,2026-02-14 12:12:26.975837,PAYMENT,US,US,3254
|
| 684 |
+
TXN_000683,CUST_0035,3252.7,2026-02-14 13:38:54.975837,TRANSFER,MX,US,158
|
| 685 |
+
TXN_000684,CUST_0022,374.67,2026-02-14 14:45:02.975837,PAYMENT,US,US,3312
|
| 686 |
+
TXN_000685,CUST_0042,3369.85,2026-02-14 15:33:21.975837,TRANSFER,US,CN,3042
|
| 687 |
+
TXN_000686,CUST_0038,1241.63,2026-02-14 15:37:15.975837,PAYMENT,MX,US,1937
|
| 688 |
+
TXN_000687,CUST_0040,324.43,2026-02-14 15:49:46.975837,TRANSFER,US,US,211
|
| 689 |
+
TXN_000688,CUST_0020,4121.62,2026-02-14 16:04:56.975837,PAYMENT,US,GB,3356
|
| 690 |
+
TXN_000689,CUST_0007,659.48,2026-02-14 17:11:50.975837,TRANSFER,US,US,837
|
| 691 |
+
TXN_000690,CUST_0028,1752.98,2026-02-14 17:18:55.975837,DEBIT,BR,US,2809
|
| 692 |
+
TXN_000691,CUST_0037,2774.84,2026-02-14 18:40:13.975837,TRANSFER,NG,CN,1381
|
| 693 |
+
TXN_000692,CUST_0005,691.65,2026-02-14 18:57:26.975837,CASH_IN,US,US,2273
|
| 694 |
+
TXN_000693,CUST_0011,2249.44,2026-02-14 19:48:33.975837,PAYMENT,US,US,3477
|
| 695 |
+
TXN_000694,CUST_0041,3100.96,2026-02-14 21:33:02.975837,CASH_OUT,US,US,33
|
| 696 |
+
TXN_000695,CUST_0001,979.12,2026-02-14 22:45:46.975837,TRANSFER,US,BR,2847
|
| 697 |
+
TXN_000696,CUST_0050,2432.46,2026-02-14 22:59:51.975837,PAYMENT,US,US,1851
|
| 698 |
+
TXN_000697,CUST_0027,1272.34,2026-02-14 23:50:19.975837,TRANSFER,US,US,2944
|
| 699 |
+
TXN_000698,CUST_0032,3099.04,2026-02-14 23:56:25.975837,TRANSFER,RU,US,25
|
| 700 |
+
TXN_000699,CUST_0036,1254.63,2026-02-15 00:14:42.975837,CASH_OUT,US,US,1489
|
| 701 |
+
TXN_000700,CUST_0049,4935.23,2026-02-15 00:18:08.975837,DEBIT,US,US,859
|
| 702 |
+
TXN_000701,CUST_0018,360.04,2026-02-15 00:30:11.975837,TRANSFER,US,MX,2044
|
| 703 |
+
TXN_000702,CUST_0012,882.82,2026-02-15 00:53:42.975837,PAYMENT,US,US,865
|
| 704 |
+
TXN_000703,CUST_0028,1331.77,2026-02-15 02:29:07.975837,TRANSFER,MX,US,3039
|
| 705 |
+
TXN_000704,CUST_0004,4631.82,2026-02-15 02:52:58.975837,TRANSFER,MX,US,297
|
| 706 |
+
TXN_000705,CUST_0016,3634.88,2026-02-15 02:54:06.975837,CASH_OUT,US,US,2779
|
| 707 |
+
TXN_000706,CUST_0021,1227.31,2026-02-15 02:58:53.975837,CASH_OUT,US,US,1696
|
| 708 |
+
TXN_000707,CUST_0013,1940.11,2026-02-15 04:06:37.975837,CASH_OUT,US,US,1792
|
| 709 |
+
TXN_000708,CUST_0010,1159.21,2026-02-15 04:56:53.975837,TRANSFER,US,US,1881
|
| 710 |
+
TXN_000709,CUST_0047,1051.36,2026-02-15 05:38:34.975837,DEBIT,US,US,138
|
| 711 |
+
TXN_000710,CUST_0045,2886.46,2026-02-15 07:10:38.975837,CASH_OUT,US,US,1720
|
| 712 |
+
TXN_000711,CUST_0011,3825.66,2026-02-15 07:14:06.975837,DEBIT,US,US,3261
|
| 713 |
+
TXN_000712,CUST_0041,4768.52,2026-02-15 07:28:28.975837,DEBIT,US,US,947
|
| 714 |
+
TXN_000713,CUST_0006,2117.31,2026-02-15 07:36:46.975837,CASH_OUT,NG,US,3435
|
| 715 |
+
TXN_000714,CUST_0030,1467.94,2026-02-15 07:41:38.975837,CASH_OUT,NG,US,1785
|
| 716 |
+
TXN_000715,CUST_0038,1189.79,2026-02-15 08:05:41.975837,PAYMENT,US,US,188
|
| 717 |
+
TXN_000716,CUST_0003,4957.24,2026-02-15 08:16:00.975837,PAYMENT,US,US,1622
|
| 718 |
+
TXN_000717,CUST_0031,4067.61,2026-02-15 08:44:39.975837,TRANSFER,US,US,347
|
| 719 |
+
TXN_000718,CUST_0036,3790.09,2026-02-15 11:59:11.975837,CASH_OUT,US,US,1475
|
| 720 |
+
TXN_000719,CUST_0019,1271.41,2026-02-15 12:43:29.975837,TRANSFER,US,US,669
|
| 721 |
+
TXN_000720,CUST_0046,2350.49,2026-02-15 14:37:14.975837,TRANSFER,US,MX,3168
|
| 722 |
+
TXN_000721,CUST_0009,4383.58,2026-02-15 15:07:55.975837,CASH_OUT,DE,US,2890
|
| 723 |
+
TXN_000722,CUST_0041,106.68,2026-02-15 15:49:33.975837,DEBIT,US,US,2181
|
| 724 |
+
TXN_000723,CUST_0003,1553.29,2026-02-15 16:49:43.975837,PAYMENT,US,US,2363
|
| 725 |
+
TXN_000724,CUST_0014,3959.69,2026-02-15 17:20:03.975837,TRANSFER,US,US,2770
|
| 726 |
+
TXN_000725,CUST_0024,4451.09,2026-02-15 17:20:48.975837,CASH_OUT,US,US,1504
|
| 727 |
+
TXN_000726,CUST_0024,958.81,2026-02-15 17:40:54.975837,TRANSFER,US,NG,573
|
| 728 |
+
TXN_000727,CUST_0022,1269.3,2026-02-15 18:28:44.975837,TRANSFER,US,NG,3091
|
| 729 |
+
TXN_000728,CUST_0048,3828.34,2026-02-15 20:43:14.975837,TRANSFER,BR,US,266
|
| 730 |
+
TXN_000729,CUST_0024,1791.61,2026-02-15 21:05:09.975837,TRANSFER,US,US,2914
|
| 731 |
+
TXN_000730,CUST_0035,100000.0,2026-02-15 21:06:39.975837,TRANSFER,US,US,3283
|
| 732 |
+
TXN_000731,CUST_0044,4732.29,2026-02-15 21:26:39.975837,CASH_OUT,GB,US,3627
|
| 733 |
+
TXN_000732,CUST_0030,527.81,2026-02-15 22:13:21.975837,PAYMENT,US,GB,454
|
| 734 |
+
TXN_000733,CUST_0011,1452.12,2026-02-15 22:22:12.975837,PAYMENT,US,US,1207
|
| 735 |
+
TXN_000734,CUST_0027,4850.92,2026-02-15 22:34:57.975837,PAYMENT,US,US,1825
|
| 736 |
+
TXN_000735,CUST_0048,3258.95,2026-02-15 23:03:27.975837,CASH_OUT,US,NG,3426
|
| 737 |
+
TXN_000736,CUST_0034,3258.89,2026-02-16 00:16:33.975837,PAYMENT,US,US,1343
|
| 738 |
+
TXN_000737,CUST_0032,3007.45,2026-02-16 00:39:15.975837,TRANSFER,MX,US,2330
|
| 739 |
+
TXN_000738,CUST_0009,4501.58,2026-02-16 01:09:52.975837,PAYMENT,NG,US,1187
|
| 740 |
+
TXN_000739,CUST_0050,4243.02,2026-02-16 02:24:02.975837,TRANSFER,US,CN,2922
|
| 741 |
+
TXN_000740,CUST_0035,1497.71,2026-02-16 03:03:38.975837,DEBIT,CN,US,485
|
| 742 |
+
TXN_000741,CUST_0003,4969.49,2026-02-16 03:43:41.975837,TRANSFER,US,US,847
|
| 743 |
+
TXN_000742,CUST_0036,3564.96,2026-02-16 04:05:40.975837,CASH_OUT,CN,US,2218
|
| 744 |
+
TXN_000743,CUST_0011,2714.85,2026-02-16 04:45:05.975837,DEBIT,US,CN,1883
|
| 745 |
+
TXN_000744,CUST_0021,864.66,2026-02-16 06:05:06.975837,TRANSFER,US,US,2658
|
| 746 |
+
TXN_000745,CUST_0046,1548.23,2026-02-16 06:22:37.975837,CASH_OUT,CN,MX,1394
|
| 747 |
+
TXN_000746,CUST_0045,650.35,2026-02-16 06:42:03.975837,CASH_IN,US,US,485
|
| 748 |
+
TXN_000747,CUST_0020,221.5,2026-02-16 07:01:53.975837,PAYMENT,US,US,1343
|
| 749 |
+
TXN_000748,CUST_0004,3079.94,2026-02-16 07:27:36.975837,TRANSFER,US,RU,808
|
| 750 |
+
TXN_000749,CUST_0002,509.59,2026-02-16 09:41:57.975837,TRANSFER,US,BR,803
|
| 751 |
+
TXN_000750,CUST_0032,1657.01,2026-02-16 09:48:28.975837,DEBIT,DE,US,2939
|
| 752 |
+
TXN_000751,CUST_0028,1911.19,2026-02-16 09:53:02.975837,PAYMENT,US,US,1832
|
| 753 |
+
TXN_000752,CUST_0036,529.23,2026-02-16 10:04:35.975837,CASH_OUT,US,MX,1189
|
| 754 |
+
TXN_000753,CUST_0011,4047.8,2026-02-16 10:12:35.975837,TRANSFER,US,CN,3429
|
| 755 |
+
TXN_000754,CUST_0038,3029.88,2026-02-16 10:15:47.975837,PAYMENT,US,DE,277
|
| 756 |
+
TXN_000755,CUST_0038,3804.96,2026-02-16 11:18:02.975837,PAYMENT,US,BR,723
|
| 757 |
+
TXN_000756,CUST_0036,2364.39,2026-02-16 12:34:57.975837,TRANSFER,NG,US,1570
|
| 758 |
+
TXN_000757,CUST_0019,413992.91,2026-02-16 13:00:30.975837,CASH_OUT,RU,US,3037
|
| 759 |
+
TXN_000758,CUST_0030,1200.15,2026-02-16 13:46:37.975837,TRANSFER,US,US,2630
|
| 760 |
+
TXN_000759,CUST_0041,2415.45,2026-02-16 14:31:55.975837,CASH_OUT,BR,US,2824
|
| 761 |
+
TXN_000760,CUST_0042,1299.28,2026-02-16 15:20:47.975837,TRANSFER,US,GB,2460
|
| 762 |
+
TXN_000761,CUST_0048,1872.62,2026-02-16 15:56:49.975837,TRANSFER,US,US,2816
|
| 763 |
+
TXN_000762,CUST_0031,4873.87,2026-02-16 16:03:40.975837,CASH_OUT,US,US,3469
|
| 764 |
+
TXN_000763,CUST_0017,897.95,2026-02-16 16:24:23.975837,PAYMENT,US,CN,1470
|
| 765 |
+
TXN_000764,CUST_0011,359.15,2026-02-16 16:37:57.975837,PAYMENT,US,US,1194
|
| 766 |
+
TXN_000765,CUST_0019,2695.1,2026-02-16 16:51:11.975837,CASH_OUT,US,CN,3139
|
| 767 |
+
TXN_000766,CUST_0007,3033.94,2026-02-16 18:38:07.975837,CASH_OUT,US,US,3468
|
| 768 |
+
TXN_000767,CUST_0044,4019.4,2026-02-16 19:09:39.975837,DEBIT,US,US,2195
|
| 769 |
+
TXN_000768,CUST_0038,1822.98,2026-02-16 19:30:46.975837,PAYMENT,US,US,3196
|
| 770 |
+
TXN_000769,CUST_0032,2118.77,2026-02-16 19:45:40.975837,PAYMENT,US,US,2068
|
| 771 |
+
TXN_000770,CUST_0015,4174.71,2026-02-16 19:50:52.975837,TRANSFER,US,US,2160
|
| 772 |
+
TXN_000771,CUST_0035,3591.48,2026-02-16 20:11:53.975837,TRANSFER,BR,US,319
|
| 773 |
+
TXN_000772,CUST_0008,4112.34,2026-02-16 21:29:42.975837,TRANSFER,US,US,1492
|
| 774 |
+
TXN_000773,CUST_0009,4103.49,2026-02-16 22:02:00.975837,CASH_OUT,US,DE,712
|
| 775 |
+
TXN_000774,CUST_0046,1592.95,2026-02-16 22:12:12.975837,TRANSFER,US,US,2850
|
| 776 |
+
TXN_000775,CUST_0010,3471.43,2026-02-16 23:08:53.975837,DEBIT,US,BR,2836
|
| 777 |
+
TXN_000776,CUST_0049,3941.75,2026-02-16 23:57:29.975837,DEBIT,BR,US,448
|
| 778 |
+
TXN_000777,CUST_0003,3985.97,2026-02-17 00:10:52.975837,PAYMENT,US,US,1043
|
| 779 |
+
TXN_000778,CUST_0003,424.61,2026-02-17 01:03:15.975837,CASH_OUT,GB,NG,2413
|
| 780 |
+
TXN_000779,CUST_0013,1005.43,2026-02-17 02:12:06.975837,TRANSFER,US,RU,2381
|
| 781 |
+
TXN_000780,CUST_0023,1825.8,2026-02-17 05:16:57.975837,TRANSFER,NG,US,286
|
| 782 |
+
TXN_000781,CUST_0007,4115.97,2026-02-17 06:36:43.975837,TRANSFER,US,RU,710
|
| 783 |
+
TXN_000782,CUST_0049,2731.92,2026-02-17 07:46:29.975837,CASH_OUT,US,US,2072
|
| 784 |
+
TXN_000783,CUST_0046,2426.11,2026-02-17 08:35:30.975837,DEBIT,US,US,446
|
| 785 |
+
TXN_000784,CUST_0012,4190.24,2026-02-17 08:45:29.975837,TRANSFER,US,US,1676
|
| 786 |
+
TXN_000785,CUST_0008,3830.91,2026-02-17 09:03:21.975837,CASH_OUT,US,US,2037
|
| 787 |
+
TXN_000786,CUST_0049,1870.13,2026-02-17 09:11:22.975837,TRANSFER,GB,US,480
|
| 788 |
+
TXN_000787,CUST_0025,1489.7,2026-02-17 10:00:29.975837,TRANSFER,US,MX,932
|
| 789 |
+
TXN_000788,CUST_0036,2095.68,2026-02-17 10:16:20.975837,DEBIT,US,MX,2788
|
| 790 |
+
TXN_000789,CUST_0024,978.56,2026-02-17 10:16:24.975837,CASH_OUT,US,US,1801
|
| 791 |
+
TXN_000790,CUST_0034,3326.89,2026-02-17 10:40:45.975837,PAYMENT,US,US,2425
|
| 792 |
+
TXN_000791,CUST_0007,3733.02,2026-02-17 11:28:21.975837,TRANSFER,US,US,822
|
| 793 |
+
TXN_000792,CUST_0022,1081.29,2026-02-17 12:29:46.975837,PAYMENT,US,US,1746
|
| 794 |
+
TXN_000793,CUST_0047,2545.64,2026-02-17 13:17:16.975837,DEBIT,RU,BR,1465
|
| 795 |
+
TXN_000794,CUST_0031,3366.72,2026-02-17 13:38:25.975837,TRANSFER,RU,US,1869
|
| 796 |
+
TXN_000795,CUST_0007,698.73,2026-02-17 13:41:38.975837,PAYMENT,US,US,414
|
| 797 |
+
TXN_000796,CUST_0048,358.98,2026-02-17 13:43:34.975837,TRANSFER,US,BR,2483
|
| 798 |
+
TXN_000797,CUST_0044,1702.08,2026-02-17 14:55:54.975837,CASH_OUT,US,MX,3254
|
| 799 |
+
TXN_000798,CUST_0030,1089.47,2026-02-17 15:35:08.975837,TRANSFER,US,US,1414
|
| 800 |
+
TXN_000799,CUST_0035,2778.44,2026-02-17 16:18:27.975837,CASH_OUT,US,US,494
|
| 801 |
+
TXN_000800,CUST_0025,2305.57,2026-02-17 16:22:28.975837,TRANSFER,US,US,731
|
| 802 |
+
TXN_000801,CUST_0036,3331.11,2026-02-17 17:21:41.975837,TRANSFER,CN,US,557
|
| 803 |
+
TXN_000802,CUST_0020,9594.58,2026-02-17 17:23:08.975837,PAYMENT,US,US,2710
|
| 804 |
+
TXN_000803,CUST_0036,3458.33,2026-02-17 19:26:49.975837,CASH_OUT,US,US,1610
|
| 805 |
+
TXN_000804,CUST_0017,2523.99,2026-02-17 19:46:21.975837,TRANSFER,US,US,1172
|
| 806 |
+
TXN_000805,CUST_0021,400.98,2026-02-17 20:22:05.975837,CASH_OUT,US,US,3322
|
| 807 |
+
TXN_000806,CUST_0048,2961.44,2026-02-17 20:27:02.975837,TRANSFER,US,US,1760
|
| 808 |
+
TXN_000807,CUST_0023,4960.53,2026-02-17 21:43:21.975837,PAYMENT,US,US,968
|
| 809 |
+
TXN_000808,CUST_0042,1629.29,2026-02-18 01:06:32.975837,PAYMENT,US,GB,1389
|
| 810 |
+
TXN_000809,CUST_0011,196.59,2026-02-18 01:14:45.975837,PAYMENT,US,BR,1099
|
| 811 |
+
TXN_000810,CUST_0002,3510.2,2026-02-18 02:06:21.975837,PAYMENT,BR,US,1327
|
| 812 |
+
TXN_000811,CUST_0037,578.86,2026-02-18 03:33:06.975837,PAYMENT,US,US,2041
|
| 813 |
+
TXN_000812,CUST_0033,4076.14,2026-02-18 03:41:04.975837,PAYMENT,US,US,1792
|
| 814 |
+
TXN_000813,CUST_0013,2535.06,2026-02-18 06:19:21.975837,DEBIT,NG,US,201
|
| 815 |
+
TXN_000814,CUST_0020,4981.52,2026-02-18 08:34:07.975837,CASH_OUT,US,GB,2946
|
| 816 |
+
TXN_000815,CUST_0038,564.19,2026-02-18 09:14:27.975837,TRANSFER,US,MX,1756
|
| 817 |
+
TXN_000816,CUST_0014,1801.85,2026-02-18 09:18:13.975837,PAYMENT,RU,US,2218
|
| 818 |
+
TXN_000817,CUST_0021,1080.38,2026-02-18 09:51:28.975837,TRANSFER,US,US,3134
|
| 819 |
+
TXN_000818,CUST_0036,353149.16,2026-02-18 09:56:47.975837,TRANSFER,MX,US,3381
|
| 820 |
+
TXN_000819,CUST_0048,4696.7,2026-02-18 11:17:59.975837,CASH_OUT,US,BR,2325
|
| 821 |
+
TXN_000820,CUST_0047,3171.12,2026-02-18 11:55:46.975837,TRANSFER,US,US,623
|
| 822 |
+
TXN_000821,CUST_0048,3458.0,2026-02-18 11:57:05.975837,PAYMENT,US,US,3407
|
| 823 |
+
TXN_000822,CUST_0005,3206.24,2026-02-18 12:01:00.975837,CASH_IN,US,US,664
|
| 824 |
+
TXN_000823,CUST_0017,3465.59,2026-02-18 12:07:21.975837,TRANSFER,US,US,120
|
| 825 |
+
TXN_000824,CUST_0016,4005.52,2026-02-18 12:36:10.975837,CASH_OUT,US,BR,2656
|
| 826 |
+
TXN_000825,CUST_0003,1089.75,2026-02-18 13:20:17.975837,PAYMENT,US,RU,2704
|
| 827 |
+
TXN_000826,CUST_0036,962.33,2026-02-18 13:57:36.975837,CASH_OUT,MX,US,3527
|
| 828 |
+
TXN_000827,CUST_0006,108367.01,2026-02-18 14:06:02.975837,CASH_OUT,US,DE,2758
|
| 829 |
+
TXN_000828,CUST_0043,4440.02,2026-02-18 16:01:13.975837,CASH_IN,CN,US,2345
|
| 830 |
+
TXN_000829,CUST_0048,2551.22,2026-02-18 16:18:37.975837,PAYMENT,US,US,3181
|
| 831 |
+
TXN_000830,CUST_0034,1333.86,2026-02-18 19:29:41.975837,PAYMENT,US,US,3311
|
| 832 |
+
TXN_000831,CUST_0021,1713.5,2026-02-18 20:00:27.975837,DEBIT,US,NG,1739
|
| 833 |
+
TXN_000832,CUST_0014,806.96,2026-02-18 21:00:16.975837,TRANSFER,MX,US,3541
|
| 834 |
+
TXN_000833,CUST_0038,374.03,2026-02-18 22:22:25.975837,TRANSFER,US,US,2242
|
| 835 |
+
TXN_000834,CUST_0028,2426.79,2026-02-18 23:28:44.975837,CASH_OUT,US,CN,1493
|
| 836 |
+
TXN_000835,CUST_0031,3606.79,2026-02-18 23:55:26.975837,PAYMENT,US,US,3453
|
| 837 |
+
TXN_000836,CUST_0048,3344.89,2026-02-19 00:29:06.975837,TRANSFER,US,NG,1043
|
| 838 |
+
TXN_000837,CUST_0036,1984.98,2026-02-19 01:05:46.975837,PAYMENT,GB,US,975
|
| 839 |
+
TXN_000838,CUST_0029,2003.51,2026-02-19 02:12:37.975837,PAYMENT,US,RU,1239
|
| 840 |
+
TXN_000839,CUST_0006,4687.98,2026-02-19 03:49:03.975837,TRANSFER,US,CN,1804
|
| 841 |
+
TXN_000840,CUST_0041,1654.2,2026-02-19 04:20:18.975837,CASH_OUT,US,RU,3555
|
| 842 |
+
TXN_000841,CUST_0006,4133.67,2026-02-19 05:18:02.975837,DEBIT,US,US,3452
|
| 843 |
+
TXN_000842,CUST_0022,3615.19,2026-02-19 05:32:43.975837,CASH_IN,CN,US,2080
|
| 844 |
+
TXN_000843,CUST_0005,1824.1,2026-02-19 07:42:20.975837,CASH_IN,DE,US,119
|
| 845 |
+
TXN_000844,CUST_0049,355.28,2026-02-19 11:14:38.975837,TRANSFER,US,CN,19
|
| 846 |
+
TXN_000845,CUST_0026,1080.37,2026-02-19 12:43:12.975837,TRANSFER,US,US,1029
|
| 847 |
+
TXN_000846,CUST_0034,3596.46,2026-02-19 12:55:20.975837,CASH_OUT,US,US,2440
|
| 848 |
+
TXN_000847,CUST_0044,2110.55,2026-02-19 14:21:58.975837,TRANSFER,US,CN,1074
|
| 849 |
+
TXN_000848,CUST_0012,3468.59,2026-02-19 15:01:41.975837,TRANSFER,NG,US,1512
|
| 850 |
+
TXN_000849,CUST_0012,2028.12,2026-02-19 15:15:58.975837,TRANSFER,NG,US,101
|
| 851 |
+
TXN_000850,CUST_0036,3270.82,2026-02-19 15:16:22.975837,CASH_IN,MX,US,2879
|
| 852 |
+
TXN_000851,CUST_0011,343.94,2026-02-19 17:06:25.975837,TRANSFER,US,US,1514
|
| 853 |
+
TXN_000852,CUST_0011,4741.49,2026-02-19 17:09:09.975837,PAYMENT,BR,MX,3395
|
| 854 |
+
TXN_000853,CUST_0044,2521.33,2026-02-19 18:45:30.975837,CASH_OUT,US,RU,1186
|
| 855 |
+
TXN_000854,CUST_0048,2521.42,2026-02-19 18:46:18.975837,PAYMENT,NG,RU,2983
|
| 856 |
+
TXN_000855,CUST_0044,1027.88,2026-02-19 18:46:39.975837,DEBIT,US,US,1079
|
| 857 |
+
TXN_000856,CUST_0016,3126.63,2026-02-19 20:47:10.975837,CASH_OUT,US,US,1883
|
| 858 |
+
TXN_000857,CUST_0006,17575.03,2026-02-19 21:11:45.975837,TRANSFER,US,US,11
|
| 859 |
+
TXN_000858,CUST_0014,3595.35,2026-02-19 21:12:37.975837,CASH_OUT,RU,US,2288
|
| 860 |
+
TXN_000859,CUST_0004,355.35,2026-02-19 21:16:39.975837,TRANSFER,US,US,2490
|
| 861 |
+
TXN_000860,CUST_0043,4839.33,2026-02-19 22:04:30.975837,TRANSFER,US,US,2073
|
| 862 |
+
TXN_000861,CUST_0040,1966.59,2026-02-19 22:50:56.975837,CASH_OUT,US,US,2298
|
| 863 |
+
TXN_000862,CUST_0003,2944.39,2026-02-19 23:28:34.975837,PAYMENT,US,MX,547
|
| 864 |
+
TXN_000863,CUST_0006,1654.86,2026-02-19 23:31:54.975837,DEBIT,US,US,187
|
| 865 |
+
TXN_000864,CUST_0009,2546.13,2026-02-19 23:48:05.975837,CASH_OUT,US,US,1768
|
| 866 |
+
TXN_000865,CUST_0019,4523.68,2026-02-19 23:57:04.975837,PAYMENT,RU,US,1791
|
| 867 |
+
TXN_000866,CUST_0011,1646.16,2026-02-20 00:24:48.975837,TRANSFER,CN,US,2699
|
| 868 |
+
TXN_000867,CUST_0041,4011.28,2026-02-20 00:42:45.975837,PAYMENT,US,US,153
|
| 869 |
+
TXN_000868,CUST_0031,1375.1,2026-02-20 00:47:05.975837,TRANSFER,US,MX,174
|
| 870 |
+
TXN_000869,CUST_0029,1846.95,2026-02-20 00:52:53.975837,CASH_OUT,US,US,3471
|
| 871 |
+
TXN_000870,CUST_0047,4347.71,2026-02-20 00:55:41.975837,TRANSFER,US,CN,3426
|
| 872 |
+
TXN_000871,CUST_0011,3774.69,2026-02-20 01:35:00.975837,PAYMENT,US,US,876
|
| 873 |
+
TXN_000872,CUST_0038,384589.58,2026-02-20 01:46:56.975837,CASH_OUT,US,NG,3153
|
| 874 |
+
TXN_000873,CUST_0032,3416.85,2026-02-20 02:17:24.975837,TRANSFER,US,US,2794
|
| 875 |
+
TXN_000874,CUST_0008,37791.57,2026-02-20 04:09:45.975837,TRANSFER,DE,US,16
|
| 876 |
+
TXN_000875,CUST_0030,4170.43,2026-02-20 04:37:36.975837,CASH_OUT,US,US,1356
|
| 877 |
+
TXN_000876,CUST_0003,3315.25,2026-02-20 04:38:50.975837,CASH_OUT,US,CN,872
|
| 878 |
+
TXN_000877,CUST_0004,4027.63,2026-02-20 05:21:15.975837,TRANSFER,GB,US,2473
|
| 879 |
+
TXN_000878,CUST_0025,553.5,2026-02-20 06:55:14.975837,PAYMENT,US,BR,372
|
| 880 |
+
TXN_000879,CUST_0002,4276.49,2026-02-20 07:21:44.975837,CASH_OUT,RU,US,2686
|
| 881 |
+
TXN_000880,CUST_0010,690.95,2026-02-20 07:51:27.975837,TRANSFER,US,RU,2812
|
| 882 |
+
TXN_000881,CUST_0039,743.3,2026-02-20 08:07:05.975837,CASH_OUT,NG,US,3633
|
| 883 |
+
TXN_000882,CUST_0025,2434.55,2026-02-20 08:44:58.975837,TRANSFER,US,DE,2521
|
| 884 |
+
TXN_000883,CUST_0012,2227.12,2026-02-20 10:46:35.975837,TRANSFER,US,US,1905
|
| 885 |
+
TXN_000884,CUST_0044,1198.73,2026-02-20 10:51:09.975837,TRANSFER,US,US,2585
|
| 886 |
+
TXN_000885,CUST_0042,2670.92,2026-02-20 12:20:48.975837,TRANSFER,US,MX,1237
|
| 887 |
+
TXN_000886,CUST_0010,4922.51,2026-02-20 13:01:37.975837,CASH_IN,US,US,1758
|
| 888 |
+
TXN_000887,CUST_0019,2885.82,2026-02-20 13:22:06.975837,PAYMENT,GB,US,1698
|
| 889 |
+
TXN_000888,CUST_0007,2376.82,2026-02-20 13:38:05.975837,CASH_OUT,DE,US,341
|
| 890 |
+
TXN_000889,CUST_0050,2566.88,2026-02-20 13:42:30.975837,CASH_OUT,US,US,753
|
| 891 |
+
TXN_000890,CUST_0026,321.77,2026-02-20 14:14:00.975837,CASH_OUT,DE,US,1870
|
| 892 |
+
TXN_000891,CUST_0049,3384.27,2026-02-20 14:43:47.975837,TRANSFER,US,CN,871
|
| 893 |
+
TXN_000892,CUST_0012,483.28,2026-02-20 15:12:49.975837,TRANSFER,US,US,1783
|
| 894 |
+
TXN_000893,CUST_0035,187.78,2026-02-20 15:34:37.975837,CASH_OUT,US,US,1891
|
| 895 |
+
TXN_000894,CUST_0045,2084.95,2026-02-20 15:38:00.975837,TRANSFER,MX,US,3337
|
| 896 |
+
TXN_000895,CUST_0040,1867.57,2026-02-20 15:52:44.975837,TRANSFER,US,US,1246
|
| 897 |
+
TXN_000896,CUST_0006,60396.69,2026-02-20 16:11:52.975837,TRANSFER,US,US,864
|
| 898 |
+
TXN_000897,CUST_0031,50000.0,2026-02-20 17:00:42.975837,TRANSFER,US,US,3242
|
| 899 |
+
TXN_000898,CUST_0035,1035.48,2026-02-20 17:00:51.975837,PAYMENT,US,US,96
|
| 900 |
+
TXN_000899,CUST_0008,913.92,2026-02-20 17:10:09.975837,TRANSFER,MX,US,3528
|
| 901 |
+
TXN_000900,CUST_0029,2967.61,2026-02-20 17:18:07.975837,TRANSFER,US,US,1374
|
| 902 |
+
TXN_000901,CUST_0001,603.05,2026-02-20 17:49:29.975837,TRANSFER,US,US,2037
|
| 903 |
+
TXN_000902,CUST_0048,2935.44,2026-02-20 18:23:48.975837,TRANSFER,US,US,1998
|
| 904 |
+
TXN_000903,CUST_0033,2996.09,2026-02-20 18:37:04.975837,PAYMENT,US,MX,956
|
| 905 |
+
TXN_000904,CUST_0046,290319.66,2026-02-20 19:17:11.975837,TRANSFER,US,US,2662
|
| 906 |
+
TXN_000905,CUST_0027,4456.79,2026-02-20 19:58:35.975837,CASH_OUT,US,US,1843
|
| 907 |
+
TXN_000906,CUST_0045,2237.53,2026-02-20 20:00:10.975837,CASH_IN,MX,US,957
|
| 908 |
+
TXN_000907,CUST_0033,1176.54,2026-02-20 21:21:10.975837,DEBIT,US,US,3457
|
| 909 |
+
TXN_000908,CUST_0046,3319.09,2026-02-20 21:53:03.975837,PAYMENT,US,BR,3419
|
| 910 |
+
TXN_000909,CUST_0044,3297.25,2026-02-20 22:39:41.975837,CASH_OUT,US,CN,2554
|
| 911 |
+
TXN_000910,CUST_0014,1484.04,2026-02-20 23:39:16.975837,PAYMENT,US,US,824
|
| 912 |
+
TXN_000911,CUST_0011,3068.17,2026-02-21 00:46:15.975837,TRANSFER,US,RU,968
|
| 913 |
+
TXN_000912,CUST_0014,2828.47,2026-02-21 01:57:47.975837,CASH_OUT,US,US,2779
|
| 914 |
+
TXN_000913,CUST_0011,956.1,2026-02-21 02:21:26.975837,TRANSFER,US,DE,1770
|
| 915 |
+
TXN_000914,CUST_0008,3126.06,2026-02-21 02:30:02.975837,PAYMENT,US,US,1400
|
| 916 |
+
TXN_000915,CUST_0023,3869.93,2026-02-21 04:12:54.975837,TRANSFER,US,GB,2900
|
| 917 |
+
TXN_000916,CUST_0004,4640.5,2026-02-21 04:23:40.975837,TRANSFER,US,GB,440
|
| 918 |
+
TXN_000917,CUST_0040,3087.31,2026-02-21 05:31:53.975837,PAYMENT,US,US,2084
|
| 919 |
+
TXN_000918,CUST_0007,918.53,2026-02-21 06:01:25.975837,CASH_OUT,US,US,2990
|
| 920 |
+
TXN_000919,CUST_0019,3570.0,2026-02-21 06:59:47.975837,TRANSFER,US,CN,2657
|
| 921 |
+
TXN_000920,CUST_0024,1739.58,2026-02-21 07:49:07.975837,TRANSFER,MX,US,1011
|
| 922 |
+
TXN_000921,CUST_0031,1772.47,2026-02-21 09:16:19.975837,CASH_OUT,US,US,3098
|
| 923 |
+
TXN_000922,CUST_0027,1867.15,2026-02-21 09:28:41.975837,TRANSFER,US,BR,3231
|
| 924 |
+
TXN_000923,CUST_0015,776.17,2026-02-21 10:57:38.975837,CASH_OUT,MX,DE,128
|
| 925 |
+
TXN_000924,CUST_0029,404092.2,2026-02-21 11:30:54.975837,DEBIT,GB,US,1652
|
| 926 |
+
TXN_000925,CUST_0050,905.19,2026-02-21 11:38:01.975837,CASH_OUT,CN,US,2594
|
| 927 |
+
TXN_000926,CUST_0046,4015.45,2026-02-21 12:10:45.975837,PAYMENT,BR,US,2795
|
| 928 |
+
TXN_000927,CUST_0045,2812.69,2026-02-21 12:22:56.975837,DEBIT,DE,US,1152
|
| 929 |
+
TXN_000928,CUST_0034,3090.97,2026-02-21 13:46:22.975837,PAYMENT,US,US,3642
|
| 930 |
+
TXN_000929,CUST_0035,3159.36,2026-02-21 17:17:33.975837,CASH_OUT,US,US,3332
|
| 931 |
+
TXN_000930,CUST_0042,2082.08,2026-02-21 18:36:53.975837,TRANSFER,US,US,1377
|
| 932 |
+
TXN_000931,CUST_0025,3652.98,2026-02-21 19:09:52.975837,TRANSFER,US,RU,882
|
| 933 |
+
TXN_000932,CUST_0006,2607.19,2026-02-21 19:11:14.975837,CASH_OUT,US,US,102
|
| 934 |
+
TXN_000933,CUST_0002,4462.56,2026-02-21 19:18:40.975837,DEBIT,US,RU,2982
|
| 935 |
+
TXN_000934,CUST_0028,4936.08,2026-02-21 19:47:40.975837,PAYMENT,US,US,2575
|
| 936 |
+
TXN_000935,CUST_0033,327226.4,2026-02-21 19:50:09.975837,DEBIT,US,US,3025
|
| 937 |
+
TXN_000936,CUST_0001,2320.42,2026-02-21 20:13:59.975837,TRANSFER,NG,US,1172
|
| 938 |
+
TXN_000937,CUST_0043,3945.47,2026-02-21 20:44:16.975837,DEBIT,US,NG,438
|
| 939 |
+
TXN_000938,CUST_0021,2630.61,2026-02-21 21:07:24.975837,TRANSFER,MX,US,2921
|
| 940 |
+
TXN_000939,CUST_0028,4159.34,2026-02-21 22:40:33.975837,PAYMENT,US,MX,886
|
| 941 |
+
TXN_000940,CUST_0029,482.56,2026-02-21 22:56:56.975837,CASH_OUT,US,US,3197
|
| 942 |
+
TXN_000941,CUST_0026,4372.87,2026-02-21 23:15:12.975837,PAYMENT,US,MX,3004
|
| 943 |
+
TXN_000942,CUST_0027,4136.68,2026-02-22 00:07:08.975837,CASH_OUT,US,CN,2892
|
| 944 |
+
TXN_000943,CUST_0033,4330.03,2026-02-22 00:11:26.975837,TRANSFER,US,US,3064
|
| 945 |
+
TXN_000944,CUST_0011,4725.94,2026-02-22 00:53:43.975837,TRANSFER,BR,US,1520
|
| 946 |
+
TXN_000945,CUST_0037,1518.99,2026-02-22 02:01:14.975837,PAYMENT,US,US,1540
|
| 947 |
+
TXN_000946,CUST_0020,75720.35,2026-02-22 03:07:56.975837,CASH_OUT,BR,US,1256
|
| 948 |
+
TXN_000947,CUST_0019,1156.35,2026-02-22 04:19:28.975837,TRANSFER,US,US,1435
|
| 949 |
+
TXN_000948,CUST_0005,4365.09,2026-02-22 04:29:13.975837,TRANSFER,US,US,1390
|
| 950 |
+
TXN_000949,CUST_0025,2428.61,2026-02-22 04:57:40.975837,PAYMENT,US,MX,3126
|
| 951 |
+
TXN_000950,CUST_0029,3369.38,2026-02-22 05:04:32.975837,DEBIT,GB,BR,1593
|
| 952 |
+
TXN_000951,CUST_0015,4511.2,2026-02-22 05:33:05.975837,CASH_OUT,US,US,1821
|
| 953 |
+
TXN_000952,CUST_0048,1459.14,2026-02-22 06:25:04.975837,TRANSFER,US,US,2587
|
| 954 |
+
TXN_000953,CUST_0050,3566.25,2026-02-22 08:17:29.975837,PAYMENT,US,US,795
|
| 955 |
+
TXN_000954,CUST_0040,2754.99,2026-02-22 08:30:26.975837,TRANSFER,NG,US,499
|
| 956 |
+
TXN_000955,CUST_0043,4687.29,2026-02-22 09:53:19.975837,CASH_OUT,US,NG,3405
|
| 957 |
+
TXN_000956,CUST_0046,4210.7,2026-02-22 10:02:30.975837,DEBIT,US,US,1319
|
| 958 |
+
TXN_000957,CUST_0026,2985.58,2026-02-22 10:08:27.975837,CASH_OUT,DE,US,1706
|
| 959 |
+
TXN_000958,CUST_0002,4312.28,2026-02-22 11:00:13.975837,CASH_IN,US,US,413
|
| 960 |
+
TXN_000959,CUST_0035,923.96,2026-02-22 11:22:40.975837,CASH_OUT,US,US,1263
|
| 961 |
+
TXN_000960,CUST_0027,3425.18,2026-02-22 11:36:50.975837,DEBIT,CN,US,246
|
| 962 |
+
TXN_000961,CUST_0020,2010.7,2026-02-22 12:25:59.975837,DEBIT,US,US,1545
|
| 963 |
+
TXN_000962,CUST_0008,354.2,2026-02-22 14:03:52.975837,TRANSFER,US,US,2090
|
| 964 |
+
TXN_000963,CUST_0049,2571.66,2026-02-22 14:18:12.975837,CASH_IN,US,US,2272
|
| 965 |
+
TXN_000964,CUST_0027,318602.94,2026-02-22 14:44:32.975837,TRANSFER,US,US,2407
|
| 966 |
+
TXN_000965,CUST_0044,597.4,2026-02-22 16:17:58.975837,CASH_OUT,US,US,2334
|
| 967 |
+
TXN_000966,CUST_0027,2285.31,2026-02-22 17:07:28.975837,CASH_OUT,US,CN,1536
|
| 968 |
+
TXN_000967,CUST_0035,4928.01,2026-02-22 17:43:32.975837,TRANSFER,US,US,2280
|
| 969 |
+
TXN_000968,CUST_0029,304.78,2026-02-22 17:44:09.975837,TRANSFER,RU,US,692
|
| 970 |
+
TXN_000969,CUST_0001,394.86,2026-02-22 18:12:42.975837,CASH_OUT,US,US,2792
|
| 971 |
+
TXN_000970,CUST_0025,4996.29,2026-02-22 18:43:11.975837,TRANSFER,US,RU,193
|
| 972 |
+
TXN_000971,CUST_0011,3722.0,2026-02-22 18:59:51.975837,PAYMENT,US,US,510
|
| 973 |
+
TXN_000972,CUST_0009,3652.86,2026-02-22 19:01:49.975837,PAYMENT,NG,US,3292
|
| 974 |
+
TXN_000973,CUST_0021,4431.26,2026-02-22 19:19:34.975837,PAYMENT,US,MX,1125
|
| 975 |
+
TXN_000974,CUST_0016,3345.16,2026-02-22 19:30:55.975837,PAYMENT,US,DE,72
|
| 976 |
+
TXN_000975,CUST_0045,755.26,2026-02-22 19:46:15.975837,TRANSFER,US,US,46
|
| 977 |
+
TXN_000976,CUST_0044,950.33,2026-02-22 21:13:21.975837,TRANSFER,US,US,1615
|
| 978 |
+
TXN_000977,CUST_0035,497.63,2026-02-22 22:16:49.975837,PAYMENT,US,US,3415
|
| 979 |
+
TXN_000978,CUST_0043,2281.37,2026-02-22 22:47:05.975837,DEBIT,BR,DE,1591
|
| 980 |
+
TXN_000979,CUST_0012,4211.81,2026-02-22 23:59:22.975837,PAYMENT,GB,US,797
|
| 981 |
+
TXN_000980,CUST_0029,145.88,2026-02-23 01:51:43.975837,CASH_OUT,DE,US,3350
|
| 982 |
+
TXN_000981,CUST_0040,3163.66,2026-02-23 03:17:58.975837,PAYMENT,US,DE,157
|
| 983 |
+
TXN_000982,CUST_0018,2514.91,2026-02-23 03:50:12.975837,TRANSFER,US,US,3370
|
| 984 |
+
TXN_000983,CUST_0041,2040.82,2026-02-23 03:51:04.975837,TRANSFER,US,US,2267
|
| 985 |
+
TXN_000984,CUST_0013,3333.21,2026-02-23 05:08:14.975837,CASH_OUT,US,US,274
|
| 986 |
+
TXN_000985,CUST_0038,728.41,2026-02-23 06:22:32.975837,PAYMENT,US,US,940
|
| 987 |
+
TXN_000986,CUST_0034,3671.6,2026-02-23 06:44:38.975837,DEBIT,US,RU,2795
|
| 988 |
+
TXN_000987,CUST_0036,216421.67,2026-02-23 06:52:14.975837,TRANSFER,US,US,3504
|
| 989 |
+
TXN_000988,CUST_0021,2219.49,2026-02-23 07:11:33.975837,TRANSFER,US,US,1918
|
| 990 |
+
TXN_000989,CUST_0032,1871.21,2026-02-23 07:16:17.975837,CASH_OUT,NG,US,1727
|
| 991 |
+
TXN_000990,CUST_0035,101331.03,2026-02-23 07:57:14.975837,TRANSFER,US,US,110
|
| 992 |
+
TXN_000991,CUST_0048,1205.58,2026-02-23 09:50:46.975837,PAYMENT,NG,US,1355
|
| 993 |
+
TXN_000992,CUST_0020,407.94,2026-02-23 09:57:40.975837,TRANSFER,US,US,105
|
| 994 |
+
TXN_000993,CUST_0038,4006.38,2026-02-23 10:08:54.975837,DEBIT,NG,US,983
|
| 995 |
+
TXN_000994,CUST_0022,4179.34,2026-02-23 10:43:51.975837,TRANSFER,US,US,305
|
| 996 |
+
TXN_000995,CUST_0050,3039.83,2026-02-23 11:32:50.975837,CASH_IN,US,US,518
|
| 997 |
+
TXN_000996,CUST_0006,4875.18,2026-02-23 12:38:42.975837,CASH_OUT,US,GB,3212
|
| 998 |
+
TXN_000997,CUST_0009,403.81,2026-02-23 13:06:56.975837,TRANSFER,US,US,1775
|
| 999 |
+
TXN_000998,CUST_0005,598.96,2026-02-23 14:15:04.975837,CASH_OUT,US,BR,399
|
| 1000 |
+
TXN_000999,CUST_0040,3784.62,2026-02-23 17:35:10.975837,PAYMENT,US,US,50
|
| 1001 |
+
TXN_001000,CUST_0030,1981.21,2026-02-23 18:02:57.975837,CASH_OUT,GB,US,2774
|