File size: 4,965 Bytes
d8cf478
 
 
 
 
 
 
 
 
 
 
 
 
 
52d1750
d8cf478
dc11fb3
d8cf478
 
 
 
 
 
 
 
 
dc11fb3
 
330cbe3
 
 
 
 
 
 
 
 
 
 
 
 
dc11fb3
 
 
 
d8cf478
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d41146f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6154c13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db08a72
 
6154c13
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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 = """ 
        ## 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)"
    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,
    )


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,  # 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,
    )