rosacastillo's picture
updating week format starting on Monday, new staking contracts and new weekly data
285f2a6
raw
history blame
4.6 kB
import pandas as pd
import gradio as gr
from typing import List
from tabs.metrics import tool_metric_choices
import plotly.express as px
HEIGHT = 600
WIDTH = 1000
def prepare_tools(tools: pd.DataFrame) -> pd.DataFrame:
tools["request_time"] = pd.to_datetime(tools["request_time"])
tools = tools.sort_values(by="request_time", ascending=True)
tools["request_month_year_week"] = (
pd.to_datetime(tools["request_time"])
.dt.to_period("W")
.dt.start_time.dt.strftime("%b-%d-%Y")
)
# preparing the tools graph
# adding the total
tools_all = tools.copy(deep=True)
tools_all["market_creator"] = "all"
# merging both dataframes
tools = pd.concat([tools, tools_all], ignore_index=True)
tools = tools.sort_values(by="request_time", ascending=True)
return tools
def get_overall_winning_rate_by_market(wins_df: pd.DataFrame) -> pd.DataFrame:
"""Gets the overall winning rate data for the given tools and calculates the winning percentage."""
overall_wins = (
wins_df.groupby(["request_month_year_week", "market_creator"], sort=False)
.agg({"0": "sum", "1": "sum", "win_perc": "mean", "total_request": "sum"})
.rename(columns={"0": "losses", "1": "wins"})
.reset_index()
)
return overall_wins
def sort_key(date_str):
month, day, year = date_str.split("-")
month_order = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
]
month_num = month_order.index(month) + 1
day = int(day)
year = int(year)
return (year, month_num, day) # year, month, day
def integrated_plot_tool_winnings_overall_per_market_by_week(
winning_df: pd.DataFrame,
winning_selector: str = "Weekly Mean Mech Tool Accuracy as (Accurate Responses/All) %",
) -> gr.Plot:
# get the column name from the metric name
column_name = tool_metric_choices.get(winning_selector)
wins_df = get_overall_winning_rate_by_market(winning_df)
# Sort the unique values of request_month_year_week
sorted_categories = sorted(
wins_df["request_month_year_week"].unique(), key=sort_key
)
# Create a categorical type with a specific order
wins_df["request_month_year_week"] = pd.Categorical(
wins_df["request_month_year_week"], categories=sorted_categories, ordered=True
)
# Sort the DataFrame based on the new categorical column
wins_df = wins_df.sort_values("request_month_year_week")
fig = px.bar(
wins_df,
x="request_month_year_week",
y=column_name,
color="market_creator",
barmode="group",
color_discrete_sequence=["purple", "goldenrod", "darkgreen"],
category_orders={
"market_creator": ["pearl", "quickstart", "all"],
"request_month_year_week": sorted_categories,
},
)
fig.update_layout(
xaxis_title="Week",
yaxis_title=winning_selector,
legend=dict(yanchor="top", y=0.5),
)
fig.update_layout(width=WIDTH, height=HEIGHT)
fig.update_xaxes(tickformat="%b %d\n%Y")
return gr.Plot(value=fig)
def integrated_tool_winnings_by_tool_per_market(
wins_df: pd.DataFrame, tool: str
) -> gr.Plot:
tool_wins_df = wins_df[wins_df["tool"] == tool]
# Sort the unique values of request_month_year_week
sorted_categories = sorted(
tool_wins_df["request_month_year_week"].unique(), key=sort_key
)
# Create a categorical type with a specific order
tool_wins_df["request_month_year_week"] = pd.Categorical(
tool_wins_df["request_month_year_week"],
categories=sorted_categories,
ordered=True,
)
# Sort the DataFrame based on the new categorical column
wins_df = wins_df.sort_values("request_month_year_week")
fig = px.bar(
tool_wins_df,
x="request_month_year_week",
y="win_perc",
color="market_creator",
barmode="group",
color_discrete_sequence=["purple", "goldenrod", "darkgreen"],
category_orders={
"market_creator": ["pearl", "quickstart", "all"],
"request_month_year_week": sorted_categories,
},
)
fig.update_layout(
xaxis_title="Week",
yaxis_title="Weekly Mean Mech Tool Accuracy as (Accurate Responses/All) %",
legend=dict(yanchor="top", y=0.5),
)
fig.update_layout(width=WIDTH, height=HEIGHT)
fig.update_xaxes(tickformat="%b %d\n%Y")
return gr.Plot(value=fig)