File size: 4,325 Bytes
4a3adfc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import random
from datetime import timedelta, date
import firebase_admin
from firebase_admin import credentials, storage, firestore
import streamlit as st
import pandas as pd
import plotly.express as px
import json, os, dotenv
from dotenv import load_dotenv
load_dotenv()

os.environ["FIREBASE_CREDENTIAL"] = dotenv.get_key(dotenv.find_dotenv(), "FIREBASE_CREDENTIAL")
cred = credentials.Certificate(json.loads(os.environ.get("FIREBASE_CREDENTIAL")))

# Initialize Firebase (if not already initialized)
if not firebase_admin._apps:
    firebase_admin.initialize_app(cred, {'storageBucket': 'healthhack-store.appspot.com'})

#firebase_admin.initialize_app(cred,{'storageBucket': 'healthhack-store.appspot.com'}) # connecting to firebase
db = firestore.client()

docs = db.collection("clinical_scores").stream()

# for doc in docs:
#     print(f"{doc.id} => {doc.to_dict()}")

# Create a list of dictionaries from the documents
data = []
for doc in docs:
    doc_dict = doc.to_dict()
    doc_dict['document_id'] = doc.id  # In case you need the document ID later
    data.append(doc_dict)

# Create a DataFrame
df = pd.DataFrame(data)

# Set 'name' as the index of the DataFrame
# df.set_index('name', inplace=True)

# Now, 'df' is the DataFrame with 'name' as the index
print(df)

# Load your DataFrame (assuming it's named df)
# df = pd.read_csv('your_file.csv')

# Convert date from string to datetime if it's not already in datetime format
df['date'] = pd.to_datetime(df['date'], errors='coerce')

# Streamlit page configuration
st.set_page_config(page_title="Interactive Data Dashboard", layout="wide")

# Sidebar - Selection
st.sidebar.header("Filter here:")
selected_name = st.sidebar.multiselect(
    "Select the Name:",
    options=df['name'].unique(),
    default=df['name'].unique()
)

df_selection = df[df['name'].isin(selected_name)]


# Main panel
st.title(":bar_chart: Student Performance Dashboard")
st.markdown("##")

# Total attempts by name
total_attempts_by_name = df.groupby("name")['date'].count().reset_index()
total_attempts_by_name.columns = ['name', 'total_attempts']
fig_total_attempts = px.bar(
    total_attempts_by_name,
    x="name",
    y="total_attempts",
    title="<b>Total Attempts by Name</b>",
    color_discrete_sequence=["#0083B8"] * len(total_attempts_by_name),
    template="plotly_white",
)
st.plotly_chart(fig_total_attempts, use_container_width=True)

# Score distribution
df['score'] = pd.Categorical(df['score'], categories=['A', 'B', 'C', 'D', 'E'], ordered=True)
fig_score_distribution = px.histogram(
    df, 
    x="score", 
    title="<b>Score Distribution</b>",
    color_discrete_sequence=["#33CFA5"]
)
st.plotly_chart(fig_score_distribution, use_container_width=True)

# Students with <5 attempts
students_with_less_than_5_attempts = total_attempts_by_name[total_attempts_by_name['total_attempts'] < 5]
fig_less_than_5_attempts = px.bar(
    students_with_less_than_5_attempts,
    x="name",
    y="total_attempts",
    title="<b>Students with <5 Attempts</b>",
    color_discrete_sequence=["#D62728"] * len(students_with_less_than_5_attempts),
    template="plotly_white",
)
st.plotly_chart(fig_less_than_5_attempts, use_container_width=True)

# Selection of a student for detailed view (<5 attempts)
selected_student_less_than_5 = st.selectbox("Select a student with less than 5 attempts to view details:", students_with_less_than_5_attempts['name'])
if selected_student_less_than_5:
    st.write(df[df['name'] == selected_student_less_than_5])

# Students with at least one score of 'C', 'D', 'E'
students_with_cde = df[df['score'].isin(['C', 'D', 'E'])].groupby("name")['date'].count().reset_index()
students_with_cde.columns = ['name', 'total_attempts']
fig_students_with_cde = px.bar(
    students_with_cde,
    x="name",
    y="total_attempts",
    title="<b>Students with at least one score of 'C', 'D', 'E'</b>",
    color_discrete_sequence=["#FF7F0E"] * len(students_with_cde),
    template="plotly_white",
)
st.plotly_chart(fig_students_with_cde, use_container_width=True)

# Selection of a student for detailed view (score of 'C', 'D', 'E')
selected_student_cde = st.selectbox("Select a student with at least one score of 'C', 'D', 'E' to view details:", students_with_cde['name'])
if selected_student_cde:
    st.write(df[df['name'] == selected_student_cde])