File size: 7,089 Bytes
8b8745e
 
 
23ea2ec
 
8b8745e
 
c110a72
8b8745e
 
 
f0f32c2
8b8745e
ddba63c
 
bab9c1c
 
 
23ea2ec
bab9c1c
 
 
 
ddba63c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23ea2ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f0f32c2
d457fe7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23ea2ec
d457fe7
23ea2ec
d457fe7
 
f0f32c2
 
 
d457fe7
f0f32c2
 
 
 
23ea2ec
 
 
 
 
f0f32c2
 
 
 
 
 
 
 
 
 
61d5bc4
d457fe7
 
 
 
23ea2ec
d457fe7
23ea2ec
d457fe7
 
 
 
 
 
 
 
 
 
 
 
ddba63c
 
d457fe7
 
 
 
 
 
23ea2ec
 
 
d457fe7
 
ddba63c
d457fe7
 
 
 
 
 
 
bab9c1c
8b8745e
 
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import os
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import requests

news_api_key = "fe1e6bcbbf384b3e9220a7a1138805e0"  # Replace with your News API key

@st.cache_data
def load_data(file):
    return pd.read_csv(file)

def fetch_health_articles(query):
    url = f"https://newsapi.org/v2/everything?q={query}&apiKey={news_api_key}"
    response = requests.get(url)
    if response.status_code == 200:
        articles = response.json().get('articles', [])
        return articles[:5]
    else:
        st.error("Failed to fetch news articles. Please check your API key or try again later.")
        return []

def provide_advice_from_articles(data):
    advice = []
    if data['depression'] > 7:
        advice.append("Searching for articles related to high depression...")
        articles = fetch_health_articles("high depression")
        for article in articles:
            advice.append(f"**{article['title']}**\n{article['description']}\n[Read more]({article['url']})")
    elif data['anxiety_level'] > 7:
        advice.append("Searching for articles related to high anxiety...")
        articles = fetch_health_articles("high anxiety")
        for article in articles:
            advice.append(f"**{article['title']}**\n{article['description']}\n[Read more]({article['url']})")
    elif data['stress_level'] > 7:
        advice.append("Searching for articles related to high stress...")
        articles = fetch_health_articles("high stress")
        for article in articles:
            advice.append(f"**{article['title']}**\n{article['description']}\n[Read more]({article['url']})")
    else:
        advice.append("Searching for general health advice articles...")
        articles = fetch_health_articles("mental health")
        for article in articles:
            advice.append(f"**{article['title']}**\n{article['description']}\n[Read more]({article['url']})")
    return advice

def plot_graphs(data):
    # Create subplots for visualization
    st.markdown("### πŸ“Š Data Visualizations")
    st.write("Explore key insights through visualizations.")

    # Histogram for depression
    st.markdown("#### Histogram of Depression Levels")
    fig, ax = plt.subplots(figsize=(6, 4))
    ax.hist(data['depression'], bins=20, color='skyblue', edgecolor='black')
    ax.set_title("Histogram of Depression Levels")
    ax.set_xlabel("Depression Level")
    ax.set_ylabel("Frequency")
    st.pyplot(fig)

    # Scatter plot for anxiety vs. depression
    st.markdown("#### Scatter Plot: Anxiety vs Depression")
    fig, ax = plt.subplots(figsize=(6, 4))
    sns.scatterplot(x=data['anxiety_level'], y=data['depression'], ax=ax, color='blue')
    ax.set_title("Anxiety Level vs Depression")
    ax.set_xlabel("Anxiety Level")
    ax.set_ylabel("Depression")
    st.pyplot(fig)

    # Correlation heatmap
    st.markdown("#### Correlation Heatmap")
    fig, ax = plt.subplots(figsize=(10, 8))
    sns.heatmap(data.corr(), annot=True, cmap="coolwarm", ax=ax)
    ax.set_title("Correlation Heatmap")
    st.pyplot(fig)

def main():
    st.set_page_config(
        page_title="Student Well-being Advisor",
        page_icon="πŸ“Š",
        layout="wide",
        initial_sidebar_state="expanded",
    )

    st.sidebar.title("Navigation")
    st.sidebar.write("Use the sidebar to navigate through the app.")
    st.sidebar.markdown("### πŸ“‚ Upload Data")
    st.sidebar.write("Start by uploading your dataset for analysis.")
    st.sidebar.markdown("### πŸ“Š Analysis & Advice")
    st.sidebar.write("Get detailed insights and personalized advice.")

    st.title("πŸŽ“ Student Well-being Advisor")
    st.subheader("Analyze data and provide professional mental health recommendations.")
    st.write("""
        This app helps identify areas of concern in students' well-being and provides personalized advice based on their responses.
    """)

    st.markdown("## πŸ“‚ Upload Your Dataset")
    uploaded_file = st.file_uploader("Upload your dataset (CSV)", type=["csv"])
    if uploaded_file:
        df = load_data(uploaded_file)
        st.success("Dataset uploaded successfully!")
        st.write("### Dataset Preview:")
        st.dataframe(df.head())

        required_columns = [
            'anxiety_level', 'self_esteem', 'mental_health_history', 'depression',
            'headache', 'blood_pressure', 'sleep_quality', 'breathing_problem',
            'noise_level', 'living_conditions', 'safety', 'basic_needs',
            'academic_performance', 'study_load', 'teacher_student_relationship',
            'future_career_concerns', 'social_support', 'peer_pressure',
            'extracurricular_activities', 'bullying', 'stress_level'
        ]
        missing_columns = [col for col in required_columns if col not in df.columns]
        
        if missing_columns:
            st.error(f"The uploaded dataset is missing the following required columns: {', '.join(missing_columns)}")
        else:
            if df.isnull().values.any():
                st.warning("The dataset contains missing values. Rows with missing values will be skipped.")
                df = df.dropna()

            tab1, tab2, tab3 = st.tabs(["🏠 Home", "πŸ“Š Analysis", "πŸ“° Resources"])

            with tab1:
                st.write("### Welcome to the Well-being Advisor!")
                st.write("""
                    Use the tabs to explore data, generate advice, and access mental health resources.
                """)

            with tab2:
                st.markdown("### πŸ“Š Select a Row for Analysis")
                selected_row = st.selectbox(
                    "Select a row (based on index) to analyze:",
                    options=df.index,
                    format_func=lambda x: f"Row {x} - Stress Level: {df.loc[x, 'stress_level']}, Anxiety: {df.loc[x, 'anxiety_level']} (Depression: {df.loc[x, 'depression']})",
                )
                row_data = df.loc[selected_row].to_dict()
                st.write("### Selected User Details:")
                st.json(row_data)

                st.subheader("πŸ”” Health Advice Based on Articles")
                advice = provide_advice_from_articles(row_data)
                if advice:
                    for i, tip in enumerate(advice, 1):
                        st.write(f"πŸ“Œ **{i}.** {tip}")
                else:
                    st.warning("No specific advice available based on this user's data.")

                # Include graphs in analysis tab
                plot_graphs(df)

            with tab3:
                st.subheader("πŸ“° Mental Health Resources")
                articles = fetch_health_articles("mental health")
                if articles:
                    for article in articles:
                        st.write(f"**{article['title']}**")
                        st.write(f"{article['description']}")
                        st.write(f"[Read more]({article['url']})")
                else:
                    st.write("No articles available at the moment.")

if __name__ == "__main__":
    main()