import gradio as gr import pandas as pd import plotly.express as px trader_metric_choices = [ "mech calls", "bet amount", "earnings", "net earnings", "ROI", ] default_trader_metric = "ROI" def get_metrics_text() -> gr.Markdown: metric_text = """ ## Description of 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 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)" 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]] 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_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: # earnings 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, )