diff --git a/TwitchChannelPointsMiner/classes/AnalyticsServer.py b/TwitchChannelPointsMiner/classes/AnalyticsServer.py index 42ef2a9..353b102 100644 --- a/TwitchChannelPointsMiner/classes/AnalyticsServer.py +++ b/TwitchChannelPointsMiner/classes/AnalyticsServer.py @@ -5,6 +5,7 @@ from datetime import datetime from pathlib import Path from threading import Thread +import pandas as pd from flask import Flask, Response, cli, render_template, request from TwitchChannelPointsMiner.classes.Settings import Settings @@ -22,29 +23,59 @@ def streamers_available(): ] +def aggregate(df, freq="30Min"): + df_base_events = df[(df.z == "Watch") | (df.z == "Claim")] + df_other_events = df[(df.z != "Watch") & (df.z != "Claim")] + + be = df_base_events.groupby([pd.Grouper(freq=freq, key="datetime"), "z"]).max() + be = be.reset_index() + + oe = df_other_events.groupby([pd.Grouper(freq=freq, key="datetime"), "z"]).max() + oe = oe.reset_index() + + result = pd.concat([be, oe]) + return result + + def filter_datas(start_date, end_date, datas): # Note: https://stackoverflow.com/questions/4676195/why-do-i-need-to-multiply-unix-timestamps-by-1000-in-javascript start_date = ( - datetime.strptime(start_date, "%Y-%m-%d").timestamp() * 1000 - if start_date is not None - else 0 + datetime.strptime(start_date, "%Y-%m-%d") if start_date is not None else 0 ) end_date = ( - datetime.strptime(end_date, "%Y-%m-%d").timestamp() * 1000 + datetime.strptime(end_date, "%Y-%m-%d") if end_date is not None - else datetime.now().timestamp() * 1000 + else datetime.now() ) - datas["series"] = ( - [d for d in datas["series"] if start_date <= d["x"] <= end_date] - if "series" in datas - else [] - ) - datas["annotations"] = ( - [d for d in datas["annotations"] if start_date <= d["x"] <= end_date] - if "annotations" in datas - else [] - ) + if "series" in datas: + df = pd.DataFrame(datas["series"]) + df["datetime"] = pd.to_datetime(df.x // 1000, unit="s") + + df = df[(df["datetime"] > start_date) & (df["datetime"] <= end_date)] + df = aggregate(df) + + datas["series"] = ( + df.drop(columns="datetime") + .sort_values(by="x", ascending=True) + .to_dict("records") + ) + else: + datas["series"] = [] + + if "annotations" in datas: + df = pd.DataFrame(datas["annotations"]) + df["datetime"] = pd.to_datetime(df.x // 1000, unit="s") + + df = df[(df["datetime"] > start_date) & (df["datetime"] <= end_date)] + + datas["annotations"] = ( + df.drop(columns="datetime") + .sort_values(by="x", ascending=True) + .to_dict("records") + ) + else: + datas["annotations"] = [] return datas diff --git a/requirements.txt b/requirements.txt index 6423ea2..df5fcbe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ millify==0.1.1 pre-commit==2.13.0 colorama==0.4.4 flask==2.0.1 -irc==19.0.1 \ No newline at end of file +irc==19.0.1 +pandas==1.3.4