trader_agents_performance / tabs /agent_graphs.py
cyberosa
fixing date format
4e4eb03
raw
history blame
6.31 kB
import pandas as pd
import gradio as gr
import gc
import plotly.express as px
def plot_rolling_average_dune(
daa_df: pd.DataFrame,
) -> gr.Plot:
"""Function to plot the rolling average of daily active agents"""
fig = px.bar(
daa_df,
x="tx_date",
y="seven_day_trailing_avg",
)
fig.update_layout(
xaxis_title="Date",
yaxis_title="7-day rolling average of DAA",
)
return gr.Plot(
value=fig,
)
def plot_rolling_average(
daa_df: pd.DataFrame,
market_creator: str = None,
) -> gr.Plot:
"""Function to plot the rolling average of daily active agents"""
if market_creator is not None:
filtered_traders_df = daa_df.loc[daa_df["market_creator"] == market_creator]
rolling_avg_df = get_sevenday_rolling_average(filtered_traders_df)
else:
rolling_avg_df = get_sevenday_rolling_average(daa_df)
print(rolling_avg_df.head())
# Ensure 'creation_date' is a column, not an index
if "tx_date" not in rolling_avg_df.columns:
rolling_avg_df = rolling_avg_df.reset_index()
fig = px.bar(
rolling_avg_df,
x="tx_date",
y="rolling_avg_traders",
)
fig.update_layout(
xaxis_title="Date",
yaxis_title="7-day rolling average of DAA",
)
return gr.Plot(
value=fig,
)
def get_sevenday_rolling_average(daa_df: pd.DataFrame) -> pd.DataFrame:
"""Function to get the 7-day rolling average of the number of unique
trader_address"""
# Create a local copy of the dataframe
local_df = daa_df.copy()
# Sort the dataframe by date
local_df = local_df.sort_values(by="tx_date").set_index("tx_date")
# Group by market_creator and calculate rolling average of unique trader_address
rolling_avg = (
local_df.resample("D")["trader_address"]
.nunique()
.rolling(window=7)
.mean()
.reset_index()
)
rolling_avg.rename(columns={"trader_address": "rolling_avg_traders"}, inplace=True)
return rolling_avg
def plot_rolling_average_roi(
traders_data: pd.DataFrame, pearl_agents: pd.DataFrame
) -> gr.Plot:
"""Function to plot the rolling average of ROI for pearl agents"""
# Get the list of unique addresses from the daa_pearl_df
unique_addresses = pearl_agents["safe_address"].unique()
# Filter the weekly_roi_df to include only those addresses
filtered_traders_data = traders_data[
traders_data["trader_address"].isin(unique_addresses)
]
# create the date column
filtered_traders_data["creation_timestamp"] = pd.to_datetime(
filtered_traders_data["creation_timestamp"], timezone="UTC"
)
filtered_traders_data["creation_date"] = filtered_traders_data[
"creation_timestamp"
].dt.date
# Get the 2-week rolling average of ROI
rolling_avg_roi_df = get_twoweeks_rolling_average_roi(filtered_traders_data)
print(rolling_avg_roi_df.head())
# Ensure 'month_year_week' is a column, not an index
if "month_year_week" not in rolling_avg_roi_df.columns:
rolling_avg_roi_df = rolling_avg_roi_df.reset_index()
fig = px.bar(
rolling_avg_roi_df,
x="month_year_week",
y="rolling_avg_roi",
)
fig.update_layout(
xaxis_title="Week",
yaxis_title="2-week rolling average of ROI at the trader level",
)
return gr.Plot(
value=fig,
)
def get_twoweeks_rolling_average_roi(traders_data: pd.DataFrame) -> pd.DataFrame:
"""Function to get the 2-week rolling average of the ROI by market_creator and total"""
# Aggregate ROI at the date level
daily_avg = traders_data.groupby("creation_date")["roi"].mean().reset_index()
# Ensure creation_date is datetime64[ns]
daily_avg["creation_date"] = pd.to_datetime(daily_avg["creation_date"])
daily_avg = daily_avg.set_index("creation_date")
# Now resample and rolling
weekly_avg = daily_avg.resample("W").mean()
rolling_avg = weekly_avg.rolling(window=2).mean().reset_index()
rolling_avg.rename(columns={"roi": "rolling_avg_roi"}, inplace=True)
# Optionally, rename the date column for clarity
rolling_avg.rename(columns={"creation_date": "month_year_week"}, inplace=True)
return rolling_avg
def get_weekly_average_roi(weekly_roi_df: pd.DataFrame) -> pd.DataFrame:
"""Function to get the weekly average ROI for pearl agents"""
# Create a local copy of the dataframe
local_df = weekly_roi_df.copy()
# Convert string dates to datetime
local_df["month_year_week"] = pd.to_datetime(
local_df["month_year_week"], format="%b-%d-%Y"
)
# Group by month_year_week and market_creator, then calculate the mean ROI
weekly_avg_roi = (
local_df.groupby(["month_year_week"], sort=False)["roi"].mean().reset_index()
)
return weekly_avg_roi
def plot_weekly_average_roi(
weekly_roi_df: pd.DataFrame, pearl_agents: pd.DataFrame
) -> gr.Plot:
"""Function to plot the weekly average of ROI for pearl agents"""
# Get the list of unique addresses from the daa_pearl_df
unique_addresses = pearl_agents["safe_address"].unique()
# Filter the weekly_roi_df to include only those addresses
filtered_weekly_roi_df = weekly_roi_df[
weekly_roi_df["trader_address"].isin(unique_addresses)
]
# Select only the columns: "roi", "month_year_week", "trader_address"
filtered_weekly_roi_df = filtered_weekly_roi_df[
["roi", "month_year_week", "trader_address"]
].copy()
# Remove duplicates
filtered_weekly_roi_df = filtered_weekly_roi_df.drop_duplicates(
subset=["month_year_week", "trader_address"]
)
# Get the weekly average ROI
weekly_avg_roi_df = get_weekly_average_roi(filtered_weekly_roi_df)
# plot the weekly average ROI
print(weekly_avg_roi_df.head())
# Ensure 'month_year_week' is a column, not an index
if "month_year_week" not in weekly_avg_roi_df.columns:
weekly_avg_roi_df = weekly_avg_roi_df.reset_index()
fig = px.line(
weekly_avg_roi_df,
x="month_year_week",
y="roi",
)
fig.update_layout(
xaxis_title="Week",
yaxis_title="Weekly average ROI for pearl agents",
)
return gr.Plot(
value=fig,
)