Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import altair as alt | |
import datetime | |
def main(): | |
st.set_page_config( | |
page_title="AfyaMind Mental Health Platform", | |
page_icon="🧠", | |
layout="wide" | |
) | |
# Sample Data Generation (Updated for Mental Health) | |
np.random.seed(42) | |
date_rng = pd.date_range(start='2025-01-01', end='2025-12-31', freq='D') | |
data = pd.DataFrame(date_rng, columns=['date']) | |
data['user_id'] = np.random.randint(1000, 9999, len(data)) | |
data['mood_score'] = np.random.randint(1, 11, len(data)) # 1-10 scale | |
data['phq9_score'] = np.random.randint(0, 28, len(data)) # PHQ-9: 0-27 | |
data['gad7_score'] = np.random.randint(0, 22, len(data)) # GAD-7: 0-21 | |
data['crisis_flag'] = np.random.choice([True, False], p=[0.05, 0.95], size=len(data)) | |
data['appointment_booked'] = np.random.choice([True, False], size=len(data)) | |
data['engagement_points'] = np.random.randint(0, 100, len(data)) # Gamification | |
data['therapist_id'] = np.random.randint(5000, 5999, len(data)) | |
data['message_sample'] = np.random.choice( | |
["Feeling okay", "Hopeless today", "Doing great", "Need help"], | |
size=len(data) | |
) | |
# Sidebar Filters | |
st.sidebar.header("Filters") | |
selected_user = st.sidebar.selectbox("User ID", ['All'] + sorted(data['user_id'].unique())) | |
selected_date = st.sidebar.slider( | |
"Date Range", | |
min_value=datetime.date(2025, 1, 1), | |
max_value=datetime.date(2025, 12, 31), | |
value=(datetime.date(2025, 1, 1), datetime.date(2025, 12, 31)) | |
) | |
# Apply Filters | |
filtered_data = data.copy() | |
if selected_user != 'All': | |
filtered_data = filtered_data[filtered_data['user_id'] == selected_user] | |
filtered_data = filtered_data[ | |
(filtered_data['date'].dt.date >= selected_date[0]) & | |
(filtered_data['date'].dt.date <= selected_date[1]) | |
] | |
# Main Content Tabs (Updated for AfyaMind Features) | |
tab1, tab2, tab3, tab4, tab5 = st.tabs([ | |
"User Mood Analytics", | |
"Crisis Detection", | |
"Therapy Appointments", | |
"Clinician Dashboard", | |
"Engagement & Analytics" | |
]) | |
# Tab 1: User Mood Analytics | |
with tab1: | |
st.subheader("User Mood Trends") | |
col1, col2, col3 = st.columns(3) | |
col1.metric("Avg Mood Score", f"{filtered_data['mood_score'].mean().round(1)}/10") | |
col2.metric("Avg PHQ-9 Score", f"{filtered_data['phq9_score'].mean().round(1)}/27") | |
col3.metric("Avg GAD-7 Score", f"{filtered_data['gad7_score'].mean().round(1)}/21") | |
mood_chart = alt.Chart(filtered_data).mark_line().encode( | |
x='date:T', | |
y='mood_score:Q', | |
tooltip=['date:T', 'mood_score:Q', 'phq9_score:Q'] | |
).properties(title="Mood Score Over Time") | |
st.altair_chart(mood_chart, use_container_width=True) | |
# Tab 2: Crisis Detection | |
with tab2: | |
st.subheader("Crisis Detection & Response") | |
crisis_data = filtered_data[filtered_data['crisis_flag'] == True] | |
st.write(f"Users flagged for crisis: {len(crisis_data)}") | |
st.dataframe(crisis_data[['date', 'user_id', 'message_sample', 'phq9_score']]) | |
# Simulate NLP-based distress signal detection | |
distress_messages = filtered_data[filtered_data['message_sample'].str.contains("hopeless|need help", case=False)] | |
if not distress_messages.empty: | |
st.warning("Distress Signals Detected - Auto-escalated to Therapists") | |
st.dataframe(distress_messages[['date', 'user_id', 'message_sample']]) | |
# Tab 3: Therapy Appointments | |
with tab3: | |
st.subheader("Appointment Scheduling") | |
appointments = filtered_data[filtered_data['appointment_booked'] == True] | |
st.dataframe(appointments[['date', 'user_id', 'therapist_id']]) | |
st.write(f"Total Appointments Booked: {len(appointments)}") | |
if st.button("Simulate SMS Reminder"): | |
st.success("SMS Reminder Sent: 'Your appointment is tomorrow at 10 AM.'") | |
# Tab 4: Clinician Dashboard | |
with tab4: | |
st.subheader("Clinician Support Dashboard") | |
therapist_load = filtered_data.groupby('therapist_id').agg({ | |
'user_id': 'nunique', | |
'appointment_booked': 'sum' | |
}).reset_index() | |
therapist_load.columns = ['Therapist ID', 'Unique Clients', 'Appointments'] | |
st.dataframe(therapist_load) | |
# Burnout Alert | |
overloaded = therapist_load[therapist_load['Appointments'] > 20] | |
if not overloaded.empty: | |
st.error(f"Therapist Overload Detected: {len(overloaded)} therapists exceed 20 sessions.") | |
# AI-Generated User Summary | |
if selected_user != 'All': | |
user_summary = filtered_data[filtered_data['user_id'] == selected_user].iloc[-1] | |
st.write("AI-Generated Session Prep Summary:") | |
st.write(f"User {selected_user} - Mood: {user_summary['mood_score']}/10, PHQ-9: {user_summary['phq9_score']}, Last Message: '{user_summary['message_sample']}'") | |
# Tab 5: Engagement & Analytics | |
with tab5: | |
st.subheader("Engagement & Population Insights") | |
col1, col2 = st.columns(2) | |
col1.metric("Avg Engagement Points", f"{filtered_data['engagement_points'].mean().round(1)}") | |
col2.metric("Mood Tracking Adoption", f"{(len(filtered_data['mood_score'].notna()) / len(filtered_data)) * 100:.1f}%") | |
# Gamified Engagement Chart | |
points_chart = alt.Chart(filtered_data).mark_bar().encode( | |
x=alt.X('engagement_points:Q', bin=True), | |
y='count()', | |
tooltip=['engagement_points:Q', 'count()'] | |
).properties(title="Engagement Points Distribution") | |
st.altair_chart(points_chart, use_container_width=True) | |
# Download Anonymized Data | |
st.download_button( | |
label="Download Anonymized Data (CSV)", | |
data=filtered_data.drop(columns=['user_id', 'therapist_id']).to_csv(index=False), | |
file_name="afyamind_analytics.csv", | |
mime="text/csv" | |
) | |
if __name__ == "__main__": | |
main() |