|
import gradio as gr |
|
import pandas as pd |
|
import plotly.express as px |
|
|
|
trader_metric_choices = [ |
|
"mech calls", |
|
"bet amount", |
|
"earnings", |
|
"net earnings", |
|
"ROI", |
|
"nr_trades", |
|
] |
|
default_trader_metric = "ROI" |
|
|
|
|
|
def get_metrics_text() -> 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 |
|
""" |
|
|
|
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: |
|
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_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: |
|
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_median_roi_by_creation_date(traders_df: pd.DataFrame) -> gr.Plot: |
|
traders_df["creation_date"] = traders_df["creation_timestamp"].dt.date |
|
|
|
traders_all = traders_df.copy(deep=True) |
|
traders_all["market_creator"] = "all" |
|
|
|
|
|
final_traders = pd.concat([traders_all, traders_df], ignore_index=True) |
|
final_traders = final_traders.sort_values(by="creation_date", ascending=True) |
|
roi_daily_metrics = ( |
|
final_traders.groupby( |
|
["creation_date", "market_creator", "trader_address"], sort=False |
|
) |
|
.agg( |
|
median_roi=("roi", "median"), |
|
mean_roi=("roi", "mean"), |
|
total_trades=("roi", "count"), |
|
) |
|
.reset_index() |
|
) |
|
|
|
fig = px.scatter( |
|
roi_daily_metrics, |
|
x="creation_date", |
|
y="median_roi", |
|
facet_col="market_creator", |
|
color="market_creator", |
|
color_discrete_map={ |
|
"pearl": "purple", |
|
"quickstart": "goldenrod", |
|
"all": "darkgreen", |
|
}, |
|
title="Median ROI Over Time by Market Creator", |
|
labels={ |
|
"creation_date": "Creation Date", |
|
"median_roi": "Median ROI (%)", |
|
"market_creator": "Market Creator", |
|
}, |
|
hover_data={ |
|
"creation_date": "|%B %d, %Y", |
|
"median_roi": True, |
|
"mean_roi": True, |
|
"total_trades": True, |
|
}, |
|
category_orders={"market_creator": ["pearl", "quickstart", "all"]}, |
|
|
|
) |
|
|
|
|
|
fig.update_layout( |
|
template="plotly_white", |
|
hovermode="closest", |
|
showlegend=False, |
|
) |
|
|
|
|
|
fig.update_xaxes(matches="x") |
|
fig.update_yaxes(matches="y") |
|
|
|
|
|
vline_date = "2024-09-29" |
|
vline_datetime = pd.to_datetime(vline_date, format="%Y-%m-%d") |
|
fig.add_vline( |
|
x=vline_datetime, |
|
line_dash="dash", |
|
line_color="darkred", |
|
) |
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
import plotly.express as px |
|
|
|
|
|
def create_median_roi_plot(roi_daily_metrics): |
|
""" |
|
Creates a Plotly scatter plot for median ROI over time, colored by market_creator. |
|
|
|
Parameters: |
|
- roi_daily_metrics (pd.DataFrame): Aggregated ROI metrics with columns: |
|
['creation_date', 'market_creator', 'trader_address', 'median_roi', 'mean_roi', 'total_trades'] |
|
|
|
Returns: |
|
- fig (plotly.graph_objs._figure.Figure): The Plotly figure object. |
|
""" |
|
|
|
roi_daily_metrics["creation_date"] = pd.to_datetime( |
|
roi_daily_metrics["creation_date"] |
|
) |
|
|
|
|
|
fig = px.line( |
|
roi_daily_metrics, |
|
x="creation_date", |
|
y="median_roi", |
|
color="market_creator", |
|
markers=True, |
|
title="Median ROI Over Time by Market Creator", |
|
labels={ |
|
"creation_date": "Creation Date", |
|
"median_roi": "Median ROI (%)", |
|
"market_creator": "Market Creator", |
|
}, |
|
hover_data={ |
|
"creation_date": "|%B %d, %Y", |
|
"median_roi": True, |
|
"mean_roi": True, |
|
"total_trades": True, |
|
}, |
|
) |
|
|
|
|
|
fig.update_layout( |
|
xaxis_title="Creation Date", |
|
yaxis_title="Median ROI (%)", |
|
legend_title="Market Creator", |
|
template="plotly_white", |
|
hovermode="x unified", |
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 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), |
|
width=1000, |
|
height=600, |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
|
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|