Commit
·
a035e35
1
Parent(s):
74d40b5
new error graphs with markets
Browse files- app.py +26 -22
- tabs/error.py +140 -1
app.py
CHANGED
|
@@ -19,8 +19,6 @@ from tabs.metrics import (
|
|
| 19 |
default_trade_metric,
|
| 20 |
default_tool_metric,
|
| 21 |
plot_trade_metrics,
|
| 22 |
-
WIDTH,
|
| 23 |
-
HEIGHT,
|
| 24 |
get_trade_metrics_text,
|
| 25 |
)
|
| 26 |
|
|
@@ -44,11 +42,11 @@ from tabs.invalid_markets import (
|
|
| 44 |
)
|
| 45 |
|
| 46 |
from tabs.error import (
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
)
|
| 53 |
from tabs.about import about_olas_predict, about_this_dashboard
|
| 54 |
|
|
@@ -169,9 +167,10 @@ tools_df, trades_df, tools_accuracy_info, invalid_trades = prepare_data()
|
|
| 169 |
|
| 170 |
|
| 171 |
demo = gr.Blocks()
|
|
|
|
|
|
|
|
|
|
| 172 |
|
| 173 |
-
error_df = get_error_data(tools_df=tools_df, inc_tools=INC_TOOLS)
|
| 174 |
-
error_overall_df = get_error_data_overall(error_df=error_df)
|
| 175 |
winning_df = get_tool_winning_rate_by_market(tools_df, inc_tools=INC_TOOLS)
|
| 176 |
# preparing data for the trades graph
|
| 177 |
trades_count_df = get_overall_trades(trades_df=trades_df)
|
|
@@ -336,11 +335,6 @@ with demo:
|
|
| 336 |
with gr.Row():
|
| 337 |
daily_trades = plot_daily_dist_invalid_trades(invalid_trades)
|
| 338 |
|
| 339 |
-
# with gr.Row():
|
| 340 |
-
# gr.Markdown("# Ratio of invalid trades per market")
|
| 341 |
-
# with gr.Row():
|
| 342 |
-
# plot_ratio_invalid_trades_per_market(invalid_trades)
|
| 343 |
-
|
| 344 |
with gr.Row():
|
| 345 |
gr.Markdown("# Top markets with invalid trades")
|
| 346 |
with gr.Row():
|
|
@@ -355,7 +349,9 @@ with demo:
|
|
| 355 |
with gr.Row():
|
| 356 |
gr.Markdown("# All tools errors")
|
| 357 |
with gr.Row():
|
| 358 |
-
error_overall_plot =
|
|
|
|
|
|
|
| 359 |
with gr.Row():
|
| 360 |
gr.Markdown("# Error percentage per tool")
|
| 361 |
with gr.Row():
|
|
@@ -364,12 +360,14 @@ with demo:
|
|
| 364 |
)
|
| 365 |
|
| 366 |
with gr.Row():
|
| 367 |
-
tool_error_plot =
|
| 368 |
-
error_df=
|
| 369 |
)
|
| 370 |
|
| 371 |
def update_tool_error_plot(tool):
|
| 372 |
-
return
|
|
|
|
|
|
|
| 373 |
|
| 374 |
sel_tool.change(
|
| 375 |
update_tool_error_plot, inputs=sel_tool, outputs=tool_error_plot
|
|
@@ -383,7 +381,11 @@ with demo:
|
|
| 383 |
gr.Markdown("# Tools distribution of errors per week")
|
| 384 |
|
| 385 |
with gr.Row():
|
| 386 |
-
choices =
|
|
|
|
|
|
|
|
|
|
|
|
|
| 387 |
# sort the choices by the latest week to be on the top
|
| 388 |
choices = sorted(choices)
|
| 389 |
sel_week = gr.Dropdown(
|
|
@@ -391,12 +393,14 @@ with demo:
|
|
| 391 |
)
|
| 392 |
|
| 393 |
with gr.Row():
|
| 394 |
-
week_error_plot =
|
| 395 |
-
error_df=
|
| 396 |
)
|
| 397 |
|
| 398 |
def update_week_error_plot(selected_week):
|
| 399 |
-
return
|
|
|
|
|
|
|
| 400 |
|
| 401 |
sel_tool.change(
|
| 402 |
update_tool_error_plot, inputs=sel_tool, outputs=tool_error_plot
|
|
|
|
| 19 |
default_trade_metric,
|
| 20 |
default_tool_metric,
|
| 21 |
plot_trade_metrics,
|
|
|
|
|
|
|
| 22 |
get_trade_metrics_text,
|
| 23 |
)
|
| 24 |
|
|
|
|
| 42 |
)
|
| 43 |
|
| 44 |
from tabs.error import (
|
| 45 |
+
plot_week_error_data_by_market,
|
| 46 |
+
plot_error_data_by_market,
|
| 47 |
+
get_error_data_by_market,
|
| 48 |
+
get_error_data_overall_by_market,
|
| 49 |
+
plot_tool_error_data_by_market,
|
| 50 |
)
|
| 51 |
from tabs.about import about_olas_predict, about_this_dashboard
|
| 52 |
|
|
|
|
| 167 |
|
| 168 |
|
| 169 |
demo = gr.Blocks()
|
| 170 |
+
# preparing data for the errors
|
| 171 |
+
error_by_markets = get_error_data_by_market(tools_df=tools_df, inc_tools=INC_TOOLS)
|
| 172 |
+
error_overall_by_markets = get_error_data_overall_by_market(error_df=error_by_markets)
|
| 173 |
|
|
|
|
|
|
|
| 174 |
winning_df = get_tool_winning_rate_by_market(tools_df, inc_tools=INC_TOOLS)
|
| 175 |
# preparing data for the trades graph
|
| 176 |
trades_count_df = get_overall_trades(trades_df=trades_df)
|
|
|
|
| 335 |
with gr.Row():
|
| 336 |
daily_trades = plot_daily_dist_invalid_trades(invalid_trades)
|
| 337 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 338 |
with gr.Row():
|
| 339 |
gr.Markdown("# Top markets with invalid trades")
|
| 340 |
with gr.Row():
|
|
|
|
| 349 |
with gr.Row():
|
| 350 |
gr.Markdown("# All tools errors")
|
| 351 |
with gr.Row():
|
| 352 |
+
error_overall_plot = plot_error_data_by_market(
|
| 353 |
+
error_all_df=error_overall_by_markets
|
| 354 |
+
)
|
| 355 |
with gr.Row():
|
| 356 |
gr.Markdown("# Error percentage per tool")
|
| 357 |
with gr.Row():
|
|
|
|
| 360 |
)
|
| 361 |
|
| 362 |
with gr.Row():
|
| 363 |
+
tool_error_plot = plot_tool_error_data_by_market(
|
| 364 |
+
error_df=error_by_markets, tool=INC_TOOLS[0]
|
| 365 |
)
|
| 366 |
|
| 367 |
def update_tool_error_plot(tool):
|
| 368 |
+
return plot_tool_error_data_by_market(
|
| 369 |
+
error_df=error_by_markets, tool=tool
|
| 370 |
+
)
|
| 371 |
|
| 372 |
sel_tool.change(
|
| 373 |
update_tool_error_plot, inputs=sel_tool, outputs=tool_error_plot
|
|
|
|
| 381 |
gr.Markdown("# Tools distribution of errors per week")
|
| 382 |
|
| 383 |
with gr.Row():
|
| 384 |
+
choices = (
|
| 385 |
+
error_overall_by_markets["request_month_year_week"]
|
| 386 |
+
.unique()
|
| 387 |
+
.tolist()
|
| 388 |
+
)
|
| 389 |
# sort the choices by the latest week to be on the top
|
| 390 |
choices = sorted(choices)
|
| 391 |
sel_week = gr.Dropdown(
|
|
|
|
| 393 |
)
|
| 394 |
|
| 395 |
with gr.Row():
|
| 396 |
+
week_error_plot = plot_week_error_data_by_market(
|
| 397 |
+
error_df=error_by_markets, week=choices[-1]
|
| 398 |
)
|
| 399 |
|
| 400 |
def update_week_error_plot(selected_week):
|
| 401 |
+
return plot_week_error_data_by_market(
|
| 402 |
+
error_df=error_by_markets, week=selected_week
|
| 403 |
+
)
|
| 404 |
|
| 405 |
sel_tool.change(
|
| 406 |
update_tool_error_plot, inputs=sel_tool, outputs=tool_error_plot
|
tabs/error.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
| 1 |
import pandas as pd
|
| 2 |
import gradio as gr
|
| 3 |
from typing import List
|
|
|
|
|
|
|
| 4 |
|
| 5 |
|
| 6 |
HEIGHT = 600
|
|
@@ -22,6 +24,25 @@ def get_error_data(tools_df: pd.DataFrame, inc_tools: List[str]) -> pd.DataFrame
|
|
| 22 |
return error
|
| 23 |
|
| 24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
def get_error_data_overall(error_df: pd.DataFrame) -> pd.DataFrame:
|
| 26 |
"""Gets the error data for the given tools and calculates the error percentage."""
|
| 27 |
error_total = (
|
|
@@ -35,6 +56,19 @@ def get_error_data_overall(error_df: pd.DataFrame) -> pd.DataFrame:
|
|
| 35 |
return error_total
|
| 36 |
|
| 37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
def plot_error_data(error_all_df: pd.DataFrame) -> gr.BarPlot:
|
| 39 |
"""Plots the error data for the given tools and calculates the error percentage."""
|
| 40 |
return gr.BarPlot(
|
|
@@ -53,6 +87,44 @@ def plot_error_data(error_all_df: pd.DataFrame) -> gr.BarPlot:
|
|
| 53 |
)
|
| 54 |
|
| 55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
def plot_tool_error_data(error_df: pd.DataFrame, tool: str) -> gr.BarPlot:
|
| 57 |
"""Plots the error data for the given tool."""
|
| 58 |
error_tool = error_df[error_df["tool"] == tool]
|
|
@@ -62,7 +134,7 @@ def plot_tool_error_data(error_df: pd.DataFrame, tool: str) -> gr.BarPlot:
|
|
| 62 |
return gr.BarPlot(
|
| 63 |
title="Error Percentage",
|
| 64 |
x_title="Week",
|
| 65 |
-
y_title="Error Percentage",
|
| 66 |
show_label=True,
|
| 67 |
interactive=True,
|
| 68 |
show_actions_button=True,
|
|
@@ -75,6 +147,47 @@ def plot_tool_error_data(error_df: pd.DataFrame, tool: str) -> gr.BarPlot:
|
|
| 75 |
)
|
| 76 |
|
| 77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
def plot_week_error_data(error_df: pd.DataFrame, week: str) -> gr.BarPlot:
|
| 79 |
"""Plots the error data for the given week."""
|
| 80 |
error_week = error_df[error_df["request_month_year_week"] == week]
|
|
@@ -94,3 +207,29 @@ def plot_week_error_data(error_df: pd.DataFrame, week: str) -> gr.BarPlot:
|
|
| 94 |
height=HEIGHT,
|
| 95 |
width=WIDTH,
|
| 96 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import pandas as pd
|
| 2 |
import gradio as gr
|
| 3 |
from typing import List
|
| 4 |
+
import plotly.express as px
|
| 5 |
+
from tabs.tool_win import sort_key
|
| 6 |
|
| 7 |
|
| 8 |
HEIGHT = 600
|
|
|
|
| 24 |
return error
|
| 25 |
|
| 26 |
|
| 27 |
+
def get_error_data_by_market(
|
| 28 |
+
tools_df: pd.DataFrame, inc_tools: List[str]
|
| 29 |
+
) -> pd.DataFrame:
|
| 30 |
+
"""Gets the error data for the given tools and calculates the error percentage."""
|
| 31 |
+
tools_inc = tools_df[tools_df["tool"].isin(inc_tools)]
|
| 32 |
+
error = (
|
| 33 |
+
tools_inc.groupby(
|
| 34 |
+
["tool", "request_month_year_week", "market_creator", "error"], sort=False
|
| 35 |
+
)
|
| 36 |
+
.size()
|
| 37 |
+
.unstack()
|
| 38 |
+
.fillna(0)
|
| 39 |
+
.reset_index()
|
| 40 |
+
)
|
| 41 |
+
error["error_perc"] = (error[1] / (error[0] + error[1])) * 100
|
| 42 |
+
error["total_requests"] = error[0] + error[1]
|
| 43 |
+
return error
|
| 44 |
+
|
| 45 |
+
|
| 46 |
def get_error_data_overall(error_df: pd.DataFrame) -> pd.DataFrame:
|
| 47 |
"""Gets the error data for the given tools and calculates the error percentage."""
|
| 48 |
error_total = (
|
|
|
|
| 56 |
return error_total
|
| 57 |
|
| 58 |
|
| 59 |
+
def get_error_data_overall_by_market(error_df: pd.DataFrame) -> pd.DataFrame:
|
| 60 |
+
"""Gets the error data for the given tools and calculates the error percentage."""
|
| 61 |
+
error_total = (
|
| 62 |
+
error_df.groupby(["request_month_year_week", "market_creator"], sort=False)
|
| 63 |
+
.agg({"total_requests": "sum", 1: "sum", 0: "sum"})
|
| 64 |
+
.reset_index()
|
| 65 |
+
)
|
| 66 |
+
error_total["error_perc"] = (error_total[1] / error_total["total_requests"]) * 100
|
| 67 |
+
error_total.columns = error_total.columns.astype(str)
|
| 68 |
+
error_total["error_perc"] = error_total["error_perc"].apply(lambda x: round(x, 4))
|
| 69 |
+
return error_total
|
| 70 |
+
|
| 71 |
+
|
| 72 |
def plot_error_data(error_all_df: pd.DataFrame) -> gr.BarPlot:
|
| 73 |
"""Plots the error data for the given tools and calculates the error percentage."""
|
| 74 |
return gr.BarPlot(
|
|
|
|
| 87 |
)
|
| 88 |
|
| 89 |
|
| 90 |
+
def plot_error_data_by_market(error_all_df: pd.DataFrame) -> gr.Plot:
|
| 91 |
+
|
| 92 |
+
# Sort the unique values of request_month_year_week
|
| 93 |
+
sorted_categories = sorted(
|
| 94 |
+
error_all_df["request_month_year_week"].unique(), key=sort_key
|
| 95 |
+
)
|
| 96 |
+
# Create a categorical type with a specific order
|
| 97 |
+
error_all_df["request_month_year_week"] = pd.Categorical(
|
| 98 |
+
error_all_df["request_month_year_week"],
|
| 99 |
+
categories=sorted_categories,
|
| 100 |
+
ordered=True,
|
| 101 |
+
)
|
| 102 |
+
|
| 103 |
+
# Sort the DataFrame based on the new categorical column
|
| 104 |
+
error_all_df = error_all_df.sort_values("request_month_year_week")
|
| 105 |
+
|
| 106 |
+
fig = px.bar(
|
| 107 |
+
error_all_df,
|
| 108 |
+
x="request_month_year_week",
|
| 109 |
+
y="error_perc",
|
| 110 |
+
color="market_creator",
|
| 111 |
+
barmode="group",
|
| 112 |
+
color_discrete_sequence=["purple", "goldenrod", "darkgreen"],
|
| 113 |
+
category_orders={
|
| 114 |
+
"market_creator": ["pearl", "quickstart", "all"],
|
| 115 |
+
"request_month_year_week": sorted_categories,
|
| 116 |
+
},
|
| 117 |
+
)
|
| 118 |
+
fig.update_layout(
|
| 119 |
+
xaxis_title="Week",
|
| 120 |
+
yaxis_title="Error Percentage",
|
| 121 |
+
legend=dict(yanchor="top", y=0.5),
|
| 122 |
+
)
|
| 123 |
+
fig.update_layout(width=WIDTH, height=HEIGHT)
|
| 124 |
+
fig.update_xaxes(tickformat="%b %d\n%Y")
|
| 125 |
+
return gr.Plot(value=fig)
|
| 126 |
+
|
| 127 |
+
|
| 128 |
def plot_tool_error_data(error_df: pd.DataFrame, tool: str) -> gr.BarPlot:
|
| 129 |
"""Plots the error data for the given tool."""
|
| 130 |
error_tool = error_df[error_df["tool"] == tool]
|
|
|
|
| 134 |
return gr.BarPlot(
|
| 135 |
title="Error Percentage",
|
| 136 |
x_title="Week",
|
| 137 |
+
y_title="Error Percentage %",
|
| 138 |
show_label=True,
|
| 139 |
interactive=True,
|
| 140 |
show_actions_button=True,
|
|
|
|
| 147 |
)
|
| 148 |
|
| 149 |
|
| 150 |
+
def plot_tool_error_data_by_market(error_df: pd.DataFrame, tool: str) -> gr.Plot:
|
| 151 |
+
error_tool = error_df[error_df["tool"] == tool]
|
| 152 |
+
error_tool.columns = error_tool.columns.astype(str)
|
| 153 |
+
error_tool["error_perc"] = error_tool["error_perc"].apply(lambda x: round(x, 4))
|
| 154 |
+
|
| 155 |
+
# Sort the unique values of request_month_year_week
|
| 156 |
+
sorted_categories = sorted(
|
| 157 |
+
error_tool["request_month_year_week"].unique(), key=sort_key
|
| 158 |
+
)
|
| 159 |
+
# Create a categorical type with a specific order
|
| 160 |
+
error_tool["request_month_year_week"] = pd.Categorical(
|
| 161 |
+
error_tool["request_month_year_week"],
|
| 162 |
+
categories=sorted_categories,
|
| 163 |
+
ordered=True,
|
| 164 |
+
)
|
| 165 |
+
|
| 166 |
+
# Sort the DataFrame based on the new categorical column
|
| 167 |
+
error_tool = error_tool.sort_values("request_month_year_week")
|
| 168 |
+
|
| 169 |
+
fig = px.bar(
|
| 170 |
+
error_tool,
|
| 171 |
+
x="request_month_year_week",
|
| 172 |
+
y="error_perc",
|
| 173 |
+
color="market_creator",
|
| 174 |
+
barmode="group",
|
| 175 |
+
color_discrete_sequence=["purple", "goldenrod", "darkgreen"],
|
| 176 |
+
category_orders={
|
| 177 |
+
"market_creator": ["pearl", "quickstart", "all"],
|
| 178 |
+
"request_month_year_week": sorted_categories,
|
| 179 |
+
},
|
| 180 |
+
)
|
| 181 |
+
fig.update_layout(
|
| 182 |
+
xaxis_title="Week",
|
| 183 |
+
yaxis_title="Error Percentage %",
|
| 184 |
+
legend=dict(yanchor="top", y=0.5),
|
| 185 |
+
)
|
| 186 |
+
fig.update_layout(width=WIDTH, height=HEIGHT)
|
| 187 |
+
fig.update_xaxes(tickformat="%b %d\n%Y")
|
| 188 |
+
return gr.Plot(value=fig)
|
| 189 |
+
|
| 190 |
+
|
| 191 |
def plot_week_error_data(error_df: pd.DataFrame, week: str) -> gr.BarPlot:
|
| 192 |
"""Plots the error data for the given week."""
|
| 193 |
error_week = error_df[error_df["request_month_year_week"] == week]
|
|
|
|
| 207 |
height=HEIGHT,
|
| 208 |
width=WIDTH,
|
| 209 |
)
|
| 210 |
+
|
| 211 |
+
|
| 212 |
+
def plot_week_error_data_by_market(error_df: pd.DataFrame, week: str) -> gr.Plot:
|
| 213 |
+
error_week = error_df[error_df["request_month_year_week"] == week]
|
| 214 |
+
error_week.columns = error_week.columns.astype(str)
|
| 215 |
+
error_week["error_perc"] = error_week["error_perc"].apply(lambda x: round(x, 4))
|
| 216 |
+
|
| 217 |
+
fig = px.bar(
|
| 218 |
+
error_week,
|
| 219 |
+
x="tool",
|
| 220 |
+
y="error_perc",
|
| 221 |
+
color="market_creator",
|
| 222 |
+
barmode="group",
|
| 223 |
+
color_discrete_sequence=["purple", "goldenrod", "darkgreen"],
|
| 224 |
+
category_orders={
|
| 225 |
+
"market_creator": ["pearl", "quickstart", "all"],
|
| 226 |
+
},
|
| 227 |
+
)
|
| 228 |
+
fig.update_layout(
|
| 229 |
+
xaxis_title="Tool",
|
| 230 |
+
yaxis_title="Error Percentage %",
|
| 231 |
+
legend=dict(yanchor="top", y=0.5),
|
| 232 |
+
)
|
| 233 |
+
fig.update_layout(width=WIDTH, height=HEIGHT)
|
| 234 |
+
fig.update_xaxes(tickformat="%b %d\n%Y")
|
| 235 |
+
return gr.Plot(value=fig)
|