Spaces:
Sleeping
Sleeping
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") | |
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.") | |