rosacastillo's picture
updating daily info
755a4de
raw
history blame
6.66 kB
import pandas as pd
import gradio as gr
import plotly.express as px
import gc
from datetime import datetime
trade_metric_choices = [
"mech calls",
"collateral amount",
"earnings",
"net earnings",
"ROI",
]
tool_metric_choices = {
"Weekly Mean Mech Tool Accuracy as (Accurate Responses/All) %": "win_perc",
"Total Weekly Inaccurate Nr of Mech Tool Responses": "losses",
"Total Weekly Accurate Nr of Mech Tool Responses": "wins",
"Total Weekly Nr of Mech Tool Requests": "total_request",
}
default_trade_metric = "ROI"
default_tool_metric = "Weekly Mean Mech Tool Accuracy as (Accurate Responses/All) %"
HEIGHT = 600
WIDTH = 1000
def get_metrics(
metric_name: str, column_name: str, market_creator: str, trades_df: pd.DataFrame
) -> pd.DataFrame:
# this is to filter out the data before 2023-09-01
trades_filtered = trades_df[trades_df["creation_timestamp"] > "2023-09-01"]
if market_creator != "all":
trades_filtered = trades_filtered.loc[
trades_filtered["market_creator"] == market_creator
]
trades_filtered = (
trades_filtered.groupby("month_year_week", sort=False)[column_name]
.quantile([0.25, 0.5, 0.75])
.unstack()
)
# reformat the data as percentile, date, value
trades_filtered = trades_filtered.melt(
id_vars=["month_year_week"], var_name="percentile", value_name=metric_name
)
trades_filtered.columns = trades_filtered.columns.astype(str)
trades_filtered.reset_index(inplace=True)
trades_filtered.columns = [
"month_year_week",
"25th_percentile",
"50th_percentile",
"75th_percentile",
]
# reformat the data as percentile, date, value
trades_filtered = trades_filtered.melt(
id_vars=["month_year_week"], var_name="percentile", value_name=metric_name
)
return trades_filtered
def get_boxplot_metrics(column_name: str, trades_df: pd.DataFrame) -> pd.DataFrame:
trades_filtered = trades_df[
["creation_timestamp", "month_year_week", "market_creator", column_name]
]
# adding the total
trades_filtered_all = trades_df.copy(deep=True)
trades_filtered_all["market_creator"] = "all"
# merging both dataframes
all_filtered_trades = pd.concat(
[trades_filtered, trades_filtered_all], ignore_index=True
)
all_filtered_trades = all_filtered_trades.sort_values(
by="creation_timestamp", ascending=True
)
gc.collect()
return all_filtered_trades
def plot2_trade_details(
metric_name: str, market_creator: str, trades_df: pd.DataFrame
) -> gr.Plot:
"""Plots the trade details for the given trade detail."""
if metric_name == "mech calls":
metric_name = "mech_calls"
column_name = "num_mech_calls"
yaxis_title = "Nr of mech calls per trade"
elif metric_name == "ROI":
column_name = "roi"
yaxis_title = "ROI (net profit/cost)"
elif metric_name == "collateral amount":
metric_name = "collateral_amount"
column_name = metric_name
yaxis_title = "Collateral amount per trade (xDAI)"
elif metric_name == "net earnings":
metric_name = "net_earnings"
column_name = metric_name
yaxis_title = "Net profit per trade (xDAI)"
else: # earnings
column_name = metric_name
yaxis_title = "Gross profit per trade (xDAI)"
trades_filtered = get_metrics(metric_name, column_name, market_creator, trades_df)
fig = px.line(
trades_filtered, x="month_year_week", y=metric_name, color="percentile"
)
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_trade_metrics(
metric_name: str, trades_df: pd.DataFrame, trader_filter: str = None
) -> gr.Plot:
"""Plots the trade metrics."""
if metric_name == "mech calls":
metric_name = "mech_calls"
column_name = "num_mech_calls"
yaxis_title = "Nr of mech calls per trade"
elif metric_name == "ROI":
column_name = "roi"
yaxis_title = "ROI (net profit/cost)"
elif metric_name == "collateral amount":
metric_name = "collateral_amount"
column_name = metric_name
yaxis_title = "Collateral amount per trade (xDAI)"
elif metric_name == "net earnings":
metric_name = "net_earnings"
column_name = metric_name
yaxis_title = "Net profit per trade (xDAI)"
else: # earnings
column_name = metric_name
yaxis_title = "Gross profit per trade (xDAI)"
color_discrete = ["purple", "darkgoldenrod", "darkgreen"]
if trader_filter == "agent":
trades_filtered = get_boxplot_metrics(
column_name, trades_df.loc[trades_df["staking"] != "non_agent"]
)
color_discrete = ["darkviolet", "goldenrod", "green"]
elif trader_filter == "non_agent":
trades_filtered = get_boxplot_metrics(
column_name, trades_df.loc[trades_df["staking"] == "non_agent"]
)
else:
trades_filtered = get_boxplot_metrics(column_name, trades_df)
# Convert string dates to datetime and sort them
all_dates_dt = sorted(
[
datetime.strptime(date, "%b-%d")
for date in trades_filtered["month_year_week"].unique()
]
)
# Convert back to string format
all_dates = [date.strftime("%b-%d") for date in all_dates_dt]
fig = px.box(
trades_filtered,
x="month_year_week",
y=column_name,
color="market_creator",
color_discrete_sequence=color_discrete,
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")
# Update layout to force x-axis category order (hotfix for a sorting issue)
fig.update_layout(xaxis={"categoryorder": "array", "categoryarray": all_dates})
return gr.Plot(
value=fig,
)
def get_trade_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)