Spaces:
Runtime error
Runtime error
| 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, | |
| ) | |