import os import streamlit as st import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import requests from googleapiclient.discovery import build from google.oauth2.credentials import Credentials # News API Key news_api_key = "AIzaSyAlvoXLqzqcZgVjhQeCNUsQgk6_SGHQNr8" # 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 stress_level_to_string(stress_level): """Convert numerical stress level (0, 1, 2) to a string representation.""" if stress_level == 0: return "Low" elif stress_level == 1: return "Moderate" else: return "High" def provide_advice_from_articles(data): advice = [] stress_level = stress_level_to_string(data['stress_level']) if stress_level == "High": 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']})") elif stress_level == "Moderate": advice.append("Searching for articles related to moderate stress...") articles = fetch_health_articles("moderate stress") for article in articles: advice.append(f"**{article['title']}**\n{article['description']}\n[Read more]({article['url']})") else: advice.append("Searching for articles related to low stress...") articles = fetch_health_articles("low stress") 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.") # 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: {stress_level_to_string(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()