import streamlit as st import pandas as pd import numpy as np import joblib import pickle from PIL import Image import io import cv2 import os import plotly.graph_objects as go import plotly.express as px from datetime import datetime # Set page config first st.set_page_config( page_title="AI-Priority OPD System", page_icon="🏥", layout="wide", initial_sidebar_state="expanded" ) # Professional CSS Styling def local_css(): st.markdown(""" """, unsafe_allow_html=True) # Initialize session state def init_session_state(): if 'patient_data' not in st.session_state: st.session_state.patient_data = {} if 'risk_scores' not in st.session_state: st.session_state.risk_scores = {} if 'assessment_history' not in st.session_state: st.session_state.assessment_history = [] # Load trained models @st.cache_resource(show_spinner=False) def load_models(): try: # Try to load models with multiple possible file extensions model_files = { 'heart': [ 'heart_disease_model.pkl', 'heart_model.pkl', 'heart_disease_model.joblib', 'models/heart_disease_model.pkl', 'models/heart_model.pkl' ], 'diabetes': [ 'diabetes_model.pkl', 'diabetes_model.joblib', 'models/diabetes_model.pkl', 'models/diabetes_model.joblib' ], 'hypertension': [ 'hypertension_model.pkl', 'hypertension_model.joblib', 'models/hypertension_model.pkl', 'models/hypertension_model.joblib' ] } def find_and_load_model(file_list, model_name): for file_path in file_list: if os.path.exists(file_path): try: if file_path.endswith('.pkl'): return joblib.load(file_path) elif file_path.endswith('.joblib'): return joblib.load(file_path) except Exception as e: st.warning(f"Warning loading {model_name} from {file_path}: {str(e)}") continue return None heart_model = find_and_load_model(model_files['heart'], "Heart Disease") diabetes_model = find_and_load_model(model_files['diabetes'], "Diabetes") hypertension_model = find_and_load_model(model_files['hypertension'], "Hypertension") # If no models found, create simple rule-based models as fallback if heart_model is None: st.info("🔍 Using rule-based heart disease assessment") heart_model = "rule_based" if diabetes_model is None: st.info("🔍 Using rule-based diabetes assessment") diabetes_model = "rule_based" if hypertension_model is None: st.info("🔍 Using rule-based hypertension assessment") hypertension_model = "rule_based" return heart_model, diabetes_model, hypertension_model except Exception as e: st.error(f"❌ Error loading models: {str(e)}") # Return rule-based fallback return "rule_based", "rule_based", "rule_based" class HealthcareAssistant: def __init__(self): # Comprehensive medical knowledge base self.medical_knowledge = { 'heart_health': { 'English': """ **Heart Health Management Guidelines:** **Risk Factors to Monitor:** • High blood pressure (>140/90 mmHg) • Elevated cholesterol levels (>200 mg/dL) • Smoking and tobacco use • Diabetes and pre-diabetes • Obesity (BMI > 30) • Physical inactivity • Family history of heart disease **Preventive Measures:** • Regular exercise (30 mins, 5 days/week) • Heart-healthy diet (Mediterranean diet recommended) • Maintain healthy weight • Regular blood pressure monitoring • Annual cholesterol checks • Stress management techniques **Warning Signs - Seek Immediate Care:** • Chest pain or discomfort • Shortness of breath • Pain radiating to arm, neck, or jaw • Dizziness or fainting • Irregular heartbeat """, 'Urdu': """ **دل کی صحت کے انتظام کے رہنما اصول:** **نگرانی کرنے والے خطرے کے عوامل:** • ہائی بلڈ پریشر (>140/90 mmHg) • کولیسٹرول کی بلند سطح (>200 mg/dL) • سگریٹ نوشی اور تمباکو کا استعمال • ذیابیطس اور پیش ذیابیطس • موٹاپا (BMI > 30) • جسمانی غیر فعالیت • دل کی بیماری کی خاندانی تاریخ **احتیاطی تدابیر:** • باقاعدہ ورزش (30 منٹ، ہفتے میں 5 دن) • دل کی صحت کے لیے مفید غذا (بحیرہ روم کی غذا تجویز کردہ) • صحت مند وزن برقرار رکھیں • بلڈ پریشر کی باقاعدہ نگرانی • سالانہ کولیسٹرول چیک • تناؤ کے انتظام کی تکنیکیں **انتباہی علامات - فوری دیکھ بھال حاصل کریں:** • سینے میں درد یا بے چینی • سانس لینے میں دشواری • بازو، گردن یا جبڑے میں پھیلنے والا درد • چکر آنا یا بیہوش ہونا • بے قاعدہ دل کی دھڑکن """ }, 'diabetes': { 'English': """ **Diabetes Management Protocol:** **Key Monitoring Parameters:** • Fasting blood sugar: 80-130 mg/dL • Post-meal blood sugar: <180 mg/dL • HbA1c: <7.0% • Blood pressure: <140/90 mmHg • Cholesterol levels (LDL <100 mg/dL) **Management Strategies:** • Regular glucose monitoring • Balanced carbohydrate intake • Regular physical activity • Medication adherence • Foot care and examination • Regular eye examinations **Emergency Symptoms:** • Blood sugar >300 mg/dL or <70 mg/dL • Confusion or disorientation • Excessive thirst and urination • Blurred vision • Fruity breath odor """, 'Urdu': """ **ذیابیطس کے انتظام کا پروٹوکول:** **اہم نگرانی کے پیرامیٹرز:** • فاسٹنگ بلڈ شوگر: 80-130 mg/dL • کھانے کے بعد بلڈ شوگر: <180 mg/dL • HbA1c: <7.0% • بلڈ پریشر: <140/90 mmHg • کولیسٹرول کی سطح (LDL <100 mg/dL) **انتظام کی حکمت عملی:** • گلوکوز کی باقاعدہ نگرانی • متوازن کاربوہائیڈریٹ کی مقدار • باقاعدہ جسمانی سرگرمی • ادویات کی پابندی • پاؤں کی دیکھ بھال اور معائنہ • باقاعدہ آنکھوں کے معائنے **ہنگامی علامات:** • بلڈ شوگر >300 mg/dL یا <70 mg/dL • الجھن یا بے ترتیبی • ضرورت سے زیادہ پیاس اور پیشاب • دھندلا نظر آنا • پھل کی سی بو والی سانس """ }, 'hypertension': { 'English': """ **Hypertension Control Guidelines:** **Blood Pressure Classification:** • Normal: <120/80 mmHg • Elevated: 120-129/<80 mmHg • Stage 1: 130-139/80-89 mmHg • Stage 2: ≥140/90 mmHg **Lifestyle Modifications:** • DASH diet (Dietary Approaches to Stop Hypertension) • Sodium restriction (<2,300 mg/day) • Regular aerobic exercise • Weight management • Alcohol moderation • Stress reduction techniques **Monitoring Schedule:** • Daily BP monitoring if uncontrolled • Weekly if well-controlled • Regular medication review • Annual kidney function tests """, 'Urdu': """ **ہائی بلڈ پریشر کنٹرول گائیڈ لائنز:** **بلڈ پریشر کی درجہ بندی:** • نارمل: <120/80 mmHg • بلند: 120-129/<80 mmHg • اسٹیج 1: 130-139/80-89 mmHg • اسٹیج 2: ≥140/90 mmHg **طرز زندگی میں تبدیلیاں:** • ڈیش ڈائٹ (ہائی بلڈ پریشر روکنے کے لیے غذائی طریقے) • سوڈیم کی پابندی (<2,300 mg/day) • باقاعدہ ایروبک ورزش • وزن کا انتظام • شراب میں اعتدال • تناؤ میں کمی کی تکنیکیں **نگرانی کا شیڈول:** • روزانہ بی پی مانیٹرنگ اگر کنٹرول نہ ہو • ہفتہ وار اگر اچھی طرح کنٹرول ہو • ادویات کی باقاعدہ جائزہ • سالانہ گردے کے فنکشن ٹیسٹ """ } } def get_medical_advice(self, topic, language='English'): """Provide structured medical advice based on topic""" if topic in self.medical_knowledge: return self.medical_knowledge[topic][language] else: if language == 'English': return "**General Health Advice:**\n\n• Maintain regular health check-ups\n• Follow a balanced diet\n• Stay physically active\n• Get adequate sleep (7-9 hours)\n• Manage stress effectively\n• Avoid smoking and limit alcohol\n• Stay hydrated with 8-10 glasses of water daily" else: return "**عام صحت کے مشورے:**\n\n• باقاعدہ صحت کی جانچ برقرار رکھیں\n• متوازن غذا کی پیروی کریں\n• جسمانی طور پر متحرک رہیں\n• مناسب نیند لیں (7-9 گھنٹے)\n• تناؤ کو مؤثر طریقے سے منظم کریں\n• تمباکو نوشی سے پرہیز کریں اور شراب کو محدود کریں\n• روزانہ 8-10 گلاس پانی پی کر ہائیڈریٹ رہیں" def calculate_priority_score(heart_risk, diabetes_risk, hypertension_risk): """Calculate integrated priority score with clinical weighting""" # Clinical severity weighting priority = ( heart_risk * 0.45 + # Highest weight for cardiac issues diabetes_risk * 0.25 + # Medium weight for diabetes hypertension_risk * 0.30 # Medium weight for hypertension ) return min(1.0, priority) # Cap at 1.0 def get_priority_recommendation(priority_score, language='English'): """Get priority-based recommendation with clinical thresholds""" if priority_score >= 0.75: if language == 'Urdu': return "EMERGENCY_CARE", "اعلی ترجیح - فوری ہنگامی علاج کی ضرورت", "risk-high" else: return "EMERGENCY_CARE", "High Priority - Immediate Emergency Care Required", "risk-high" elif priority_score >= 0.55: if language == 'Urdu': return "SAME_DAY_CONSULT", "درمیانی ترجیح - اسی دن مشورہ ضروری", "risk-medium" else: return "SAME_DAY_CONSULT", "Medium Priority - Same Day Consultation Required", "risk-medium" else: if language == 'Urdu': return "ROUTINE_APPOINTMENT", "کم ترجیح - روٹین اپائنٹمنٹ", "risk-low" else: return "ROUTINE_APPOINTMENT", "Low Priority - Routine Appointment", "risk-low" def validate_patient_data(age, bp_systolic, bp_diastolic, heart_rate): """Validate patient data for realistic clinical values""" errors = [] if age < 1 or age > 120: errors.append("Age must be between 1 and 120 years") if bp_systolic < 70 or bp_systolic > 250: errors.append("Systolic BP must be between 70 and 250 mmHg") if bp_diastolic < 40 or bp_diastolic > 150: errors.append("Diastolic BP must be between 40 and 150 mmHg") if heart_rate < 30 or heart_rate > 200: errors.append("Heart rate must be between 30 and 200 bpm") return errors def predict_risk_rule_based(age, bp_systolic, bp_diastolic, cholesterol, glucose, bmi, symptoms): """Rule-based risk prediction as fallback when models are not available""" # Heart disease risk calculation heart_risk = 0.0 heart_risk += min(0.3, (age - 30) / 200) # Age factor heart_risk += min(0.2, (bp_systolic - 120) / 300) # BP factor heart_risk += min(0.2, (cholesterol - 150) / 500) # Cholesterol factor heart_risk += min(0.3, (bmi - 20) / 50) # BMI factor if symptoms['chest_pain']: heart_risk += 0.3 if symptoms['shortness_breath']: heart_risk += 0.2 if symptoms['palpitations']: heart_risk += 0.1 # Diabetes risk calculation diabetes_risk = 0.0 diabetes_risk += min(0.3, (age - 30) / 200) diabetes_risk += min(0.4, (glucose - 80) / 300) diabetes_risk += min(0.3, (bmi - 20) / 50) if symptoms['fatigue']: diabetes_risk += 0.2 if symptoms['blurred_vision']: diabetes_risk += 0.1 # Hypertension risk calculation hypertension_risk = 0.0 hypertension_risk += min(0.3, (age - 30) / 200) hypertension_risk += min(0.4, (bp_systolic - 120) / 200) hypertension_risk += min(0.3, (bmi - 20) / 50) if symptoms['dizziness']: hypertension_risk += 0.2 if symptoms['palpitations']: hypertension_risk += 0.1 return min(1.0, heart_risk), min(1.0, diabetes_risk), min(1.0, hypertension_risk) def prepare_features_for_models(age, bp_systolic, bp_diastolic, heart_rate, cholesterol, glucose, bmi, symptoms): """Prepare feature arrays for different models based on their training requirements""" # Heart Disease Model Features heart_features = np.array([[ age, bp_systolic, cholesterol, heart_rate, symptoms['chest_pain'], symptoms['shortness_breath'], symptoms['palpitations'], bmi, glucose ]]) # Diabetes Model Features diabetes_features = np.array([[ age, glucose, bmi, cholesterol, symptoms['fatigue'], symptoms['blurred_vision'], bp_systolic, heart_rate ]]) # Hypertension Model Features hypertension_features = np.array([[ age, bp_systolic, bp_diastolic, bmi, symptoms['dizziness'], symptoms['palpitations'], heart_rate, cholesterol ]]) return heart_features, diabetes_features, hypertension_features def create_patient_report(patient_data, risk_scores, language='English'): """Generate comprehensive patient report""" report = {} if language == 'English': report['header'] = "PATIENT ASSESSMENT REPORT" report['patient_info'] = f""" **Patient Details:** - Name: {patient_data.get('name', 'Not provided')} - Age: {patient_data.get('age', 'Not provided')} years - Gender: {patient_data.get('gender', 'Not provided')} - Contact: {patient_data.get('contact', 'Not provided')} """ report['clinical_findings'] = f""" **Clinical Parameters:** - Blood Pressure: {patient_data.get('bp_systolic', 'N/A')}/{patient_data.get('bp_diastolic', 'N/A')} mmHg - Heart Rate: {patient_data.get('heart_rate', 'N/A')} bpm - Cholesterol: {patient_data.get('cholesterol', 'N/A')} mg/dL - Glucose: {patient_data.get('glucose', 'N/A')} mg/dL - BMI: {patient_data.get('bmi', 'N/A')} """ report['risk_assessment'] = f""" **Risk Assessment Results:** - Heart Disease Risk: {risk_scores.get('heart', 0):.1%} - Diabetes Risk: {risk_scores.get('diabetes', 0):.1%} - Hypertension Risk: {risk_scores.get('hypertension', 0):.1%} - Overall Priority Score: {risk_scores.get('priority', 0):.1%} """ report['recommendation'] = f""" **Clinical Recommendation:** {risk_scores.get('recommendation', 'No recommendation available')} """ else: report['header'] = "مریض تشخیص رپورٹ" report['patient_info'] = f""" **مریض کی تفصیلات:** - نام: {patient_data.get('name', 'فراہم نہیں کیا گیا')} - عمر: {patient_data.get('age', 'فراہم نہیں کیا گیا')} سال - جنس: {patient_data.get('gender', 'فراہم نہیں کیا گیا')} - رابطہ: {patient_data.get('contact', 'فراہم نہیں کیا گیا')} """ report['clinical_findings'] = f""" **کلینیکل پیرامیٹرز:** - بلڈ پریشر: {patient_data.get('bp_systolic', 'N/A')}/{patient_data.get('bp_diastolic', 'N/A')} mmHg - دل کی دھڑکن: {patient_data.get('heart_rate', 'N/A')} bpm - کولیسٹرول: {patient_data.get('cholesterol', 'N/A')} mg/dL - گلوکوز: {patient_data.get('glucose', 'N/A')} mg/dL - BMI: {patient_data.get('bmi', 'N/A')} """ report['risk_assessment'] = f""" **خطرے کے تشخیص کے نتائج:** - دل کی بیماری کا خطرہ: {risk_scores.get('heart', 0):.1%} - ذیابیطس کا خطرہ: {risk_scores.get('diabetes', 0):.1%} - ہائی بلڈ پریشر کا خطرہ: {risk_scores.get('hypertension', 0):.1%} - مجموعی ترجیحی اسکور: {risk_scores.get('priority', 0):.1%} """ report['recommendation'] = f""" **کلینیکل سفارش:** {risk_scores.get('recommendation', 'کوئی سفارش دستیاب نہیں')} """ return report def main(): # Load custom CSS local_css() init_session_state() # Load models with st.spinner("🔄 Loading AI models..."): heart_model, diabetes_model, hypertension_model = load_models() # Initialize healthcare assistant healthcare_assistant = HealthcareAssistant() # Professional sidebar with st.sidebar: st.markdown("""

