|
import pandas as pd |
|
import gradio as gr |
|
import plotly.express as px |
|
import plotly.graph_objects as go |
|
from plotly.subplots import make_subplots |
|
import matplotlib.pyplot as plt |
|
import seaborn as sns |
|
from tabs.daily_graphs import color_mapping |
|
from datetime import datetime |
|
|
|
color_mapping = [ |
|
"darkviolet", |
|
"purple", |
|
"goldenrod", |
|
"darkgoldenrod", |
|
"green", |
|
"darkgreen", |
|
] |
|
|
|
|
|
def plot_kl_div_per_market(closed_markets: pd.DataFrame) -> gr.Plot: |
|
|
|
|
|
all_markets = closed_markets.copy(deep=True) |
|
all_markets["market_creator"] = "all" |
|
|
|
|
|
final_markets = pd.concat([closed_markets, all_markets], ignore_index=True) |
|
final_markets = final_markets.sort_values(by="opening_datetime", ascending=True) |
|
|
|
fig = px.box( |
|
final_markets, |
|
x="month_year_week", |
|
y="kl_divergence", |
|
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="Markets closing Week", |
|
yaxis_title="Kullback–Leibler divergence", |
|
legend=dict(yanchor="top", y=0.5), |
|
width=800, |
|
height=600, |
|
) |
|
|
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
|
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
def plot_kl_div_with_off_by(closed_markets: pd.DataFrame) -> gr.Plot: |
|
|
|
all_markets = closed_markets.copy(deep=True) |
|
all_markets["market_creator"] = "all" |
|
|
|
|
|
final_markets = pd.concat([closed_markets, all_markets], ignore_index=True) |
|
final_markets = final_markets.sort_values(by="opening_datetime", ascending=True) |
|
|
|
|
|
fig, ax1 = plt.subplots(figsize=(10, 6)) |
|
|
|
|
|
sns.boxplot( |
|
data=final_markets, |
|
x="month_year_week", |
|
y="kl_divergence", |
|
ax=ax1, |
|
hue="market_creator", |
|
) |
|
|
|
|
|
ax1.set_xlabel("Week") |
|
ax1.set_ylabel("KL Divergence") |
|
ax1.set_title("KL Divergence Boxplot with Off-by Percentage") |
|
|
|
|
|
ax2 = ax1.twinx() |
|
|
|
|
|
for i, week in enumerate(closed_markets["month_year_week"].unique()): |
|
off_by_perc = closed_markets[closed_markets["month_year_week"] == week][ |
|
"off_by_perc" |
|
] |
|
ax2.scatter([i] * len(off_by_perc), off_by_perc, color="red", alpha=0.01) |
|
|
|
|
|
ax2.set_ylabel("Off-by Percentage") |
|
|
|
|
|
plt.tight_layout() |
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
def plot_total_bet_amount_per_trader_per_market( |
|
trades_df: pd.DataFrame, trader_filter: str = "all" |
|
) -> gr.Plot: |
|
"""Plots the total bet amount per trader per market.""" |
|
traders_all = trades_df.copy(deep=True) |
|
traders_all["market_creator"] = "all" |
|
|
|
|
|
final_traders = pd.concat([traders_all, trades_df], ignore_index=True) |
|
final_traders = final_traders.sort_values(by="creation_date", ascending=True) |
|
|
|
|
|
final_traders["trader_type"] = final_traders["staking"].apply( |
|
lambda x: "non_Olas" if x == "non_Olas" else "Olas" |
|
) |
|
final_traders["trader_market"] = final_traders.apply( |
|
lambda x: (x["trader_type"], x["market_creator"]), axis=1 |
|
) |
|
color_discrete_sequence = ["purple", "goldenrod", "darkgreen"] |
|
if trader_filter == "Olas": |
|
color_discrete_sequence = ["darkviolet", "goldenrod", "green"] |
|
final_traders = final_traders.loc[final_traders["trader_type"] == "Olas"] |
|
elif trader_filter == "non_Olas": |
|
final_traders = final_traders.loc[final_traders["trader_type"] != "Olas"] |
|
|
|
total_bet_amount = ( |
|
final_traders.groupby( |
|
["month_year_week", "market_creator", "trader_address", "title"], |
|
sort=False, |
|
)["collateral_amount"] |
|
.sum() |
|
.reset_index(name="total_bet_amount") |
|
) |
|
|
|
all_dates_dt = sorted( |
|
[ |
|
datetime.strptime(date, "%b-%d-%Y") |
|
for date in total_bet_amount["month_year_week"].unique() |
|
] |
|
) |
|
|
|
all_dates = [date.strftime("%b-%d-%Y") for date in all_dates_dt] |
|
fig = px.box( |
|
total_bet_amount, |
|
x="month_year_week", |
|
y="total_bet_amount", |
|
color="market_creator", |
|
color_discrete_sequence=color_discrete_sequence, |
|
category_orders={ |
|
"market_creator": ["pearl", "quickstart", "all"], |
|
"trader_market": [ |
|
("Olas", "pearl"), |
|
("non_Olas", "pearl"), |
|
("Olas", "quickstart"), |
|
("non_Olas", "quickstart"), |
|
("Olas", "all"), |
|
("non_Olas", "all"), |
|
], |
|
}, |
|
|
|
) |
|
fig.update_traces(boxmean=True) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Weekly bet amounts per trader per market", |
|
legend=dict(yanchor="top", y=0.5), |
|
width=1000, |
|
height=600, |
|
) |
|
|
|
|
|
|
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
|
|
fig.update_layout(xaxis={"categoryorder": "array", "categoryarray": all_dates}) |
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
def plot_nr_trades_per_trader_per_market( |
|
traders_data: pd.DataFrame, trader_filter: str = "all" |
|
) -> gr.Plot: |
|
"""Function to paint the plot with the metric nr_trades_per_market by trader type and market creator""" |
|
|
|
traders_all = traders_data.copy(deep=True) |
|
traders_all["market_creator"] = "all" |
|
|
|
|
|
final_traders = pd.concat([traders_all, traders_data], ignore_index=True) |
|
final_traders = final_traders.sort_values(by="creation_date", ascending=True) |
|
|
|
|
|
final_traders["trader_type"] = final_traders["staking"].apply( |
|
lambda x: "non_Olas" if x == "non_Olas" else "Olas" |
|
) |
|
final_traders["trader_market"] = final_traders.apply( |
|
lambda x: (x["trader_type"], x["market_creator"]), axis=1 |
|
) |
|
color_discrete_sequence = ["purple", "goldenrod", "darkgreen"] |
|
if trader_filter == "Olas": |
|
color_discrete_sequence = ["darkviolet", "goldenrod", "green"] |
|
final_traders = final_traders.loc[final_traders["trader_type"] == "Olas"] |
|
elif trader_filter == "non_Olas": |
|
final_traders = final_traders.loc[final_traders["trader_type"] != "Olas"] |
|
|
|
fig = px.box( |
|
final_traders, |
|
x="month_year_week", |
|
y="nr_trades_per_market", |
|
color="market_creator", |
|
color_discrete_sequence=color_discrete_sequence, |
|
category_orders={ |
|
"market_creator": ["pearl", "quickstart", "all"], |
|
"trader_market": [ |
|
("Olas", "pearl"), |
|
("non_Olas", "pearl"), |
|
("Olas", "quickstart"), |
|
("non_Olas", "quickstart"), |
|
("Olas", "all"), |
|
("non_Olas", "all"), |
|
], |
|
}, |
|
|
|
) |
|
fig.update_traces(boxmean=True) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Nr trades per trader per market", |
|
legend=dict(yanchor="top", y=0.5), |
|
width=1000, |
|
height=600, |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|