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() |