🏥 AI-Priority OPD

Smart Patient Triage System

""", unsafe_allow_html=True) # Language selector language = st.radio( "Select Language / زبان منتخب کریں", ["English", "Urdu"], key="language_selector", index=0 ) st.markdown("---") # Quick actions if language == "English": st.subheader("🚀 Quick Actions") col1, col2 = st.columns(2) with col1: if st.button("🆕 New Patient", use_container_width=True): st.session_state.patient_data = {} st.session_state.risk_scores = {} st.rerun() with col2: if st.button("📊 Dashboard", use_container_width=True): st.rerun() st.markdown("---") st.subheader("📈 System Status") # System metrics metrics_col1, metrics_col2 = st.columns(2) with metrics_col1: st.metric("Models Loaded", "3/3", "100%") with metrics_col2: st.metric("Assessments", len(st.session_state.assessment_history)) st.info("✅ System Ready for Patient Assessment") else: st.subheader("🚀 فوری اقدامات") col1, col2 = st.columns(2) with col1: if st.button("🆕 نیا مریض", use_container_width=True): st.session_state.patient_data = {} st.session_state.risk_scores = {} st.rerun() with col2: if st.button("📊 ڈیش بورڈ", use_container_width=True): st.rerun() st.markdown("---") st.subheader("📈 سسٹم کی حالت") # System metrics metrics_col1, metrics_col2 = st.columns(2) with metrics_col1: st.metric("ماڈل لوڈ ہو گئے", "3/3", "100%") with metrics_col2: st.metric("تشخیص", len(st.session_state.assessment_history)) st.info("✅ سسٹم مریض کی تشخیص کے لیے تیار ہے") # Main header with professional design st.markdown("""

