cyberosa
commited on
Commit
·
d41146f
1
Parent(s):
d31c241
Adding graph for trader type
Browse files- app.py +34 -35
- scripts/metrics.py +36 -26
- tabs/trader_plots.py +43 -2
app.py
CHANGED
@@ -95,9 +95,9 @@ weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
|
|
95 |
print("weekly metrics by market creator")
|
96 |
print(weekly_metrics_by_market_creator.head())
|
97 |
# get weekly metrics by trader type: multibet, singlebet or all.
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
with demo:
|
102 |
gr.HTML("<h1>Trader agents monitoring dashboard </h1>")
|
103 |
gr.Markdown(
|
@@ -106,7 +106,6 @@ with demo:
|
|
106 |
|
107 |
with gr.Tabs():
|
108 |
with gr.TabItem("🔥Trader Agents Dashboard"):
|
109 |
-
# TODO Implement metrics showing market creator
|
110 |
with gr.Row():
|
111 |
gr.Markdown("# Weekly metrics of trader agents by market creator")
|
112 |
with gr.Row():
|
@@ -137,36 +136,36 @@ with demo:
|
|
137 |
outputs=trader_markets_plot,
|
138 |
)
|
139 |
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
|
172 |
demo.queue(default_concurrency_limit=40).launch()
|
|
|
95 |
print("weekly metrics by market creator")
|
96 |
print(weekly_metrics_by_market_creator.head())
|
97 |
# get weekly metrics by trader type: multibet, singlebet or all.
|
98 |
+
weekly_metrics_by_trader_type = compute_weekly_metrics_by_trader_type(
|
99 |
+
trader_agents_data
|
100 |
+
)
|
101 |
with demo:
|
102 |
gr.HTML("<h1>Trader agents monitoring dashboard </h1>")
|
103 |
gr.Markdown(
|
|
|
106 |
|
107 |
with gr.Tabs():
|
108 |
with gr.TabItem("🔥Trader Agents Dashboard"):
|
|
|
109 |
with gr.Row():
|
110 |
gr.Markdown("# Weekly metrics of trader agents by market creator")
|
111 |
with gr.Row():
|
|
|
136 |
outputs=trader_markets_plot,
|
137 |
)
|
138 |
|
139 |
+
with gr.Row():
|
140 |
+
gr.Markdown(
|
141 |
+
"# Weekly metrics for trader agents by trader type (multibet or singlebet)"
|
142 |
+
)
|
143 |
+
with gr.Row():
|
144 |
+
trader_metric_selector = gr.Dropdown(
|
145 |
+
label="Select a trader metric",
|
146 |
+
choices=trader_metric_choices,
|
147 |
+
value=default_trader_metric,
|
148 |
+
)
|
149 |
+
|
150 |
+
with gr.Row():
|
151 |
+
with gr.Column(scale=3):
|
152 |
+
trader_type_plot = plot_trader_metrics_by_trader_type(
|
153 |
+
metric_name=default_trader_metric,
|
154 |
+
traders_df=weekly_metrics_by_trader_type,
|
155 |
+
)
|
156 |
+
with gr.Column(scale=1):
|
157 |
+
trader_metrics_text = get_trader_metrics_text()
|
158 |
+
|
159 |
+
def update_trader_metric(trader_metric):
|
160 |
+
return plot_trader_metrics_by_trader_type(
|
161 |
+
metric_name=trader_metric,
|
162 |
+
traders_df=weekly_metrics_by_trader_type,
|
163 |
+
)
|
164 |
+
|
165 |
+
trader_metric_selector.change(
|
166 |
+
update_trader_metric,
|
167 |
+
inputs=trader_metric_selector,
|
168 |
+
outputs=trader_type_plot,
|
169 |
+
)
|
170 |
|
171 |
demo.queue(default_concurrency_limit=40).launch()
|
scripts/metrics.py
CHANGED
@@ -105,7 +105,41 @@ def merge_trader_metrics(
|
|
105 |
weekly_metrics_pearl["market_creator"] = "pearl"
|
106 |
trader_metrics.append(weekly_metrics_pearl)
|
107 |
result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
|
108 |
-
tqdm.write(f"Total length of all trader metrics for this week = {len(result)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
return result
|
110 |
|
111 |
|
@@ -142,30 +176,6 @@ def compute_weekly_metrics_by_trader_type(
|
|
142 |
# traverse each trader agent
|
143 |
traders = list(weekly_data.trader_address.unique())
|
144 |
for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
|
145 |
-
|
146 |
-
weekly_metrics = compute_trader_metrics_by_trader_type(
|
147 |
-
trader, weekly_data, trader_type="all"
|
148 |
-
)
|
149 |
-
weekly_metrics["month_year_week"] = week
|
150 |
-
weekly_metrics["trader_type"] = "all"
|
151 |
-
contents.append(weekly_metrics)
|
152 |
-
|
153 |
-
# computation as specification 1 for multibet traders
|
154 |
-
weekly_metrics = compute_trader_metrics_by_trader_type(
|
155 |
-
trader, weekly_data, trader_type="multibet"
|
156 |
-
)
|
157 |
-
if len(weekly_metrics) > 0:
|
158 |
-
weekly_metrics["month_year_week"] = week
|
159 |
-
weekly_metrics["trader_type"] = "multibet"
|
160 |
-
contents.append(weekly_metrics)
|
161 |
-
|
162 |
-
# computation as specification 1 for singlebet traders
|
163 |
-
weekly_metrics = compute_trader_metrics_by_trader_type(
|
164 |
-
trader, weekly_data, trader_type="singlebet"
|
165 |
-
)
|
166 |
-
if len(weekly_metrics) > 0:
|
167 |
-
weekly_metrics["month_year_week"] = week
|
168 |
-
weekly_metrics["trader_type"] = "singlebet"
|
169 |
-
contents.append(weekly_metrics)
|
170 |
print("End computing all weekly metrics by trader types")
|
171 |
return pd.concat(contents, ignore_index=True)
|
|
|
105 |
weekly_metrics_pearl["market_creator"] = "pearl"
|
106 |
trader_metrics.append(weekly_metrics_pearl)
|
107 |
result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
|
108 |
+
# tqdm.write(f"Total length of all trader metrics for this week = {len(result)}")
|
109 |
+
return result
|
110 |
+
|
111 |
+
|
112 |
+
def merge_trader_metrics_by_type(
|
113 |
+
trader: str, weekly_data: pd.DataFrame, week: str
|
114 |
+
) -> pd.DataFrame:
|
115 |
+
trader_metrics = []
|
116 |
+
# computation as specification 1 for all types of traders
|
117 |
+
weekly_metrics_all = compute_trader_metrics_by_trader_type(
|
118 |
+
trader, weekly_data, trader_type="all"
|
119 |
+
)
|
120 |
+
weekly_metrics_all["month_year_week"] = week
|
121 |
+
weekly_metrics_all["trader_type"] = "all"
|
122 |
+
trader_metrics.append(weekly_metrics_all)
|
123 |
+
|
124 |
+
# computation as specification 1 for multibet traders
|
125 |
+
weekly_metrics_mb = compute_trader_metrics_by_trader_type(
|
126 |
+
trader, weekly_data, trader_type="multibet"
|
127 |
+
)
|
128 |
+
if len(weekly_metrics_mb) > 0:
|
129 |
+
weekly_metrics_mb["month_year_week"] = week
|
130 |
+
weekly_metrics_mb["trader_type"] = "multibet"
|
131 |
+
trader_metrics.append(weekly_metrics_mb)
|
132 |
+
|
133 |
+
# computation as specification 1 for singlebet traders
|
134 |
+
weekly_metrics_sb = compute_trader_metrics_by_trader_type(
|
135 |
+
trader, weekly_data, trader_type="singlebet"
|
136 |
+
)
|
137 |
+
if len(weekly_metrics_sb) > 0:
|
138 |
+
weekly_metrics_sb["month_year_week"] = week
|
139 |
+
weekly_metrics_sb["trader_type"] = "singlebet"
|
140 |
+
trader_metrics.append(weekly_metrics_sb)
|
141 |
+
result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
|
142 |
+
# tqdm.write(f"Total length of all trader metrics for this week = {len(result)}")
|
143 |
return result
|
144 |
|
145 |
|
|
|
176 |
# traverse each trader agent
|
177 |
traders = list(weekly_data.trader_address.unique())
|
178 |
for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
|
179 |
+
contents.append(merge_trader_metrics_by_type(trader, weekly_data, week))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
print("End computing all weekly metrics by trader types")
|
181 |
return pd.concat(contents, ignore_index=True)
|
tabs/trader_plots.py
CHANGED
@@ -71,5 +71,46 @@ def plot_trader_metrics_by_market_creator(
|
|
71 |
)
|
72 |
|
73 |
|
74 |
-
def plot_trader_metrics_by_trader_type():
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
)
|
72 |
|
73 |
|
74 |
+
def plot_trader_metrics_by_trader_type(metric_name: str, traders_df: pd.DataFrame):
|
75 |
+
"""Plots the weekly trader metrics."""
|
76 |
+
|
77 |
+
if metric_name == "mech calls":
|
78 |
+
metric_name = "mech_calls"
|
79 |
+
column_name = "nr_mech_calls"
|
80 |
+
yaxis_title = "Total nr of mech calls per trader"
|
81 |
+
elif metric_name == "ROI":
|
82 |
+
column_name = "roi"
|
83 |
+
yaxis_title = "Total ROI (net profit/cost)"
|
84 |
+
elif metric_name == "bet amount":
|
85 |
+
metric_name = "bet_amount"
|
86 |
+
column_name = metric_name
|
87 |
+
yaxis_title = "Total bet amount per trader (xDAI)"
|
88 |
+
elif metric_name == "net earnings":
|
89 |
+
metric_name = "net_earnings"
|
90 |
+
column_name = metric_name
|
91 |
+
yaxis_title = "Total net profit per trader (xDAI)"
|
92 |
+
else: # earnings
|
93 |
+
column_name = metric_name
|
94 |
+
yaxis_title = "Total gross profit per trader (xDAI)"
|
95 |
+
|
96 |
+
traders_filtered = traders_df[["month_year_week", "trader_type", column_name]]
|
97 |
+
|
98 |
+
fig = px.box(
|
99 |
+
traders_filtered,
|
100 |
+
x="month_year_week",
|
101 |
+
y=column_name,
|
102 |
+
color="trader_type",
|
103 |
+
color_discrete_sequence=["gray", "orange", "darkblue"],
|
104 |
+
category_orders={"trader_type": ["singlebet", "multibet", "all"]},
|
105 |
+
)
|
106 |
+
fig.update_traces(boxmean=True)
|
107 |
+
fig.update_layout(
|
108 |
+
xaxis_title="Week",
|
109 |
+
yaxis_title=yaxis_title,
|
110 |
+
legend=dict(yanchor="top", y=0.5),
|
111 |
+
)
|
112 |
+
fig.update_xaxes(tickformat="%b %d\n%Y")
|
113 |
+
|
114 |
+
return gr.Plot(
|
115 |
+
value=fig,
|
116 |
+
)
|