cyberosa
commited on
Commit
·
f245408
1
Parent(s):
652d8f6
new tab with active traders
Browse files- app.py +22 -1
- tabs/market_plots.py +0 -3
- tabs/trader_plots.py +65 -0
app.py
CHANGED
@@ -11,13 +11,13 @@ from scripts.metrics import (
|
|
11 |
)
|
12 |
from tabs.trader_plots import (
|
13 |
plot_trader_metrics_by_market_creator,
|
14 |
-
plot_trader_daily_metrics_by_market_creator,
|
15 |
default_trader_metric,
|
16 |
trader_metric_choices,
|
17 |
get_metrics_text,
|
18 |
plot_winning_metric_per_trader,
|
19 |
get_interpretation_text,
|
20 |
plot_total_bet_amount,
|
|
|
21 |
)
|
22 |
from tabs.daily_graphs import (
|
23 |
get_current_week_data,
|
@@ -393,6 +393,27 @@ with demo:
|
|
393 |
inputs=[no_trader_live_details_selector, no_trader_live_details_plot],
|
394 |
outputs=[no_trader_live_details_plot],
|
395 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
396 |
|
397 |
with gr.TabItem("📉 Markets Kullback–Leibler divergence"):
|
398 |
with gr.Row():
|
|
|
11 |
)
|
12 |
from tabs.trader_plots import (
|
13 |
plot_trader_metrics_by_market_creator,
|
|
|
14 |
default_trader_metric,
|
15 |
trader_metric_choices,
|
16 |
get_metrics_text,
|
17 |
plot_winning_metric_per_trader,
|
18 |
get_interpretation_text,
|
19 |
plot_total_bet_amount,
|
20 |
+
plot_active_traders,
|
21 |
)
|
22 |
from tabs.daily_graphs import (
|
23 |
get_current_week_data,
|
|
|
393 |
inputs=[no_trader_live_details_selector, no_trader_live_details_plot],
|
394 |
outputs=[no_trader_live_details_plot],
|
395 |
)
|
396 |
+
with gr.TabItem("⚙️ Active traders"):
|
397 |
+
with gr.Row():
|
398 |
+
gr.Markdown("# Active traders for all markets by trader categories")
|
399 |
+
with gr.Row():
|
400 |
+
active_traders_plot = plot_active_traders(traders_data, unknown_traders)
|
401 |
+
|
402 |
+
with gr.Row():
|
403 |
+
gr.Markdown("# Active traders for Pearl markets by trader categories")
|
404 |
+
with gr.Row():
|
405 |
+
active_traders_plot = plot_active_traders(
|
406 |
+
traders_data, unknown_traders, market_creator="pearl"
|
407 |
+
)
|
408 |
+
|
409 |
+
with gr.Row():
|
410 |
+
gr.Markdown(
|
411 |
+
"# Active traders for Quickstart markets by trader categories"
|
412 |
+
)
|
413 |
+
with gr.Row():
|
414 |
+
active_traders_plot = plot_active_traders(
|
415 |
+
traders_data, unknown_traders, market_creator="quickstart"
|
416 |
+
)
|
417 |
|
418 |
with gr.TabItem("📉 Markets Kullback–Leibler divergence"):
|
419 |
with gr.Row():
|
tabs/market_plots.py
CHANGED
@@ -231,9 +231,6 @@ def plot_nr_trades_per_trader_per_market(
|
|
231 |
width=1000, # Adjusted for better fit on laptop screens
|
232 |
height=600, # Adjusted for better fit on laptop screens
|
233 |
)
|
234 |
-
# for axis in fig.layout:
|
235 |
-
# if axis.startswith("xaxis"):
|
236 |
-
# fig.layout[axis].update(title="Week")
|
237 |
fig.update_xaxes(tickformat="%b %d\n%Y")
|
238 |
return gr.Plot(
|
239 |
value=fig,
|
|
|
231 |
width=1000, # Adjusted for better fit on laptop screens
|
232 |
height=600, # Adjusted for better fit on laptop screens
|
233 |
)
|
|
|
|
|
|
|
234 |
fig.update_xaxes(tickformat="%b %d\n%Y")
|
235 |
return gr.Plot(
|
236 |
value=fig,
|
tabs/trader_plots.py
CHANGED
@@ -268,3 +268,68 @@ def plot_total_bet_amount(
|
|
268 |
return gr.Plot(
|
269 |
value=fig,
|
270 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
268 |
return gr.Plot(
|
269 |
value=fig,
|
270 |
)
|
271 |
+
|
272 |
+
|
273 |
+
def plot_active_traders(
|
274 |
+
traders_data: pd.DataFrame,
|
275 |
+
unknown_traders: pd.DataFrame,
|
276 |
+
market_creator: str = None,
|
277 |
+
):
|
278 |
+
"""Function to plot the volume of active traders for the different categories and markets"""
|
279 |
+
traders_data["trader_type"] = traders_data["staking"].apply(
|
280 |
+
lambda x: "non_Olas" if x == "non_Olas" else "Olas"
|
281 |
+
)
|
282 |
+
filtered_traders_data = traders_data
|
283 |
+
if len(unknown_traders) > 0:
|
284 |
+
# merge
|
285 |
+
unknown_traders["trader_type"] = "unknown"
|
286 |
+
filtered_traders_data = pd.concat([traders_data, unknown_traders], axis=0)
|
287 |
+
|
288 |
+
if market_creator is not None:
|
289 |
+
filtered_traders_data = filtered_traders_data.loc[
|
290 |
+
filtered_traders_data["market_creator"] == market_creator
|
291 |
+
]
|
292 |
+
active_traders = (
|
293 |
+
filtered_traders_data.groupby(by=["month_year_week", "trader_type"])[
|
294 |
+
"trader_address"
|
295 |
+
]
|
296 |
+
.nunique()
|
297 |
+
.reset_index(name="nr_traders")
|
298 |
+
)
|
299 |
+
# Convert string dates to datetime and sort them
|
300 |
+
all_dates_dt = sorted(
|
301 |
+
[
|
302 |
+
datetime.strptime(date, "%b-%d")
|
303 |
+
for date in active_traders["month_year_week"].unique()
|
304 |
+
]
|
305 |
+
)
|
306 |
+
# Convert back to string format
|
307 |
+
all_dates = [date.strftime("%b-%d") for date in all_dates_dt]
|
308 |
+
color_mapping = [
|
309 |
+
"royalblue",
|
310 |
+
"goldenrod",
|
311 |
+
"gray",
|
312 |
+
]
|
313 |
+
fig = px.bar(
|
314 |
+
active_traders,
|
315 |
+
x="month_year_week",
|
316 |
+
y="nr_traders",
|
317 |
+
color="trader_type",
|
318 |
+
color_discrete_sequence=color_mapping,
|
319 |
+
category_orders={
|
320 |
+
"trader_type": ["Olas", "non_Olas", "unknown"],
|
321 |
+
},
|
322 |
+
barmode="group",
|
323 |
+
)
|
324 |
+
fig.update_layout(
|
325 |
+
xaxis_title="Week",
|
326 |
+
yaxis_title="Weekly active traders per trader type",
|
327 |
+
legend=dict(yanchor="top", y=0.5),
|
328 |
+
)
|
329 |
+
|
330 |
+
fig.update_xaxes(tickformat="%b %d")
|
331 |
+
# Update layout to force x-axis category order (hotfix for a sorting issue)
|
332 |
+
fig.update_layout(xaxis={"categoryorder": "array", "categoryarray": all_dates})
|
333 |
+
return gr.Plot(
|
334 |
+
value=fig,
|
335 |
+
)
|