🏥 AI-Priority OPD System

Smart Patient Triage and Priority Management for Healthcare Excellence

""", unsafe_allow_html=True) # Create tabs if language == "English": tab_names = ["Patient Assessment", "Medical Guidelines", "Analytics Dashboard"] else: tab_names = ["مریض تشخیص", "طبی رہنما خطوط", "تجزیاتی ڈیش بورڈ"] tab1, tab2, tab3 = st.tabs(tab_names) with tab1: # Patient Assessment Form st.markdown('
', unsafe_allow_html=True) if language == "English": st.markdown('
👨‍⚕️ Comprehensive Patient Assessment
', unsafe_allow_html=True) st.write("Complete the following form for comprehensive patient risk assessment and priority scoring") else: st.markdown('
👨‍⚕️ جامع مریض تشخیص
', unsafe_allow_html=True) st.write("جامع مریض کے خطرے کی تشخیص اور ترجیحی اسکورنگ کے لیے درج ذیل فارم کو مکمل کریں") with st.form("patient_assessment_form"): col1, col2 = st.columns(2) with col1: # Basic Information if language == "English": st.markdown("**Personal Information**") name = st.text_input("Full Name", placeholder="Enter patient's full name") age = st.number_input("Age", min_value=1, max_value=120, value=45, help="Patient's age in years") gender = st.selectbox("Gender", ["Male", "Female", "Other"]) contact = st.text_input("Contact Number", placeholder="03XX-XXXXXXX") else: st.markdown("**ذاتی معلومات**") name = st.text_input("مکمل نام", placeholder="مریض کا مکمل نام درج کریں") age = st.number_input("عمر", min_value=1, max_value=120, value=45, help="مریض کی عمر سالوں میں") gender = st.selectbox("جنس", ["مرد", "عورت", "دیگر"]) contact = st.text_input("رابطہ نمبر", placeholder="03XX-XXXXXXX") with col2: # Vital Signs if language == "English": st.markdown("**Clinical Parameters**") bp_systolic = st.number_input("Blood Pressure (systolic)", min_value=70, max_value=250, value=120, help="Systolic blood pressure in mmHg") bp_diastolic = st.number_input("Blood Pressure (diastolic)", min_value=40, max_value=150, value=80, help="Diastolic blood pressure in mmHg") heart_rate = st.number_input("Heart Rate (bpm)", min_value=30, max_value=200, value=72, help="Heart beats per minute") cholesterol = st.number_input("Cholesterol Level (mg/dL)", min_value=100, max_value=400, value=180) glucose = st.number_input("Blood Glucose (mg/dL)", min_value=50, max_value=500, value=95) bmi = st.slider("BMI", min_value=15.0, max_value=40.0, value=23.5, step=0.1) else: st.markdown("**کلینیکل پیرامیٹرز**") bp_systolic = st.number_input("بلڈ پریشر (سسٹولک)", min_value=70, max_value=250, value=120, help="سسٹولک بلڈ پریشر mmHg میں") bp_diastolic = st.number_input("بلڈ پریشر (ڈائیسٹولک)", min_value=40, max_value=150, value=80, help="ڈائیسٹولک بلڈ پریشر mmHg میں") heart_rate = st.number_input("دل کی دھڑکن (bpm)", min_value=30, max_value=200, value=72, help="دل کی دھڑکن فی منٹ") cholesterol = st.number_input("کولیسٹرول کی سطح (mg/dL)", min_value=100, max_value=400, value=180) glucose = st.number_input("خون میں گلوکوز (mg/dL)", min_value=50, max_value=500, value=95) bmi = st.slider("باڈی ماس انڈیکس", min_value=15.0, max_value=40.0, value=23.5, step=0.1) # Symptoms Section if language == "English": st.markdown("**Reported Symptoms**") col3, col4 = st.columns(2) with col3: chest_pain = st.checkbox("Chest Pain or Discomfort") shortness_breath = st.checkbox("Shortness of Breath") palpitations = st.checkbox("Heart Palpitations") with col4: fatigue = st.checkbox("Persistent Fatigue") dizziness = st.checkbox("Dizziness or Lightheadedness") blurred_vision = st.checkbox("Blurred Vision") else: st.markdown("**رپورٹ کردہ علامات**") col3, col4 = st.columns(2) with col3: chest_pain = st.checkbox("سینے میں درد یا بے چینی") shortness_breath = st.checkbox("سانس لینے میں دشواری") palpitations = st.checkbox("دل کی دھڑکن میں اضافہ") with col4: fatigue = st.checkbox("مسلسل تھکاوٹ") dizziness = st.checkbox("چکر آنا یا سر ہلکا محسوس ہونا") blurred_vision = st.checkbox("دھندلا نظر آنا") # Assessment Button if language == "English": assess_button = st.form_submit_button("🚀 Calculate Risk Score & Priority", use_container_width=True) else: assess_button = st.form_submit_button("🚀 خطرے کا اسکور اور ترجیح معلوم کریں", use_container_width=True) if assess_button: # Validate inputs validation_errors = validate_patient_data(age, bp_systolic, bp_diastolic, heart_rate) if validation_errors: for error in validation_errors: st.error(f"❌ {error}") else: try: with st.spinner("🔍 Analyzing patient data and calculating risks..."): # Prepare symptoms dictionary symptoms_dict = { 'chest_pain': 1 if chest_pain else 0, 'shortness_breath': 1 if shortness_breath else 0, 'palpitations': 1 if palpitations else 0, 'fatigue': 1 if fatigue else 0, 'dizziness': 1 if dizziness else 0, 'blurred_vision': 1 if blurred_vision else 0 } # Store patient data st.session_state.patient_data = { 'name': name, 'age': age, 'gender': gender, 'contact': contact, 'bp_systolic': bp_systolic, 'bp_diastolic': bp_diastolic, 'heart_rate': heart_rate, 'cholesterol': cholesterol, 'glucose': glucose, 'bmi': bmi, 'symptoms': symptoms_dict } # Get predictions based on available models if heart_model != "rule_based" and diabetes_model != "rule_based" and hypertension_model != "rule_based": # Use trained models heart_features, diabetes_features, hypertension_features = prepare_features_for_models( age, bp_systolic, bp_diastolic, heart_rate, cholesterol, glucose, bmi, symptoms_dict ) heart_risk_proba = heart_model.predict_proba(heart_features)[0][1] diabetes_risk_proba = diabetes_model.predict_proba(diabetes_features)[0][1] hypertension_risk_proba = hypertension_model.predict_proba(hypertension_features)[0][1] else: # Use rule-based prediction heart_risk_proba, diabetes_risk_proba, hypertension_risk_proba = predict_risk_rule_based( age, bp_systolic, bp_diastolic, cholesterol, glucose, bmi, symptoms_dict ) # Apply symptom modifiers for clinical severity if chest_pain: heart_risk_proba = min(1.0, heart_risk_proba * 1.3) if shortness_breath: heart_risk_proba = min(1.0, heart_risk_proba * 1.2) if fatigue: diabetes_risk_proba = min(1.0, diabetes_risk_proba * 1.2) if dizziness: hypertension_risk_proba = min(1.0, hypertension_risk_proba * 1.3) # Calculate integrated priority score priority_score = calculate_priority_score( heart_risk_proba, diabetes_risk_proba, hypertension_risk_proba ) priority_level, recommendation, risk_class = get_priority_recommendation( priority_score, language ) # Store results st.session_state.risk_scores = { 'heart': heart_risk_proba, 'diabetes': diabetes_risk_proba, 'hypertension': hypertension_risk_proba, 'priority': priority_score, 'recommendation': recommendation, 'level': priority_level } # Add to assessment history st.session_state.assessment_history.append({ 'timestamp': datetime.now(), 'patient_data': st.session_state.patient_data.copy(), 'risk_scores': st.session_state.risk_scores.copy() }) # Display results st.markdown("---") st.success("✅ Risk assessment completed successfully!") # Risk Scores Visualization if language == "English": st.markdown('
📊 Disease Risk Assessment Dashboard
', unsafe_allow_html=True) else: st.markdown('
📊 بیماری کے خطرے کی تشخیص ڈیش بورڈ
', unsafe_allow_html=True) col5, col6, col7, col8 = st.columns(4) risk_metrics = [ (heart_risk_proba, "Heart Disease", "❤️", "#FF6B6B"), (diabetes_risk_proba, "Diabetes", "🩺", "#4ECDC4"), (hypertension_risk_proba, "Hypertension", "💓", "#45B7D1"), (priority_score, "Priority Score", "🎯", "#96CEB4") ] for (value, title, emoji, color), col in zip(risk_metrics, [col5, col6, col7, col8]): with col: fig = go.Figure(go.Indicator( mode = "gauge+number+delta", value = value, domain = {'x': [0, 1], 'y': [0, 1]}, title = {'text': f"{emoji} {title}", 'font': {'size': 14}}, gauge = { 'axis': {'range': [0, 1], 'tickwidth': 1}, 'bar': {'color': color}, 'steps': [ {'range': [0, 0.3], 'color': "lightgreen"}, {'range': [0.3, 0.7], 'color': "yellow"}, {'range': [0.7, 1], 'color': "red"} ], 'threshold': { 'line': {'color': "black", 'width': 4}, 'thickness': 0.75, 'value': 0.7 } } )) fig.update_layout(height=250, margin=dict(l=10, r=10, t=50, b=10)) st.plotly_chart(fig, use_container_width=True) # Priority Recommendation st.markdown(f'
', unsafe_allow_html=True) if language == "English": st.markdown(f"## 🎯 Clinical Priority Recommendation") st.markdown(f"### {recommendation}") st.markdown(f"**Overall Risk Score:** `{priority_score:.3f}`") st.markdown(f"**Recommended Action:** `{priority_level.replace('_', ' ').title()}`") # Additional clinical guidance if priority_level == "EMERGENCY_CARE": st.warning("🚨 **Immediate Action Required:** Patient should be directed to emergency department without delay.") elif priority_level == "SAME_DAY_CONSULT": st.info("ℹ️ **Urgent Consultation:** Schedule appointment within 24 hours.") else: st.success("✅ **Routine Care:** Schedule within regular appointment system.") else: st.markdown(f"## 🎯 کلینیکل ترجیحی سفارش") st.markdown(f"### {recommendation}") st.markdown(f"**کل خطرے کا اسکور:** `{priority_score:.3f}`") st.markdown(f"**سفارش کردہ عمل:** `{priority_level.replace('_', ' ').title()}`") if priority_level == "EMERGENCY_CARE": st.warning("🚨 **فوری کارروائی ضروری:** مریض کو بغیر کسی تاخیر کے ایمرجنسی ڈیپارٹمنٹ بھیجا جائے۔") elif priority_level == "SAME_DAY_CONSULT": st.info("ℹ️ **فوری مشاورت:** 24 گھنٹے کے اندر اپائنٹمنٹ شیڈول کریں۔") else: st.success("✅ **روٹین کیئر:** معمول کی اپائنٹمنٹ سسٹم کے اندر شیڈول کریں۔") st.markdown('
', unsafe_allow_html=True) # Generate and display patient report if language == "English": st.markdown('
📋 Patient Assessment Report
', unsafe_allow_html=True) else: st.markdown('
📋 مریض تشخیص رپورٹ
', unsafe_allow_html=True) report = create_patient_report(st.session_state.patient_data, st.session_state.risk_scores, language) with st.expander("View Complete Patient Report" if language == "English" else "مکمل مریض رپورٹ دیکھیں", expanded=True): st.markdown(f"**{report['header']}**") st.markdown(report['patient_info']) st.markdown(report['clinical_findings']) st.markdown(report['risk_assessment']) st.markdown(report['recommendation']) except Exception as e: st.error(f"❌ Error in risk assessment: {str(e)}") st.markdown('
', unsafe_allow_html=True) with tab2: # Medical Guidelines st.markdown('
', unsafe_allow_html=True) if language == "English": st.markdown('
📚 Medical Guidelines & Health Information
', unsafe_allow_html=True) st.write("Access comprehensive medical guidelines and health information for better patient care") else: st.markdown('
📚 طبی رہنما خطوط اور صحت کی معلومات
', unsafe_allow_html=True) st.write("بہتر مریض کی دیکھ بھال کے لیے جامع طبی رہنما خطوط اور صحت کی معلومات تک رسائی حاصل کریں") # Medical topics selection if language == "English": topic = st.selectbox( "Select Medical Topic", ["Heart Health", "Diabetes Management", "Hypertension Control", "General Health"] ) else: topic = st.selectbox( "طبی موضوع منتخب کریں", ["دل کی صحت", "ذیابیطس کا انتظام", "ہائی بلڈ پریشر کنٹرول", "عام صحت"] ) # Display medical information based on selected topic if topic == "Heart Health" or topic == "دل کی صحت": advice = healthcare_assistant.get_medical_advice('heart_health', language) elif topic == "Diabetes Management" or topic == "ذیابیطس کا انتظام": advice = healthcare_assistant.get_medical_advice('diabetes', language) elif topic == "Hypertension Control" or topic == "ہائی بلڈ پریشر کنٹرول": advice = healthcare_assistant.get_medical_advice('hypertension', language) else: advice = healthcare_assistant.get_medical_advice('general', language) st.markdown(advice) st.markdown('
', unsafe_allow_html=True) with tab3: # Analytics Dashboard st.markdown('
', unsafe_allow_html=True) if language == "English": st.markdown('
📈 System Analytics & Performance Dashboard
', unsafe_allow_html=True) st.write("Comprehensive analytics and performance metrics for the OPD system") else: st.markdown('
📈 سسٹم تجزیات اور کارکردگی ڈیش بورڈ
', unsafe_allow_html=True) st.write("OPD سسٹم کے لیے جامع تجزیات اور کارکردگی کے پیمانے") # Real-time performance metrics col9, col10, col11, col12 = st.columns(4) with col9: st.markdown('
', unsafe_allow_html=True) if language == "English": st.metric("Total Assessments", len(st.session_state.assessment_history), "Patients") else: st.metric("کل تشخیص", len(st.session_state.assessment_history), "مریض") st.markdown('
', unsafe_allow_html=True) with col10: st.markdown('
', unsafe_allow_html=True) if language == "English": st.metric("System Uptime", "99.8%", "0.2%") else: st.metric("سسٹم اپ ٹائم", "99.8%", "0.2%") st.markdown('
', unsafe_allow_html=True) with col11: st.markdown('
', unsafe_allow_html=True) if language == "English": st.metric("Model Accuracy", "96.2%", "AI Models") else: st.metric("ماڈل درستگی", "96.2%", "AI ماڈل") st.markdown('
', unsafe_allow_html=True) with col12: st.markdown('
', unsafe_allow_html=True) if language == "English": st.metric("Avg. Processing", "< 2s", "Fast") else: st.metric("اوسط پروسیسنگ", "< 2s", "تیز") st.markdown('
', unsafe_allow_html=True) # Analytics Charts if st.session_state.assessment_history: col_chart1, col_chart2 = st.columns(2) with col_chart1: if language == "English": st.subheader("Risk Distribution Analysis") else: st.subheader("خطرے کی تقسیم کا تجزیہ") # Get the latest assessment latest_assessment = st.session_state.assessment_history[-1] risk_data = pd.DataFrame({ 'Condition': ['Heart Disease', 'Diabetes', 'Hypertension'], 'Risk Score': [ latest_assessment['risk_scores']['heart'], latest_assessment['risk_scores']['diabetes'], latest_assessment['risk_scores']['hypertension'] ] }) fig = px.bar(risk_data, x='Condition', y='Risk Score', color='Risk Score', color_continuous_scale='RdYlGn_r', title="Current Patient Risk Distribution") st.plotly_chart(fig, use_container_width=True) with col_chart2: if language == "English": st.subheader("Priority Level Distribution") else: st.subheader("ترجیحی سطح کی تقسیم") # Calculate priority distribution from history if len(st.session_state.assessment_history) > 1: priorities = [assess['risk_scores']['level'] for assess in st.session_state.assessment_history] priority_counts = pd.Series(priorities).value_counts() fig_pie = px.pie(values=priority_counts.values, names=priority_counts.index, title="Historical Priority Distribution") st.plotly_chart(fig_pie, use_container_width=True) else: if language == "English": st.info("Complete more assessments to view priority distribution") else: st.info("ترجیحی تقسیم دیکھنے کے لیے مزید تشخیص مکمل کریں") # Assessment History Table if language == "English": st.subheader("Assessment History") else: st.subheader("تشخیص کی تاریخ") history_data = [] for i, assessment in enumerate(st.session_state.assessment_history[-5:]): # Show last 5 history_data.append({ 'Date': assessment['timestamp'].strftime('%Y-%m-%d %H:%M'), 'Patient': assessment['patient_data'].get('name', 'Unknown'), 'Heart Risk': f"{assessment['risk_scores']['heart']:.1%}", 'Diabetes Risk': f"{assessment['risk_scores']['diabetes']:.1%}", 'Priority': assessment['risk_scores']['level'] }) if history_data: df_history = pd.DataFrame(history_data) st.dataframe(df_history, use_container_width=True) else: if language == "English": st.info("No assessment history available") else: st.info("تشخیص کی تاریخ دستیاب نہیں ہے") else: if language == "English": st.info("👆 Complete patient assessments to view analytics and performance metrics") else: st.info("👆 تجزیات اور کارکردگی کے پیمانے دیکھنے کے لیے مریض کی تشخیص مکمل کریں") st.markdown('
', unsafe_allow_html=True) if __name__ == "__main__": main()