From 657bd37cdd2a41adbe0535bfb3ddab1da36fa614 Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Sat, 31 Jan 2026 16:46:15 +0000 Subject: [PATCH] feat: add grouped time analysis endpoint --- server/app.py | 14 ++++++++++++++ server/stat_gen.py | 28 +++++++++++++++++++--------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/server/app.py b/server/app.py index 580396a..0c8fac2 100644 --- a/server/app.py +++ b/server/app.py @@ -3,6 +3,7 @@ from flask_cors import CORS from server.stat_gen import StatGen import pandas as pd +import traceback app = Flask(__name__) @@ -102,6 +103,19 @@ def get_summary(): return jsonify({"error": f"Malformed or missing data: {str(e)}"}), 400 except Exception as e: return jsonify({"error": f"An unexpected error occurred: {str(e)}"}), 500 + +@app.route("/stats/time", methods=["GET"]) +def get_time_analysis(): + if stat_obj is None: + return jsonify({"error": "No data uploaded"}), 400 + + try: + return jsonify(stat_obj.time_analysis()), 200 + except ValueError as e: + return jsonify({"error": f"Malformed or missing data: {str(e)}"}), 400 + except Exception as e: + print(traceback.format_exc()) + return jsonify({"error": f"An unexpected error occurred: {str(e)}"}), 500 @app.route('/reset', methods=["GET"]) def reset_dataset(): diff --git a/server/stat_gen.py b/server/stat_gen.py index 60d6536..b9311e4 100644 --- a/server/stat_gen.py +++ b/server/stat_gen.py @@ -38,25 +38,35 @@ class StatGen: df["weekday"] = df["dt"].dt.day_name() ## Public - def get_heatmap(self) -> pd.DataFrame: + def time_analysis(self) -> pd.DataFrame: + per_day = ( + self.df.groupby("date") + .size() + .reset_index(name="count") + ) + weekday_order = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] - self.df["weekday"] = pd.Categorical( - self.df["weekday"], - categories=weekday_order, - ordered=True - ) - - return ( + heatmap = ( self.df - .groupby(["weekday", "hour"], observed=True) + .assign(weekday=pd.Categorical(self.df["weekday"], weekday_order, ordered=True)) + .groupby(["weekday", "hour"]) .size() .unstack(fill_value=0) .reindex(columns=range(24), fill_value=0) ) + heatmap.columns = heatmap.columns.map(str) + + burst_index = per_day["count"].std() / max(per_day["count"].mean(), 1) + + return { + "events_per_day": per_day.to_dict(orient="records"), + "weekday_hour_heatmap": heatmap.reset_index().to_dict(orient="records"), + "burstiness": round(burst_index, 2) + } def get_word_frequencies(self, limit: int = 100) -> pd.DataFrame: texts = (