rosacastillo commited on
Commit
dad191d
·
1 Parent(s): dd22672

New notebook and new weighted accuracy graph

Browse files
app.py CHANGED
@@ -1,6 +1,7 @@
1
  from datetime import datetime, timedelta
2
  import gradio as gr
3
  import pandas as pd
 
4
  import duckdb
5
  import logging
6
  from tabs.trades import (
@@ -83,6 +84,13 @@ def get_all_data():
83
  logger.info("Getting all data")
84
  con = duckdb.connect(":memory:")
85
 
 
 
 
 
 
 
 
86
  # Query to fetch data from all_trades_profitability.parquet
87
  query2 = f"""
88
  SELECT *
@@ -100,23 +108,39 @@ def get_all_data():
100
 
101
  con.close()
102
 
103
- return df1, df2
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
 
106
  def prepare_data():
107
  """
108
  Prepare the data for the dashboard
109
  """
110
- tools_df, trades_df = get_all_data()
111
 
112
  tools_df["request_time"] = pd.to_datetime(tools_df["request_time"])
113
  trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"])
114
 
115
  trades_df = prepare_trades(trades_df)
116
- return tools_df, trades_df
117
 
 
118
 
119
- tools_df, trades_df = prepare_data()
 
 
 
120
 
121
 
122
  demo = gr.Blocks()
@@ -240,6 +264,26 @@ with demo:
240
  with gr.Row():
241
  tool_winnings_by_tool_plot
242
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  with gr.TabItem("🏥 Tool Error Dashboard"):
244
  with gr.Row():
245
  gr.Markdown("# All tools errors")
 
1
  from datetime import datetime, timedelta
2
  import gradio as gr
3
  import pandas as pd
4
+ import seaborn as sns
5
  import duckdb
6
  import logging
7
  from tabs.trades import (
 
84
  logger.info("Getting all data")
85
  con = duckdb.connect(":memory:")
86
 
87
+ # Query to fetch tools accuracy data
88
+ query3 = f"""
89
+ SELECT *
90
+ FROM read_csv('./data/tools_accuracy.csv')
91
+ """
92
+ df3 = con.execute(query3).fetchdf()
93
+
94
  # Query to fetch data from all_trades_profitability.parquet
95
  query2 = f"""
96
  SELECT *
 
108
 
109
  con.close()
110
 
111
+ return df1, df2, df3
112
+
113
+
114
+ def get_weighted_accuracy(row, global_requests: int):
115
+ """Function to compute the weighted accuracy of a tool"""
116
+ return row["tool_accuracy"] * (row["total_requests"] / global_requests)
117
+
118
+
119
+ def compute_weighted_accuracy(tools_accuracy: pd.DataFrame):
120
+ global_requests = tools_accuracy.total_requests.sum()
121
+ tools_accuracy["weighted_accuracy"] = tools_accuracy.apply(
122
+ lambda x: get_weighted_accuracy(x, global_requests), axis=1
123
+ )
124
+ return tools_accuracy
125
 
126
 
127
  def prepare_data():
128
  """
129
  Prepare the data for the dashboard
130
  """
131
+ tools_df, trades_df, tools_accuracy_info = get_all_data()
132
 
133
  tools_df["request_time"] = pd.to_datetime(tools_df["request_time"])
134
  trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"])
135
 
136
  trades_df = prepare_trades(trades_df)
 
137
 
138
+ tools_accuracy_info = compute_weighted_accuracy(tools_accuracy_info)
139
 
140
+ return tools_df, trades_df, tools_accuracy_info
141
+
142
+
143
+ tools_df, trades_df, tools_accuracy_info = prepare_data()
144
 
145
 
146
  demo = gr.Blocks()
 
264
  with gr.Row():
265
  tool_winnings_by_tool_plot
266
 
267
+ with gr.Row():
268
+ gr.Markdown("# Weighted accuracy ranking per tool")
269
+
270
+ with gr.Row():
271
+ tools_accuracy_info = tools_accuracy_info.sort_values(
272
+ by="weighted_accuracy", ascending=False
273
+ )
274
+ # Create the Seaborn bar plot
275
+ sns.set_theme(palette="viridis")
276
+ plot = sns.barplot(
277
+ tools_accuracy_info,
278
+ x="weighted_accuracy",
279
+ y="tool",
280
+ hue="tool",
281
+ dodge=False,
282
+ )
283
+ plot.legend_.remove()
284
+ # Display the plot using gr.Plot
285
+ gr.Plot(value=plot.get_figure())
286
+
287
  with gr.TabItem("🏥 Tool Error Dashboard"):
288
  with gr.Row():
289
  gr.Markdown("# All tools errors")
notebooks/weekly_analysis.ipynb CHANGED
@@ -46,10 +46,240 @@
46
  "source": [
47
  "tools = pd.read_parquet('../data/tools.parquet')\n",
48
  "fpmms = pd.read_parquet('../data/fpmms.parquet')\n",
49
- "summary_traders = pd.read_parquet('../data/summary_profitability.parquet')\n",
 
 
 
 
 
 
 
 
50
  "all_trades = pd.read_parquet('../data/all_trades_profitability.parquet')"
51
  ]
52
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  {
54
  "cell_type": "code",
55
  "execution_count": 4,
@@ -60,31 +290,8 @@
60
  "output_type": "stream",
61
  "text": [
62
  "<class 'pandas.core.frame.DataFrame'>\n",
63
- "RangeIndex: 95550 entries, 0 to 95549\n",
64
- "Data columns (total 19 columns):\n",
65
- " # Column Non-Null Count Dtype \n",
66
- "--- ------ -------------- ----- \n",
67
- " 0 trader_address 95550 non-null object \n",
68
- " 1 trade_id 95550 non-null object \n",
69
- " 2 creation_timestamp 95550 non-null datetime64[ns, UTC]\n",
70
- " 3 title 95550 non-null object \n",
71
- " 4 market_status 95550 non-null object \n",
72
- " 5 collateral_amount 95550 non-null float64 \n",
73
- " 6 outcome_index 95550 non-null object \n",
74
- " 7 trade_fee_amount 95550 non-null float64 \n",
75
- " 8 outcomes_tokens_traded 95550 non-null float64 \n",
76
- " 9 current_answer 95550 non-null int64 \n",
77
- " 10 is_invalid 95550 non-null bool \n",
78
- " 11 winning_trade 95550 non-null bool \n",
79
- " 12 earnings 95550 non-null float64 \n",
80
- " 13 redeemed 95550 non-null bool \n",
81
- " 14 redeemed_amount 95550 non-null float64 \n",
82
- " 15 num_mech_calls 95550 non-null int64 \n",
83
- " 16 mech_fee_amount 95550 non-null float64 \n",
84
- " 17 net_earnings 95550 non-null float64 \n",
85
- " 18 roi 95550 non-null float64 \n",
86
- "dtypes: bool(3), datetime64[ns, UTC](1), float64(8), int64(2), object(5)\n",
87
- "memory usage: 11.9+ MB\n"
88
  ]
89
  }
90
  ],
@@ -94,16 +301,16 @@
94
  },
