import gradio as gr
import pandas as pd
import duckdb
import logging
from scripts.metrics import (
compute_weekly_metrics_by_market_creator,
compute_daily_metrics_by_market_creator,
compute_winning_metrics_by_trader,
)
from tabs.trader_plots import (
plot_trader_metrics_by_market_creator,
plot_trader_daily_metrics_by_market_creator,
default_trader_metric,
trader_metric_choices,
get_metrics_text,
plot_winning_metric_per_trader,
get_interpretation_text,
plot_total_bet_amount,
)
from tabs.daily_graphs import (
get_current_week_data,
plot_daily_metrics,
trader_daily_metric_choices,
default_daily_metric,
)
from scripts.utils import get_traders_family
from tabs.market_plots import (
plot_kl_div_per_market,
plot_total_bet_amount_per_trader_per_market,
)
def get_logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# stream handler and formatter
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
return logger
logger = get_logger()
def get_all_data():
"""
Get parquet files from weekly stats and new generated
"""
logger.info("Getting traders data")
con = duckdb.connect(":memory:")
# Query to fetch data from all_trades_profitability.parquet
query1 = f"""
SELECT *
FROM read_parquet('./data/all_trades_profitability.parquet')
"""
df1 = con.execute(query1).fetchdf()
logger.info("Got all data from all_trades_profitability.parquet")
# Query to fetch data from closed_markets_div.parquet
query2 = f"""
SELECT *
FROM read_parquet('./data/closed_markets_div.parquet')
"""
df2 = con.execute(query2).fetchdf()
logger.info("Got all data from closed_markets_div.parquet")
# Query to fetch daily live data
query3 = f"""
SELECT *
FROM read_parquet('./data/daily_info.parquet')
"""
df3 = con.execute(query3).fetchdf()
con.close()
return df1, df2, df3
def prepare_data():
all_trades, closed_markets, daily_info = get_all_data()
all_trades["creation_date"] = all_trades["creation_timestamp"].dt.date
# nr-trades variable
volume_trades_per_trader_and_market = (
all_trades.groupby(["trader_address", "title"])["roi"]
.count()
.reset_index(name="nr_trades_per_market")
)
trader_agents_data = pd.merge(
all_trades, volume_trades_per_trader_and_market, on=["trader_address", "title"]
)
daily_info["creation_date"] = daily_info["creation_timestamp"].dt.date
# adding the trader family column
trader_agents_data["trader_family"] = trader_agents_data.apply(
lambda x: get_traders_family(x), axis=1
)
print(trader_agents_data.head())
trader_agents_data = trader_agents_data.sort_values(
by="creation_timestamp", ascending=True
)
trader_agents_data["month_year_week"] = (
trader_agents_data["creation_timestamp"].dt.to_period("W").dt.strftime("%b-%d")
)
closed_markets["month_year_week"] = (
closed_markets["opening_datetime"].dt.to_period("W").dt.strftime("%b-%d")
)
return trader_agents_data, closed_markets, daily_info
trader_agents_data, closed_markets, daily_info = prepare_data()
demo = gr.Blocks()
# get weekly metrics by market creator: qs, pearl or all.
weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
trader_agents_data
)
weekly_agent_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
trader_agents_data, trader_filter="agent"
)
weekly_non_agent_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
trader_agents_data, trader_filter="non_agent"
)
weekly_winning_metrics = compute_winning_metrics_by_trader(
trader_agents_data=trader_agents_data
)
weekly_agent_winning_metrics = compute_winning_metrics_by_trader(
trader_agents_data=trader_agents_data, trader_filter="agent"
)
weekly_non_agent_winning_metrics = compute_winning_metrics_by_trader(
trader_agents_data=trader_agents_data, trader_filter="non_agent"
)
with demo:
gr.HTML("
Trader agents monitoring dashboard
")
gr.Markdown(
"This app shows the weekly performance of the trader agents in Olas Predict."
)
with gr.Tabs():
with gr.TabItem("🔥 Weekly metrics"):
with gr.Row():
gr.Markdown("# Weekly metrics of all traders")
with gr.Row():
trader_details_selector = gr.Dropdown(
label="Select a weekly trader metric",
choices=trader_metric_choices,
value=default_trader_metric,
)
with gr.Row():
with gr.Column(scale=3):
trader_markets_plot = plot_trader_metrics_by_market_creator(
metric_name=default_trader_metric,
traders_df=weekly_metrics_by_market_creator,
)
with gr.Column(scale=1):
trade_details_text = get_metrics_text()
def update_trader_details(trader_detail):
return plot_trader_metrics_by_market_creator(
metric_name=trader_detail,
traders_df=weekly_metrics_by_market_creator,
)
trader_details_selector.change(
update_trader_details,
inputs=trader_details_selector,
outputs=trader_markets_plot,
)
# Agentic traders graph
with gr.Row():
gr.Markdown("# Weekly metrics of trader Agents 🤖")
with gr.Row():
trader_a_details_selector = gr.Dropdown(
label="Select a weekly trader metric",
choices=trader_metric_choices,
value=default_trader_metric,
)
with gr.Row():
with gr.Column(scale=3):
a_trader_markets_plot = plot_trader_metrics_by_market_creator(
metric_name=default_trader_metric,
traders_df=weekly_agent_metrics_by_market_creator,
)
with gr.Column(scale=1):
trade_details_text = get_metrics_text()
def update_a_trader_details(trader_detail):
return plot_trader_metrics_by_market_creator(
metric_name=trader_detail,
traders_df=weekly_agent_metrics_by_market_creator,
)
trader_a_details_selector.change(
update_a_trader_details,
inputs=trader_a_details_selector,
outputs=a_trader_markets_plot,
)
# Non-agentic traders graph
with gr.Row():
gr.Markdown("# Weekly metrics of Non-agent traders")
with gr.Row():
trader_na_details_selector = gr.Dropdown(
label="Select a weekly trader metric",
choices=trader_metric_choices,
value=default_trader_metric,
)
with gr.Row():
with gr.Column(scale=3):
na_trader_markets_plot = plot_trader_metrics_by_market_creator(
metric_name=default_trader_metric,
traders_df=weekly_non_agent_metrics_by_market_creator,
)
with gr.Column(scale=1):
trade_details_text = get_metrics_text()
def update_na_trader_details(trader_detail):
return plot_trader_metrics_by_market_creator(
metric_name=trader_detail,
traders_df=weekly_non_agent_metrics_by_market_creator,
)
trader_na_details_selector.change(
update_na_trader_details,
inputs=trader_na_details_selector,
outputs=na_trader_markets_plot,
)
with gr.TabItem("đź“… Daily metrics"):
current_week_trades = get_current_week_data(trades_df=trader_agents_data)
live_trades_current_week = get_current_week_data(trades_df=daily_info)
if len(current_week_trades) > 0:
daily_prof_metrics_by_market_creator = (
compute_daily_metrics_by_market_creator(current_week_trades)
)
else:
print("No profitability info about the current week")
daily_prof_metrics_by_market_creator = pd.DataFrame()
live_metrics_by_market_creator = compute_daily_metrics_by_market_creator(
live_trades_current_week, trader_filter=None, live_metrics=True
)
with gr.Row():
gr.Markdown("# Daily live metrics for all trades")
with gr.Row():
trade_live_details_selector = gr.Dropdown(
label="Select a daily live metric",
choices=trader_daily_metric_choices,
value=default_daily_metric,
)
with gr.Row():
with gr.Column(scale=3):
trade_live_details_plot = plot_daily_metrics(
metric_name=default_daily_metric,
trades_df=live_metrics_by_market_creator,
)
with gr.Column(scale=1):
trade_details_text = get_metrics_text(daily=True)
def update_trade_live_details(trade_detail, trade_live_details_plot):
new_a_plot = plot_daily_metrics(
metric_name=trade_detail, trades_df=live_metrics_by_market_creator
)
return new_a_plot
trade_live_details_selector.change(
update_trade_live_details,
inputs=[trade_live_details_selector, trade_live_details_plot],
outputs=[trade_live_details_plot],
)
with gr.Row():
gr.Markdown("# Daily live metrics for trader Agents 🤖")
with gr.Row():
a_trader_live_details_selector = gr.Dropdown(
label="Select a daily live metric",
choices=trader_daily_metric_choices,
value=default_daily_metric,
)
with gr.Row():
with gr.Column(scale=3):
a_trader_live_details_plot = plot_daily_metrics(
metric_name=default_daily_metric,
trades_df=live_metrics_by_market_creator,
trader_filter="agent",
)
with gr.Column(scale=1):
trade_details_text = get_metrics_text(daily=True)
def update_a_trader_live_details(trade_detail, a_trader_live_details_plot):
a_trader_plot = plot_daily_metrics(
metric_name=trade_detail,
trades_df=live_metrics_by_market_creator,
trader_filter="agent",
)
return a_trader_plot
a_trader_live_details_selector.change(
update_a_trader_live_details,
inputs=[a_trader_live_details_selector, a_trader_live_details_plot],
outputs=[a_trader_live_details_plot],
)
with gr.Row():
gr.Markdown("# Daily live metrics for Non-agent traders")
with gr.Row():
na_trader_live_details_selector = gr.Dropdown(
label="Select a daily live metric",
choices=trader_daily_metric_choices,
value=default_daily_metric,
)
with gr.Row():
with gr.Column(scale=3):
na_trader_live_details_plot = plot_daily_metrics(
metric_name=default_daily_metric,
trades_df=live_metrics_by_market_creator,
trader_filter="non_agent",
)
with gr.Column(scale=1):
trade_details_text = get_metrics_text(daily=True)
def update_na_trader_live_details(
trade_detail, na_trader_live_details_plot
):
na_trader_plot = plot_daily_metrics(
metric_name=trade_detail,
trades_df=live_metrics_by_market_creator,
trader_filter="non_agent",
)
return na_trader_plot
na_trader_live_details_selector.change(
update_na_trader_live_details,
inputs=[na_trader_live_details_selector, na_trader_live_details_plot],
outputs=[na_trader_live_details_plot],
)
# with gr.Row():
# gr.Markdown("# Daily profitability metrics available for all trades")
# if len(current_week_trades) > 0:
# with gr.Row():
# trader_daily_details_selector = gr.Dropdown(
# label="Select a daily trade metric",
# choices=trader_metric_choices,
# value=default_trader_metric,
# )
# with gr.Row():
# with gr.Column(scale=3):
# trader_daily_details_plot = plot_daily_metrics(
# metric_name=default_trader_metric,
# trades_df=daily_prof_metrics_by_market_creator,
# )
# with gr.Column(scale=1):
# trader_details_text = get_metrics_text(daily=True)
# def update_trader_daily_details(
# trade_detail, trader_daily_details_plot
# ):
# new_a_plot = plot_daily_metrics(
# metric_name=trade_detail,
# trades_df=daily_prof_metrics_by_market_creator,
# )
# return new_a_plot
# trader_daily_details_selector.change(
# update_trader_daily_details,
# inputs=[trader_daily_details_selector, trader_daily_details_plot],
# outputs=[trader_daily_details_plot],
# )
# else:
# gr.Markdown("Data not available yet")
with gr.TabItem("📉 Markets Kullback–Leibler divergence"):
with gr.Row():
gr.Markdown(
"# Weekly Market Prediction Accuracy for Closed Markets (Kullback-Leibler Divergence)"
)
with gr.Row():
gr.Markdown(
"Aka, how much off is the market prediction’s accuracy from the real outcome of the event. Values capped at 20 for market outcomes completely opposite to the real outcome."
)
with gr.Row():
trade_details_text = get_metrics_text()
with gr.Row():
with gr.Column(scale=3):
kl_div_plot = plot_kl_div_per_market(closed_markets=closed_markets)
with gr.Column(scale=1):
interpretation = get_interpretation_text()
with gr.TabItem("đź’° Money invested per trader type"):
with gr.Row():
gr.Markdown("# Weekly total bet amount per trader type for all markets")
with gr.Row():
total_bet_amount = plot_total_bet_amount(
trader_agents_data, market_filter="all"
)
with gr.Row():
gr.Markdown(
"# Weekly total bet amount per trader type for Pearl markets"
)
with gr.Row():
a_trader_total_bet_amount = plot_total_bet_amount(
trader_agents_data, market_filter="pearl"
)
with gr.Row():
gr.Markdown(
"# Weekly total bet amount per trader type for Quickstart markets"
)
with gr.Row():
na_trader_total_bet_amount = plot_total_bet_amount(
trader_agents_data, market_filter="quickstart"
)
with gr.TabItem("đź’° Money invested per market"):
with gr.Row():
gr.Markdown("# Weekly bet amounts per market for all traders")
with gr.Row():
bet_amounts = plot_total_bet_amount_per_trader_per_market(
trader_agents_data
)
with gr.Row():
gr.Markdown("# Weekly bet amounts per market for traders Agents 🤖")
with gr.Row():
a_trader_bet_amounts = plot_total_bet_amount_per_trader_per_market(
trader_agents_data, trader_filter="agent"
)
with gr.Row():
gr.Markdown("# Weekly bet amounts per market for Non-agent traders")
with gr.Row():
na_trader_bet_amounts = plot_total_bet_amount_per_trader_per_market(
trader_agents_data, trader_filter="non_agent"
)
with gr.TabItem("🎖️Weekly winning trades % per trader"):
with gr.Row():
gr.Markdown("# Weekly winning trades percentage from all traders")
with gr.Row():
metrics_text = get_metrics_text()
with gr.Row():
winning_metric = plot_winning_metric_per_trader(weekly_winning_metrics)
# Agentic traders
with gr.Row():
gr.Markdown("# Weekly winning trades percentage from traders Agents")
with gr.Row():
metrics_text = get_metrics_text()
with gr.Row():
winning_metric = plot_winning_metric_per_trader(
weekly_agent_winning_metrics
)
# Non_agentic traders
with gr.Row():
gr.Markdown("# Weekly winning trades percentage from Non-agent traders")
with gr.Row():
metrics_text = get_metrics_text()
with gr.Row():
winning_metric = plot_winning_metric_per_trader(
weekly_non_agent_winning_metrics
)
demo.queue(default_concurrency_limit=40).launch()