rosacastillo
commited on
Commit
·
dad191d
1
Parent(s):
dd22672
New notebook and new weighted accuracy graph
Browse files- app.py +48 -4
- notebooks/weekly_analysis.ipynb +239 -32
- notebooks/weighted_accuracy_ranking.ipynb +339 -0
- requirements.txt +1 -0
- scripts/profitability.py +0 -1
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
|
|
|
|
|
|
|
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:
|
64 |
-
"
|
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":
|
98 |
"metadata": {},
|
99 |
"outputs": [
|
100 |
{
|
101 |
"data": {
|
102 |
"text/plain": [
|
103 |
-
"Timestamp('
|
104 |
]
|
105 |
},
|
106 |
-
"execution_count":
|
107 |
"metadata": {},
|
108 |
"output_type": "execute_result"
|
109 |
}
|
@@ -114,16 +321,16 @@
|
|
114 |
},
|
115 |
{
|
116 |
"cell_type": "code",
|
117 |
-
"execution_count":
|
118 |
"metadata": {},
|
119 |
"outputs": [
|
120 |
{
|
121 |
"data": {
|
122 |
"text/plain": [
|
123 |
-
"Timestamp('2024-
|
124 |
]
|
125 |
},
|
126 |
-
"execution_count":
|
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 |
|