File size: 5,328 Bytes
18bbae8 | 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | from flask import Flask, request, render_template, flash, session, redirect, url_for
import numpy as np
import joblib
import pandas as pd
import os
from datetime import datetime
app = Flask(__name__)
app.secret_key = 'x7k9p2m4q8r5t1n3j6h0' # Secret key for flash messages and session
# Load model, encoder, and CSV locally
model = joblib.load("symptom_checker_model.pkl")
mlb = joblib.load("mlb_encoder.pkl")
df = pd.read_csv("DiseaseAndSymptoms.csv")
# Symptom columns define karo
symptom_columns = [f"Symptom_{i}" for i in range(1, 18)]
# Saare symptoms extract karo
all_symptoms = sorted(set([symptom for col in symptom_columns for symptom in df[col].dropna().unique()]))
# Symptom categories dynamically banayein (except 'Other')
symptom_categories = {
"Skin": [s for s in all_symptoms if any(kw in s for kw in ["skin", "rash", "itch", "patch", "eruption"])],
"Respiratory": [s for s in all_symptoms if any(kw in s for kw in ["cough", "breath", "sputum", "chest", "phlegm"])],
"Digestive": [s for s in all_symptoms if any(kw in s for kw in ["vomit", "nausea", "abdominal", "diarrhoea", "constipation", "ulcer", "acidity"])],
"General": [s for s in all_symptoms if any(kw in s for kw in ["fever", "fatigue", "chill", "sweat", "malaise", "weight", "thirst"])],
"Neurological": [s for s in all_symptoms if any(kw in s for kw in ["headache", "dizz", "balance", "confusion", "numb"])]
}
# 'Other' category ko baaki categories ke baad calculate karo
symptom_categories["Other"] = [s for s in all_symptoms if s not in sum(symptom_categories.values(), [])]
@app.route("/", methods=["GET", "POST"])
def home():
selected_symptoms = []
feedback_submitted = session.get('feedback_submitted', False) # Success flag
feedback_error = session.get('feedback_error', False) # Error flag
if request.method == "POST" and 'symptom-form' in request.form:
for category in symptom_categories:
selected_symptoms.extend(request.form.getlist(category))
if len(selected_symptoms) < 3:
return render_template("index.html", categories=symptom_categories,
selected_symptoms=selected_symptoms,
error="Please select at least 3 symptoms",
feedback_submitted=feedback_submitted,
feedback_error=feedback_error)
# Binary vector banao
input_vector = np.zeros(len(mlb.classes_))
for symptom in selected_symptoms:
if symptom in mlb.classes_:
input_vector[np.where(mlb.classes_ == symptom)] = 1
# Predict karo with probabilities
probabilities = model.predict_proba([input_vector])[0]
top_preds = sorted(zip(model.classes_, probabilities), key=lambda x: x[1], reverse=True)[:3]
prediction = top_preds[0][0]
others = [f"{p[0]} ({p[1] * 100:.0f}%)" for p in top_preds[1:]] # Percentage format mein
# Session mein prediction aur others store karo
session['prediction'] = prediction
session['others'] = others
return redirect(url_for('result')) # Redirect to result page
# Feedback form handling
if request.method == "POST" and 'feedback-form' in request.form:
name = request.form.get('name')
email = request.form.get('email')
feedback = request.form.get('feedback')
if not name or not email or not feedback:
session['feedback_error'] = True # Error flag set karo
return redirect(url_for('home')) # Redirect karo
else:
# Current date aur time dd/mm/yy format mein
submit_time = datetime.now().strftime("%d/%m/%y %H:%M:%S")
# Feedback ko file mein save karo with date-time
with open("feedback.txt", "a") as f:
f.write(f"Date: {submit_time}, Name: {name}, Email: {email}, Feedback: {feedback}\n")
session['feedback_submitted'] = True # Success flag set karo
print(f"Feedback received - Date: {submit_time}, Name: {name}, Email: {email}, Feedback: {feedback}")
return redirect(url_for('home')) # Redirect karo taaki repeat na ho
# Feedback flags ko reset karo jab page normally load ho
if request.method == "GET":
if 'feedback_submitted' in session:
session.pop('feedback_submitted')
if 'feedback_error' in session:
session.pop('feedback_error')
return render_template("index.html", categories=symptom_categories,
selected_symptoms=selected_symptoms,
feedback_submitted=feedback_submitted,
feedback_error=feedback_error)
@app.route("/result")
def result():
# Session se prediction aur others retrieve karo
prediction = session.get('prediction')
others = session.get('others', [])
if not prediction:
return redirect(url_for('home')) # Agar session mein data nahi hai to home pe redirect
return render_template("result.html", prediction=prediction, others=others)
if __name__ == "__main__":
app.run(debug=True) |