Update monitoring_app.py
Browse files- monitoring_app.py +8 -15
monitoring_app.py
CHANGED
|
@@ -47,12 +47,10 @@ def load_monitoring_summary() -> dict:
|
|
| 47 |
def apply_filters(df: pd.DataFrame) -> pd.DataFrame:
|
| 48 |
st.sidebar.header("Monitoring Filters")
|
| 49 |
|
| 50 |
-
status_options = sorted(df["overall_status"].dropna().unique().tolist()) if not df.empty else []
|
| 51 |
label_judgment_options = sorted(df["label_judgment"].dropna().unique().tolist()) if not df.empty else []
|
| 52 |
predicted_label_options = sorted(df["predicted_label"].dropna().unique().tolist()) if not df.empty else []
|
| 53 |
source_options = sorted(df["source"].dropna().unique().tolist()) if not df.empty else []
|
| 54 |
|
| 55 |
-
selected_status = st.sidebar.multiselect("Overall status", status_options, default=status_options)
|
| 56 |
selected_label_judgment = st.sidebar.multiselect("Label judgment", label_judgment_options, default=label_judgment_options)
|
| 57 |
selected_predicted_labels = st.sidebar.multiselect("Predicted labels", predicted_label_options, default=[])
|
| 58 |
selected_sources = st.sidebar.multiselect("Sources", source_options, default=[])
|
|
@@ -75,9 +73,6 @@ def apply_filters(df: pd.DataFrame) -> pd.DataFrame:
|
|
| 75 |
|
| 76 |
filtered = df.copy()
|
| 77 |
|
| 78 |
-
if selected_status:
|
| 79 |
-
filtered = filtered[filtered["overall_status"].isin(selected_status)]
|
| 80 |
-
|
| 81 |
if selected_label_judgment:
|
| 82 |
filtered = filtered[filtered["label_judgment"].isin(selected_label_judgment)]
|
| 83 |
|
|
@@ -111,23 +106,22 @@ def render_summary(summary: dict, df: pd.DataFrame) -> None:
|
|
| 111 |
st.subheader("Monitoring Overview")
|
| 112 |
|
| 113 |
c1, c2, c3, c4 = st.columns(4)
|
|
|
|
| 114 |
c1.metric("Total monitored", summary.get("total_monitored", 0))
|
| 115 |
c2.metric("Needs review", summary.get("needs_review", 0))
|
| 116 |
c3.metric("Shown after filters", len(df))
|
| 117 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
|
| 119 |
if df.empty:
|
| 120 |
st.info("No monitoring results match the current filters.")
|
| 121 |
return
|
| 122 |
|
| 123 |
-
st.markdown("#### Monitoring status distribution")
|
| 124 |
-
status_df = df["overall_status"].value_counts().rename_axis("overall_status").reset_index(name="count")
|
| 125 |
-
st.bar_chart(status_df.set_index("overall_status"))
|
| 126 |
-
|
| 127 |
-
st.markdown("#### Label judgment distribution")
|
| 128 |
-
label_df = df["label_judgment"].value_counts().rename_axis("label_judgment").reset_index(name="count")
|
| 129 |
-
st.bar_chart(label_df.set_index("label_judgment"))
|
| 130 |
-
|
| 131 |
def render_problem_patterns(df: pd.DataFrame) -> None:
|
| 132 |
st.subheader("Problem Patterns")
|
| 133 |
|
|
@@ -216,7 +210,6 @@ def render_full_table(df: pd.DataFrame) -> None:
|
|
| 216 |
"predicted_label",
|
| 217 |
"label_judgment",
|
| 218 |
"label_confidence",
|
| 219 |
-
"overall_status",
|
| 220 |
"requires_human_review",
|
| 221 |
"title",
|
| 222 |
]
|
|
|
|
| 47 |
def apply_filters(df: pd.DataFrame) -> pd.DataFrame:
|
| 48 |
st.sidebar.header("Monitoring Filters")
|
| 49 |
|
|
|
|
| 50 |
label_judgment_options = sorted(df["label_judgment"].dropna().unique().tolist()) if not df.empty else []
|
| 51 |
predicted_label_options = sorted(df["predicted_label"].dropna().unique().tolist()) if not df.empty else []
|
| 52 |
source_options = sorted(df["source"].dropna().unique().tolist()) if not df.empty else []
|
| 53 |
|
|
|
|
| 54 |
selected_label_judgment = st.sidebar.multiselect("Label judgment", label_judgment_options, default=label_judgment_options)
|
| 55 |
selected_predicted_labels = st.sidebar.multiselect("Predicted labels", predicted_label_options, default=[])
|
| 56 |
selected_sources = st.sidebar.multiselect("Sources", source_options, default=[])
|
|
|
|
| 73 |
|
| 74 |
filtered = df.copy()
|
| 75 |
|
|
|
|
|
|
|
|
|
|
| 76 |
if selected_label_judgment:
|
| 77 |
filtered = filtered[filtered["label_judgment"].isin(selected_label_judgment)]
|
| 78 |
|
|
|
|
| 106 |
st.subheader("Monitoring Overview")
|
| 107 |
|
| 108 |
c1, c2, c3, c4 = st.columns(4)
|
| 109 |
+
|
| 110 |
c1.metric("Total monitored", summary.get("total_monitored", 0))
|
| 111 |
c2.metric("Needs review", summary.get("needs_review", 0))
|
| 112 |
c3.metric("Shown after filters", len(df))
|
| 113 |
+
|
| 114 |
+
c4.metric(
|
| 115 |
+
"Problem rate",
|
| 116 |
+
f"{(len(df[df['overall_status'] != 'ok']) / len(df) * 100):.1f}%"
|
| 117 |
+
if len(df)
|
| 118 |
+
else "0.0%"
|
| 119 |
+
)
|
| 120 |
|
| 121 |
if df.empty:
|
| 122 |
st.info("No monitoring results match the current filters.")
|
| 123 |
return
|
| 124 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
def render_problem_patterns(df: pd.DataFrame) -> None:
|
| 126 |
st.subheader("Problem Patterns")
|
| 127 |
|
|
|
|
| 210 |
"predicted_label",
|
| 211 |
"label_judgment",
|
| 212 |
"label_confidence",
|
|
|
|
| 213 |
"requires_human_review",
|
| 214 |
"title",
|
| 215 |
]
|