File size: 3,795 Bytes
cfffc31 da55889 cfffc31 e51ae04 cfffc31 e51ae04 cfffc31 ac8ae1f cfffc31 ac8ae1f cfffc31 3b90a69 ac8ae1f 3b90a69 cfffc31 ac8ae1f cfffc31 e51ae04 cfffc31 ac8ae1f cfffc31 da55889 6992ec1 da55889 6992ec1 da55889 cfffc31 da55889 cfffc31 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
import gradio as gr
import pandas as pd
import plotly.express as px
from datetime import datetime
def get_overall_by_staking_traders(trades_df: pd.DataFrame) -> pd.DataFrame:
"""Gets the overall trades data"""
trades_count = (
trades_df.groupby(["month_year_week", "staking"], 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 plot_staking_trades_per_market_by_week(
trades_df: pd.DataFrame, market_creator: str
) -> gr.Plot:
# adding the total
trades_all = trades_df.copy(deep=True)
trades_all["market_creator"] = "all"
# choose colour
market_colour = "green"
if market_creator == "pearl":
market_colour = "darkviolet"
elif market_creator == "quickstart":
market_colour = "goldenrod"
# merging both dataframes
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
)
all_filtered_trades = all_filtered_trades.loc[
all_filtered_trades["market_creator"] == market_creator
]
if market_creator != "all":
if market_creator == "pearl":
# remove the staking data from quickstart
all_filtered_trades = all_filtered_trades.loc[
all_filtered_trades["staking"] != "quickstart"
]
else:
# remove the staking data from pearl
all_filtered_trades = all_filtered_trades.loc[
all_filtered_trades["staking"] != "pearl"
]
all_filtered_trades["staking"] = all_filtered_trades["staking"].replace(
{market_creator: "staking_traders", "non_Olas": "non_Olas_traders"}
)
colour_sequence = ["gray", market_colour, "black"]
categories_sorted = {
"staking": ["non_staking_traders", "staking_traders", "non_Olas_traders"]
}
else:
all_filtered_trades["staking"] = all_filtered_trades["staking"].replace(
{
"pearl": "staking_pearl_traders",
"quickstart": "staking_quickstart_traders",
"non_Olas": "non_Olas_traders",
}
)
colour_sequence = ["gray", "darkviolet", "goldenrod", "black"]
categories_sorted = {
"staking": [
"non_staking_traders",
"staking_pearl_traders",
"staking_quickstart_traders",
"non_Olas_traders",
]
}
trades = get_overall_by_staking_traders(all_filtered_trades)
# Convert string dates to datetime and sort them
all_dates_dt = sorted(
[
datetime.strptime(date, "%b-%d-%Y")
for date in trades["month_year_week"].unique()
]
)
# Convert back to string format
all_dates = [date.strftime("%b-%d-%Y") for date in all_dates_dt]
fig = px.bar(
trades,
x="month_year_week",
y="trades",
color="staking",
barmode="group",
color_discrete_sequence=colour_sequence,
category_orders=categories_sorted,
)
fig.update_layout(
xaxis_title="Week",
yaxis_title="Weekly nr of trades",
legend=dict(yanchor="top", y=0.5),
width=1000, # Adjusted for better fit on laptop screens
height=600, # Adjusted for better fit on laptop screens
)
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)
|