Spaces:
Sleeping
Sleeping
second commit
Browse files- app copy.py +0 -135
- app.py +206 -99
- data/all_trades_profitability.csv +2 -2
- data/delivers.csv +2 -2
- data/fpmmTrades.csv +2 -2
- data/fpmms.csv +2 -2
- data/requests.csv +2 -2
- data/summary_profitability.csv +2 -2
- data/tools.csv +2 -2
- nbs/weekly_analysis.ipynb +0 -0
- tabs/__pycache__/error.cpython-310.pyc +0 -0
- tabs/__pycache__/tool_win.cpython-310.pyc +0 -0
- tabs/__pycache__/trades.cpython-310.pyc +0 -0
- tabs/error.py +77 -0
- tabs/tool_win.py +73 -0
- tabs/trades.py +174 -0
app copy.py
DELETED
@@ -1,135 +0,0 @@
|
|
1 |
-
import gradio as gr
|
2 |
-
import pandas as pd
|
3 |
-
|
4 |
-
tools = pd.read_csv("./data/tools.csv")
|
5 |
-
# all_trades = pd.read_csv('./data/all_trades_profitability.csv')
|
6 |
-
|
7 |
-
demo = gr.Blocks()
|
8 |
-
|
9 |
-
INC_TOOLS = [
|
10 |
-
'prediction-online',
|
11 |
-
'prediction-offline',
|
12 |
-
'claude-prediction-online',
|
13 |
-
'claude-prediction-offline',
|
14 |
-
'prediction-offline-sme',
|
15 |
-
'prediction-online-sme',
|
16 |
-
'prediction-request-rag',
|
17 |
-
'prediction-request-reasoning',
|
18 |
-
'prediction-url-cot-claude',
|
19 |
-
'prediction-request-rag-claude',
|
20 |
-
'prediction-request-reasoning-claude'
|
21 |
-
]
|
22 |
-
|
23 |
-
def set_error(row):
|
24 |
-
if row.error not in [True, False]:
|
25 |
-
if not row.prompt_response:
|
26 |
-
return True
|
27 |
-
return False
|
28 |
-
return row.error
|
29 |
-
|
30 |
-
def get_error_data():
|
31 |
-
tools_inc = tools[tools['tool'].isin(INC_TOOLS)]
|
32 |
-
tools_inc['error'] = tools_inc.apply(set_error, axis=1)
|
33 |
-
error = tools_inc.groupby(['tool', 'request_month_year_week', 'error']).size().unstack().fillna(0).reset_index()
|
34 |
-
error['error_perc'] = (error[True] / (error[False] + error[True]))*100
|
35 |
-
error['total_requests'] = error[False] + error[True]
|
36 |
-
|
37 |
-
return error
|
38 |
-
|
39 |
-
def get_error_data_all(error):
|
40 |
-
error_total = error.groupby('request_month_year_week').agg({'total_requests': 'sum', False: 'sum', True:'sum'}).reset_index()
|
41 |
-
error_total['error_perc'] = (error_total[True] / error_total['total_requests'])*100
|
42 |
-
# convert column name to string
|
43 |
-
error_total.columns = error_total.columns.astype(str)
|
44 |
-
# format all values to 4 decimal places for error_perc
|
45 |
-
error_total['error_perc'] = error_total['error_perc'].apply(lambda x: round(x, 4))
|
46 |
-
return error_total
|
47 |
-
|
48 |
-
error = get_error_data()
|
49 |
-
error_all = get_error_data_all(error)
|
50 |
-
print(error_all.head())
|
51 |
-
|
52 |
-
with demo:
|
53 |
-
gr.HTML("<h1>Olas Predict Actual Performance</h1>")
|
54 |
-
gr.Markdown("This app shows the actual performance of Olas Predict tools on the live market.")
|
55 |
-
|
56 |
-
with gr.Tabs():
|
57 |
-
with gr.TabItem("🔥 Error Dashboard"):
|
58 |
-
with gr.Row():
|
59 |
-
gr.Markdown("This plot shows the percentage of requests that resulted in an error.")
|
60 |
-
with gr.Row():
|
61 |
-
# plot
|
62 |
-
with gr.Column():
|
63 |
-
gr.LinePlot(
|
64 |
-
value=error_all,
|
65 |
-
x="request_month_year_week",
|
66 |
-
y="error_perc",
|
67 |
-
title="Error Percentage",
|
68 |
-
x_title="Week",
|
69 |
-
y_title="Error Percentage",
|
70 |
-
height=400,
|
71 |
-
show_label=True
|
72 |
-
)
|
73 |
-
gr.Markdown("This plot shows the percentage of requests that resulted in an error.")
|
74 |
-
|
75 |
-
# Dropdown for selecting the tool
|
76 |
-
sel_tool = gr.Dropdown(
|
77 |
-
value="prediction-online",
|
78 |
-
choices=INC_TOOLS,
|
79 |
-
label="Select a tool"
|
80 |
-
)
|
81 |
-
plot_tool_error = gr.LinePlot(
|
82 |
-
title="Error Percentage",
|
83 |
-
x_title="Week",
|
84 |
-
y_title="Error Percentage",
|
85 |
-
render=False
|
86 |
-
)
|
87 |
-
|
88 |
-
# Dropdown for selecting the week
|
89 |
-
sel_week = gr.Dropdown(
|
90 |
-
value=error['request_month_year_week'].iloc[-1],
|
91 |
-
choices=error['request_month_year_week'].unique().tolist(),
|
92 |
-
label="Select a week"
|
93 |
-
)
|
94 |
-
plot_week_error = gr.BarPlot(
|
95 |
-
title="Error Percentage",
|
96 |
-
x_title="Tool",
|
97 |
-
y_title="Error Percentage",
|
98 |
-
render=False
|
99 |
-
)
|
100 |
-
|
101 |
-
def update_tool_plot(selected_tool):
|
102 |
-
filtered_data = error[error['tool'] == selected_tool]
|
103 |
-
# convert column name to string
|
104 |
-
filtered_data.columns = filtered_data.columns.astype(str)
|
105 |
-
# conver error_perc to 4 decimal place
|
106 |
-
filtered_data['error_perc'] = filtered_data['error_perc'].apply(lambda x: round(x, 4))
|
107 |
-
print(filtered_data.head())
|
108 |
-
return {
|
109 |
-
"x": filtered_data['request_month_year_week'].tolist(),
|
110 |
-
"y": filtered_data['error_perc'].tolist(),
|
111 |
-
}
|
112 |
-
|
113 |
-
def update_week_plot(selected_week):
|
114 |
-
filtered_data = error[error['request_month_year_week'] == selected_week]
|
115 |
-
filtered_data.columns = filtered_data.columns.astype(str)
|
116 |
-
filtered_data['error_perc'] = filtered_data['error_perc'].apply(lambda x: round(x, 4))
|
117 |
-
print(filtered_data.head())
|
118 |
-
return {
|
119 |
-
"x": filtered_data['tool'].tolist(),
|
120 |
-
"y": filtered_data['error_perc'].tolist(),
|
121 |
-
}
|
122 |
-
|
123 |
-
sel_tool.change(fn=update_tool_plot, inputs=sel_tool, outputs=plot_tool_error)
|
124 |
-
sel_week.change(fn=update_week_plot, inputs=sel_week, outputs=plot_week_error)
|
125 |
-
|
126 |
-
with gr.Row():
|
127 |
-
plot_tool_error.render()
|
128 |
-
with gr.Row():
|
129 |
-
plot_week_error.render()
|
130 |
-
|
131 |
-
with gr.TabItem("ℹ️ About"):
|
132 |
-
with gr.Accordion("About the Benchmark", open=False):
|
133 |
-
gr.Markdown("This app shows the actual performance of Olas Predict tools on the live market.")
|
134 |
-
|
135 |
-
demo.queue(default_concurrency_limit=40).launch()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app.py
CHANGED
@@ -1,7 +1,30 @@
|
|
1 |
import gradio as gr
|
2 |
import pandas as pd
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
-
|
|
|
|
|
5 |
|
6 |
demo = gr.Blocks()
|
7 |
|
@@ -19,78 +42,195 @@ INC_TOOLS = [
|
|
19 |
'prediction-request-reasoning-claude'
|
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 |
-
error = get_error_data()
|
45 |
-
error_all = get_error_data_all(error)
|
46 |
|
47 |
with demo:
|
48 |
gr.HTML("<h1>Olas Predict Actual Performance</h1>")
|
49 |
gr.Markdown("This app shows the actual performance of Olas Predict tools on the live market.")
|
50 |
|
51 |
with gr.Tabs():
|
52 |
-
with gr.TabItem("🔥
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
with gr.Row():
|
54 |
gr.Markdown("# Plot showing overall error")
|
55 |
with gr.Row():
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
value=error_all,
|
60 |
-
x="request_month_year_week",
|
61 |
-
y="error_perc",
|
62 |
-
title="Error Percentage",
|
63 |
-
x_title="Week",
|
64 |
-
y_title="Error Percentage",
|
65 |
-
height=800,
|
66 |
-
show_label=True,
|
67 |
-
interactive=True,
|
68 |
-
show_actions_button=True,
|
69 |
-
tooltip=["request_month_year_week", "error_perc"]
|
70 |
-
)
|
71 |
with gr.Row():
|
72 |
gr.Markdown("# Plot showing error by tool")
|
73 |
-
|
74 |
with gr.Row():
|
75 |
-
sel_tool = gr.Dropdown(
|
|
|
|
|
|
|
|
|
76 |
|
77 |
with gr.Row():
|
78 |
-
plot_tool_error =
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
|
|
87 |
)
|
88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
with gr.Row():
|
90 |
gr.Markdown("# Plot showing error by week")
|
91 |
|
92 |
with gr.Row():
|
93 |
-
choices =
|
94 |
# sort the choices by the latest week to be on the top
|
95 |
choices = sorted(choices)
|
96 |
sel_week = gr.Dropdown(
|
@@ -100,52 +240,19 @@ with demo:
|
|
100 |
)
|
101 |
|
102 |
with gr.Row():
|
103 |
-
plot_week_error =
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
)
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
filtered_data = error[error['tool'] == selected_tool]
|
117 |
-
# convert column name to string
|
118 |
-
filtered_data.columns = filtered_data.columns.astype(str)
|
119 |
-
# convert error_perc to 4 decimal place
|
120 |
-
filtered_data['error_perc'] = filtered_data['error_perc'].apply(lambda x: round(x, 4))
|
121 |
-
update = gr.LinePlot(
|
122 |
-
title="Error Percentage",
|
123 |
-
x_title="Week",
|
124 |
-
y_title="Error Percentage",
|
125 |
-
x="request_month_year_week",
|
126 |
-
y="error_perc",
|
127 |
-
value=filtered_data
|
128 |
-
)
|
129 |
-
return update
|
130 |
-
|
131 |
-
def update_week_plot(selected_week):
|
132 |
-
filtered_data = error[error['request_month_year_week'] == selected_week]
|
133 |
-
# convert column name to string
|
134 |
-
filtered_data.columns = filtered_data.columns.astype(str)
|
135 |
-
# convert error_perc to 4 decimal place
|
136 |
-
filtered_data['error_perc'] = filtered_data['error_perc'].apply(lambda x: round(x, 4))
|
137 |
-
update = gr.BarPlot(
|
138 |
-
title="Error Percentage",
|
139 |
-
x_title="Tool",
|
140 |
-
y_title="Error Percentage",
|
141 |
-
x="tool",
|
142 |
-
y="error_perc",
|
143 |
-
value=filtered_data
|
144 |
-
)
|
145 |
-
return update
|
146 |
-
|
147 |
-
sel_tool.change(update_tool_plot, inputs=sel_tool, outputs=plot_tool_error)
|
148 |
-
sel_week.change(update_week_plot, inputs=sel_week, outputs=plot_week_error)
|
149 |
|
150 |
with gr.Row():
|
151 |
sel_tool
|
|
|
1 |
import gradio as gr
|
2 |
import pandas as pd
|
3 |
+
from tabs.trades import (
|
4 |
+
prepare_trades,
|
5 |
+
get_overall_trades,
|
6 |
+
get_overall_winning_trades,
|
7 |
+
plot_trades_by_week,
|
8 |
+
plot_winning_trades_by_week,
|
9 |
+
plot_trade_details
|
10 |
+
)
|
11 |
+
from tabs.tool_win import (
|
12 |
+
get_tool_winning_rate,
|
13 |
+
get_overall_winning_rate,
|
14 |
+
plot_winning_trades,
|
15 |
+
plot_winning_plot_by_tool
|
16 |
+
)
|
17 |
+
from tabs.error import (
|
18 |
+
get_error_data,
|
19 |
+
get_error_data_overall,
|
20 |
+
plot_error_data,
|
21 |
+
plot_tool_error_data,
|
22 |
+
plot_week_error_data
|
23 |
+
)
|
24 |
|
25 |
+
tools_df = pd.read_csv("./data/tools.csv")
|
26 |
+
trades_df = pd.read_csv("./data/all_trades_profitability.csv")
|
27 |
+
trades_df = prepare_trades(trades_df)
|
28 |
|
29 |
demo = gr.Blocks()
|
30 |
|
|
|
42 |
'prediction-request-reasoning-claude'
|
43 |
]
|
44 |
|
45 |
+
|
46 |
+
# TOOLS DATA
|
47 |
+
error_df = get_error_data(
|
48 |
+
tools_df=tools_df,
|
49 |
+
inc_tools=INC_TOOLS
|
50 |
+
)
|
51 |
+
error_overall_df = get_error_data_overall(
|
52 |
+
error_df=error_df
|
53 |
+
)
|
54 |
+
winning_rate_df = get_tool_winning_rate(
|
55 |
+
tools_df=tools_df,
|
56 |
+
inc_tools=INC_TOOLS
|
57 |
+
)
|
58 |
+
winning_rate_all_df = get_overall_winning_rate(
|
59 |
+
wins_df=winning_rate_df
|
60 |
+
)
|
61 |
+
trades_count_df = get_overall_trades(
|
62 |
+
trades_df=trades_df
|
63 |
+
)
|
64 |
+
trades_winning_rate_df = get_overall_winning_trades(
|
65 |
+
trades_df=trades_df
|
66 |
+
)
|
|
|
|
|
67 |
|
68 |
with demo:
|
69 |
gr.HTML("<h1>Olas Predict Actual Performance</h1>")
|
70 |
gr.Markdown("This app shows the actual performance of Olas Predict tools on the live market.")
|
71 |
|
72 |
with gr.Tabs():
|
73 |
+
with gr.TabItem("🔥Trades Dashboard"):
|
74 |
+
with gr.Row():
|
75 |
+
gr.Markdown("# Plot of number of trades by week")
|
76 |
+
with gr.Row():
|
77 |
+
plot_trades_by_week = plot_trades_by_week(
|
78 |
+
trades_df=trades_count_df
|
79 |
+
)
|
80 |
+
with gr.Row():
|
81 |
+
gr.Markdown("# Plot of winning trades by week")
|
82 |
+
with gr.Row():
|
83 |
+
plot_winning_trades_by_week = plot_winning_trades_by_week(
|
84 |
+
trades_df=trades_winning_rate_df
|
85 |
+
)
|
86 |
+
with gr.Row():
|
87 |
+
gr.Markdown("# Plot of trade details")
|
88 |
+
with gr.Row():
|
89 |
+
trade_details_selector = gr.Dropdown(
|
90 |
+
label="Select a trade",
|
91 |
+
choices=[
|
92 |
+
"mech calls",
|
93 |
+
"collateral amount",
|
94 |
+
"earnings",
|
95 |
+
"net earnings",
|
96 |
+
"ROI"
|
97 |
+
],
|
98 |
+
value="mech calls"
|
99 |
+
)
|
100 |
+
with gr.Row():
|
101 |
+
trade_details_plot = plot_trade_details(
|
102 |
+
trade_detail="mech calls",
|
103 |
+
trades_df=trades_df
|
104 |
+
)
|
105 |
+
|
106 |
+
def update_trade_details(trade_detail):
|
107 |
+
return plot_trade_details(
|
108 |
+
trade_detail=trade_detail,
|
109 |
+
trades_df=trades_df
|
110 |
+
)
|
111 |
+
|
112 |
+
trade_details_selector.change(
|
113 |
+
update_trade_details,
|
114 |
+
inputs=trade_details_selector,
|
115 |
+
outputs=trade_details_plot
|
116 |
+
)
|
117 |
+
|
118 |
+
with gr.Row():
|
119 |
+
trade_details_selector
|
120 |
+
with gr.Row():
|
121 |
+
trade_details_plot
|
122 |
+
|
123 |
+
with gr.TabItem("🚀 Tool Winning Dashboard"):
|
124 |
+
with gr.Row():
|
125 |
+
gr.Markdown("# Plot showing overall winning rate")
|
126 |
+
|
127 |
+
with gr.Row():
|
128 |
+
winning_selector = gr.Dropdown(
|
129 |
+
label="Select Metric",
|
130 |
+
choices=['losses', 'wins', 'total_request', 'win_perc'],
|
131 |
+
value='win_perc',
|
132 |
+
)
|
133 |
+
|
134 |
+
with gr.Row():
|
135 |
+
winning_plot = plot_winning_trades(
|
136 |
+
wins_df=winning_rate_all_df,
|
137 |
+
winning_selector="win_perc"
|
138 |
+
)
|
139 |
+
|
140 |
+
def update_winning_plot(winning_selector):
|
141 |
+
return plot_winning_trades(
|
142 |
+
wins_df=winning_rate_all_df,
|
143 |
+
winning_selector=winning_selector
|
144 |
+
)
|
145 |
+
|
146 |
+
winning_selector.change(
|
147 |
+
plot_winning_trades,
|
148 |
+
inputs=winning_selector,
|
149 |
+
outputs=winning_plot
|
150 |
+
)
|
151 |
+
|
152 |
+
with gr.Row():
|
153 |
+
winning_selector
|
154 |
+
with gr.Row():
|
155 |
+
winning_plot
|
156 |
+
|
157 |
+
with gr.Row():
|
158 |
+
gr.Markdown("# Plot showing winning rate by tool")
|
159 |
+
|
160 |
+
with gr.Row():
|
161 |
+
sel_tool = gr.Dropdown(
|
162 |
+
label="Select a tool",
|
163 |
+
choices=INC_TOOLS,
|
164 |
+
value=INC_TOOLS[0]
|
165 |
+
)
|
166 |
+
|
167 |
+
with gr.Row():
|
168 |
+
plot_tool_win_rate = plot_winning_plot_by_tool(
|
169 |
+
wins_df=winning_rate_df,
|
170 |
+
tool=INC_TOOLS[0]
|
171 |
+
)
|
172 |
+
|
173 |
+
def update_tool_win_plot(tool):
|
174 |
+
return plot_winning_plot_by_tool(
|
175 |
+
wins_df=winning_rate_df,
|
176 |
+
tool=tool
|
177 |
+
)
|
178 |
+
|
179 |
+
sel_tool.change(
|
180 |
+
update_tool_win_plot,
|
181 |
+
inputs=sel_tool,
|
182 |
+
outputs=plot_tool_win_rate
|
183 |
+
)
|
184 |
+
|
185 |
+
with gr.Row():
|
186 |
+
sel_tool
|
187 |
+
with gr.Row():
|
188 |
+
plot_tool_win_rate
|
189 |
+
|
190 |
+
with gr.TabItem("🏥 Tool Error Dashboard"):
|
191 |
with gr.Row():
|
192 |
gr.Markdown("# Plot showing overall error")
|
193 |
with gr.Row():
|
194 |
+
plot_error_data(
|
195 |
+
error_all_df=error_overall_df
|
196 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
197 |
with gr.Row():
|
198 |
gr.Markdown("# Plot showing error by tool")
|
|
|
199 |
with gr.Row():
|
200 |
+
sel_tool = gr.Dropdown(
|
201 |
+
label="Select a tool",
|
202 |
+
choices=INC_TOOLS,
|
203 |
+
value=INC_TOOLS[0]
|
204 |
+
)
|
205 |
|
206 |
with gr.Row():
|
207 |
+
plot_tool_error = plot_tool_error_data(
|
208 |
+
error_df=error_df,
|
209 |
+
tool=INC_TOOLS[0]
|
210 |
+
)
|
211 |
+
|
212 |
+
|
213 |
+
def update_tool_error_plot(tool):
|
214 |
+
return plot_tool_error_data(
|
215 |
+
error_df=error_df,
|
216 |
+
tool=tool
|
217 |
)
|
218 |
|
219 |
+
sel_tool.change(
|
220 |
+
update_tool_error_plot,
|
221 |
+
inputs=sel_tool,
|
222 |
+
outputs=plot_tool_error
|
223 |
+
)
|
224 |
+
with gr.Row():
|
225 |
+
sel_tool
|
226 |
+
with gr.Row():
|
227 |
+
plot_tool_error
|
228 |
+
|
229 |
with gr.Row():
|
230 |
gr.Markdown("# Plot showing error by week")
|
231 |
|
232 |
with gr.Row():
|
233 |
+
choices = error_overall_df['request_month_year_week'].unique().tolist()
|
234 |
# sort the choices by the latest week to be on the top
|
235 |
choices = sorted(choices)
|
236 |
sel_week = gr.Dropdown(
|
|
|
240 |
)
|
241 |
|
242 |
with gr.Row():
|
243 |
+
plot_week_error = plot_week_error_data(
|
244 |
+
error_df=error_df,
|
245 |
+
week=choices[-1]
|
246 |
+
)
|
247 |
+
|
248 |
+
def update_week_error_plot(selected_week):
|
249 |
+
return plot_week_error_data(
|
250 |
+
error_df=error_df,
|
251 |
+
week=selected_week
|
252 |
+
)
|
253 |
+
|
254 |
+
sel_tool.change(update_tool_error_plot, inputs=sel_tool, outputs=plot_tool_error)
|
255 |
+
sel_week.change(update_week_error_plot, inputs=sel_week, outputs=plot_week_error)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
256 |
|
257 |
with gr.Row():
|
258 |
sel_tool
|
data/all_trades_profitability.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:866a83eac6c603f435ee960b0da2570ced109438ee73e13a525b06a3d7baa133
|
3 |
+
size 28938394
|
data/delivers.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:04f73cf0443fc8e91dd4b2e5188aee00f06ccc89d3977bf8e57063076ca91f51
|
3 |
+
size 1270000369
|
data/fpmmTrades.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1e4600c2925a707bc882fda67612d03e28903e11947fe56f3e594f575f437d20
|
3 |
+
size 64196881
|
data/fpmms.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:721b874d94ebb1a83456f75b911f79fd654971c2150976911968b27790ed7f84
|
3 |
+
size 399415
|
data/requests.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:db71f7e4cebe1e68eb280615d4331f3fe6a8732d94c29920b7b485f048631b7a
|
3 |
+
size 129156993
|
data/summary_profitability.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1a999ed3c31ae1ee71da379e0840995584491457db4ca7250ca2e7f9b55c3869
|
3 |
+
size 48242
|
data/tools.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:35f76795539604c1c50f70d161c217c32c0fa04bbbd94ee29f5717b782c6863f
|
3 |
+
size 1363028261
|
nbs/weekly_analysis.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
tabs/__pycache__/error.cpython-310.pyc
ADDED
Binary file (2.46 kB). View file
|
|
tabs/__pycache__/tool_win.cpython-310.pyc
ADDED
Binary file (2.03 kB). View file
|
|
tabs/__pycache__/trades.cpython-310.pyc
ADDED
Binary file (2.93 kB). View file
|
|
tabs/error.py
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import gradio as gr
|
3 |
+
|
4 |
+
def set_error(row):
|
5 |
+
if row.error not in [True, False]:
|
6 |
+
if not row.prompt_response:
|
7 |
+
return True
|
8 |
+
return False
|
9 |
+
return row.error
|
10 |
+
|
11 |
+
def get_error_data(tools_df, inc_tools):
|
12 |
+
tools_inc = tools_df[tools_df['tool'].isin(inc_tools)]
|
13 |
+
tools_inc['error'] = tools_inc.apply(set_error, axis=1)
|
14 |
+
error = tools_inc.groupby(['tool', 'request_month_year_week', 'error']).size().unstack().fillna(0).reset_index()
|
15 |
+
error['error_perc'] = (error[True] / (error[False] + error[True])) * 100
|
16 |
+
error['total_requests'] = error[False] + error[True]
|
17 |
+
return error
|
18 |
+
|
19 |
+
def get_error_data_overall(error_df):
|
20 |
+
error_total = error_df.groupby('request_month_year_week').agg({'total_requests': 'sum', False: 'sum', True: 'sum'}).reset_index()
|
21 |
+
error_total['error_perc'] = (error_total[True] / error_total['total_requests']) * 100
|
22 |
+
error_total.columns = error_total.columns.astype(str)
|
23 |
+
error_total['error_perc'] = error_total['error_perc'].apply(lambda x: round(x, 4))
|
24 |
+
return error_total
|
25 |
+
|
26 |
+
def plot_error_data(error_all_df):
|
27 |
+
return gr.BarPlot(
|
28 |
+
value=error_all_df,
|
29 |
+
x="request_month_year_week",
|
30 |
+
y="error_perc",
|
31 |
+
title="Error Percentage",
|
32 |
+
x_title="Week",
|
33 |
+
y_title="Error Percentage",
|
34 |
+
height=800,
|
35 |
+
show_label=True,
|
36 |
+
interactive=True,
|
37 |
+
show_actions_button=True,
|
38 |
+
tooltip=["request_month_year_week", "error_perc"]
|
39 |
+
)
|
40 |
+
|
41 |
+
def plot_tool_error_data(error_df, tool):
|
42 |
+
error_tool = error_df[error_df['tool'] == tool]
|
43 |
+
error_tool.columns = error_tool.columns.astype(str)
|
44 |
+
error_tool['error_perc'] = error_tool['error_perc'].apply(lambda x: round(x, 4))
|
45 |
+
|
46 |
+
return gr.BarPlot(
|
47 |
+
title="Error Percentage",
|
48 |
+
x_title="Week",
|
49 |
+
y_title="Error Percentage",
|
50 |
+
show_label=True,
|
51 |
+
interactive=True,
|
52 |
+
show_actions_button=True,
|
53 |
+
tooltip=["request_month_year_week", "error_perc"],
|
54 |
+
width=800,
|
55 |
+
value=error_tool,
|
56 |
+
x="request_month_year_week",
|
57 |
+
y="error_perc"
|
58 |
+
)
|
59 |
+
|
60 |
+
def plot_week_error_data(error_df, week):
|
61 |
+
error_week = error_df[error_df['request_month_year_week'] == week]
|
62 |
+
error_week.columns = error_week.columns.astype(str)
|
63 |
+
error_week['error_perc'] = error_week['error_perc'].apply(lambda x: round(x, 4))
|
64 |
+
return gr.BarPlot(
|
65 |
+
value=error_week,
|
66 |
+
x="tool",
|
67 |
+
y="error_perc",
|
68 |
+
title="Error Percentage",
|
69 |
+
x_title="Tool",
|
70 |
+
y_title="Error Percentage",
|
71 |
+
height=800,
|
72 |
+
show_label=True,
|
73 |
+
interactive=True,
|
74 |
+
show_actions_button=True,
|
75 |
+
tooltip=["tool", "error_perc"]
|
76 |
+
)
|
77 |
+
|
tabs/tool_win.py
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import gradio as gr
|
3 |
+
|
4 |
+
def set_error(row):
|
5 |
+
if row.error not in [True, False]:
|
6 |
+
if not row.prompt_response:
|
7 |
+
return True
|
8 |
+
return False
|
9 |
+
return row.error
|
10 |
+
|
11 |
+
|
12 |
+
def get_tool_winning_rate(tools_df, inc_tools):
|
13 |
+
tools_inc = tools_df[tools_df['tool'].isin(inc_tools)]
|
14 |
+
tools_inc['error'] = tools_inc.apply(set_error, axis=1)
|
15 |
+
tools_non_error = tools_inc[tools_inc['error'] != True]
|
16 |
+
tools_non_error['currentAnswer'].replace('no', 'No', inplace=True)
|
17 |
+
tools_non_error['currentAnswer'].replace('yes', 'Yes', inplace=True)
|
18 |
+
tools_non_error = tools_non_error[tools_non_error['currentAnswer'].isin(['Yes', 'No'])]
|
19 |
+
tools_non_error = tools_non_error[tools_non_error['vote'].isin(['Yes', 'No'])]
|
20 |
+
tools_non_error['win'] = tools_non_error['currentAnswer'] == tools_non_error['vote']
|
21 |
+
tools_non_error['win'] = tools_non_error['win'].astype(int)
|
22 |
+
tools_non_error.columns = tools_non_error.columns.astype(str)
|
23 |
+
wins = tools_non_error.groupby(['tool', 'request_month_year_week', 'win']).size().unstack().fillna(0)
|
24 |
+
wins['win_perc'] = (wins[1] / (wins[0] + wins[1]))*100
|
25 |
+
wins.reset_index(inplace=True)
|
26 |
+
wins['total_request'] = wins[0] + wins[1]
|
27 |
+
wins.columns = wins.columns.astype(str)
|
28 |
+
return wins
|
29 |
+
|
30 |
+
|
31 |
+
def get_overall_winning_rate(wins_df):
|
32 |
+
overall_wins = wins_df.groupby('request_month_year_week').agg({
|
33 |
+
"0": 'sum',
|
34 |
+
"1": 'sum',
|
35 |
+
"win_perc": 'mean',
|
36 |
+
"total_request": 'sum'
|
37 |
+
}).rename(columns={"0": 'losses', "1": 'wins'}).reset_index()
|
38 |
+
return overall_wins
|
39 |
+
|
40 |
+
|
41 |
+
def plot_winning_trades(
|
42 |
+
wins_df,
|
43 |
+
winning_selector="win_perc"
|
44 |
+
):
|
45 |
+
return gr.BarPlot(
|
46 |
+
title="Winning Rate",
|
47 |
+
x_title="Date",
|
48 |
+
y_title=winning_selector,
|
49 |
+
show_label=True,
|
50 |
+
interactive=True,
|
51 |
+
show_actions_button=True,
|
52 |
+
tooltip=["request_month_year_week", winning_selector],
|
53 |
+
width=800,
|
54 |
+
value=wins_df,
|
55 |
+
x="request_month_year_week",
|
56 |
+
y=winning_selector
|
57 |
+
)
|
58 |
+
|
59 |
+
|
60 |
+
def plot_winning_plot_by_tool(wins_df, tool):
|
61 |
+
return gr.BarPlot(
|
62 |
+
title="Winning Rate",
|
63 |
+
x_title="Week",
|
64 |
+
y_title="Winning Rate",
|
65 |
+
x="request_month_year_week",
|
66 |
+
y="win_perc",
|
67 |
+
value=wins_df[wins_df['tool'] == tool],
|
68 |
+
width=800,
|
69 |
+
show_label=True,
|
70 |
+
interactive=True,
|
71 |
+
show_actions_button=True,
|
72 |
+
tooltip=["request_month_year_week", "win_perc"]
|
73 |
+
)
|
tabs/trades.py
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import pandas as pd
|
3 |
+
|
4 |
+
|
5 |
+
def prepare_trades(trades_df):
|
6 |
+
trades_df['creation_timestamp'] = pd.to_datetime(trades_df['creation_timestamp'])
|
7 |
+
trades_df['month_year'] = trades_df['creation_timestamp'].dt.to_period('M').astype(str)
|
8 |
+
trades_df['month_year_week'] = trades_df['creation_timestamp'].dt.to_period('W').astype(str)
|
9 |
+
trades_df['winning_trade'] = trades_df['winning_trade'].astype(int)
|
10 |
+
return trades_df
|
11 |
+
|
12 |
+
|
13 |
+
def get_overall_trades(trades_df):
|
14 |
+
trades_count = trades_df.groupby('month_year_week').size().reset_index()
|
15 |
+
trades_count.columns = trades_count.columns.astype(str)
|
16 |
+
trades_count.rename(columns={'0': 'trades'}, inplace=True)
|
17 |
+
return trades_count
|
18 |
+
|
19 |
+
def get_overall_winning_trades(trades_df):
|
20 |
+
winning_trades = trades_df.groupby(['month_year_week'])['winning_trade'].sum() / trades_df.groupby(['month_year_week'])['winning_trade'].count() * 100
|
21 |
+
# winning_trades is a series, give it a dataframe
|
22 |
+
winning_trades = winning_trades.reset_index()
|
23 |
+
winning_trades.columns = winning_trades.columns.astype(str)
|
24 |
+
winning_trades.columns = ['month_year_week', 'winning_trade']
|
25 |
+
return winning_trades
|
26 |
+
|
27 |
+
def plot_trade_details(trade_detail, trades_df):
|
28 |
+
if trade_detail == "mech calls":
|
29 |
+
# this is to filter out the data before 2023-09-01
|
30 |
+
trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
|
31 |
+
trades_filtered = trades_filtered.groupby("month_year_week")["num_mech_calls"].quantile([0.25, 0.5, 0.75]).unstack()
|
32 |
+
trades_filtered.columns = trades_filtered.columns.astype(str)
|
33 |
+
trades_filtered.reset_index(inplace=True)
|
34 |
+
trades_filtered.columns = [
|
35 |
+
"month_year_week",
|
36 |
+
"25th_percentile",
|
37 |
+
"50th_percentile",
|
38 |
+
"75th_percentile"
|
39 |
+
]
|
40 |
+
# reformat the data as percentile, date, value
|
41 |
+
trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="mech_calls")
|
42 |
+
|
43 |
+
return gr.LinePlot(
|
44 |
+
value=trades_filtered,
|
45 |
+
x="month_year_week",
|
46 |
+
y="mech_calls",
|
47 |
+
color="percentile",
|
48 |
+
show_label=True,
|
49 |
+
interactive=True,
|
50 |
+
show_actions_button=True,
|
51 |
+
tooltip=["month_year_week", "percentile", "mech_calls"]
|
52 |
+
)
|
53 |
+
|
54 |
+
if trade_detail == "collateral amount":
|
55 |
+
trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
|
56 |
+
trades_filtered = trades_filtered.groupby("month_year_week")["collateral_amount"].quantile([0.25, 0.5, 0.75]).unstack()
|
57 |
+
trades_filtered.columns = trades_filtered.columns.astype(str)
|
58 |
+
trades_filtered.reset_index(inplace=True)
|
59 |
+
trades_filtered.columns = [
|
60 |
+
"month_year_week",
|
61 |
+
"25th_percentile",
|
62 |
+
"50th_percentile",
|
63 |
+
"75th_percentile"
|
64 |
+
]
|
65 |
+
# reformat the data as percentile, date, value
|
66 |
+
trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="collateral_amount")
|
67 |
+
|
68 |
+
return gr.LinePlot(
|
69 |
+
value=trades_filtered,
|
70 |
+
x="month_year_week",
|
71 |
+
y="collateral_amount",
|
72 |
+
color="percentile",
|
73 |
+
show_label=True,
|
74 |
+
interactive=True,
|
75 |
+
show_actions_button=True,
|
76 |
+
tooltip=["month_year_week", "percentile", "collateral_amount"]
|
77 |
+
)
|
78 |
+
|
79 |
+
if trade_detail == "earnings":
|
80 |
+
trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
|
81 |
+
trades_filtered = trades_filtered.groupby("month_year_week")["earnings"].quantile([0.25, 0.5, 0.75]).unstack()
|
82 |
+
trades_filtered.columns = trades_filtered.columns.astype(str)
|
83 |
+
trades_filtered.reset_index(inplace=True)
|
84 |
+
trades_filtered.columns = [
|
85 |
+
"month_year_week",
|
86 |
+
"25th_percentile",
|
87 |
+
"50th_percentile",
|
88 |
+
"75th_percentile"
|
89 |
+
]
|
90 |
+
# reformat the data as percentile, date, value
|
91 |
+
trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="earnings")
|
92 |
+
|
93 |
+
return gr.LinePlot(
|
94 |
+
value=trades_filtered,
|
95 |
+
x="month_year_week",
|
96 |
+
y="earnings",
|
97 |
+
color="percentile",
|
98 |
+
show_label=True,
|
99 |
+
interactive=True,
|
100 |
+
show_actions_button=True,
|
101 |
+
tooltip=["month_year_week", "percentile", "earnings"]
|
102 |
+
)
|
103 |
+
|
104 |
+
if trade_detail == "net earnings":
|
105 |
+
trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
|
106 |
+
trades_filtered = trades_filtered.groupby("month_year_week")["net_earnings"].quantile([0.25, 0.5, 0.75]).unstack()
|
107 |
+
trades_filtered.columns = trades_filtered.columns.astype(str)
|
108 |
+
trades_filtered.reset_index(inplace=True)
|
109 |
+
trades_filtered.columns = [
|
110 |
+
"month_year_week",
|
111 |
+
"25th_percentile",
|
112 |
+
"50th_percentile",
|
113 |
+
"75th_percentile"
|
114 |
+
]
|
115 |
+
# reformat the data as percentile, date, value
|
116 |
+
trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="net_earnings")
|
117 |
+
|
118 |
+
return gr.LinePlot(
|
119 |
+
value=trades_filtered,
|
120 |
+
x="month_year_week",
|
121 |
+
y="net_earnings",
|
122 |
+
color="percentile",
|
123 |
+
show_label=True,
|
124 |
+
interactive=True,
|
125 |
+
show_actions_button=True,
|
126 |
+
tooltip=["month_year_week", "percentile", "net_earnings"]
|
127 |
+
)
|
128 |
+
|
129 |
+
if trade_detail == "ROI":
|
130 |
+
trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
|
131 |
+
trades_filtered = trades_filtered.groupby("month_year_week")["roi"].quantile([0.25, 0.5, 0.75]).unstack()
|
132 |
+
trades_filtered.columns = trades_filtered.columns.astype(str)
|
133 |
+
trades_filtered.reset_index(inplace=True)
|
134 |
+
trades_filtered.columns = [
|
135 |
+
"month_year_week",
|
136 |
+
"25th_percentile",
|
137 |
+
"50th_percentile",
|
138 |
+
"75th_percentile"
|
139 |
+
]
|
140 |
+
# reformat the data as percentile, date, value
|
141 |
+
trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="ROI")
|
142 |
+
|
143 |
+
return gr.LinePlot(
|
144 |
+
value=trades_filtered,
|
145 |
+
x="month_year_week",
|
146 |
+
y="ROI",
|
147 |
+
color="percentile",
|
148 |
+
show_label=True,
|
149 |
+
interactive=True,
|
150 |
+
show_actions_button=True,
|
151 |
+
tooltip=["month_year_week", "percentile", "ROI"]
|
152 |
+
)
|
153 |
+
|
154 |
+
def plot_trades_by_week(trades_df):
|
155 |
+
return gr.BarPlot(
|
156 |
+
value=trades_df,
|
157 |
+
x="month_year_week",
|
158 |
+
y="trades",
|
159 |
+
show_label=True,
|
160 |
+
interactive=True,
|
161 |
+
show_actions_button=True,
|
162 |
+
tooltip=["month_year_week", "trades"]
|
163 |
+
)
|
164 |
+
|
165 |
+
def plot_winning_trades_by_week(trades_df):
|
166 |
+
return gr.BarPlot(
|
167 |
+
value=trades_df,
|
168 |
+
x="month_year_week",
|
169 |
+
y="winning_trade",
|
170 |
+
show_label=True,
|
171 |
+
interactive=True,
|
172 |
+
show_actions_button=True,
|
173 |
+
tooltip=["month_year_week", "winning_trade"]
|
174 |
+
)
|