Spaces:
Runtime error
Runtime error
Download src/streamlit_app.py from Shreyash3096/DSA-Project: direct link, hf CLI and curl.
- Browser
- Download file 4.06 kB
-
https://huggingface.co/spaces/Shreyash3096/DSA-Project/resolve/main/src/streamlit_app.py
- Command line
-
hf download hf://spaces/Shreyash3096/DSA-Project/src/streamlit_app.py
-
curl -L -o streamlit_app.py https://huggingface.co/spaces/Shreyash3096/DSA-Project/resolve/main/src/streamlit_app.py
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).") |