updating week format starting on Monday, new staking contracts and new weekly data
285f2a6
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) | |