KJ commited on
Commit
8b68883
·
1 Parent(s): f8bc989

adding api

Browse files
Files changed (1) hide show
  1. app.py +39 -7
app.py CHANGED
@@ -2,6 +2,7 @@ import streamlit as st
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,10 +52,45 @@ def get_data():
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()
60
 
@@ -120,8 +156,6 @@ if not filtered_df.empty:
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,6 +183,7 @@ if not filtered_df.empty:
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,8 +205,6 @@ if not filtered_df.empty:
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,7 +218,6 @@ if not filtered_df.empty:
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({
 
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
  df["created_at"] = pd.to_datetime(df["created_at"], unit="s")
53
  return df
54
 
 
 
55
  df = get_data()
56
 
57
+ # --- API mode handling ---
58
+ params = st.experimental_get_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()
96
 
 
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
  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
  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
  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({