|
import gradio as gr |
|
import pandas as pd |
|
import plotly.express as px |
|
|
|
trader_metric_choices = [ |
|
"mech calls", |
|
"bet amount", |
|
"earnings", |
|
"net earnings", |
|
"ROI", |
|
] |
|
default_trader_metric = "ROI" |
|
|
|
|
|
def get_metrics_text() -> gr.Markdown: |
|
metric_text = """ |
|
## Description of the graph |
|
These metrics are computed weekly. The statistical measures are: |
|
* min, max, 25th(q1), 50th(median) and 75th(q2) percentiles |
|
* the upper and lower fences to delimit possible outliers |
|
* the average values as the dotted lines |
|
""" |
|
|
|
return gr.Markdown(metric_text) |
|
|
|
|
|
def plot_trader_metrics_by_market_creator( |
|
metric_name: str, traders_df: pd.DataFrame |
|
) -> gr.Plot: |
|
"""Plots the weekly trader metrics.""" |
|
|
|
if metric_name == "mech calls": |
|
metric_name = "mech_calls" |
|
column_name = "nr_mech_calls" |
|
yaxis_title = "Total nr of mech calls per trader" |
|
elif metric_name == "ROI": |
|
column_name = "roi" |
|
yaxis_title = "Total ROI (net profit/cost)" |
|
elif metric_name == "bet amount": |
|
metric_name = "bet_amount" |
|
column_name = metric_name |
|
yaxis_title = "Total bet amount per trader (xDAI)" |
|
elif metric_name == "net earnings": |
|
metric_name = "net_earnings" |
|
column_name = metric_name |
|
yaxis_title = "Total net profit per trader (xDAI)" |
|
else: |
|
column_name = metric_name |
|
yaxis_title = "Total gross profit per trader (xDAI)" |
|
|
|
traders_filtered = traders_df[["month_year_week", "market_creator", column_name]] |
|
|
|
fig = px.box( |
|
traders_filtered, |
|
x="month_year_week", |
|
y=column_name, |
|
color="market_creator", |
|
color_discrete_sequence=["purple", "goldenrod", "darkgreen"], |
|
category_orders={"market_creator": ["pearl", "quickstart", "all"]}, |
|
) |
|
fig.update_traces(boxmean=True) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title=yaxis_title, |
|
legend=dict(yanchor="top", y=0.5), |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
|
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
def plot_trader_metrics_by_trader_type(metric_name: str, traders_df: pd.DataFrame): |
|
"""Plots the weekly trader metrics.""" |
|
|
|
if metric_name == "mech calls": |
|
metric_name = "mech_calls" |
|
column_name = "nr_mech_calls" |
|
yaxis_title = "Total nr of mech calls per trader" |
|
elif metric_name == "ROI": |
|
column_name = "roi" |
|
yaxis_title = "Total ROI (net profit/cost)" |
|
elif metric_name == "bet amount": |
|
metric_name = "bet_amount" |
|
column_name = metric_name |
|
yaxis_title = "Total bet amount per trader (xDAI)" |
|
elif metric_name == "net earnings": |
|
metric_name = "net_earnings" |
|
column_name = metric_name |
|
yaxis_title = "Total net profit per trader (xDAI)" |
|
else: |
|
column_name = metric_name |
|
yaxis_title = "Total gross profit per trader (xDAI)" |
|
|
|
traders_filtered = traders_df[["month_year_week", "trader_type", column_name]] |
|
|
|
fig = px.box( |
|
traders_filtered, |
|
x="month_year_week", |
|
y=column_name, |
|
color="trader_type", |
|
color_discrete_sequence=["gray", "orange", "darkblue"], |
|
category_orders={"trader_type": ["singlebet", "multibet", "all"]}, |
|
) |
|
fig.update_traces(boxmean=True) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title=yaxis_title, |
|
legend=dict(yanchor="top", y=0.5), |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
|
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
def plot_winning_metric_per_trader(traders_winning_df: pd.DataFrame) -> gr.Plot: |
|
fig = px.box( |
|
traders_winning_df, |
|
x="month_year_week", |
|
y="winning_perc", |
|
color="market_creator", |
|
color_discrete_sequence=["purple", "goldenrod", "darkgreen"], |
|
category_orders={"market_creator": ["pearl", "quickstart", "all"]}, |
|
) |
|
fig.update_traces(boxmean=True) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Weekly winning percentage %", |
|
legend=dict(yanchor="top", y=0.5), |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
|
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|