import pandas as pd import gradio as gr from typing import List import plotly.express as px from tabs.tool_win import sort_key HEIGHT = 600 WIDTH = 1000 def get_error_data_overall_by_market(error_df: pd.DataFrame) -> pd.DataFrame: """Gets the error data for the given tools and calculates the error percentage.""" error_total = ( error_df.groupby(["request_month_year_week", "market_creator"], sort=False) .agg({"total_requests": "sum", "1": "sum", "0": "sum"}) .reset_index() ) error_total["error_perc"] = (error_total["1"] / error_total["total_requests"]) * 100 error_total.columns = error_total.columns.astype(str) error_total["error_perc"] = error_total["error_perc"].apply(lambda x: round(x, 4)) return error_total def plot_error_data_by_market(error_all_df: pd.DataFrame) -> gr.Plot: # Sort the unique values of request_month_year_week sorted_categories = sorted( error_all_df["request_month_year_week"].unique(), key=sort_key ) # Create a categorical type with a specific order error_all_df["request_month_year_week"] = pd.Categorical( error_all_df["request_month_year_week"], categories=sorted_categories, ordered=True, ) # Sort the DataFrame based on the new categorical column error_all_df = error_all_df.sort_values("request_month_year_week") fig = px.bar( error_all_df, x="request_month_year_week", y="error_perc", color="market_creator", barmode="group", color_discrete_sequence=["purple", "goldenrod", "darkgreen"], category_orders={ "market_creator": ["pearl", "quickstart", "all"], "request_month_year_week": sorted_categories, }, ) fig.update_layout( xaxis_title="Week", yaxis_title="Error Percentage", legend=dict(yanchor="top", y=0.5), ) fig.update_layout(width=WIDTH, height=HEIGHT) fig.update_xaxes(tickformat="%b %d\n%Y") return gr.Plot(value=fig) def plot_tool_error_data_by_market(error_df: pd.DataFrame, tool: str) -> gr.Plot: error_tool = error_df[error_df["tool"] == tool] error_tool.columns = error_tool.columns.astype(str) error_tool["error_perc"] = error_tool["error_perc"].apply(lambda x: round(x, 4)) # Sort the unique values of request_month_year_week sorted_categories = sorted( error_tool["request_month_year_week"].unique(), key=sort_key ) # Create a categorical type with a specific order error_tool["request_month_year_week"] = pd.Categorical( error_tool["request_month_year_week"], categories=sorted_categories, ordered=True, ) # Sort the DataFrame based on the new categorical column error_tool = error_tool.sort_values("request_month_year_week") fig = px.bar( error_tool, x="request_month_year_week", y="error_perc", color="market_creator", barmode="group", color_discrete_sequence=["purple", "goldenrod", "darkgreen"], category_orders={ "market_creator": ["pearl", "quickstart", "all"], "request_month_year_week": sorted_categories, }, ) fig.update_layout( xaxis_title="Week", yaxis_title="Error Percentage %", legend=dict(yanchor="top", y=0.5), ) fig.update_layout(width=WIDTH, height=HEIGHT) fig.update_xaxes(tickformat="%b %d\n%Y") return gr.Plot(value=fig) def plot_week_error_data_by_market(error_df: pd.DataFrame, week: str) -> gr.Plot: error_week = error_df[error_df["request_month_year_week"] == week] error_week.columns = error_week.columns.astype(str) error_week["error_perc"] = error_week["error_perc"].apply(lambda x: round(x, 4)) fig = px.bar( error_week, x="tool", y="error_perc", color="market_creator", barmode="group", color_discrete_sequence=["purple", "goldenrod", "darkgreen"], category_orders={ "market_creator": ["pearl", "quickstart", "all"], }, ) fig.update_layout( xaxis_title="Tool", yaxis_title="Error Percentage %", legend=dict(yanchor="top", y=0.5), ) fig.update_layout(width=WIDTH, height=HEIGHT) fig.update_xaxes(tickformat="%b %d\n%Y") return gr.Plot(value=fig)