import streamlit as st import pandas as pd import psycopg2 import os # Load DB credentials from Hugging Face secrets or environment variables DB_HOST = os.getenv("DB_HOST") DB_PORT = os.getenv("DB_PORT", "5432") DB_NAME = os.getenv("DB_NAME") DB_USER = os.getenv("DB_USER") DB_PASSWORD = os.getenv("DB_PASSWORD") @st.cache_data(ttl=600) def get_data(): try: conn = psycopg2.connect( host=DB_HOST, port=DB_PORT, dbname=DB_NAME, user=DB_USER, password=DB_PASSWORD, sslmode="require" ) query = "SELECT country, year, section, question_code, question_text, answer_code, answer_text FROM survey_info;" df = pd.read_sql_query(query, conn) conn.close() return df except Exception as e: st.error(f"Failed to connect to the database: {e}") st.stop() # Load data df = get_data() # Streamlit UI st.title("🌍 CGD Survey Explorer (Live DB)") st.sidebar.header("🔎 Filter Questions") # Dropdown filters (optional) countries = sorted(df["country"].dropna().unique()) years = sorted(df["year"].dropna().unique()) selected_countries = st.sidebar.multiselect("Select Country", countries, default=countries) selected_years = st.sidebar.multiselect("Select Year", years, default=years) keyword = st.sidebar.text_input("Keyword Search (in question)", "") # Column selector all_columns = df.columns.tolist() default_columns = ["country", "question", "responses"] selected_columns = st.sidebar.multiselect("Columns to Display", all_columns, default=default_columns) # Apply filters filtered = df[ df["country"].isin(selected_countries) & df["year"].isin(selected_years) ] if keyword: filtered = filtered[filtered["question"].str.contains(keyword, case=False, na=False)] # Show results st.markdown("### Filtered Results") if not filtered.empty: st.dataframe(filtered[selected_columns]) else: st.info("No matching questions found.")