Spaces:
Starting
Starting
import gradio as gr | |
import pandas as pd | |
import plotly.express as px | |
from tabs.market_plots import color_mapping | |
from datetime import datetime | |
trader_metric_choices = [ | |
"mech calls", | |
"bet amount", | |
"earnings", | |
"net earnings", | |
"ROI", | |
"nr_trades", | |
] | |
default_trader_metric = "ROI" | |
def get_metrics_text(daily: bool = False) -> gr.Markdown: | |
metric_text = """ | |
## Metrics at 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 | |
""" | |
if daily: | |
metric_text = """ | |
## Metrics at the graph | |
These metrics are computed daily. 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 get_interpretation_text() -> gr.Markdown: | |
interpretation_text = """ | |
## Meaning of KL-divergence values | |
* Y = 0.05129 | |
* Market accuracy off by 5% | |
* Y = 0.1053 | |
* Market accuracy off by 10% | |
* Y = 0.2876 | |
* Market accuracy off by 25% | |
* Y = 0.5108 | |
* Market accuracy off by 40% | |
* Y = 1.2040 | |
* Market accuracy off by 70% | |
* Y = 2.3026 | |
* Market accuracy off by 90% | |
""" | |
return gr.Markdown(interpretation_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)" | |
elif metric_name == "nr_trades": | |
column_name = metric_name | |
yaxis_title = "Total nr of trades per trader" | |
else: # earnings | |
column_name = metric_name | |
yaxis_title = "Total gross profit per trader (xDAI)" | |
traders_filtered = traders_df[["month_year_week", "market_creator", column_name]] | |
# Convert string dates to datetime and sort them | |
all_dates_dt = sorted( | |
[ | |
datetime.strptime(date, "%b-%d") | |
for date in traders_filtered["month_year_week"].unique() | |
] | |
) | |
# Convert back to string format | |
all_dates = [date.strftime("%b-%d") for date in all_dates_dt] | |
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") | |
# Update layout to force x-axis category order (hotfix for a sorting issue) | |
fig.update_layout(xaxis={"categoryorder": "array", "categoryarray": all_dates}) | |
return gr.Plot( | |
value=fig, | |
) | |
def plot_trader_daily_metrics_by_market_creator( | |
metric_name: str, traders_df: pd.DataFrame | |
) -> gr.Plot: | |
"""Plots the daily 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)" | |
elif metric_name == "nr_trades": | |
column_name = metric_name | |
yaxis_title = "Total nr of trades per trader" | |
else: # earnings | |
column_name = metric_name | |
yaxis_title = "Total gross profit per trader (xDAI)" | |
traders_filtered = traders_df[["creation_date", "market_creator", column_name]] | |
fig = px.box( | |
traders_filtered, | |
x="creation_date", | |
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="Day", | |
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), | |
width=1000, # Adjusted for better fit on laptop screens | |
height=600, # Adjusted for better fit on laptop screens | |
) | |
fig.update_xaxes(tickformat="%b %d\n%Y") | |
return gr.Plot( | |
value=fig, | |
) | |
def plot_total_bet_amount( | |
trades_df: pd.DataFrame, market_filter: str = "all" | |
) -> gr.Plot: | |
"""Plots the trade metrics.""" | |
traders_all = trades_df.copy(deep=True) | |
traders_all["market_creator"] = "all" | |
# merging both dataframes | |
final_traders = pd.concat([traders_all, trades_df], ignore_index=True) | |
final_traders = final_traders.sort_values(by="creation_date", ascending=True) | |
# Create binary staking category | |
final_traders["trader_type"] = final_traders["staking"].apply( | |
lambda x: "non_agent" if x == "non_agent" else "agent" | |
) | |
total_bet_amount = ( | |
final_traders.groupby( | |
["month_year_week", "market_creator", "trader_type"], sort=False | |
)["collateral_amount"] | |
.sum() | |
.reset_index(name="total_bet_amount") | |
) | |
# Convert string dates to datetime and sort them | |
all_dates_dt = sorted( | |
[ | |
datetime.strptime(date, "%b-%d") | |
for date in total_bet_amount["month_year_week"].unique() | |
] | |
) | |
# Convert back to string format | |
all_dates = [date.strftime("%b-%d") for date in all_dates_dt] | |
total_bet_amount["trader_market"] = total_bet_amount.apply( | |
lambda x: (x["trader_type"], x["market_creator"]), axis=1 | |
) | |
color_discrete_sequence = ["purple", "goldenrod", "darkgreen"] | |
if market_filter == "pearl": | |
color_discrete_sequence = ["darkviolet", "goldenrod", "green"] | |
total_bet_amount = total_bet_amount.loc[ | |
total_bet_amount["market_creator"] == "pearl" | |
] | |
elif market_filter == "quickstart": | |
total_bet_amount = total_bet_amount.loc[ | |
total_bet_amount["market_creator"] == "quickstart" | |
] | |
else: | |
total_bet_amount = total_bet_amount.loc[ | |
total_bet_amount["market_creator"] == "all" | |
] | |
fig = px.bar( | |
total_bet_amount, | |
x="month_year_week", | |
y="total_bet_amount", | |
color="trader_market", | |
color_discrete_sequence=color_mapping, | |
category_orders={ | |
"market_creator": ["pearl", "quickstart", "all"], | |
"trader_market": [ | |
("agent", "pearl"), | |
("non_agent", "pearl"), | |
("agent", "quickstart"), | |
("non_agent", "quickstart"), | |
("agent", "all"), | |
("non_agent", "all"), | |
], | |
}, | |
barmode="group", | |
) | |
fig.update_layout( | |
xaxis_title="Week", | |
yaxis_title="Weekly total bet amount per trader type", | |
legend=dict(yanchor="top", y=0.5), | |
) | |
# for axis in fig.layout: | |
# if axis.startswith("xaxis"): | |
# fig.layout[axis].update(title="Week") | |
fig.update_xaxes(tickformat="%b %d") | |
# Update layout to force x-axis category order (hotfix for a sorting issue) | |
fig.update_layout(xaxis={"categoryorder": "array", "categoryarray": all_dates}) | |
return gr.Plot( | |
value=fig, | |
) | |