95
  {
96
  "cell_type": "code",
97
- "execution_count": 5,
98
  "metadata": {},
99
  "outputs": [
100
  {
101
  "data": {
102
  "text/plain": [
103
- "Timestamp('2023-07-12 15:17:25+0000', tz='UTC')"
104
  ]
105
  },
106
- "execution_count": 5,
107
  "metadata": {},
108
  "output_type": "execute_result"
109
  }
@@ -114,16 +321,16 @@
114
  },
115
  {
116
  "cell_type": "code",
117
- "execution_count": 6,
118
  "metadata": {},
119
  "outputs": [
120
  {
121
  "data": {
122
  "text/plain": [
123
- "Timestamp('2024-05-27 02:13:05+0000', tz='UTC')"
124
  ]
125
  },
126
- "execution_count": 6,
127
  "metadata": {},
128
  "output_type": "execute_result"
129
  }
 
46
  "source": [
47
  "tools = pd.read_parquet('../data/tools.parquet')\n",
48
  "fpmms = pd.read_parquet('../data/fpmms.parquet')\n",
49
+ "summary_traders = pd.read_parquet('../data/summary_profitability.parquet')\n"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 6,
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": [
58
  "all_trades = pd.read_parquet('../data/all_trades_profitability.parquet')"
59
  ]
60
  },
61
+ {
62
+ "cell_type": "code",
63
+ "execution_count": 7,
64
+ "metadata": {},
65
+ "outputs": [
66
+ {
67
+ "data": {
68
+ "text/html": [
69
+ "<div>\n",
70
+ "<style scoped>\n",
71
+ " .dataframe tbody tr th:only-of-type {\n",
72
+ " vertical-align: middle;\n",
73
+ " }\n",
74
+ "\n",
75
+ " .dataframe tbody tr th {\n",
76
+ " vertical-align: top;\n",
77
+ " }\n",
78
+ "\n",
79
+ " .dataframe thead th {\n",
80
+ " text-align: right;\n",
81
+ " }\n",
82
+ "</style>\n",
83
+ "<table border=\"1\" class=\"dataframe\">\n",
84
+ " <thead>\n",
85
+ " <tr style=\"text-align: right;\">\n",
86
+ " <th></th>\n",
87
+ " <th>trader_address</th>\n",
88
+ " <th>trade_id</th>\n",
89
+ " <th>creation_timestamp</th>\n",
90
+ " <th>title</th>\n",
91
+ " <th>market_status</th>\n",
92
+ " <th>collateral_amount</th>\n",
93
+ " <th>outcome_index</th>\n",
94
+ " <th>trade_fee_amount</th>\n",
95
+ " <th>outcomes_tokens_traded</th>\n",
96
+ " <th>current_answer</th>\n",
97
+ " <th>is_invalid</th>\n",
98
+ " <th>winning_trade</th>\n",
99
+ " <th>earnings</th>\n",
100
+ " <th>redeemed</th>\n",
101
+ " <th>redeemed_amount</th>\n",
102
+ " <th>num_mech_calls</th>\n",
103
+ " <th>mech_fee_amount</th>\n",
104
+ " <th>net_earnings</th>\n",
105
+ " <th>roi</th>\n",
106
+ " </tr>\n",
107
+ " </thead>\n",
108
+ " <tbody>\n",
109
+ " <tr>\n",
110
+ " <th>0</th>\n",
111
+ " <td>0x022b36c50b85b8ae7addfb8a35d76c59d5814834</td>\n",
112
+ " <td>0x017947579ab51313c31fe1cc562c0f1726ec09c90x02...</td>\n",
113
+ " <td>2024-05-19 01:26:30+00:00</td>\n",
114
+ " <td>Will Google's Pixel 9 lineup be officially rel...</td>\n",
115
+ " <td>CLOSED</td>\n",
116
+ " <td>0.638</td>\n",
117
+ " <td>1</td>\n",
118
+ " <td>0.013</td>\n",
119
+ " <td>1.206</td>\n",
120
+ " <td>1</td>\n",
121
+ " <td>False</td>\n",
122
+ " <td>True</td>\n",
123
+ " <td>1.206</td>\n",
124
+ " <td>True</td>\n",
125
+ " <td>1.206</td>\n",
126
+ " <td>0</td>\n",
127
+ " <td>0.000</td>\n",
128
+ " <td>0.556</td>\n",
129
+ " <td>0.854</td>\n",
130
+ " </tr>\n",
131
+ " <tr>\n",
132
+ " <th>1</th>\n",
133
+ " <td>0x022b36c50b85b8ae7addfb8a35d76c59d5814834</td>\n",
134
+ " <td>0x027f6bc849e273477f4a63085192714084917fcc0x02...</td>\n",
135
+ " <td>2024-06-12 01:16:55+00:00</td>\n",
136
+ " <td>Will the 2D-animated Paramount Plus show 'Tale...</td>\n",
137
+ " <td>CLOSED</td>\n",
138
+ " <td>1.000</td>\n",
139
+ " <td>1</td>\n",
140
+ " <td>0.020</td>\n",
141
+ " <td>1.840</td>\n",
142
+ " <td>1</td>\n",
143
+ " <td>False</td>\n",
144
+ " <td>True</td>\n",
145
+ " <td>1.840</td>\n",
146
+ " <td>True</td>\n",
147
+ " <td>1.840</td>\n",
148
+ " <td>5</td>\n",
149
+ " <td>0.050</td>\n",
150
+ " <td>0.770</td>\n",
151
+ " <td>0.719</td>\n",
152
+ " </tr>\n",
153
+ " <tr>\n",
154
+ " <th>2</th>\n",
155
+ " <td>0x022b36c50b85b8ae7addfb8a35d76c59d5814834</td>\n",
156
+ " <td>0x027f6bc849e273477f4a63085192714084917fcc0x02...</td>\n",
157
+ " <td>2024-06-12 15:08:00+00:00</td>\n",
158
+ " <td>Will the 2D-animated Paramount Plus show 'Tale...</td>\n",
159
+ " <td>CLOSED</td>\n",
160
+ " <td>0.800</td>\n",
161
+ " <td>1</td>\n",
162
+ " <td>0.016</td>\n",
163
+ " <td>1.518</td>\n",
164
+ " <td>1</td>\n",
165
+ " <td>False</td>\n",
166
+ " <td>True</td>\n",
167
+ " <td>1.518</td>\n",
168
+ " <td>True</td>\n",
169
+ " <td>1.518</td>\n",
170
+ " <td>5</td>\n",
171
+ " <td>0.050</td>\n",
172
+ " <td>0.652</td>\n",
173
+ " <td>0.753</td>\n",
174
+ " </tr>\n",
175
+ " <tr>\n",
176
+ " <th>3</th>\n",
177
+ " <td>0x022b36c50b85b8ae7addfb8a35d76c59d5814834</td>\n",
178
+ " <td>0x027f6bc849e273477f4a63085192714084917fcc0x02...</td>\n",
179
+ " <td>2024-06-13 07:22:55+00:00</td>\n",
180
+ " <td>Will the 2D-animated Paramount Plus show 'Tale...</td>\n",
181
+ " <td>CLOSED</td>\n",
182
+ " <td>0.456</td>\n",
183
+ " <td>0</td>\n",
184
+ " <td>0.009</td>\n",
185
+ " <td>1.003</td>\n",
186
+ " <td>1</td>\n",
187
+ " <td>False</td>\n",
188
+ " <td>False</td>\n",
189
+ " <td>0.000</td>\n",
190
+ " <td>True</td>\n",
191
+ " <td>0.000</td>\n",
192
+ " <td>5</td>\n",
193
+ " <td>0.050</td>\n",
194
+ " <td>-0.515</td>\n",
195
+ " <td>-1.000</td>\n",
196
+ " </tr>\n",
197
+ " <tr>\n",
198
+ " <th>4</th>\n",
199
+ " <td>0x022b36c50b85b8ae7addfb8a35d76c59d5814834</td>\n",
200
+ " <td>0x027f6bc849e273477f4a63085192714084917fcc0x02...</td>\n",
201
+ " <td>2024-06-14 03:01:20+00:00</td>\n",
202
+ " <td>Will the 2D-animated Paramount Plus show 'Tale...</td>\n",
203
+ " <td>CLOSED</td>\n",
204
+ " <td>0.704</td>\n",
205
+ " <td>0</td>\n",
206
+ " <td>0.014</td>\n",
207
+ " <td>1.198</td>\n",
208
+ " <td>1</td>\n",
209
+ " <td>False</td>\n",
210
+ " <td>False</td>\n",
211
+ " <td>0.000</td>\n",
212
+ " <td>True</td>\n",
213
+ " <td>0.000</td>\n",
214
+ " <td>5</td>\n",
215
+ " <td>0.050</td>\n",
216
+ " <td>-0.768</td>\n",
217
+ " <td>-1.000</td>\n",
218
+ " </tr>\n",
219
+ " </tbody>\n",
220
+ "</table>\n",
221
+ "</div>"
222
+ ],
223
+ "text/plain": [
224
+ " trader_address \\\n",
225
+ "0 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 \n",
226
+ "1 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 \n",
227
+ "2 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 \n",
228
+ "3 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 \n",
229
+ "4 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 \n",
230
+ "\n",
231
+ " trade_id \\\n",
232
+ "0 0x017947579ab51313c31fe1cc562c0f1726ec09c90x02... \n",
233
+ "1 0x027f6bc849e273477f4a63085192714084917fcc0x02... \n",
234
+ "2 0x027f6bc849e273477f4a63085192714084917fcc0x02... \n",
235
+ "3 0x027f6bc849e273477f4a63085192714084917fcc0x02... \n",
236
+ "4 0x027f6bc849e273477f4a63085192714084917fcc0x02... \n",
237
+ "\n",
238
+ " creation_timestamp \\\n",
239
+ "0 2024-05-19 01:26:30+00:00 \n",
240
+ "1 2024-06-12 01:16:55+00:00 \n",
241
+ "2 2024-06-12 15:08:00+00:00 \n",
242
+ "3 2024-06-13 07:22:55+00:00 \n",
243
+ "4 2024-06-14 03:01:20+00:00 \n",
244
+ "\n",
245
+ " title market_status \\\n",
246
+ "0 Will Google's Pixel 9 lineup be officially rel... CLOSED \n",
247
+ "1 Will the 2D-animated Paramount Plus show 'Tale... CLOSED \n",
248
+ "2 Will the 2D-animated Paramount Plus show 'Tale... CLOSED \n",
249
+ "3 Will the 2D-animated Paramount Plus show 'Tale... CLOSED \n",
250
+ "4 Will the 2D-animated Paramount Plus show 'Tale... CLOSED \n",
251
+ "\n",
252
+ " collateral_amount outcome_index trade_fee_amount outcomes_tokens_traded \\\n",
253
+ "0 0.638 1 0.013 1.206 \n",
254
+ "1 1.000 1 0.020 1.840 \n",
255
+ "2 0.800 1 0.016 1.518 \n",
256
+ "3 0.456 0 0.009 1.003 \n",
257
+ "4 0.704 0 0.014 1.198 \n",
258
+ "\n",
259
+ " current_answer is_invalid winning_trade earnings redeemed \\\n",
260
+ "0 1 False True 1.206 True \n",
261
+ "1 1 False True 1.840 True \n",
262
+ "2 1 False True 1.518 True \n",
263
+ "3 1 False False 0.000 True \n",
264
+ "4 1 False False 0.000 True \n",
265
+ "\n",
266
+ " redeemed_amount num_mech_calls mech_fee_amount net_earnings roi \n",
267
+ "0 1.206 0 0.000 0.556 0.854 \n",
268
+ "1 1.840 5 0.050 0.770 0.719 \n",
269
+ "2 1.518 5 0.050 0.652 0.753 \n",
270
+ "3 0.000 5 0.050 -0.515 -1.000 \n",
271
+ "4 0.000 5 0.050 -0.768 -1.000 "
272
+ ]
273
+ },
274
+ "execution_count": 7,
275
+ "metadata": {},
276
+ "output_type": "execute_result"
277
+ }
278
+ ],
279
+ "source": [
280
+ "all_trades.head()"
281
+ ]
282
+ },
283
  {
284
  "cell_type": "code",
285
  "execution_count": 4,
 
290
  "output_type": "stream",
291
  "text": [
292
  "<class 'pandas.core.frame.DataFrame'>\n",
293
+ "RangeIndex: 0 entries\n",
294
+ "Empty DataFrame\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  ]
296
  }
297
  ],
 
301
  },
302
  {
303
  "cell_type": "code",
304
+ "execution_count": 8,
305
  "metadata": {},
306
  "outputs": [
307
  {
308
  "data": {
309
  "text/plain": [
310
+ "Timestamp('2024-05-12 00:04:25+0000', tz='UTC')"
311
  ]
312
  },
313
+ "execution_count": 8,
314
  "metadata": {},
315
  "output_type": "execute_result"
316
  }
 
321
  },
322
  {
323
  "cell_type": "code",
324
+ "execution_count": 9,
325
  "metadata": {},
326
  "outputs": [
327
  {
328
  "data": {
329
  "text/plain": [
330
+ "Timestamp('2024-07-08 02:29:40+0000', tz='UTC')"
331
  ]
332
  },
333
+ "execution_count": 9,
334
  "metadata": {},
335
  "output_type": "execute_result"
336
  }
notebooks/weighted_accuracy_ranking.ipynb ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 2,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pandas as pd\n",
10
+ "import matplotlib.pyplot as plt\n",
11
+ "import seaborn as sns\n",
12
+ "import gc"
13
+ ]
14
+ },
15
+ {
16
+ "cell_type": "markdown",
17
+ "metadata": {},
18
+ "source": [
19
+ "Weighted_accuracy = tool_accuracy * volume_factor\n",
20
+ "Volume_factor = tool_requests / all_tools_requests\n"
21
+ ]
22
+ },
23
+ {
24
+ "cell_type": "code",
25
+ "execution_count": 3,
26
+ "metadata": {},
27
+ "outputs": [
28
+ {
29
+ "data": {
30
+ "text/html": [
31
+ "<div>\n",
32
+ "<style scoped>\n",
33
+ " .dataframe tbody tr th:only-of-type {\n",
34
+ " vertical-align: middle;\n",
35
+ " }\n",
36
+ "\n",
37
+ " .dataframe tbody tr th {\n",
38
+ " vertical-align: top;\n",
39
+ " }\n",
40
+ "\n",
41
+ " .dataframe thead th {\n",
42
+ " text-align: right;\n",
43
+ " }\n",
44
+ "</style>\n",
45
+ "<table border=\"1\" class=\"dataframe\">\n",
46
+ " <thead>\n",
47
+ " <tr style=\"text-align: right;\">\n",
48
+ " <th></th>\n",
49
+ " <th>tool</th>\n",
50
+ " <th>tool_accuracy</th>\n",
51
+ " <th>total_requests</th>\n",
52
+ " <th>min</th>\n",
53
+ " <th>max</th>\n",
54
+ " </tr>\n",
55
+ " </thead>\n",
56
+ " <tbody>\n",
57
+ " <tr>\n",
58
+ " <th>0</th>\n",
59
+ " <td>claude-prediction-offline</td>\n",
60
+ " <td>66.233766</td>\n",
61
+ " <td>231</td>\n",
62
+ " <td>2024-05-10 14:54:40</td>\n",
63
+ " <td>2024-06-22 04:20:40</td>\n",
64
+ " </tr>\n",
65
+ " <tr>\n",
66
+ " <th>1</th>\n",
67
+ " <td>claude-prediction-online</td>\n",
68
+ " <td>73.538462</td>\n",
69
+ " <td>325</td>\n",
70
+ " <td>2024-05-10 17:47:35</td>\n",
71
+ " <td>2024-07-04 21:55:25</td>\n",
72
+ " </tr>\n",
73
+ " <tr>\n",
74
+ " <th>2</th>\n",
75
+ " <td>prediction-offline</td>\n",
76
+ " <td>69.532755</td>\n",
77
+ " <td>4152</td>\n",
78
+ " <td>2024-05-10 14:14:55</td>\n",
79
+ " <td>2024-07-06 07:46:35</td>\n",
80
+ " </tr>\n",
81
+ " <tr>\n",
82
+ " <th>3</th>\n",
83
+ " <td>prediction-offline-sme</td>\n",
84
+ " <td>77.647059</td>\n",
85
+ " <td>85</td>\n",
86
+ " <td>2024-06-16 00:42:00</td>\n",
87
+ " <td>2024-06-21 15:04:40</td>\n",
88
+ " </tr>\n",
89
+ " <tr>\n",
90
+ " <th>4</th>\n",
91
+ " <td>prediction-online</td>\n",
92
+ " <td>70.135444</td>\n",
93
+ " <td>10484</td>\n",
94
+ " <td>2024-05-10 14:11:15</td>\n",
95
+ " <td>2024-07-06 08:13:10</td>\n",
96
+ " </tr>\n",
97
+ " </tbody>\n",
98
+ "</table>\n",
99
+ "</div>"
100
+ ],
101
+ "text/plain": [
102
+ " tool tool_accuracy total_requests \\\n",
103
+ "0 claude-prediction-offline 66.233766 231 \n",
104
+ "1 claude-prediction-online 73.538462 325 \n",
105
+ "2 prediction-offline 69.532755 4152 \n",
106
+ "3 prediction-offline-sme 77.647059 85 \n",
107
+ "4 prediction-online 70.135444 10484 \n",
108
+ "\n",
109
+ " min max \n",
110
+ "0 2024-05-10 14:54:40 2024-06-22 04:20:40 \n",
111
+ "1 2024-05-10 17:47:35 2024-07-04 21:55:25 \n",
112
+ "2 2024-05-10 14:14:55 2024-07-06 07:46:35 \n",
113
+ "3 2024-06-16 00:42:00 2024-06-21 15:04:40 \n",
114
+ "4 2024-05-10 14:11:15 2024-07-06 08:13:10 "
115
+ ]
116
+ },
117
+ "execution_count": 3,
118
+ "metadata": {},
119
+ "output_type": "execute_result"
120
+ }
121
+ ],
122
+ "source": [
123
+ "# read accuracy csv file\n",
124
+ "tools_accuracy_info = pd.read_csv(\"../data/tools_accuracy.csv\")\n",
125
+ "tools_accuracy_info.head()"
126
+ ]
127
+ },
128
+ {
129
+ "cell_type": "code",
130
+ "execution_count": 4,
131
+ "metadata": {},
132
+ "outputs": [
133
+ {
134
+ "data": {
135
+ "text/plain": [
136
+ "57603"
137
+ ]
138
+ },
139
+ "execution_count": 4,
140
+ "metadata": {},
141
+ "output_type": "execute_result"
142
+ }
143
+ ],
144
+ "source": [
145
+ "global_requests = tools_accuracy_info.total_requests.sum()\n",
146
+ "global_requests"
147
+ ]
148
+ },
149
+ {
150
+ "cell_type": "code",
151
+ "execution_count": 7,
152
+ "metadata": {},
153
+ "outputs": [],
154
+ "source": [
155
+ "def get_weighted_accuracy(row, global_requests: int):\n",
156
+ " '''Function to compute the weighted accuracy of a tool'''\n",
157
+ " return row[\"tool_accuracy\"] * (row[\"total_requests\"]/global_requests)"
158
+ ]
159
+ },
160
+ {
161
+ "cell_type": "code",
162
+ "execution_count": 8,
163
+ "metadata": {},
164
+ "outputs": [
165
+ {
166
+ "data": {
167
+ "text/html": [
168
+ "<div>\n",
169
+ "<style scoped>\n",
170
+ " .dataframe tbody tr th:only-of-type {\n",
171
+ " vertical-align: middle;\n",
172
+ " }\n",
173
+ "\n",
174
+ " .dataframe tbody tr th {\n",
175
+ " vertical-align: top;\n",
176
+ " }\n",
177
+ "\n",
178
+ " .dataframe thead th {\n",
179
+ " text-align: right;\n",
180
+ " }\n",
181
+ "</style>\n",
182
+ "<table border=\"1\" class=\"dataframe\">\n",
183
+ " <thead>\n",
184
+ " <tr style=\"text-align: right;\">\n",
185
+ " <th></th>\n",
186
+ " <th>tool</th>\n",
187
+ " <th>tool_accuracy</th>\n",
188
+ " <th>total_requests</th>\n",
189
+ " <th>min</th>\n",
190
+ " <th>max</th>\n",
191
+ " <th>weighted_accuracy</th>\n",
192
+ " </tr>\n",
193
+ " </thead>\n",
194
+ " <tbody>\n",
195
+ " <tr>\n",
196
+ " <th>0</th>\n",
197
+ " <td>claude-prediction-offline</td>\n",
198
+ " <td>66.233766</td>\n",
199
+ " <td>231</td>\n",
200
+ " <td>2024-05-10 14:54:40</td>\n",
201
+ " <td>2024-06-22 04:20:40</td>\n",
202
+ " <td>0.265611</td>\n",
203
+ " </tr>\n",
204
+ " <tr>\n",
205
+ " <th>1</th>\n",
206
+ " <td>claude-prediction-online</td>\n",
207
+ " <td>73.538462</td>\n",
208
+ " <td>325</td>\n",
209
+ " <td>2024-05-10 17:47:35</td>\n",
210
+ " <td>2024-07-04 21:55:25</td>\n",
211
+ " <td>0.414909</td>\n",
212
+ " </tr>\n",
213
+ " <tr>\n",
214
+ " <th>2</th>\n",
215
+ " <td>prediction-offline</td>\n",
216
+ " <td>69.532755</td>\n",
217
+ " <td>4152</td>\n",
218
+ " <td>2024-05-10 14:14:55</td>\n",
219
+ " <td>2024-07-06 07:46:35</td>\n",
220
+ " <td>5.011892</td>\n",
221
+ " </tr>\n",
222
+ " <tr>\n",
223
+ " <th>3</th>\n",
224
+ " <td>prediction-offline-sme</td>\n",
225
+ " <td>77.647059</td>\n",
226
+ " <td>85</td>\n",
227
+ " <td>2024-06-16 00:42:00</td>\n",
228
+ " <td>2024-06-21 15:04:40</td>\n",
229
+ " <td>0.114577</td>\n",
230
+ " </tr>\n",
231
+ " <tr>\n",
232
+ " <th>4</th>\n",
233
+ " <td>prediction-online</td>\n",
234
+ " <td>70.135444</td>\n",
235
+ " <td>10484</td>\n",
236
+ " <td>2024-05-10 14:11:15</td>\n",
237
+ " <td>2024-07-06 08:13:10</td>\n",
238
+ " <td>12.764960</td>\n",
239
+ " </tr>\n",
240
+ " </tbody>\n",
241
+ "</table>\n",
242
+ "</div>"
243
+ ],
244
+ "text/plain": [
245
+ " tool tool_accuracy total_requests \\\n",
246
+ "0 claude-prediction-offline 66.233766 231 \n",
247
+ "1 claude-prediction-online 73.538462 325 \n",
248
+ "2 prediction-offline 69.532755 4152 \n",
249
+ "3 prediction-offline-sme 77.647059 85 \n",
250
+ "4 prediction-online 70.135444 10484 \n",
251
+ "\n",
252
+ " min max weighted_accuracy \n",
253
+ "0 2024-05-10 14:54:40 2024-06-22 04:20:40 0.265611 \n",
254
+ "1 2024-05-10 17:47:35 2024-07-04 21:55:25 0.414909 \n",
255
+ "2 2024-05-10 14:14:55 2024-07-06 07:46:35 5.011892 \n",
256
+ "3 2024-06-16 00:42:00 2024-06-21 15:04:40 0.114577 \n",
257
+ "4 2024-05-10 14:11:15 2024-07-06 08:13:10 12.764960 "
258
+ ]
259
+ },
260
+ "execution_count": 8,
261
+ "metadata": {},
262
+ "output_type": "execute_result"
263
+ }
264
+ ],
265
+ "source": [
266
+ "tools_accuracy_info[\"weighted_accuracy\"] = tools_accuracy_info.apply(lambda x: get_weighted_accuracy(x, global_requests), axis=1)\n",
267
+ "tools_accuracy_info.head()"
268
+ ]
269
+ },
270
+ {
271
+ "cell_type": "markdown",
272
+ "metadata": {},
273
+ "source": [
274
+ "# Painting the ranking"
275
+ ]
276
+ },
277
+ {
278
+ "cell_type": "code",
279
+ "execution_count": 13,
280
+ "metadata": {},
281
+ "outputs": [],
282
+ "source": [
283
+ "tools_accuracy_info = tools_accuracy_info.sort_values(by='weighted_accuracy', ascending=False)"
284
+ ]
285
+ },
286
+ {
287
+ "cell_type": "code",
288
+ "execution_count": 14,
289
+ "metadata": {},
290
+ "outputs": [
291
+ {
292
+ "data": {
293
+ "text/plain": [
294
+ "<Axes: xlabel='weighted_accuracy', ylabel='tool'>"
295
+ ]
296
+ },
297
+ "execution_count": 14,
298
+ "metadata": {},
299
+ "output_type": "execute_result"
300
+ },
301
+ {
302
+ "data": {
303
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAG1CAYAAAB+lYJAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACf7UlEQVR4nOzde1zP9///8VsizaFImPlE5hCbUk4xOYXJIYf2GfZJRuMzhoghH18f3nNIOS+zRk3IZmwOYdM2H2axMWNzGq0cc/o450y9+/3h1+vTW0XbIof79XJx0ev1eh4er+cr2/vxfj2fr5dVRkZGBiIiIiIiIvmoUEEHICIiIiIiTx8lGiIiIiIiku+UaIiIiIiISL5ToiEiIiIiIvlOiYaIiIiIiOQ7JRoiIiIiIpLvlGiIiIiIiEi+U6IhIiIiIiL5rnBBByAiz7aMjAzMZr039GErVMhK4/yIaKwfDY3zo6OxfjSepHEuVMgKKyurB5ZToiEiBcrKyorU1OukpZkLOpSnVuHChShdurjG+RHQWD8aGudHR2P9aDxp4+zgUBxr6wcnGpo6JSIiIiIi+U53NESkwFlb6zuPhylzfDXOD5/G+tHQOD86GutH42GMs9lc8FOTrTIyMp6MyWAi8lTKyMjI0zxPERERybuMdDMXLl1/KMnG3alTD06KdEdDRAqUlZUVF1d8Tdq5iwUdioiIyFOhsGNpSvu9WuALzJVoiEiBSzt3kbTTZws6DBEREclHmnAnIiIiIiL5TomGiIiIiIjkOyUaIiIiIiKS75RoiIiIiIhIvlOiISIiIiIi+U6JxhPI29ubiIgIAFasWIGLi0ue627cuJGkpCQAtm3bhouLCykpKQ8lzqfBxYsXWb58eUGH8dAEBAQQEhJS0GGIiIjIU0iJxhOuffv2JCQk5KnsiRMn6N+/P+fPnwfAw8ODhIQEKlSo8DBDfKKFh4cTFxdX0GE8NBEREYwZM6agwxAREZGnkN6j8YSztbXF1tY2T2XvfQm8jY0NZcuWfRhhPTXuHbOnTalSpQo6BBEREXlK6Y5GPnFxcWHJkiV069YNV1dXfH192bBhg3E8IiKCnj17EhwcTN26dZkwYQIAO3fuxN/fHzc3N1q0aIHJZOLq1atGvStXrjBq1Cjq169Po0aNWLBggUW/906dunbtGhMmTMDLywsPDw969uzJ3r17SUlJoVWrVgD06tWLiIiIbFOnbt68yaxZs2jVqhWurq507tyZ+Ph4i77atGlj/F27dm38/Pz4+eef7zs2AQEBjB07ltdff5369esbdwi++OIL2rVrh5ubG+3atWPhwoWYzWajXlJSEr1798bd3Z1XX32VjRs34uLiwrZt2wAICQkhICDAoq979505c4bg4GDq16+Pp6cn/fv358iRI8bx8+fPExQUhKenJ25ubvTo0YPt27cbba1cuZLt27ffd3paSEgIQUFBBAYGUrduXebPnw/cnabm5+eHm5sbbdq0YdasWdy+fduol5iYyNtvv02DBg2oXbs2rVq14uOPPzaO37hxgzFjxtCkSRNcXV3p0qULX3/9tXE8PT2dmJgY2rZti6urK23btuXTTz81jm/bto2XXnqJ7777jo4dO1K7dm18fHz49ttvLa5N5tSpvFzfGzduMG7cODw9Palbty5jxoxh+PDhmn4lIiIi2SjRyEfTpk2jc+fOrF69mubNmzNo0CB27txpHP/pp59wdHRk9erVBAQEcODAAfr06UPTpk2Ji4tj2rRp7Nu3j8DAQOOb9KFDh7J7924iIyNZsGABmzZt4sSJE7nGMHToUDZv3kxoaCirVq3CycmJwMBAihcvbqw1iIiIIDAwMFvdYcOGsWrVKsaOHUtcXBytW7dmyJAhFh9MT506xdKlS5k6dSorV67kueeeIyQk5IHf/C9fvpxevXrxySef0LRpUz777DPCw8MZNGgQ69atY+jQocyfP59p06YBcOnSJXr16oWtrS3Lli1jzJgxTJw4Me8XA7h+/bqRdMTGxrJ48WJKly5Nt27dOHPmDADjx4/n1q1bxMbGsmbNGqpUqcI777zD9evXGTNmDO3atTOmmN1PfHw8r7zyCl988QUdO3Zk8+bNDB06lG7durF27VrGjRvHV199xYgRI4C7H9gDAwMpVaoUS5cuZe3atfj4+BAWFsZvv/0GwOzZszl48CDz5s3jyy+/pFmzZgQHBxuJ4ZQpU5g7dy6DBg1izZo1+Pv7M2nSJGJiYoy40tPTmTp1KmPGjGHt2rXUqFGDUaNGce3atRzP40HXd9SoUWzZsoWZM2eydOlSrly5wrp16/7QdREREZFng6ZO5SM/Pz/8/f0BePfdd9m+fTuxsbHUrVvXKBMUFETJkiUBGDFiBE2aNKF///4AODs7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Q0RERERE8p0SDRERERERyXeaOiUiBc7eoVJBhyAiWejfpIjkByUaIlKgMjIyeMXnXwUdhojcw2xOx2zWE/BF5M9ToiEiBcrKyorU1Bukpz/+zw1/UllbF8LO7jmN8yPwNI212ZyhRENE/hIlGiJS4NLTzU/EC4qedBrnR0djLSKixeAiIiIiIvIQKNEQEREREZF8p0RDRERERETyndZoiEiBs7bWdx4PU+b4/pVx1sJgERH5o5RoiEiBysjIwM7uuYIO45nwV8Y53ZzOpYs3lGyIiEieKdEQkQJlZWXFqg2TOHfpaEGHIrlwLFWZLq3GUKiQlRINERHJMyUaIlLgzl06yulzvxd0GCIiIpKPNDFaRERERETynRINERERERHJd0o0REREREQk3ynREBERERGRfKdEQ0RERERE8p0Sjcect7c3ERERAKxYsQIXF5c81924cSNJSUkAbNu2DRcXF1JSUh5KnE+Dixcvsnz58oIOI88CAgIICQl5qH3o90ZERET+LCUaT5D27duTkJCQp7InTpygf//+nD9/HgAPDw8SEhKoUKHCwwzxiRYeHk5cXFxBhyEiIiLyVNB7NJ4gtra22Nra5qlsRoblS7VsbGwoW7bswwjrqXHvmImIiIjIn6c7Gn+Ci4sLS5YsoVu3bri6uuLr68uGDRuM4xEREfTs2ZPg4GDq1q3LhAkTANi5cyf+/v64ubnRokULTCYTV69eNepduXKFUaNGUb9+fRo1asSCBQss+r136tS1a9eYMGECXl5eeHh40LNnT/bu3UtKSgqtWrUCoFevXkRERGSbAnPz5k1mzZpFq1atcHV1pXPnzsTHx1v01aZNG+Pv2rVr4+fnx88//3zfsQkICGDs2LG8/vrr1K9f37hD8MUXX9CuXTvc3Nxo164dCxcuxGw2G/WSkpLo3bs37u7uvPrqq2zcuBEXFxe2bdsGQEhICAEBARZ93bvvzJkzBAcHU79+fTw9Penfvz9Hjhwxjp8/f56goCA8PT1xc3OjR48ebN++3Whr5cqVbN++/b7T00JCQggKCiIwMJC6desyf/58zGYzH330EW3btqV27drUrVuXvn37cuzYMaPehQsXLGKbNm2acW3uZ/fu3fTu3RsPDw9eeeUVxo0bx40bN3Is++233/L666/j7u6Oq6srfn5+fP/99xbX5t6pVvfu27FjB6+/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93uWpkgBcHFxITQ0FD8/v4IORR6R/uvG8fuFowUdxlOrukNlIjuYSE29wa1baQUdzlOtcOFClC5dnIsXr5GWpvfLPCwa50dHY/1oPGnj7OBQHGvrB6/A0BoNERERERHJd0o0REREREQk32mNhjx2Mt9DISIiIiJPLt3REBERERGRfKdEQ0RERERE8p2mTolIgatk/0JBh/BU0/iKiEhBUKIhIgUqIyODf3m9XdBhPPXSzWbMZj3NXEREHh0lGiJSoKysrEhNvUF6+uP/3PAnlbV1IezsnkOvTRIRkUdJiYaIFLj0dPMT8YIiERERyTstBhcRERERkXynRENERERERPKdEg0REREREcl3WqMhIgXO2vrx/M7DbM7Qk5pERET+JCUaIlKgMjIysLN7rqDDyFG62cyli9eVbIiIiPwJSjREpEBZWVkRunkdxy5dKOhQLFQq5cDoZh0oVMhKiYaIiMifoERDRArcsUsXSLrw34IOQ0RERPJRnhKN0aNH57lBKysrJk+e/KcDEhERERGRJ1+eEo1t27bluUErK6s/HYyIiIiIiDwd8pRo/Oc//3nYcYiIiIiIyFPkT6/RSE5OZvv27Vy5coXSpUtTr149XnzxxfyMTUREREREnlB/ONHIyMhg3LhxLF++nIyM/z2JxcrKiq5du2p9hoiIiIiI/PE3g0dFRfHFF18QFBTEhg0b2L17N99++y2DBg0iLi6OmJiYhxCmPOm8vb2JiIgAYMWKFbi4uOS57saNG0lKSgLurhdycXEhJSXlocT5NLh48SLLly8v6DBERETkGfeHE43PP/+cvn37MmDAACpWrIiNjQ1/+9vfGDhwIH379mXZsmUPI055irRv356EhIQ8lT1x4gT9+/fn/PnzAHh4eJCQkECFChUeZohPtPDwcOLi4go6DBEREXnG/eFE49SpUzRq1CjHY56envqmWR7I1taWsmXL5qls1ul5ADY2NpQtWxZra+uHEdpT4d4xExERESkIfzjRqFixIgcPHszx2IEDB3BwcPjLQcmj4eLiwpIlS+jWrRuurq74+vqyYcMG43hERAQ9e/YkODiYunXrMmHCBAB27tyJv78/bm5utGjRApPJxNWrV416V65cYdSoUdSvX59GjRqxYMECi37vnTp17do1JkyYgJeXFx4eHvTs2ZO9e/eSkpJCq1atAOjVqxcRERHZ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axdwd31BbGws4eHhvPXWW6Snp/Pyyy/z8ccfG3d/Zs6cSWhoKAMGDODKlSu8+OKLTJs2zVh836VLF7755hs6duzI119/netdmnv5+Pgwc+ZMPvroIyIjIylVqhTe3t68++67xvF9+/YxZcoUrl69SsWKFXn99dfZsGEDe/bs4Y033mDcuHGEhYUxYsQILl26RMWKFXn33Xfp3LkzcHfqT+nSpZk2bRrnzp3D2dmZf//733Tr1i1/LlIOJkyYwMSJExk8eDAZGRn4+vri4eFBkSJFcq3z3HPPER0dTWhoKD169MDW1pYWLVowatSobGV79erFoUOHjITa2dmZYcOG8f7777Nnzx6aNWv2wOterFgxFi5cyIQJE3jjjTeMZDNzrRI8+PdPREREJJNVRgG/Wc3FxYXQ0FD8/PwKMoynWua7QBYtWpRt4b08fLdu3eL777+nUaNGxqJygLZt29KpUyeLpzo9qwbGfUnS+dy/CLifamUc+KBTey5evEZamt7nkZPChQtRunRxjdEjoLF+NDTOj47G+tF40sbZwaE41tYPnhj1WNzREHma2djYYDKZaNiwIe+88w7W1tZ8/vnnnDx5Eh8fn4IOT0REROSheCzWaIg8zaysrJg3bx4XL16ke/fudO3alV27dllMRRMRERF52hT4HY3M91DIw/O3v/1N41zAatWqxccff1zQYYiIiIg8MrqjISIiIiIi+U6JhoiIiIiI5LsCnzolIuJkb1cgdUVEROThUaIhIgUqIyODkOZef6mNdLMZs7lAn9QtIiIi91CiISIFysrKitTUG6Sn//nnhpvNGUo0REREHjNKNESkwKWnm5+IFxSJiIhI3mkxuIiIiIiI5DslGiIiIiIiku+UaIiIiIiISL7TGg0RKXDW1g/+zkMLvkVERJ4sSjREpEBlZGRgZ/fcA8ulm81cunhdyYaIiMgTQomGiBQoKysrpm8+yPFL13Mt41SqGMObuVCokJUSDRERkSeEEg0RKXDHL13n0IVrBR2GiIiI5CMtBhcRERERkXynRENERERERPKdEg0REREREcl3SjRERERERCTfKdEQEREREZF8p0RD8szb25uIiAgAVqxYgYuLS57rbty4kaSkJAC2bduGi4sLKSkpDyXOvyIlJQUXFxe2bdv2UPvJOh5/RkREBN7e3vkYUc5cXFxYsWLFQ+9HREREnj5KNORPad++PQkJCXkqe+LECfr378/58+cB8PDwICEhgQoVKjzMEB9b946HiIiIyNNI79GQP8XW1hZbW9s8lc3IsHzBmo2NDWXLln0YYT0R7h0PERERkaeR7mg84VxcXFiyZAndunXD1dUVX19fNmzYYByPiIigZ8+eBAcHU7duXSZMmADAzp078ff3x83NjRYtWmAymbh69apR78qVK4waNYr69evTqFEjFixYYNHvvVOnrl27xoQJE/Dy8sLDw4OePXuyd+9eUlJSaNWqFQC9evUiIiIi29SpmzdvMmvWLFq1aoWrqyudO3cmPj7eoq82bdoYf9euXRs/Pz9+/vnn+45NQEAAISEhue7btm0bL730EvPmzcPT0xM/P788JwHff/893bt3p06dOjRr1oyZM2eSnp7+wPPJaTxyc+7cOUaOHImnpyf16tXj7bff5ujRozmWTUxM5O2336ZBgwbUrl2bVq1a8fHHHxvHc5pqde++06dPM2DAADw8PGjWrBlr1qzJ1s/GjRvx8/PDzc2NNm3aMGvWLG7fvp2nMRMREZFnixKNp8C0adPo3Lkzq1evpnnz5gwaNIidO3cax3/66SccHR1ZvXo1AQEBHDhwgD59+tC0aVPi4uKYNm0a+/btIzAw0PigPXToUHbv3k1kZCQLFixg06ZNnDhxItcYhg4dyubNmwkNDWXVqlU4OTkRGBhI8eLFWb58OXD3g21gYGC2usOGDWPVqlWMHTuWuLg4WrduzZAhQ/j222+NMqdOnWLp0qVMnTqVlStX8txzzxESEvKX7w6kp6fz3Xff8dlnnzFp0iSsrKweWGfXrl3885//pF69eqxYsYKJEyeydOlS5s6d+8DzqVChwgPHAyAtLY3AwECSkpKYO3cuy5Ytw2w207dvXyOhyXTjxg0CAwMpVaoUS5cuZe3atfj4+BAWFsZvv/2Wp3FIS0ujb9++XLx4kdjYWGbPnk10dLRFmc2bNzN06FC6devG2rVrGTduHF999RUjRozIUx8iIiLybNHUqaeAn58f/v7+ALz77rts376d2NhY6tata5QJCgqiZMmSAIwYMYImTZrQv39/AJydnZk+fTqtW7dm+/btlC1bloSEBGJiYqhfvz4A06dPp2XLljn2f+jQITZv3kx0dDReXl4AjB8/Hjs7Oy5fvoyDgwMA9vb2FC9e3KJucnIy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97wfpG3btsyYMYMPP/yQuXPn4uDgQMeOHS0WmD9MeRlnERERkUxWGXmdvC3yCAQEBFCxYsVsj4KVp9vKuPOcv5Bmsa+MQ2G6dirDxYvXSEvL24MKJGeFCxeidOniGstHQGP9aGicHx2N9aPxpI2zg0NxrK0fPDFKU6dERERERCTfKdEQEREREZF8pzUa8lhZvHhxQYcgIiIiIvlAdzRERERERCTfKdEQEREREZF8p6lTIlLgSpXK/p+inPaJiIjIk0P/JxeRApWRkUHLZjm/9d1szsBs1hO4RUREnkRKNESkQFlZWZGaeoP09OzPDVeiISIi8uRSoiEiBS493fxEvKBIRERE8k6LwUVEREREJN8p0RARERERkXynRENERERERPKd1miISIGztv7fdx5aAC4iIvJ0UKIhIgUqIyMDO7vnjG1zegYXL11TsiEiIvKEU6IhIgXKysqKYysucOtcGkUdC1PJz4FChayUaIiIiDzhlGiISIG7dS6NG6fvFHQYIiIiko+0GFxERERERPKdEg0REREREcl3SjRERERERCTfKdEQEREREZF8p0RDRERERETynRINERERERHJd0o0ngErVqzAxcXloffj7e1NRETEQ+8nv4SEhBAQEABASkoKLi4ubNu2LU91f//9dzZt2mRsu7i4sGLFiocR5h+yZ88e2rVrR+3atQkLC8u2HRAQQEhICADbtm3DxcWFlJSUAo5aREREnkZ6j4YIUKFCBRISErC3t89T+bfffpuuXbvSokULABISEihZsuRDjDBvPvroI4oUKcKXX35JyZIlGTt2rMV2UFCQUdbDw4OEhAQcHBwKMGIRERF5WinREAGsra0pW7bsn67/V+rmp8uXL1OrVi0qVaqU43ZWNjY2j03cIiIi8vTR1KmnyLVr15gwYQJeXl54eHjQs2dP9u7dm63cyZMnCQ4OpnHjxrz88ss0a9aMqVOnYjabgZynWt2778qVK4waNYr69evTqFEjFixYkK2fnTt34u/vj5ubGy1atMBkMnH16tX7nkNAQACTJk1i2LBh1KlTh2bNmjFv3jwyMjKAu9N9XnrpJebNm4enpyd+fn6YzWbOnDlDcHAw9evXx9PTk/79+3PkyBGj3YyMDObOnUuzZs1wd3dn9OjR3Lp1yzh+79SpjIwMFi5cSNu2bXFzc6NDhw6sXbsWuDtF7MSJ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Hk2deopMnjyZ8PBwhgwZwu3bt6lTpw7R0dHs37/fKOPm5sbo0aOJiYlh1qxZlC9fnvbt21OhQgXjG3wnJydMJhMfffQRn3zyCfXq1WPkyJGMGjXKaCcsLIywsDCCg4Mxm810796dCxcuGMfd3d2Jiopi9uzZdO3alWLFitG4cWNGjRqV4/ScrFq1akVycjKdOnWiXLlyjB49mjfeeCPX8iVLliQ2Npbw8HDeeust0tPTefnll/n444+ND+D+/v6YzWY+/PBDzp07R9OmTfn73//O4cOHc2wzc3rZ7NmzOXv2LM7OzsycOdNYExEQEEBYWBi///47cXFxFnUDAwOxsbFh4cKFTJ48meeff55+/frx1ltv3fe8H6Rt27bMmDGDDz/8kLlz5+Lg4EDHjh0tFpg/TH/lmoqIiMizxypDz6WUx0hAQAAVK1bM9ihYebr9Pu+/3Dh9h+eeL0L1f5bj4sVrpKXl7eEE8mCFCxeidOniGtdHQGP9aGicHx2N9aPxpI2zg0NxrK0fPDFKU6dERERERCTfKdEQEREREZF8pzUa8lhZvHhxQYcgIiIiIvng/7V352FV1fsex98bGRRERSDFJEk0MGVwlhJFxOGYXm960ro4okckR7wep9TEcgQRxQFJS1PolDdzONXxpMdESnHoqJUpqeX0KIYTWSIK3D98WMctaA47duDn9Tw8sn5r+u6f69H12eu31tIVDRERERERsTgFDRERERERsTgNnRIRq3NwszX7U0RERMo+/a8uIlZVWFjIUz2qG9MF+YUUFOip2yIiImWdgoaIWJXJZCIn5xr5+beeG15QoKAhIiJSHihoiIjV5ecXlIkXFImIiMj9083gIiIiIiJicQoaIiIiIiJicQoaIiIiIiJicQoaImJ1FSrYYGNjsnYZIiIiYkEKGiJiVYWFhVSpUonq1RwVNkRERMoRBQ0RsSqTyUTOv05g0lUNERGRckVBQ0SsLv9yrrVLEBEREQtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BCrCA0NJTExEYB169bh4+Nz3+tu27aNo0ePApCRkYGPjw+nT5/+Xep8EB9++CGtW7fG39+fzz77rNi0j48P69atAyAxMZHQ0FArVywiIiLy+1HQEKvr0qUL6enp97XsmTNnGDp0KBcuXACg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j48nLy+vxO09/fTTdOzYkZiYGKZNm0aNGjVITk7m+vXrtGjRwggamZmZPPvss2brent7065dO2JiYjCZTNSpU4ePP/6YrVu3PtKJcOXKlenduzcLFy6kWrVq+Pn5kZ6eTmpqKmPGjLln+LEEk8nEX/7yF+bPn0+tWrVo06YNR44cYdq0abRv377EKyFFdaempmJnZ0evXr24fv06n3zyCV5eXri4uJRaHSIiIvJ4UtAQMy+//DIrV64kMzMTX19fVqxYga+v712XDwwMZPny5SxYsIAXX3wRR0dHgoKCGD9+vHHiOWfOHObMmUN0dDQFBQX07t2bixcv3nWbM2fOZO7cuYwaNYq8vDwCAgJYsWKFcVN1z549mTt3LidOnCh2v0F8fDzx8fG89tpr5OTk8Mwzz5CYmFhsuQc1ceJEXFxciIuLIzs7Gy8vL6ZOnUqvXr0eabv3KyIiAgcHB1avXs3s2bNxc3OjV69ejBw58q7reHt7k5iYyKJFi0hNTcXGxoZWrVrx1ltv3XV41O9Rh4iIiDyeTIX3eqanPFZ8fHyYNWsWPXr0sHYp8pi5tO4ILj18uHTpF27e1Ds5LM3W1gYXFyf1bylQX5cO9XPpUV+XjrLWz9WrO1Ghwm9/aal7NERERERExOIUNERERERExOJ0j4YYit5DISIiIiLyqHRFQ0RERERELE5BQ0RERERELE5BQ0RERERELE5BQ0SsrkK1itYuQURERCxMQUNErKqwsJAqoXUozC+goECv9RERESkv9NQpEbEqk8lETs41btzIV9AQEREpR/RmcBGxuvz8P/5bUMu6ChVs1M+lRH1dOtTPpUd9XTrKUj/b2JgwmUy/uZyChoiIiIiIWJzu0RAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BAREREREYtT0BCRUldQUMDChQsJDg4mMDCQv/zlL5w6dcraZZVLWVlZ+Pj4FPtZt26dtUsrN5YtW0bfvn3N2r777jv69OlDYGAgoaGhvPvuu1aqrnwpqa8nT55c7PgODQ21UoVl1+XLl5k6dSpt2rShSZMmvPLKK+zdu9eYv3PnTnr06EFAQACd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ISIiIiIiFqegISIiIiIiFqegISIiIiIiFqegISIiIiIiFqegISIiIiIiFqegISIi8hjR67NEpLQoaIiIiPyBTJgwgdDQUIuvk5OTw7hx49i7d++jlGfw8fEhMTHRItsSkfJJQUNEROQP5NVXX2XRokUW3+53333Hhg0bKCgosPi2RURKYmvtAkREROQ/nnrqKWuXICJiEbqiISIi8pBefPFFoqKizNrCwsIICQkxa3v11VcZNGgQAGvXruWFF16gUaNGhISEkJiYSH5+vrHsncOgbty4QVxcHG3atMHf359Bgwaxfv16fHx8OH36tNl+1q1bR6dOnfDz8+O//uu/2L59OwAZGRn069cPgH79+tG3b19jnS1bttCjRw/8/Px4/vnnefPNN/n111/Ntrt792569+5NQEAAnTp14ssvv3yo/srNzWXevHl07NiRRo0a0aRJEwYOHMh3331nttz27dt5+eWXCQwMpHXr1kydOpWcnBxj/vHjxxk+fDgtWrSgefPmREZGcuzYMeOz+vj4kJGRYbbNvn37mn3u0NBQZs6cSf/+/fH39+e1114D4PDhwwwfPpxWrVrRsGFDgoODefPNN8nNzTXWzcvLIyEhgfbt2+Pv70/Xrl356KOPAEhJScHHx4cffvjBbP8bNmygQYMGnD179qH6TqQsUtAQERF5SG3btmX37t1GUDh9+jSnTp3i7NmznDp1CrgVFHbu3ElISAjLli1jypQpBAUFkZSURHh4OG+99RZTpky56z6mTp3KqlWr6NOnD4sXL8bNza3E5c+ePUtycjKjRo0iMTERk8nEyJEjuXDhAg0bNmTq1KnG9l5//XUANm3axLBhw6hbty6LFy9m+PDhbNy4kVdffdW4afzbb78lIiICZ2dnFi5cSL9+/RgzZsxD9de4ceP48MMPGTJkCG+//TYTJ07k+++/53//93+N/W3bto3IyEhcXV1JSEhg7NixbNmyhejoaACysrLo3bs3P/74I9OmTSM2Npbs7Gz69+/P5cuXH6ielJQU/Pz8WLJkCX/+8585f/484eHhXLt2jdmzZ/PWW2/xwgsvsHr1at59911jvbFjx/LOO+/w0ksvsWzZMlq3bs2ECRP4+9//Trdu3XBwcGDDhg1m+1q/fj1BQUF4eHg8VN+JlEUaOiUiIvKQQkJCWLp0KQcPHqRx48bs3LkTLy8v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",
304
+ "text/plain": [
305
+ "<Figure size 640x480 with 1 Axes>"
306
+ ]
307
+ },
308
+ "metadata": {},
309
+ "output_type": "display_data"
310
+ }
311
+ ],
312
+ "source": [
313
+ "sns.set_theme(palette=\"viridis\")\n",
314
+ "sns.barplot(tools_accuracy_info, x=\"weighted_accuracy\", y=\"tool\", hue=\"tool\")"
315
+ ]
316
+ }
317
+ ],
318
+ "metadata": {
319
+ "kernelspec": {
320
+ "display_name": "Python 3",
321
+ "language": "python",
322
+ "name": "python3"
323
+ },
324
+ "language_info": {
325
+ "codemirror_mode": {
326
+ "name": "ipython",
327
+ "version": 3
328
+ },
329
+ "file_extension": ".py",
330
+ "mimetype": "text/x-python",
331
+ "name": "python",
332
+ "nbconvert_exporter": "python",
333
+ "pygments_lexer": "ipython3",
334
+ "version": "3.12.3"
335
+ }
336
+ },
337
+ "nbformat": 4,
338
+ "nbformat_minor": 2
339
+ }
requirements.txt CHANGED
@@ -1,4 +1,5 @@
1
  pandas==2.0.1
 
2
  matplotlib
3
  huggingface-hub
4
  pyarrow
 
1
  pandas==2.0.1
2
+ seaborn
3
  matplotlib
4
  huggingface-hub
5
  pyarrow
scripts/profitability.py CHANGED
@@ -625,7 +625,6 @@ def run_profitability_analysis(
625
  all_trades_df = analyse_all_traders(fpmmTrades, tools)
626
 
627
  # filter invalid markets. Condition: "is_invalid" is True
628
- # TODO fix this mask
629
  print(all_trades_df.head())
630
  all_trades_df = all_trades_df.loc[all_trades_df["is_invalid"] == False]
631
 
 
625
  all_trades_df = analyse_all_traders(fpmmTrades, tools)
626
 
627
  # filter invalid markets. Condition: "is_invalid" is True
 
628
  print(all_trades_df.head())
629
  all_trades_df = all_trades_df.loc[all_trades_df["is_invalid"] == False]
630