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: # adding the total all_markets = closed_markets.copy(deep=True) all_markets["market_creator"] = "all" # merging both dataframes 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, # 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_kl_div_with_off_by(closed_markets: pd.DataFrame) -> gr.Plot: # adding the total all_markets = closed_markets.copy(deep=True) all_markets["market_creator"] = "all" # merging both dataframes final_markets = pd.concat([closed_markets, all_markets], ignore_index=True) final_markets = final_markets.sort_values(by="opening_datetime", ascending=True) # Create the main figure and axis fig, ax1 = plt.subplots(figsize=(10, 6)) # Create the boxplot using seaborn sns.boxplot( data=final_markets, x="month_year_week", y="kl_divergence", ax=ax1, hue="market_creator", ) # Set labels and title for the main axis ax1.set_xlabel("Week") ax1.set_ylabel("KL Divergence") ax1.set_title("KL Divergence Boxplot with Off-by Percentage") # Create a secondary y-axis ax2 = ax1.twinx() # Plot the off_by_perc values on the secondary y-axis 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) # Set label for the secondary y-axis ax2.set_ylabel("Off-by Percentage") # Adjust the layout and display the plot 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" # 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_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") ) # Convert string dates to datetime and sort them all_dates_dt = sorted( [ datetime.strptime(date, "%b-%d-%Y") for date in total_bet_amount["month_year_week"].unique() ] ) # Convert back to string format 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"), ], }, # facet_col="trader_type", ) 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, # Adjusted for better fit on laptop screens height=600, # Adjusted for better fit on laptop screens ) # for axis in fig.layout: # if axis.startswith("xaxis"): # fig.layout[axis].update(title="Week") 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_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" # merging both dataframes final_traders = pd.concat([traders_all, traders_data], 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_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"), ], }, # facet_col="trader_type", ) 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, # 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, )