KJ commited on
Commit ·
8f43b7e
1
Parent(s): 82cb089
reverting api
Browse files
app.py
CHANGED
|
@@ -2,7 +2,6 @@ import streamlit as st
|
|
| 2 |
import pandas as pd
|
| 3 |
import plotly.express as px
|
| 4 |
from sqlalchemy import create_engine, text
|
| 5 |
-
from urllib.parse import unquote
|
| 6 |
|
| 7 |
# --- Language toggle ---
|
| 8 |
LANG = st.radio("Language / Език", ["English", "Български"], horizontal=True)
|
|
@@ -52,44 +51,9 @@ def get_data():
|
|
| 52 |
df["created_at"] = pd.to_datetime(df["created_at"], unit="s")
|
| 53 |
return df
|
| 54 |
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
# --- API mode handling ---
|
| 58 |
-
params = st.query_params
|
| 59 |
-
route = params.get("api", [None])[0]
|
| 60 |
-
|
| 61 |
-
if route == "meta":
|
| 62 |
-
st.json({
|
| 63 |
-
"entities": sorted(df["entity"].dropna().unique().tolist()),
|
| 64 |
-
"domains": sorted(df["domain"].dropna().unique().tolist()),
|
| 65 |
-
"score_types": ["entity_score", "title_score", "overall_score"],
|
| 66 |
-
"min_date": df["created_at"].min().isoformat(),
|
| 67 |
-
"max_date": df["created_at"].max().isoformat(),
|
| 68 |
-
})
|
| 69 |
-
st.stop()
|
| 70 |
-
|
| 71 |
-
elif route == "data":
|
| 72 |
-
entity = unquote(params.get("entity", [""])[0])
|
| 73 |
-
domain = unquote(params.get("domain", [""])[0])
|
| 74 |
-
score = params.get("score", ["entity_score"])[0]
|
| 75 |
-
|
| 76 |
-
df_filtered = df.copy()
|
| 77 |
-
if entity:
|
| 78 |
-
df_filtered = df_filtered[df_filtered["entity"] == entity]
|
| 79 |
-
if domain:
|
| 80 |
-
df_filtered = df_filtered[df_filtered["domain"] == domain]
|
| 81 |
-
|
| 82 |
-
if score not in ["entity_score", "title_score", "overall_score"]:
|
| 83 |
-
st.json({"error": "Invalid score type"})
|
| 84 |
-
else:
|
| 85 |
-
df_out = df_filtered[["created_at", "entity", "domain", score]].copy()
|
| 86 |
-
df_out["created_at"] = df_out["created_at"].astype(str)
|
| 87 |
-
df_out.rename(columns={score: "score"}, inplace=True)
|
| 88 |
-
st.json(df_out.to_dict(orient="records"))
|
| 89 |
-
st.stop()
|
| 90 |
-
|
| 91 |
-
# --- UI (non-API) ---
|
| 92 |
st.title(T[LANG]["title"])
|
|
|
|
| 93 |
|
| 94 |
entity_counts = df["entity"].value_counts()
|
| 95 |
domain_counts = df["domain"].value_counts()
|
|
@@ -156,6 +120,8 @@ if not filtered_df.empty:
|
|
| 156 |
return label
|
| 157 |
|
| 158 |
grouped["label"] = grouped.apply(build_label, axis=1)
|
|
|
|
|
|
|
| 159 |
label_avg = grouped.groupby("label")["score"].mean().reset_index(name="avg_score")
|
| 160 |
grouped = grouped.merge(label_avg, on="label")
|
| 161 |
grouped = grouped.sort_values(by=["avg_score", "date"], ascending=[False, True])
|
|
@@ -183,7 +149,6 @@ if not filtered_df.empty:
|
|
| 183 |
stats_group = ["entity"]
|
| 184 |
if group_by_domain:
|
| 185 |
stats_group.append("domain")
|
| 186 |
-
|
| 187 |
stats = (
|
| 188 |
filtered_df.groupby(stats_group)[score_type]
|
| 189 |
.agg(["mean", "count"])
|
|
@@ -205,6 +170,8 @@ if not filtered_df.empty:
|
|
| 205 |
return label
|
| 206 |
|
| 207 |
grouped["label"] = grouped.apply(build_label, axis=1)
|
|
|
|
|
|
|
| 208 |
label_avg = grouped.groupby("label")[score_type].mean().reset_index(name="avg_score")
|
| 209 |
grouped = grouped.merge(label_avg, on="label")
|
| 210 |
grouped = grouped.sort_values(by=["avg_score", "date"], ascending=[False, True])
|
|
@@ -218,6 +185,7 @@ if not filtered_df.empty:
|
|
| 218 |
title=T[LANG]["avg_over_time"].format(score_type.replace("_", " ").title())
|
| 219 |
)
|
| 220 |
|
|
|
|
| 221 |
shapes = []
|
| 222 |
for y in range(-10, 11):
|
| 223 |
shapes.append({
|
|
|
|
| 2 |
import pandas as pd
|
| 3 |
import plotly.express as px
|
| 4 |
from sqlalchemy import create_engine, text
|
|
|
|
| 5 |
|
| 6 |
# --- Language toggle ---
|
| 7 |
LANG = st.radio("Language / Език", ["English", "Български"], horizontal=True)
|
|
|
|
| 51 |
df["created_at"] = pd.to_datetime(df["created_at"], unit="s")
|
| 52 |
return df
|
| 53 |
|
| 54 |
+
# --- UI ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
st.title(T[LANG]["title"])
|
| 56 |
+
df = get_data()
|
| 57 |
|
| 58 |
entity_counts = df["entity"].value_counts()
|
| 59 |
domain_counts = df["domain"].value_counts()
|
|
|
|
| 120 |
return label
|
| 121 |
|
| 122 |
grouped["label"] = grouped.apply(build_label, axis=1)
|
| 123 |
+
|
| 124 |
+
# ✅ Sort by avg score then by date
|
| 125 |
label_avg = grouped.groupby("label")["score"].mean().reset_index(name="avg_score")
|
| 126 |
grouped = grouped.merge(label_avg, on="label")
|
| 127 |
grouped = grouped.sort_values(by=["avg_score", "date"], ascending=[False, True])
|
|
|
|
| 149 |
stats_group = ["entity"]
|
| 150 |
if group_by_domain:
|
| 151 |
stats_group.append("domain")
|
|
|
|
| 152 |
stats = (
|
| 153 |
filtered_df.groupby(stats_group)[score_type]
|
| 154 |
.agg(["mean", "count"])
|
|
|
|
| 170 |
return label
|
| 171 |
|
| 172 |
grouped["label"] = grouped.apply(build_label, axis=1)
|
| 173 |
+
|
| 174 |
+
# ✅ Sort by avg score then by date
|
| 175 |
label_avg = grouped.groupby("label")[score_type].mean().reset_index(name="avg_score")
|
| 176 |
grouped = grouped.merge(label_avg, on="label")
|
| 177 |
grouped = grouped.sort_values(by=["avg_score", "date"], ascending=[False, True])
|
|
|
|
| 185 |
title=T[LANG]["avg_over_time"].format(score_type.replace("_", " ").title())
|
| 186 |
)
|
| 187 |
|
| 188 |
+
# Grid lines at every integer, thicker at -5 and 5
|
| 189 |
shapes = []
|
| 190 |
for y in range(-10, 11):
|
| 191 |
shapes.append({
|