|
import gradio as gr |
|
import pandas as pd |
|
import plotly.express as px |
|
|
|
|
|
HEIGHT = 400 |
|
WIDTH = 1100 |
|
|
|
|
|
def prepare_trades(trades_df: pd.DataFrame) -> pd.DataFrame: |
|
"""Prepares the trades data for analysis.""" |
|
trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"]) |
|
trades_df["creation_timestamp"] = trades_df["creation_timestamp"].dt.tz_convert( |
|
"UTC" |
|
) |
|
trades_df = trades_df.sort_values(by="creation_timestamp", ascending=True) |
|
trades_df["month_year"] = ( |
|
trades_df["creation_timestamp"].dt.to_period("M").astype(str) |
|
) |
|
trades_df["month_year_week"] = ( |
|
trades_df["creation_timestamp"].dt.to_period("W").dt.strftime("%b-%d") |
|
) |
|
trades_df["winning_trade"] = trades_df["winning_trade"].astype(int) |
|
return trades_df |
|
|
|
|
|
def get_overall_trades(trades_df: pd.DataFrame) -> pd.DataFrame: |
|
"""Gets the overall trades data""" |
|
trades_count = trades_df.groupby("month_year_week").size().reset_index() |
|
trades_count.columns = trades_count.columns.astype(str) |
|
trades_count.rename(columns={"0": "trades"}, inplace=True) |
|
return trades_count |
|
|
|
|
|
def get_overall_by_market_trades(trades_df: pd.DataFrame) -> pd.DataFrame: |
|
"""Gets the overall trades data""" |
|
trades_count = ( |
|
trades_df.groupby(["month_year_week", "market_creator"], sort=False) |
|
.size() |
|
.reset_index() |
|
) |
|
trades_count.columns = trades_count.columns.astype(str) |
|
trades_count.rename(columns={"0": "trades"}, inplace=True) |
|
return trades_count |
|
|
|
|
|
def get_overall_winning_trades(trades_df: pd.DataFrame) -> pd.DataFrame: |
|
"""Gets the overall winning trades data for the given tools and calculates the winning percentage.""" |
|
winning_trades = ( |
|
trades_df.groupby(["month_year_week"])["winning_trade"].sum() |
|
/ trades_df.groupby(["month_year_week"])["winning_trade"].count() |
|
* 100 |
|
) |
|
|
|
winning_trades = winning_trades.reset_index() |
|
winning_trades.columns = winning_trades.columns.astype(str) |
|
winning_trades.columns = ["month_year_week", "winning_trade"] |
|
return winning_trades |
|
|
|
|
|
def get_overall_winning_by_market_trades(trades_df: pd.DataFrame) -> pd.DataFrame: |
|
"""Gets the overall winning trades data for the given tools and calculates the winning percentage.""" |
|
winning_trades = ( |
|
trades_df.groupby(["month_year_week", "market_creator"], sort=False)[ |
|
"winning_trade" |
|
].sum() |
|
/ trades_df.groupby(["month_year_week", "market_creator"], sort=False)[ |
|
"winning_trade" |
|
].count() |
|
* 100 |
|
) |
|
|
|
winning_trades = winning_trades.reset_index() |
|
winning_trades.columns = winning_trades.columns.astype(str) |
|
winning_trades.columns = ["month_year_week", "market_creator", "winning_trade"] |
|
return winning_trades |
|
|
|
|
|
def plot_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot: |
|
"""Plots the trades data for the given tools and calculates the winning percentage.""" |
|
return gr.BarPlot( |
|
value=trades_df, |
|
x="month_year_week", |
|
y="trades", |
|
show_label=True, |
|
interactive=True, |
|
show_actions_button=True, |
|
tooltip=["month_year_week", "trades"], |
|
height=HEIGHT, |
|
width=WIDTH, |
|
) |
|
|
|
|
|
def plot_trades_per_market_by_week( |
|
trades_df: pd.DataFrame, market_type: str |
|
) -> gr.Plot: |
|
"""Plots the trades data for the given tools and calculates the winning percentage.""" |
|
assert "market_creator" in trades_df.columns |
|
|
|
if market_type == "quickstart": |
|
trades = trades_df.loc[trades_df["market_creator"] == "quickstart"] |
|
color_sequence = ["goldenrod"] |
|
|
|
elif market_type == "pearl": |
|
trades = trades_df.loc[trades_df["market_creator"] == "pearl"] |
|
color_sequence = ["purple"] |
|
else: |
|
trades = trades_df |
|
color_sequence = ["darkgreen"] |
|
|
|
fig = px.bar( |
|
trades, |
|
x="month_year_week", |
|
y="trades", |
|
color_discrete_sequence=color_sequence, |
|
title=market_type + " trades", |
|
) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Weekly nr of trades", |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|
|
|
|
def integrated_plot_trades_per_market_by_week(trades_df: pd.DataFrame) -> gr.Plot: |
|
|
|
|
|
trades_all = trades_df.copy(deep=True) |
|
trades_all["market_creator"] = "all" |
|
|
|
|
|
all_filtered_trades = pd.concat([trades_df, trades_all], ignore_index=True) |
|
all_filtered_trades = all_filtered_trades.sort_values( |
|
by="creation_timestamp", ascending=True |
|
) |
|
|
|
trades = get_overall_by_market_trades(all_filtered_trades) |
|
fig = px.bar( |
|
trades, |
|
x="month_year_week", |
|
y="trades", |
|
color="market_creator", |
|
barmode="group", |
|
color_discrete_sequence=["goldenrod", "darkgreen", "purple"], |
|
) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Weekly nr of trades", |
|
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_plot_winning_trades_per_market_by_week( |
|
trades_df: pd.DataFrame, |
|
) -> gr.Plot: |
|
|
|
trades_all = trades_df.copy(deep=True) |
|
trades_all["market_creator"] = "all" |
|
|
|
|
|
all_filtered_trades = pd.concat([trades_df, trades_all], ignore_index=True) |
|
all_filtered_trades = all_filtered_trades.sort_values( |
|
by="creation_timestamp", ascending=True |
|
) |
|
final_df = get_overall_winning_by_market_trades(all_filtered_trades) |
|
fig = px.bar( |
|
final_df, |
|
x="month_year_week", |
|
y="winning_trade", |
|
color="market_creator", |
|
barmode="group", |
|
color_discrete_sequence=["goldenrod", "darkgreen", "purple"], |
|
) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Weekly % of winning trades", |
|
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 plot_winning_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot: |
|
"""Plots the winning trades data for the given tools and calculates the winning percentage.""" |
|
return gr.BarPlot( |
|
value=trades_df, |
|
x="month_year_week", |
|
y="winning_trade", |
|
show_label=True, |
|
interactive=True, |
|
show_actions_button=True, |
|
tooltip=["month_year_week", "winning_trade"], |
|
height=HEIGHT, |
|
width=WIDTH, |
|
) |
|
|
|
|
|
def plot_winning_trades_per_market_by_week( |
|
trades_df: pd.DataFrame, market_type: str |
|
) -> gr.Plot: |
|
"""Plots the winning trades data for the given tools and calculates the winning percentage.""" |
|
|
|
if market_type == "quickstart": |
|
trades = trades_df.loc[trades_df["market_creator"] == "quickstart"] |
|
color_sequence = ["goldenrod"] |
|
|
|
elif market_type == "pearl": |
|
trades = trades_df.loc[trades_df["market_creator"] == "pearl"] |
|
color_sequence = ["purple"] |
|
else: |
|
trades = trades_df |
|
color_sequence = ["darkgreen"] |
|
|
|
fig = px.bar( |
|
trades, |
|
x="month_year_week", |
|
y="winning_trade", |
|
color_discrete_sequence=color_sequence, |
|
title=market_type + " winning trades", |
|
) |
|
fig.update_layout( |
|
xaxis_title="Week", |
|
yaxis_title="Weekly % of winning trades", |
|
) |
|
fig.update_xaxes(tickformat="%b %d\n%Y") |
|
return gr.Plot( |
|
value=fig, |
|
) |
|
|