File size: 2,413 Bytes
cff8376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import streamlit as st
import pandas as pd
import joblib
import json
from datetime import datetime

# Load trained model
iso_forest = joblib.load("isolation_forest_model.pkl")

# Load location mapping
with open("location_mapping.json", "r") as f:
    location_mapping = json.load(f)

# Manual mapping for categorical variables
transaction_type_mapping = {"Debit": 0, "Credit": 1}
channel_mapping = {"ATM": 0, "Online": 1, "Branch": 2}
day_of_week_mapping = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, "Friday": 4, "Saturday": 5, "Sunday": 6}

st.title("Anomaly Detection for Bank Transactions")



# User inputs
date = st.date_input("Select Transaction Date")
time = st.time_input("Select Transaction Time")
location = st.selectbox("Select Location", options=list(location_mapping.keys()))
transaction_type = st.radio("Transaction Type", options=["Debit", "Credit"])
channel = st.radio("Transaction Channel", options=["ATM", "Online", "Branch"])
transaction_duration = st.slider("Transaction Duration (seconds)", min_value=0, max_value=600, value=30)
login_attempts = st.number_input("Login Attempts", min_value=0)
transaction_amount = st.number_input("Transaction Amount", min_value=0.0, format="%.2f")

if st.button("Check for Anomaly"):
    # Convert date to day of the week
    day_of_week = day_of_week_mapping[date.strftime('%A')]
    
    # Convert time to total seconds since midnight
    total_seconds = time.hour * 3600 + time.minute * 60
    
    # Convert categorical values to numeric
    location_encoded = location_mapping.get(location, -1)  # Default to -1 if not found
    transaction_type_encoded = transaction_type_mapping[transaction_type]
    channel_encoded = channel_mapping[channel]
    
    # Ensure the order of features matches training
    input_data = pd.DataFrame([[
        transaction_type_encoded, location_encoded, channel_encoded, total_seconds,  
        transaction_duration, login_attempts, day_of_week, transaction_amount  # <-- Corrected order
    ]], columns=[
        "TransactionType", "Location", "Channel", "Time", 
        "TransactionDuration", "LoginAttempts", "DayOfWeek", "TransactionAmount"  # <-- Corrected order
    ])

    # Predict anomaly
    prediction = iso_forest.predict(input_data)[0]
    anomaly_label = "Anomalous" if prediction == -1 else "Normal"
    
    # Display result
    st.write(f"### The transaction is: **{anomaly_label}**")