GuglielmoTor commited on
Commit
83111cb
·
verified ·
1 Parent(s): 8f25997

Update analytics_fetch_and_rendering.py

Browse files
Files changed (1) hide show
  1. analytics_fetch_and_rendering.py +70 -1
analytics_fetch_and_rendering.py CHANGED
@@ -182,6 +182,74 @@ def plot_avg_engagement_rate(data):
182
  plt.tight_layout()
183
  return fig
184
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
 
186
  def fetch_and_render_analytics(client_id, token):
187
  loading = gr.update(value="<p>Loading follower count...</p>", visible=True)
@@ -195,6 +263,7 @@ def fetch_and_render_analytics(client_id, token):
195
  name, count, gains = fetch_analytics_data(client_id, token)
196
  posts, org_name, sentiments = fetch_posts_and_stats(client_id, token, count=30)
197
  engagement_data = compute_monthly_avg_engagement_rate(posts)
 
198
 
199
 
200
  count_html = f"""
@@ -205,7 +274,7 @@ def fetch_and_render_analytics(client_id, token):
205
  <p style='font-size:0.9em; color:#777;'>(As of latest data)</p>
206
  </div>
207
  """
208
- return gr.update(value=count_html, visible=True), gr.update(value=plot_follower_gains(gains), visible=True), gr.update(value=plot_growth_rate(gains, count), visible=True), gr.update(value=plot_avg_engagement_rate(engagement_data), visible=True)
209
 
210
  except Exception as e:
211
  error = display_error("Analytics load failed.", e).get('value', "<p style='color:red;'>Error loading data.</p>")
 
182
  plt.tight_layout()
183
  return fig
184
 
185
+ def compute_post_interaction_metrics(posts):
186
+ from collections import defaultdict
187
+
188
+ if not posts:
189
+ return []
190
+
191
+ monthly_stats = defaultdict(lambda: {
192
+ "comments": 0,
193
+ "shares": 0,
194
+ "clicks": 0,
195
+ "likes": 0,
196
+ "posts": 0
197
+ })
198
+
199
+ for post in posts:
200
+ try:
201
+ month = post["when"][:7] # YYYY-MM
202
+ monthly_stats[month]["comments"] += post.get("comments", 0)
203
+ monthly_stats[month]["shares"] += post.get("shares", 0)
204
+ monthly_stats[month]["clicks"] += post.get("clicks", 0)
205
+ monthly_stats[month]["likes"] += post.get("likes", 0)
206
+ monthly_stats[month]["posts"] += 1
207
+ except Exception:
208
+ continue
209
+
210
+ results = []
211
+ for month in sorted(monthly_stats.keys()):
212
+ stats = monthly_stats[month]
213
+ total_engagement = stats["comments"] + stats["shares"] + stats["clicks"] + stats["likes"]
214
+ posts_count = stats["posts"] or 1 # Avoid division by zero
215
+
216
+ results.append({
217
+ "month": month,
218
+ "comments_per_post": round(stats["comments"] / posts_count, 2),
219
+ "shares_per_post": round(stats["shares"] / posts_count, 2),
220
+ "clicks_per_post": round(stats["clicks"] / posts_count, 2),
221
+ "comment_share_of_engagement": round((stats["comments"] / total_engagement) * 100 if total_engagement else 0, 2)
222
+ })
223
+
224
+ return results
225
+
226
+ def plot_interaction_metrics(data):
227
+ if not data:
228
+ fig, ax = plt.subplots(figsize=(10, 5))
229
+ ax.text(0.5, 0.5, 'No interaction data.', ha='center', va='center', transform=ax.transAxes)
230
+ ax.set_title('Post Interaction Metrics')
231
+ ax.set_xticks([]); ax.set_yticks([])
232
+ return fig
233
+
234
+ months = [d["month"] for d in data]
235
+ comments_pp = [d["comments_per_post"] for d in data]
236
+ shares_pp = [d["shares_per_post"] for d in data]
237
+ clicks_pp = [d["clicks_per_post"] for d in data]
238
+ comment_share = [d["comment_share_of_engagement"] for d in data]
239
+
240
+ fig, ax = plt.subplots(figsize=(12, 6))
241
+ ax.plot(months, comments_pp, label="Comments/Post", marker="o", color="#1f77b4")
242
+ ax.plot(months, shares_pp, label="Shares/Post", marker="s", color="#ff7f0e")
243
+ ax.plot(months, clicks_pp, label="Clicks/Post", marker="^", color="#2ca02c")
244
+ ax.plot(months, comment_share, label="Comment Share of Engagement (%)", marker="x", linestyle="--", color="#d62728")
245
+
246
+ ax.set(title="Post Interaction Metrics", xlabel="Month", ylabel="Values")
247
+ ax.tick_params(axis='x', rotation=45)
248
+ ax.legend()
249
+ plt.tight_layout()
250
+ return fig
251
+
252
+
253
 
254
  def fetch_and_render_analytics(client_id, token):
255
  loading = gr.update(value="<p>Loading follower count...</p>", visible=True)
 
263
  name, count, gains = fetch_analytics_data(client_id, token)
264
  posts, org_name, sentiments = fetch_posts_and_stats(client_id, token, count=30)
265
  engagement_data = compute_monthly_avg_engagement_rate(posts)
266
+ interaction_data = compute_post_interaction_metrics(posts)
267
 
268
 
269
  count_html = f"""
 
274
  <p style='font-size:0.9em; color:#777;'>(As of latest data)</p>
275
  </div>
276
  """
277
+ return gr.update(value=count_html, visible=True), gr.update(value=plot_follower_gains(gains), visible=True), gr.update(value=plot_growth_rate(gains, count), visible=True), gr.update(value=plot_avg_engagement_rate(engagement_data), visible=True), gr.update(value=plot_interaction_metrics(interaction_data), visible=True)
278
 
279
  except Exception as e:
280
  error = display_error("Analytics load failed.", e).get('value', "<p style='color:red;'>Error loading data.</p>")