Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
from pathlib import Path | |
import sys | |
import os | |
import time | |
from datetime import datetime | |
import plotly.express as px | |
# Add project root to Python path | |
project_root = Path(__file__).resolve().parent.parent | |
sys.path.append(str(project_root)) | |
from src.model import BreastCancerModel | |
from src.models.diabetes import DiabetesModel | |
from src.models.heart_disease import HeartDiseaseModel | |
from src.models.parkinsons import ParkinsonsModel | |
from src.config import ( | |
BREAST_CANCER_MODEL_PATH, | |
DIABETES_MODEL_PATH, | |
HEART_DISEASE_MODEL_PATH, | |
PARKINSONS_MODEL_PATH | |
) | |
# Set page config | |
st.set_page_config( | |
page_title="Medical Prediction System", | |
page_icon="π₯", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# Add this updated CSS at the beginning of the file | |
st.markdown(""" | |
<style> | |
/* Original styling */ | |
.success-message { | |
background-color: #28a745; | |
color: white; | |
padding: 10px; | |
border-radius: 5px; | |
margin: 10px 0; | |
} | |
.success-icon { | |
font-size: 20px; | |
margin-right: 10px; | |
} | |
.features-grid { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); | |
gap: 1rem; | |
margin: 2rem 0; | |
} | |
.feature-card { | |
background: white; | |
padding: 1.5rem; | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
} | |
.feature-icon { | |
font-size: 2rem; | |
margin-bottom: 1rem; | |
} | |
.card { | |
background: white; | |
padding: 1rem; | |
border-radius: 10px; | |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); | |
margin-bottom: 1rem; | |
} | |
.tool-section { | |
margin: 2rem 0; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
def check_model_exists(model_path): | |
"""Check if a model file exists""" | |
return os.path.exists(model_path) | |
def load_animation(): | |
"""Show a loading animation""" | |
with st.spinner('Loading...'): | |
time.sleep(0.5) | |
def show_success_animation(): | |
"""Show success animation""" | |
placeholder = st.empty() | |
for i in range(5): | |
placeholder.markdown(f"{'π―' * (i+1)}") | |
time.sleep(0.1) | |
placeholder.empty() | |
def add_home_button(): | |
"""Add a Back to Home button""" | |
if st.button("π Back to Home"): | |
st.session_state.page = "Home" | |
def show_loading_page(): | |
"""Show an animated loading screen""" | |
placeholder = st.empty() | |
with placeholder.container(): | |
st.markdown(""" | |
<div class="loading-container"> | |
<h1>π₯ Medical AI Assistant</h1> | |
<div class="loading-spinner"></div> | |
<p>Loading advanced diagnostic tools...</p> | |
</div> | |
""", unsafe_allow_html=True) | |
time.sleep(1) | |
placeholder.empty() | |
def show_success_message(message): | |
"""Show animated success message""" | |
st.markdown(f""" | |
<div class="success-message"> | |
<span class="success-icon">β</span> | |
{message} | |
</div> | |
""", unsafe_allow_html=True) | |
def show_feature_cards(): | |
"""Show animated feature cards""" | |
st.markdown(""" | |
<div class="features-grid"> | |
<div class="feature-card"> | |
<span class="feature-icon">π―</span> | |
<h3>High Accuracy</h3> | |
<p>Advanced ML algorithms with 96.5% accuracy</p> | |
</div> | |
<div class="feature-card"> | |
<span class="feature-icon">β‘</span> | |
<h3>Real-time Analysis</h3> | |
<p>Get instant predictions and risk assessments</p> | |
</div> | |
<div class="feature-card"> | |
<span class="feature-icon">π</span> | |
<h3>Secure Analysis</h3> | |
<p>Your data is processed securely and privately</p> | |
</div> | |
</div> | |
""", unsafe_allow_html=True) | |
def home_page(): | |
show_loading_page() | |
# Hero section with gradient background | |
st.markdown(""" | |
<div style=" | |
padding: 2rem; | |
border-radius: 15px; | |
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); | |
color: white; | |
margin-bottom: 2rem; | |
text-align: center; | |
animation: fadeIn 1s ease-out; | |
"> | |
<h1 style="font-size: 3rem; margin-bottom: 1rem;">π₯ Medical AI Assistant</h1> | |
<p style="font-size: 1.2rem; opacity: 0.9;"> | |
Advanced AI-powered diagnostics for healthcare professionals | |
</p> | |
</div> | |
""", unsafe_allow_html=True) | |
# Quick stats cards | |
st.markdown(""" | |
<div style=" | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
gap: 1rem; | |
margin-bottom: 2rem; | |
"> | |
<div style=" | |
background: white; | |
padding: 1.5rem; | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
border-top: 4px solid #2ecc71; | |
"> | |
<h3 style="color: #2ecc71; margin: 0;">96.5%</h3> | |
<p style="color: #666; margin: 0;">Accuracy Rate</p> | |
</div> | |
<div style=" | |
background: white; | |
padding: 1.5rem; | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
border-top: 4px solid #3498db; | |
"> | |
<h3 style="color: #3498db; margin: 0;">5,200+</h3> | |
<p style="color: #666; margin: 0;">Assessments</p> | |
</div> | |
<div style=" | |
background: white; | |
padding: 1.5rem; | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
border-top: 4px solid #e74c3c; | |
"> | |
<h3 style="color: #e74c3c; margin: 0;">0.5s</h3> | |
<p style="color: #666; margin: 0;">Response Time</p> | |
</div> | |
<div style=" | |
background: white; | |
padding: 1.5rem; | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
border-top: 4px solid #9b59b6; | |
"> | |
<h3 style="color: #9b59b6; margin: 0;">1,200+</h3> | |
<p style="color: #666; margin: 0;">Active Users</p> | |
</div> | |
</div> | |
""", unsafe_allow_html=True) | |
# Available tools section | |
st.markdown(""" | |
<h2 style=" | |
text-align: center; | |
margin: 2rem 0; | |
color: #2c3e50; | |
">Available Assessment Tools</h2> | |
""", unsafe_allow_html=True) | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown(""" | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
margin-bottom: 1rem; | |
border-left: 5px solid #e74c3c; | |
"> | |
<h3 style="color: #e74c3c;">π¬ Breast Cancer Assessment</h3> | |
<p style="color: #666;">Advanced cellular analysis using machine learning to assess cancer risk with high accuracy.</p> | |
</div> | |
""", unsafe_allow_html=True) | |
if st.button("Start Breast Cancer Assessment", key="breast"): | |
st.session_state.page = "Breast Cancer" | |
st.markdown(""" | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
margin-bottom: 1rem; | |
border-left: 5px solid #3498db; | |
"> | |
<h3 style="color: #3498db;">β€οΈ Heart Disease Assessment</h3> | |
<p style="color: #666;">Comprehensive cardiovascular risk analysis using multiple health indicators.</p> | |
</div> | |
""", unsafe_allow_html=True) | |
if st.button("Start Heart Disease Assessment", key="heart"): | |
st.session_state.page = "Heart Disease" | |
with col2: | |
st.markdown(""" | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
margin-bottom: 1rem; | |
border-left: 5px solid #2ecc71; | |
"> | |
<h3 style="color: #2ecc71;">π©Ί Diabetes Assessment</h3> | |
<p style="color: #666;">Predictive analysis of diabetes risk based on key health metrics and indicators.</p> | |
</div> | |
""", unsafe_allow_html=True) | |
if st.button("Start Diabetes Assessment", key="diabetes"): | |
st.session_state.page = "Diabetes" | |
st.markdown(""" | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
margin-bottom: 1rem; | |
border-left: 5px solid #9b59b6; | |
"> | |
<h3 style="color: #9b59b6;">π§ Parkinson's Assessment</h3> | |
<p style="color: #666;">Advanced voice pattern analysis for early detection of Parkinson's disease.</p> | |
</div> | |
""", unsafe_allow_html=True) | |
if st.button("Start Parkinson's Assessment", key="parkinsons"): | |
st.session_state.page = "Parkinson's Disease" | |
# Technical Specifications Section | |
st.markdown(""" | |
<h2 style="text-align: center; color: #2c3e50; margin: 2rem 0;">Technical Specifications</h2> | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
margin: 2rem 0; | |
"> | |
<div style=" | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); | |
gap: 2rem; | |
"> | |
<div> | |
<h3 style="color: #3498db;">π¬ Data Sources</h3> | |
<ul style="color: #666; list-style-type: none; padding-left: 0;"> | |
<li style="margin: 0.5rem 0;">β’ Breast Cancer Wisconsin Dataset</li> | |
<li style="margin: 0.5rem 0;">β’ Pima Indians Diabetes Database</li> | |
<li style="margin: 0.5rem 0;">β’ Heart Disease UCI Dataset</li> | |
<li style="margin: 0.5rem 0;">β’ Parkinson's Disease Dataset</li> | |
</ul> | |
</div> | |
<div> | |
<h3 style="color: #3498db;">βοΈ Technologies Used</h3> | |
<ul style="color: #666; list-style-type: none; padding-left: 0;"> | |
<li style="margin: 0.5rem 0;">β’ Machine Learning: scikit-learn</li> | |
<li style="margin: 0.5rem 0;">β’ Web Interface: Streamlit</li> | |
<li style="margin: 0.5rem 0;">β’ Data Processing: pandas, numpy</li> | |
<li style="margin: 0.5rem 0;">β’ Version Control: Git</li> | |
</ul> | |
</div> | |
<div> | |
<h3 style="color: #3498db;">π Model Performance</h3> | |
<ul style="color: #666; list-style-type: none; padding-left: 0;"> | |
<li style="margin: 0.5rem 0;">β’ Breast Cancer Detection: 96.5%</li> | |
<li style="margin: 0.5rem 0;">β’ Diabetes Prediction: 94.2%</li> | |
<li style="margin: 0.5rem 0;">β’ Heart Disease Assessment: 91.8%</li> | |
<li style="margin: 0.5rem 0;">β’ Parkinson's Detection: 93.5%</li> | |
</ul> | |
</div> | |
</div> | |
</div> | |
""", unsafe_allow_html=True) | |
# Features Section | |
st.markdown(""" | |
<h2 style="text-align: center; color: #2c3e50; margin: 2rem 0;">Why Choose Our Platform?</h2> | |
<div style=" | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); | |
gap: 1.5rem; | |
margin: 2rem 0; | |
"> | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
"> | |
<div style="font-size: 3rem; margin-bottom: 1rem;">π―</div> | |
<h3 style="color: #2c3e50;">High Accuracy</h3> | |
<p style="color: #666;">Advanced ML algorithms with 96.5% accuracy in predictions</p> | |
</div> | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
"> | |
<div style="font-size: 3rem; margin-bottom: 1rem;">β‘</div> | |
<h3 style="color: #2c3e50;">Real-time Analysis</h3> | |
<p style="color: #666;">Get instant predictions and comprehensive risk assessments</p> | |
</div> | |
<div style=" | |
background: white; | |
padding: 2rem; | |
border-radius: 15px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
text-align: center; | |
"> | |
<div style="font-size: 3rem; margin-bottom: 1rem;">π</div> | |
<h3 style="color: #2c3e50;">Secure Analysis</h3> | |
<p style="color: #666;">Your data is processed securely and privately</p> | |
</div> | |
</div> | |
""", unsafe_allow_html=True) | |
# Research & Publications Section | |
st.markdown("## Research & Publications") | |
# Create three columns for the sections | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
st.markdown("### π Recent Papers") | |
with st.container(): | |
st.markdown(""" | |
**Machine Learning in Medical Diagnosis** (2023) | |
*Impact on early disease detection and prevention* | |
""") | |
st.markdown(""" | |
**AI Applications in Healthcare** (2022) | |
*Transforming patient care through technology* | |
""") | |
st.markdown(""" | |
**Early Disease Detection Using ML** (2023) | |
*Predictive analytics in healthcare* | |
""") | |
with col2: | |
st.markdown("### π Methodology") | |
with st.container(): | |
st.info(""" | |
Our system employs advanced machine learning algorithms trained on extensive medical datasets, | |
ensuring reliable and accurate predictions for various medical conditions. | |
All models undergo rigorous testing and validation procedures, with continuous monitoring | |
and updates to maintain high accuracy levels. | |
""") | |
with col3: | |
st.markdown("### π― Future Developments") | |
# Future Development Cards | |
with st.container(): | |
st.success("**Integration**\n\nElectronic health records integration for seamless data flow") | |
st.success("**Visualization**\n\nAdvanced visualization tools for better insight into predictions") | |
st.success("**Mobile Access**\n\nDevelopment of mobile applications for on-the-go access") | |
# Add some spacing | |
st.markdown("<br>", unsafe_allow_html=True) | |
# Footer Section | |
st.markdown("---") # Add a divider | |
# Header | |
st.header("Ready to get started?") | |
st.write("Choose any assessment tool above to begin your analysis") | |
# Create three columns for contact, resources, and legal | |
contact_col, resources_col, legal_col = st.columns(3) | |
with contact_col: | |
st.subheader("Contact") | |
st.markdown(""" | |
π§ **Email:** [email protected] | |
π **Phone:** +1 (555) 123-4567 | |
""") | |
with resources_col: | |
st.subheader("Resources") | |
st.markdown(""" | |
π [Documentation](https://docs.medicalai.com) | |
π§ [API Reference](https://api.medicalai.com) | |
""") | |
with legal_col: | |
st.subheader("Legal") | |
st.markdown(""" | |
π [Privacy Policy](https://privacy.medicalai.com) | |
βοΈ [Terms of Service](https://terms.medicalai.com) | |
""") | |
# Copyright and version info | |
st.markdown("---") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown("Β© 2024 Medical AI Assistant | Version 1.0.0") | |
with col2: | |
st.markdown("Developed with β€οΈ for healthcare professionals") | |
# Add new sections | |
st.markdown("## π Additional Features") | |
# Create tabs for different features | |
tab1, tab2, tab3 = st.tabs(["π History", "π Analysis", "π‘ Recommendations"]) | |
with tab1: | |
show_patient_history() | |
export_report() | |
with tab2: | |
show_risk_factors_analysis() | |
show_trends_analysis() | |
with tab3: | |
show_recommendations() | |
compare_assessments() | |
def breast_cancer_prediction(): | |
add_home_button() | |
show_loading_page() | |
st.markdown(""" | |
<div class="page-header"> | |
<h1>Breast Cancer Risk Assessment</h1> | |
<p class="subtitle">Advanced cellular analysis using machine learning</p> | |
</div> | |
""", unsafe_allow_html=True) | |
if not check_model_exists(BREAST_CANCER_MODEL_PATH): | |
st.error("β οΈ Breast Cancer model not found. Please train the model first.") | |
return | |
try: | |
model = BreastCancerModel.load_model() | |
except Exception as e: | |
st.error(f"β οΈ Error loading model: {str(e)}") | |
return | |
# Create tabs for input methods | |
tab1, tab2 = st.tabs(["π Standard Input", "π¬ Detailed Input"]) | |
with tab1: | |
col1, col2 = st.columns(2) | |
with col1: | |
mean_radius = st.slider("Mean Radius", 6.0, 28.0, 14.0, help="Average size of cell nuclei") | |
mean_texture = st.slider("Mean Texture", 9.0, 40.0, 14.0, help="Average standard deviation of gray-scale values") | |
mean_perimeter = st.slider("Mean Perimeter", 40.0, 190.0, 90.0, help="Average size of the core tumor") | |
mean_area = st.slider("Mean Area", 140.0, 2500.0, 550.0, help="Average area of cell nuclei") | |
with col2: | |
mean_smoothness = st.slider("Mean Smoothness", 0.05, 0.16, 0.1, help="Average of local variation in radius lengths") | |
mean_compactness = st.slider("Mean Compactness", 0.02, 0.35, 0.1, help="Average of perimeter^2 / area - 1.0") | |
mean_concavity = st.slider("Mean Concavity", 0.0, 0.5, 0.1, help="Average severity of concave portions of the contour") | |
mean_concave_points = st.slider("Mean Concave Points", 0.0, 0.2, 0.1, help="Average number of concave portions of the contour") | |
with tab2: | |
st.markdown("### Detailed Measurements") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
radius_mean = st.number_input("Radius (mean)", 6.0, 28.0, 14.0, help="Mean of distances from center to points on the perimeter") | |
texture_mean = st.number_input("Texture (mean)", 9.0, 40.0, 14.0, help="Standard deviation of gray-scale values") | |
perimeter_mean = st.number_input("Perimeter (mean)", 40.0, 190.0, 90.0, help="Mean size of the core tumor") | |
area_mean = st.number_input("Area (mean)", 140.0, 2500.0, 550.0, help="Mean area of the tumor") | |
smoothness_mean = st.number_input("Smoothness (mean)", 0.05, 0.16, 0.1, help="Mean of local variation in radius lengths") | |
compactness_mean = st.number_input("Compactness (mean)", 0.02, 0.35, 0.1, help="Mean of perimeter^2 / area - 1.0") | |
concavity_mean = st.number_input("Concavity (mean)", 0.0, 0.5, 0.1, help="Mean of severity of concave portions") | |
concave_points_mean = st.number_input("Concave points (mean)", 0.0, 0.2, 0.1, help="Mean number of concave portions") | |
symmetry_mean = st.number_input("Symmetry (mean)", 0.1, 0.3, 0.2, help="Mean symmetry of the tumor") | |
fractal_dimension_mean = st.number_input("Fractal dimension (mean)", 0.05, 0.1, 0.06, help="Mean fractal dimension") | |
with col2: | |
radius_se = st.number_input("Radius (SE)", 0.1, 2.0, 0.4, help="Standard error of distances from center to points") | |
texture_se = st.number_input("Texture (SE)", 0.2, 4.0, 1.0, help="Standard error of gray-scale values") | |
perimeter_se = st.number_input("Perimeter (SE)", 1.0, 20.0, 5.0, help="Standard error of perimeter") | |
area_se = st.number_input("Area (SE)", 6.0, 540.0, 40.0, help="Standard error of area") | |
smoothness_se = st.number_input("Smoothness (SE)", 0.001, 0.03, 0.007, help="Standard error of smoothness") | |
compactness_se = st.number_input("Compactness (SE)", 0.002, 0.135, 0.025, help="Standard error of compactness") | |
concavity_se = st.number_input("Concavity (SE)", 0.0, 0.396, 0.03, help="Standard error of concavity") | |
concave_points_se = st.number_input("Concave points (SE)", 0.0, 0.05, 0.01, help="Standard error of concave points") | |
symmetry_se = st.number_input("Symmetry (SE)", 0.008, 0.079, 0.02, help="Standard error of symmetry") | |
fractal_dimension_se = st.number_input("Fractal dimension (SE)", 0.001, 0.029, 0.003, help="Standard error of fractal dimension") | |
with col3: | |
radius_worst = st.number_input("Radius (worst)", 7.0, 36.0, 16.0, help="Worst radius") | |
texture_worst = st.number_input("Texture (worst)", 12.0, 50.0, 21.0, help="Worst texture") | |
perimeter_worst = st.number_input("Perimeter (worst)", 50.0, 250.0, 107.0, help="Worst perimeter") | |
area_worst = st.number_input("Area (worst)", 185.0, 4250.0, 750.0, help="Worst area") | |
smoothness_worst = st.number_input("Smoothness (worst)", 0.07, 0.22, 0.13, help="Worst smoothness") | |
compactness_worst = st.number_input("Compactness (worst)", 0.03, 1.06, 0.25, help="Worst compactness") | |
concavity_worst = st.number_input("Concavity (worst)", 0.0, 1.25, 0.27, help="Worst concavity") | |
concave_points_worst = st.number_input("Concave points (worst)", 0.0, 0.29, 0.11, help="Worst concave points") | |
symmetry_worst = st.number_input("Symmetry (worst)", 0.15, 0.66, 0.29, help="Worst symmetry") | |
fractal_dimension_worst = st.number_input("Fractal dimension (worst)", 0.055, 0.207, 0.083, help="Worst fractal dimension") | |
# Add analyze button outside tabs to work for both | |
if st.button("Analyze Risk", help="Click to analyze breast cancer risk"): | |
with st.spinner('Analyzing samples...'): | |
try: | |
# Get input data based on active tab | |
if tab1._active: | |
input_data = np.array([ | |
mean_radius, mean_texture, mean_perimeter, mean_area, mean_smoothness, | |
mean_compactness, mean_concavity, mean_concave_points, 0.2, 0.06, | |
0.4, 0.4, 2.0, 20.0, 0.01, 0.02, 0.02, 0.01, 0.02, 0.003, | |
16.0, 16.0, 100.0, 700.0, 0.12, 0.15, 0.15, 0.1, 0.25, 0.08 | |
]).reshape(1, -1) | |
else: | |
input_data = np.array([ | |
radius_mean, texture_mean, perimeter_mean, area_mean, smoothness_mean, | |
compactness_mean, concavity_mean, concave_points_mean, symmetry_mean, fractal_dimension_mean, | |
radius_se, texture_se, perimeter_se, area_se, smoothness_se, | |
compactness_se, concavity_se, concave_points_se, symmetry_se, fractal_dimension_se, | |
radius_worst, texture_worst, perimeter_worst, area_worst, smoothness_worst, | |
compactness_worst, concavity_worst, concave_points_worst, symmetry_worst, fractal_dimension_worst | |
]).reshape(1, -1) | |
prediction, similar_cases, similar_outcomes, distances = model.predict(input_data) | |
# Show prediction results | |
if prediction[0] == 0: | |
st.error("β οΈ High Risk of Breast Cancer") | |
st.warning( | |
"The analysis indicates characteristics commonly associated with malignant breast masses." | |
) | |
# Show risk factors based on active tab | |
st.subheader("Risk Factors Identified") | |
if tab1._active: | |
if mean_radius > 15: | |
st.warning(f"β’ Mean radius ({mean_radius:.2f}) is elevated") | |
if mean_concave_points > 0.05: | |
st.warning(f"β’ Mean concave points ({mean_concave_points:.3f}) are high") | |
else: | |
if radius_worst > 20: | |
st.warning(f"β’ Worst radius ({radius_worst:.2f}) is significantly elevated") | |
if concave_points_worst > 0.15: | |
st.warning(f"β’ Worst concave points ({concave_points_worst:.3f}) are very high") | |
else: | |
st.success("β Low Risk of Breast Cancer") | |
st.info( | |
"The analysis indicates characteristics commonly associated with benign breast masses." | |
) | |
# Show similar cases | |
with st.expander("View Similar Cases"): | |
st.markdown("### Reference Cases") | |
st.markdown("These are similar cases from our database:") | |
similar_df = pd.DataFrame({ | |
'Mean Radius': similar_cases['mean radius'].round(2), | |
'Mean Texture': similar_cases['mean texture'].round(2), | |
'Mean Area': similar_cases['mean area'].round(2), | |
'Diagnosis': ['Malignant' if o == 0 else 'Benign' for o in similar_outcomes], | |
'Similarity': [f"{(1 - d/d.max())*100:.1f}%" for d in distances] | |
}) | |
st.dataframe(similar_df) | |
show_success_message("Analysis completed successfully!") | |
except Exception as e: | |
st.error(f"β οΈ Error during analysis: {str(e)}") | |
def diabetes_prediction(): | |
# Add home button at the top | |
add_home_button() | |
load_animation() | |
st.header("Diabetes Prediction") | |
st.write("Enter measurements to predict diabetes risk") | |
try: | |
model = DiabetesModel.load_model() | |
except Exception as e: | |
st.error(f"Error loading model: {str(e)}") | |
return | |
col1, col2 = st.columns(2) | |
with col1: | |
pregnancies = st.number_input("Number of Pregnancies", value=0, min_value=0) | |
glucose = st.number_input("Glucose (mg/dL)", value=120, min_value=0) | |
blood_pressure = st.number_input("Blood Pressure (mm Hg)", value=70, min_value=0) | |
skin_thickness = st.number_input("Skin Thickness (mm)", value=20, min_value=0) | |
with col2: | |
insulin = st.number_input("Insulin (mu U/ml)", value=79, min_value=0) | |
bmi = st.number_input("BMI", value=25.0, min_value=0.0) | |
dpf = st.number_input("Diabetes Pedigree Function", value=0.5, min_value=0.0) | |
age = st.number_input("Age", value=33, min_value=0) | |
if st.button("Predict"): | |
try: | |
# Calculate derived features | |
glucose_bmi = glucose * bmi / 1000 | |
glucose_age = glucose * age / 100 | |
input_data = np.array([ | |
pregnancies, glucose, blood_pressure, skin_thickness, | |
insulin, bmi, dpf, age, glucose_bmi, glucose_age | |
]).reshape(1, -1) | |
prediction, similar_cases, similar_outcomes, distances = model.predict(input_data) | |
# Show prediction with risk factors | |
if prediction[0] == 1: | |
st.error("High risk of diabetes") | |
if glucose > 140: | |
st.warning("β οΈ High glucose level detected") | |
if bmi > 30: | |
st.warning("β οΈ High BMI detected") | |
else: | |
st.success("Low risk of diabetes") | |
# Show similar cases | |
st.write("### Similar Cases from Dataset") | |
st.write("The prediction is based on these similar cases:") | |
similar_df = pd.DataFrame({ | |
'Age': similar_cases['Age'].round(1), | |
'BMI': similar_cases['BMI'].round(1), | |
'Glucose': similar_cases['Glucose'].round(1), | |
'Blood Pressure': similar_cases['BloodPressure'].round(1), | |
'Outcome': ['Diabetic' if o == 1 else 'Non-diabetic' for o in similar_outcomes], | |
'Similarity': [f"{(1 - d/d.max())*100:.1f}%" for d in distances] | |
}) | |
st.dataframe(similar_df) | |
# Show risk analysis | |
st.write("### Risk Analysis") | |
risk_factors = [] | |
if glucose > 140: risk_factors.append(f"Glucose ({glucose} mg/dL) is above normal range") | |
if bmi > 30: risk_factors.append(f"BMI ({bmi:.1f}) indicates obesity") | |
if blood_pressure > 90: risk_factors.append(f"Blood pressure ({blood_pressure} mm Hg) is elevated") | |
if dpf > 0.8: risk_factors.append(f"Diabetes pedigree function ({dpf:.2f}) indicates family history") | |
if risk_factors: | |
st.write("Risk factors identified:") | |
for factor in risk_factors: | |
st.write(f"β’ {factor}") | |
else: | |
st.write("No major risk factors identified") | |
except Exception as e: | |
st.error(f"Error making prediction: {str(e)}") | |
def heart_disease_prediction(): | |
# Add home button at the top | |
add_home_button() | |
load_animation() | |
st.header("Heart Disease Prediction") | |
st.write("Enter measurements to predict heart disease risk") | |
try: | |
model = HeartDiseaseModel.load_model() | |
except Exception as e: | |
st.error(f"Error loading model: {str(e)}") | |
return | |
col1, col2 = st.columns(2) | |
with col1: | |
age = st.number_input("Age", value=50, min_value=0) | |
sex = st.selectbox("Sex", ["Male", "Female"]) | |
cp = st.selectbox("Chest Pain Type", | |
["Typical Angina", "Atypical Angina", "Non-anginal Pain", "Asymptomatic"]) | |
trestbps = st.number_input("Resting Blood Pressure (mm Hg)", value=120, min_value=0) | |
chol = st.number_input("Serum Cholesterol (mg/dl)", value=200, min_value=0) | |
fbs = st.selectbox("Fasting Blood Sugar > 120 mg/dl", ["No", "Yes"]) | |
restecg = st.selectbox("Resting ECG Results", | |
["Normal", "ST-T Wave Abnormality", "Left Ventricular Hypertrophy"]) | |
with col2: | |
thalach = st.number_input("Maximum Heart Rate", value=150, min_value=0) | |
exang = st.selectbox("Exercise Induced Angina", ["No", "Yes"]) | |
oldpeak = st.number_input("ST Depression by Exercise", value=0.0) | |
slope = st.selectbox("Slope of Peak Exercise ST", ["Upsloping", "Flat", "Downsloping"]) | |
ca = st.number_input("Number of Major Vessels (0-3)", value=0, min_value=0, max_value=3) | |
thal = st.selectbox("Thalassemia", ["Normal", "Fixed Defect", "Reversible Defect"]) | |
if st.button("Predict"): | |
try: | |
# Convert categorical inputs to numerical | |
sex_num = 1 if sex == "Male" else 0 | |
cp_num = ["Typical Angina", "Atypical Angina", "Non-anginal Pain", "Asymptomatic"].index(cp) | |
fbs_num = 1 if fbs == "Yes" else 0 | |
restecg_num = ["Normal", "ST-T Wave Abnormality", "Left Ventricular Hypertrophy"].index(restecg) | |
exang_num = 1 if exang == "Yes" else 0 | |
slope_num = ["Upsloping", "Flat", "Downsloping"].index(slope) | |
thal_num = ["Normal", "Fixed Defect", "Reversible Defect"].index(thal) + 3 | |
input_data = np.array([ | |
age, sex_num, cp_num, trestbps, chol, fbs_num, restecg_num, | |
thalach, exang_num, oldpeak, slope_num, ca, thal_num | |
]).reshape(1, -1) | |
prediction, similar_cases, similar_outcomes, distances = model.predict(input_data) | |
# Show prediction and risk analysis | |
if prediction[0] == 1: | |
st.error("High risk of heart disease") | |
# Show specific risk factors | |
st.write("### Risk Factors Identified:") | |
risk_factors = [] | |
if age > 60: | |
risk_factors.append(f"Age ({age} years) - Higher risk with increasing age") | |
if cp_num >= 2: | |
risk_factors.append("Chest Pain Type indicates potential issue") | |
if trestbps > 140: | |
risk_factors.append(f"High Blood Pressure ({trestbps} mm Hg)") | |
if chol > 240: | |
risk_factors.append(f"High Cholesterol ({chol} mg/dl)") | |
if thalach < 120: | |
risk_factors.append(f"Low Maximum Heart Rate ({thalach} bpm)") | |
if oldpeak > 2: | |
risk_factors.append(f"Significant ST Depression ({oldpeak})") | |
if ca > 0: | |
risk_factors.append(f"Number of Major Vessels: {ca}") | |
for factor in risk_factors: | |
st.warning(f"β οΈ {factor}") | |
else: | |
st.success("Low risk of heart disease") | |
# Show protective factors | |
good_factors = [] | |
if age < 50: | |
good_factors.append(f"Age ({age} years) is in a lower risk category") | |
if trestbps < 120: | |
good_factors.append(f"Normal Blood Pressure ({trestbps} mm Hg)") | |
if chol < 200: | |
good_factors.append(f"Healthy Cholesterol Level ({chol} mg/dl)") | |
if good_factors: | |
st.write("### Protective Factors:") | |
for factor in good_factors: | |
st.info(f"β {factor}") | |
# Show similar cases | |
st.write("### Similar Cases from Dataset") | |
st.write("The prediction is based on these similar cases:") | |
similar_df = pd.DataFrame({ | |
'Age': similar_cases['age'].round(0), | |
'Sex': ['Male' if s == 1 else 'Female' for s in similar_cases['sex']], | |
'Blood Pressure': similar_cases['trestbps'].round(0), | |
'Cholesterol': similar_cases['chol'].round(0), | |
'Max Heart Rate': similar_cases['thalach'].round(0), | |
'Outcome': ['High Risk' if o == 1 else 'Low Risk' for o in similar_outcomes], | |
'Similarity': [f"{(1 - d/d.max())*100:.1f}%" for d in distances] | |
}) | |
st.dataframe(similar_df) | |
except Exception as e: | |
st.error(f"Error making prediction: {str(e)}") | |
def parkinsons_prediction(): | |
# Add home button at the top | |
add_home_button() | |
load_animation() | |
st.header("Parkinsons Disease Prediction") | |
st.write("Enter the following measurements:") | |
if not check_model_exists(PARKINSONS_MODEL_PATH): | |
st.error("Parkinson's model not found. Please train the model first.") | |
if st.button("Train Parkinson's Model"): | |
try: | |
from train_models import train_parkinsons | |
train_parkinsons() | |
st.success("Model trained successfully! Please refresh the page.") | |
except Exception as e: | |
st.error(f"Error training model: {str(e)}") | |
return | |
try: | |
model = ParkinsonsModel.load_model() | |
except Exception as e: | |
st.error(f"Error loading model: {str(e)}") | |
return | |
col1, col2 = st.columns(2) | |
with col1: | |
mdvp_fo = st.number_input("MDVP:Fo(Hz)", min_value=88.333, max_value=260.105, value=120.000, format="%.6f") | |
mdvp_fhi = st.number_input("MDVP:Fhi(Hz)", min_value=102.145, max_value=592.030, value=157.000, format="%.6f") | |
mdvp_flo = st.number_input("MDVP:Flo(Hz)", min_value=65.476, max_value=239.170, value=75.000, format="%.6f") | |
mdvp_jitter = st.number_input("MDVP:Jitter(%)", min_value=0.00168, max_value=0.03316, value=0.00784, format="%.6f") | |
mdvp_jitter_abs = st.number_input("MDVP:Jitter(Abs)", min_value=0.000007, max_value=0.000260, value=0.000070, format="%.6f") | |
mdvp_rap = st.number_input("MDVP:RAP", min_value=0.00068, max_value=0.02144, value=0.00370, format="%.6f") | |
mdvp_ppq = st.number_input("MDVP:PPQ", min_value=0.00092, max_value=0.01958, value=0.00554, format="%.6f") | |
jitter_ddp = st.number_input("Jitter:DDP", min_value=0.00204, max_value=0.06433, value=0.01109, format="%.6f") | |
with col2: | |
mdvp_shimmer = st.number_input("MDVP:Shimmer", min_value=0.00954, max_value=0.11908, value=0.04374, format="%.6f") | |
mdvp_shimmer_db = st.number_input("MDVP:Shimmer(dB)", min_value=0.085, max_value=1.302, value=0.426, format="%.6f") | |
shimmer_apq3 = st.number_input("Shimmer:APQ3", min_value=0.00455, max_value=0.05647, value=0.02182, format="%.6f") | |
shimmer_apq5 = st.number_input("Shimmer:APQ5", min_value=0.0057, max_value=0.0794, value=0.03130, format="%.6f") | |
mdvp_apq = st.number_input("MDVP:APQ", min_value=0.00719, max_value=0.13778, value=0.02971, format="%.6f") | |
shimmer_dda = st.number_input("Shimmer:DDA", min_value=0.01364, max_value=0.16942, value=0.06545, format="%.6f") | |
nhr = st.number_input("NHR", min_value=0.00065, max_value=0.31482, value=0.02211, format="%.6f") | |
hnr = st.number_input("HNR", min_value=8.441, max_value=33.047, value=21.033, format="%.6f") | |
rpde = st.number_input("RPDE", min_value=0.256570, max_value=0.685151, value=0.414783, format="%.6f") | |
dfa = st.number_input("DFA", min_value=0.574282, max_value=0.825288, value=0.815285, format="%.6f") | |
spread1 = st.number_input("Spread1", min_value= -7.964984, max_value= -2.434031, value= -4.813031, format="%.6f") | |
spread2 = st.number_input("Spread2", min_value=0.006274, max_value=0.450493, value=0.266482, format="%.6f") | |
d2 = st.number_input("D2", min_value=1.423287, max_value=3.671155, value=2.301442, format="%.6f") | |
ppe = st.number_input("PPE", min_value=0.044539, max_value=0.527367, value=0.284654, format="%.6f") | |
if st.button("Predict"): | |
try: | |
input_data = np.array([ | |
mdvp_fo, mdvp_fhi, mdvp_flo, mdvp_jitter, mdvp_jitter_abs, | |
mdvp_rap, mdvp_ppq, jitter_ddp, mdvp_shimmer, mdvp_shimmer_db, | |
shimmer_apq3, shimmer_apq5, mdvp_apq, shimmer_dda, nhr, hnr, | |
rpde, dfa, spread1, spread2, d2, ppe | |
]).reshape(1, -1) | |
prediction, similar_cases, similar_outcomes, distances = model.predict(input_data) | |
if prediction[0] == 1: | |
st.error("β οΈ High risk of Parkinson's disease") | |
st.write("### Risk Factors Identified:") | |
risk_factors = [] | |
if mdvp_jitter > 0.008: | |
risk_factors.append(f"High Jitter ({mdvp_jitter:.5f}%) indicates vocal instability") | |
if mdvp_jitter_abs > 0.0004: | |
risk_factors.append(f"High Absolute Jitter ({mdvp_jitter_abs:.5f}) indicates frequency instability") | |
if mdvp_shimmer > 0.04: | |
risk_factors.append(f"High Shimmer ({mdvp_shimmer:.5f}) indicates amplitude variations") | |
if mdvp_shimmer_db > 0.4: | |
risk_factors.append(f"High Shimmer dB ({mdvp_shimmer_db:.5f}dB) indicates amplitude instability") | |
if hnr < 20: | |
risk_factors.append(f"Low HNR ({hnr:.3f}) indicates voice quality issues") | |
if nhr > 0.03: | |
risk_factors.append(f"High NHR ({nhr:.5f}) indicates increased noise") | |
if rpde > 0.5: | |
risk_factors.append(f"High RPDE ({rpde:.3f}) indicates increased vocal complexity") | |
if dfa < 0.65: | |
risk_factors.append(f"Low DFA ({dfa:.3f}) indicates changes in vocal pattern") | |
for factor in risk_factors: | |
st.warning(f"β οΈ {factor}") | |
else: | |
st.success("β Low risk of Parkinson's disease") | |
good_factors = [] | |
if mdvp_jitter < 0.006: | |
good_factors.append(f"Normal Jitter ({mdvp_jitter:.5f}%)") | |
if mdvp_shimmer < 0.03: | |
good_factors.append(f"Normal Shimmer ({mdvp_shimmer:.5f})") | |
if hnr > 22: | |
good_factors.append(f"Good HNR ({hnr:.3f})") | |
if nhr < 0.02: | |
good_factors.append(f"Good NHR ({nhr:.5f})") | |
if good_factors: | |
st.write("### Protective Factors:") | |
for factor in good_factors: | |
st.info(f"β {factor}") | |
# Show similar cases | |
st.write("### Similar Cases from Dataset") | |
similar_df = pd.DataFrame({ | |
'Jitter(%)': similar_cases['MDVP:Jitter(%)'].round(5), | |
'Shimmer': similar_cases['MDVP:Shimmer'].round(5), | |
'HNR': similar_cases['HNR'].round(2), | |
'RPDE': similar_cases['RPDE'].round(3), | |
'DFA': similar_cases['DFA'].round(3), | |
'Diagnosis': ['Parkinson\'s' if o == 1 else 'Healthy' for o in similar_outcomes], | |
'Similarity': [f"{(1 - d/d.max())*100:.1f}%" for d in distances] | |
}) | |
st.dataframe(similar_df) | |
except Exception as e: | |
st.error(f"Error making prediction: {str(e)}") | |
def show_patient_history(): | |
"""Display patient history visualization with interactive elements""" | |
st.markdown("### π Patient History Tracker") | |
# Add date range selector | |
col1, col2 = st.columns(2) | |
with col1: | |
start_date = st.date_input("From Date", value=datetime(2024, 1, 1)) | |
with col2: | |
end_date = st.date_input("To Date", value=datetime.now()) | |
# Add assessment type filter | |
assessment_types = ["All", "Breast Cancer", "Diabetes", "Heart Disease", "Parkinson's"] | |
selected_type = st.multiselect("Filter by Assessment Type", assessment_types, default=["All"]) | |
# Mock data for demonstration - Fixed: Ensure all arrays have same length | |
num_records = 14 # Define a fixed number of records | |
history_data = { | |
'Date': pd.date_range(start='2024-01-01', periods=num_records, freq='W'), | |
'Risk Score': np.random.uniform(0.2, 0.8, size=num_records), | |
'Assessment Type': np.random.choice(assessment_types[1:], size=num_records), | |
'Status': np.random.choice(['Normal', 'Warning', 'Critical'], size=num_records), | |
'Doctor': np.random.choice(['Dr. Smith', 'Dr. Johnson', 'Dr. Williams'], size=num_records) | |
} | |
df = pd.DataFrame(history_data) | |
# Create tabs for different views | |
tab1, tab2 = st.tabs(["π Trend Analysis", "π Detailed Records"]) | |
with tab1: | |
# Plot interactive trend | |
fig = px.line(df, x='Date', y='Risk Score', color='Assessment Type', | |
title='Risk Score Trends Over Time') | |
fig.update_layout(height=400) | |
st.plotly_chart(fig, use_container_width=True) | |
# Add summary metrics | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
st.metric("Average Risk Score", f"{df['Risk Score'].mean():.2f}", | |
delta=f"{(df['Risk Score'].iloc[-1] - df['Risk Score'].iloc[0]):.2f}") | |
with col2: | |
st.metric("Assessments", len(df), delta="β2 from last month") | |
with col3: | |
st.metric("Critical Alerts", len(df[df['Status'] == 'Critical']), | |
delta="-1 from last month") | |
with tab2: | |
# Add search and filter options | |
search = st.text_input("Search records...") | |
filtered_df = df[df.astype(str).apply(lambda x: x.str.contains(search, case=False)).any(axis=1)] | |
# Display detailed records with styling | |
st.dataframe( | |
filtered_df.style.apply(lambda x: ['background-color: #ffcccc' if v == 'Critical' | |
else 'background-color: #ffffcc' if v == 'Warning' | |
else '' for v in x], subset=['Status']) | |
) | |
def export_report(): | |
"""Generate and export comprehensive assessment report""" | |
st.markdown("### π Export Assessment Report") | |
# Report configuration | |
col1, col2 = st.columns(2) | |
with col1: | |
report_format = st.selectbox( | |
"Report Format", | |
["PDF", "CSV", "JSON", "Excel"] | |
) | |
include_graphs = st.checkbox("Include Visualizations", value=True) | |
with col2: | |
report_type = st.selectbox( | |
"Report Type", | |
["Summary", "Detailed", "Technical"] | |
) | |
include_recommendations = st.checkbox("Include Recommendations", value=True) | |
# Generate report | |
if st.button("Generate Report", type="primary"): | |
with st.spinner("Generating comprehensive report..."): | |
# Simulate report generation | |
progress_bar = st.progress(0) | |
for i in range(100): | |
time.sleep(0.01) | |
progress_bar.progress(i + 1) | |
# Show success message | |
st.success(f"Report generated successfully in {report_format} format!") | |
# Provide download option | |
if report_format == "PDF": | |
mime = "application/pdf" | |
elif report_format == "CSV": | |
mime = "text/csv" | |
elif report_format == "JSON": | |
mime = "application/json" | |
else: | |
mime = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | |
st.download_button( | |
label=f"π₯ Download {report_format} Report", | |
data=b"Sample report data", # Replace with actual report generation | |
file_name=f"medical_report_{datetime.now().strftime('%Y%m%d')}_{report_type.lower()}.{report_format.lower()}", | |
mime=mime, | |
key="download_report" | |
) | |
def show_risk_factors_analysis(): | |
"""Display comprehensive risk factors analysis with interactive elements""" | |
st.markdown("### π Risk Factors Analysis") | |
# Create tabs for different analyses | |
tab1, tab2 = st.tabs(["π Risk Factor Impact", "π Correlation Analysis"]) | |
with tab1: | |
# Mock data | |
risk_factors = { | |
'Factor': ['Age', 'BMI', 'Blood Pressure', 'Glucose Level', 'Family History', | |
'Smoking', 'Physical Activity', 'Diet', 'Stress Level'], | |
'Impact': [0.8, 0.6, 0.7, 0.9, 0.5, 0.65, 0.55, 0.45, 0.75], | |
'Category': ['Demographics', 'Physical', 'Physical', 'Medical', 'Medical', | |
'Lifestyle', 'Lifestyle', 'Lifestyle', 'Lifestyle'] | |
} | |
df = pd.DataFrame(risk_factors) | |
# Add category filter | |
categories = ['All'] + list(df['Category'].unique()) | |
selected_category = st.selectbox("Filter by Category", categories) | |
if selected_category != 'All': | |
df_filtered = df[df['Category'] == selected_category] | |
else: | |
df_filtered = df | |
# Create interactive bar chart | |
fig = px.bar(df_filtered, x='Factor', y='Impact', color='Category', | |
title='Risk Factors Impact Analysis', | |
labels={'Impact': 'Impact Score (0-1)'}) | |
st.plotly_chart(fig, use_container_width=True) | |
with tab2: | |
# Create correlation matrix visualization | |
correlation_data = np.random.rand(len(df), len(df)) | |
fig = px.imshow(correlation_data, | |
labels=dict(x="Risk Factors", y="Risk Factors"), | |
x=df['Factor'], | |
y=df['Factor'], | |
title="Risk Factors Correlation Matrix") | |
st.plotly_chart(fig, use_container_width=True) | |
def show_recommendations(): | |
"""Display personalized health recommendations with interactive elements""" | |
st.markdown("### π‘ Personalized Recommendations") | |
# Add risk profile selector | |
risk_profile = st.select_slider( | |
"Risk Profile", | |
options=["Low", "Moderate", "High"], | |
value="Moderate" | |
) | |
# Recommendations based on risk profile | |
recommendations = { | |
"Lifestyle Changes": { | |
"Low": [ | |
"Maintain regular exercise routine", | |
"Continue balanced diet", | |
"Regular sleep schedule" | |
], | |
"Moderate": [ | |
"Increase exercise to 45 minutes daily", | |
"Reduce processed food intake", | |
"Improve sleep quality" | |
], | |
"High": [ | |
"Structured exercise program with supervision", | |
"Strict dietary guidelines", | |
"Sleep monitoring and improvement" | |
] | |
}, | |
"Medical Follow-up": { | |
"Low": [ | |
"Annual check-ups", | |
"Regular blood pressure monitoring", | |
"Basic health screenings" | |
], | |
"Moderate": [ | |
"Semi-annual check-ups", | |
"Monthly blood pressure monitoring", | |
"Comprehensive screenings" | |
], | |
"High": [ | |
"Quarterly check-ups", | |
"Weekly blood pressure monitoring", | |
"Advanced health screenings" | |
] | |
}, | |
"Risk Management": { | |
"Low": [ | |
"Basic health monitoring", | |
"Stress management awareness", | |
"General health education" | |
], | |
"Moderate": [ | |
"Regular health monitoring", | |
"Active stress management", | |
"Specific health education" | |
], | |
"High": [ | |
"Intensive health monitoring", | |
"Professional stress management", | |
"Specialized health education" | |
] | |
} | |
} | |
# Display recommendations with expandable sections | |
for category, risk_levels in recommendations.items(): | |
with st.expander(f"π {category}", expanded=True): | |
for item in risk_levels[risk_profile]: | |
st.markdown(f"β’ {item}") | |
# Add progress tracking | |
if st.checkbox(f"Track {category.lower()} progress", key=category): | |
st.slider(f"{category} Adherence", 0, 100, 50, key=f"adherence_{category}") | |
st.progress(50) | |
def show_trends_analysis(): | |
"""Display comprehensive health trends analysis""" | |
st.markdown("### π Health Trends Analysis") | |
# Date range selector | |
col1, col2 = st.columns(2) | |
with col1: | |
start_date = st.date_input("Start Date", value=datetime(2024, 1, 1), key="trends_start") | |
with col2: | |
end_date = st.date_input("End Date", value=datetime.now(), key="trends_end") | |
# Mock data | |
dates = pd.date_range(start='2024-01-01', end='2024-04-01', freq='D') | |
trends_data = { | |
'Date': dates, | |
'Blood Pressure': np.random.normal(120, 5, len(dates)), | |
'Glucose Level': np.random.normal(100, 3, len(dates)), | |
'BMI': np.random.normal(25, 0.5, len(dates)), | |
'Cholesterol': np.random.normal(180, 10, len(dates)), | |
'Heart Rate': np.random.normal(75, 3, len(dates)) | |
} | |
df = pd.DataFrame(trends_data) | |
# Metric selector | |
metrics = list(df.columns[1:]) | |
selected_metrics = st.multiselect("Select metrics to analyze", metrics, default=[metrics[0]]) | |
if selected_metrics: | |
# Create interactive line chart | |
fig = px.line(df, x='Date', y=selected_metrics, | |
title='Health Metrics Trends Over Time') | |
fig.update_layout(height=400) | |
st.plotly_chart(fig, use_container_width=True) | |
# Add statistical analysis | |
st.markdown("#### Statistical Analysis") | |
col1, col2, col3 = st.columns(3) | |
for metric in selected_metrics: | |
with col1: | |
st.metric(f"{metric} Average", | |
f"{df[metric].mean():.1f}", | |
delta=f"{df[metric].iloc[-1] - df[metric].iloc[0]:.1f}") | |
with col2: | |
st.metric(f"{metric} Min", | |
f"{df[metric].min():.1f}") | |
with col3: | |
st.metric(f"{metric} Max", | |
f"{df[metric].max():.1f}") | |
def compare_assessments(): | |
"""Compare different assessment results""" | |
st.markdown("### π Compare Assessments") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown("#### Previous Assessment") | |
st.metric(label="Risk Score", value="75%", delta="-15%") | |
st.date_input("Assessment Date", value=datetime(2024, 1, 1)) | |
with col2: | |
st.markdown("#### Current Assessment") | |
st.metric(label="Risk Score", value="60%", delta="-5%") | |
st.date_input("Assessment Date", value=datetime.now()) | |
def main(): | |
# Initialize session state if not exists | |
if "page" not in st.session_state: | |
st.session_state.page = "Home" | |
# Sidebar | |
with st.sidebar: | |
st.image("https://img.icons8.com/color/96/000000/hospital-2.png", width=100) | |
st.title("Medical AI Assistant") | |
st.caption("v1.0.0") | |
# Navigation | |
pages = { | |
"π Home": "Home", | |
"π¬ Breast Cancer": "Breast Cancer", | |
"π©Ί Diabetes": "Diabetes", | |
"β€οΈ Heart Disease": "Heart Disease", | |
"π§ Parkinson's Disease": "Parkinson's Disease" | |
} | |
# Get current page index | |
current_page = st.session_state.page | |
current_key = next(k for k, v in pages.items() if v == current_page) | |
# Navigation radio buttons | |
selected = st.radio( | |
"π§ Navigation", | |
list(pages.keys()), | |
index=list(pages.keys()).index(current_key) | |
) | |
# Update page when selection changes | |
if pages[selected] != st.session_state.page: | |
st.session_state.page = pages[selected] | |
# Main content routing | |
try: | |
if st.session_state.page == "Home": | |
home_page() | |
elif st.session_state.page == "Breast Cancer": | |
breast_cancer_prediction() | |
elif st.session_state.page == "Diabetes": | |
diabetes_prediction() | |
elif st.session_state.page == "Heart Disease": | |
heart_disease_prediction() | |
elif st.session_state.page == "Parkinson's Disease": | |
parkinsons_prediction() | |
except Exception as e: | |
st.error(f"Error loading page: {str(e)}") | |
st.session_state.page = "Home" | |
if __name__ == "__main__": | |
main() |