DSA-Project / src /streamlit_app.py
Shreyash3096's picture
Update src/streamlit_app.py
d153bd3 verified
Raw History Blame Contribute Delete
4.06 kB
import streamlit as st
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import random
# --- DSA: MERGE SORT IMPLEMENTATION (Requirement 2) ---
def merge_sort(df, column):
if len(df) <= 1:
return df
mid = len(df) // 2
left = merge_sort(df.iloc[:mid], column)
right = merge_sort(df.iloc[mid:], column)
return merge_left_right(left, right, column)
def merge_left_right(left, right, column):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left.iloc[i][column] > right.iloc[j][column]: # Sort descending
result.append(left.iloc[i])
i += 1
else:
result.append(right.iloc[j])
j += 1
result.extend(left.iloc[i:].to_dict('records'))
result.extend(right.iloc[j:].to_dict('records'))
return pd.DataFrame(result)
# --- APP LAYOUT ---
st.title("🛡️ DSA Fraud Detection System")
# Requirement 1 & 6: Data Handling
st.subheader("Step 1: Data Input")
uploaded_file = st.file_uploader("Choose a CSV file", type="csv")
# Bypassing the 403 error by allowing internal generation
if st.button("No CSV? Generate 1000 Synthetic Transactions"):
users = [f"User_{i}" for i in range(1, 51)]
data = []
for _ in range(1000):
s, r = random.sample(users, 2)
data.append({"Sender": s, "Receiver": r, "Amount": random.randint(10, 5000)})
df = pd.DataFrame(data)
st.session_state['df'] = df
st.success("1000 Transactions Generated!")
if uploaded_file is not None:
st.session_state['df'] = pd.read_csv(uploaded_file)
if 'df' in st.session_state:
df = st.session_state['df']
st.write("Current Data Preview (First 5 rows):", df.head())
# --- USER SETTINGS (THRESHOLDS) ---
st.divider()
col1, col2 = st.columns(2)
with col1:
amount_threshold = st.number_input("Amount Threshold ($)", value=4000)
with col2:
freq_threshold = st.number_input("Max Transactions per User", value=10)
blacklist_input = st.text_input("Blacklisted Users (comma separated)", "User_5, User_13")
blacklist = [x.strip() for x in blacklist_input.split(",")]
if st.button("Run Fraud Analysis"):
st.divider()
# --- 2. SORTING & THRESHOLD (Requirement 2) ---
st.subheader("1. High-Value Suspicious Transactions")
sorted_df = merge_sort(df, 'Amount')
high_value = sorted_df[sorted_df['Amount'] > amount_threshold]
st.write(f"Found {len(high_value)} transactions crossing the ${amount_threshold} limit.")
st.dataframe(high_value)
# --- 3. MAX TRANSACTIONS (HASH MAP SEARCH - Requirement 3) ---
st.subheader("2. High-Frequency User Analysis")
user_counts = {}
for user in df['Sender']:
user_counts[user] = user_counts.get(user, 0) + 1
suspicious_users = [u for u, c in user_counts.items() if c > freq_threshold]
if suspicious_users:
st.warning(f"Users exceeding {freq_threshold} transactions: {suspicious_users}")
else:
st.success("No users exceeded the frequency threshold.")
# --- 4. BLACKLIST CHECK (Requirement 4) ---
st.subheader("3. Blacklisted Fraud Detection")
blacklist_fraud = high_value[high_value['Sender'].isin(blacklist)]
if not blacklist_fraud.empty:
st.error("⚠️ CRITICAL: Blacklisted users found in high-value transactions!")
st.table(blacklist_fraud)
else:
st.info("No blacklisted users found in high-value transactions.")
# --- 7. GRAPH THEORY (Requirement 7) ---
st.subheader("4. Transaction Network Visualization")
G = nx.from_pandas_edgelist(df.head(50), 'Sender', 'Receiver', create_using=nx.DiGraph())
fig, ax = plt.subplots()
nx.draw(G, with_labels=True, node_color='orange', node_size=700, font_size=8, ax=ax)
st.pyplot(fig)
st.caption(f"Analysis completed using Merge Sort O(N log N) and Hash Map O(N).")