anomaly-detection / bidding_app.py
DataWhiz07's picture
Upload 15 files
892bfcc verified
import gradio as gr
import pandas as pd
import numpy as np
import joblib
import sqlite3
from datetime import datetime, timedelta
# Load model and encoder
model = joblib.load("anomaly_model.pkl")
label_encoder = joblib.load("label_encoder.pkl")
df = pd.read_csv("cleaned_dataset.csv")
df = df[['Product Name', 'Price']].dropna()
# Connect to SQLite
def connect_to_db():
return sqlite3.connect("sql.db")
def detect_and_act(product_name, bid_price):
vendor_id = 1 # hardcoded
try:
conn = connect_to_db()
cursor = conn.cursor()
bid_price = float(bid_price)
encoded_product = label_encoder.transform([product_name])[0]
input_data = np.array([[encoded_product, bid_price]])
prediction = model.predict(input_data)
product_data = df[df['Product Name'] == product_name]
mean_price = product_data['Price'].mean()
std_price = product_data['Price'].std()
min_range = mean_price - 2 * std_price
max_range = mean_price + 2 * std_price
bid_valid = min_range <= bid_price <= max_range
# Check if vendor exists
cursor.execute("SELECT * FROM vendors WHERE vendor_id = ?", (vendor_id,))
vendor = cursor.fetchone()
if not vendor:
return "⚠️ Vendor not found!"
# Get latest bid by this vendor
cursor.execute("SELECT bid_id FROM bids WHERE vendor_id = ? ORDER BY bid_id DESC LIMIT 1", (vendor_id,))
bid = cursor.fetchone()
if not bid:
return "⚠️ No bid found in the system to associate with a vendor."
bid_id = bid[0]
if prediction[0] == -1 and not bid_valid:
cursor.execute("UPDATE vendors SET anomaly_count = anomaly_count + 1 WHERE vendor_id = ?", (vendor_id,))
conn.commit()
cursor.execute("SELECT anomaly_count FROM vendors WHERE vendor_id = ?", (vendor_id,))
anomaly_count = cursor.fetchone()[0]
if anomaly_count >= 3:
cursor.execute("UPDATE vendors SET blocked_status = 1 WHERE vendor_id = ?", (vendor_id,))
conn.commit()
return "❌ Vendor permanently blocked after 3 fake bids."
elif anomaly_count == 2:
block_until = datetime.now() + timedelta(hours=24)
cursor.execute("UPDATE vendors SET suspended_until = ? WHERE vendor_id = ?",
(block_until.strftime("%Y-%m-%d %H:%M:%S"), vendor_id))
conn.commit()
return "⚠️ Vendor temporarily blocked for 24 hours (2nd fake bid)."
else:
return "⚠️ Fake bid detected. Warning issued."
elif prediction[0] == -1 or not bid_valid:
block_until = datetime.now() + timedelta(hours=24)
cursor.execute("UPDATE vendors SET suspended_until = ? WHERE vendor_id = ?",
(block_until.strftime("%Y-%m-%d %H:%M:%S"), vendor_id))
conn.commit()
return "⚠️ Bid suspicious. Vendor temporarily blocked for 24 hours."
else:
return "✅ Bid is normal."
except Exception as e:
return f"❌ Error: {str(e)}"
finally:
conn.close()
# Gradio Interface
iface = gr.Interface(
fn=detect_and_act,
inputs=["text", "text"],
outputs="text",
title="🛡️ Fake Bid Detection System",
description="Enter Product Name and Bid Price"
)
iface.launch()