cyberosa commited on
Commit
1ed82ec
·
1 Parent(s): 792d9a6

new scripts and files for the mech calls computation

Browse files
.gitignore CHANGED
@@ -21,6 +21,7 @@ lib64/
21
  parts/
22
  sdist/
23
  var/
 
24
  wheels/
25
  share/python-wheels/
26
  *.egg-info/
 
21
  parts/
22
  sdist/
23
  var/
24
+ tmp/
25
  wheels/
26
  share/python-wheels/
27
  *.egg-info/
app.py CHANGED
@@ -136,8 +136,8 @@ demo = gr.Blocks()
136
  weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
137
  traders_data
138
  )
139
- weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
140
- traders_data, trader_filter="non_Olas"
141
  )
142
  weekly_non_olas_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
143
  traders_data, trader_filter="non_Olas"
@@ -145,16 +145,15 @@ weekly_non_olas_metrics_by_market_creator = compute_weekly_metrics_by_market_cre
145
  weekly_unknown_trader_metrics_by_market_creator = None
146
  if len(unknown_traders) > 0:
147
  weekly_unknown_trader_metrics_by_market_creator = (
148
- compute_weekly_metrics_by_market_creator(unknown_traders)
 
 
149
  )
150
 
151
  weekly_winning_metrics = compute_winning_metrics_by_trader(traders_data=traders_data)
152
  weekly_non_olas_winning_metrics = compute_winning_metrics_by_trader(
153
  traders_data=traders_data, trader_filter="non_Olas"
154
  )
155
- weekly_non_Olas_winning_metrics = compute_winning_metrics_by_trader(
156
- traders_data=traders_data, trader_filter="non_Olas"
157
- )
158
 
159
  with demo:
160
  gr.HTML("<h1>Traders monitoring dashboard </h1>")
@@ -205,7 +204,7 @@ with demo:
205
  with gr.Column(scale=3):
206
  o_trader_markets_plot = plot_trader_metrics_by_market_creator(
207
  metric_name=default_trader_metric,
208
- traders_df=weekly_metrics_by_market_creator,
209
  )
210
  with gr.Column(scale=1):
211
  trade_details_text = get_metrics_text()
@@ -213,7 +212,7 @@ with demo:
213
  def update_a_trader_details(trader_detail):
214
  return plot_trader_metrics_by_market_creator(
215
  metric_name=trader_detail,
216
- traders_df=weekly_metrics_by_market_creator,
217
  )
218
 
219
  trader_o_details_selector.change(
@@ -500,7 +499,7 @@ with demo:
500
  metrics_text = get_metrics_text()
501
  with gr.Row():
502
  winning_metric = plot_winning_metric_per_trader(
503
- weekly_non_Olas_winning_metrics
504
  )
505
 
506
  demo.queue(default_concurrency_limit=40).launch()
 
136
  weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
137
  traders_data
138
  )
139
+ weekly_o_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
140
+ traders_data, trader_filter="Olas"
141
  )
142
  weekly_non_olas_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
143
  traders_data, trader_filter="non_Olas"
 
145
  weekly_unknown_trader_metrics_by_market_creator = None
146
  if len(unknown_traders) > 0:
147
  weekly_unknown_trader_metrics_by_market_creator = (
148
+ compute_weekly_metrics_by_market_creator(
149
+ unknown_traders, trader_filter=None, unknown_trader=True
150
+ )
151
  )
152
 
153
  weekly_winning_metrics = compute_winning_metrics_by_trader(traders_data=traders_data)
154
  weekly_non_olas_winning_metrics = compute_winning_metrics_by_trader(
155
  traders_data=traders_data, trader_filter="non_Olas"
156
  )
 
 
 
157
 
158
  with demo:
159
  gr.HTML("<h1>Traders monitoring dashboard </h1>")
 
204
  with gr.Column(scale=3):
205
  o_trader_markets_plot = plot_trader_metrics_by_market_creator(
206
  metric_name=default_trader_metric,
207
+ traders_df=weekly_o_metrics_by_market_creator,
208
  )
209
  with gr.Column(scale=1):
210
  trade_details_text = get_metrics_text()
 
212
  def update_a_trader_details(trader_detail):
213
  return plot_trader_metrics_by_market_creator(
214
  metric_name=trader_detail,
215
+ traders_df=weekly_o_metrics_by_market_creator,
216
  )
217
 
218
  trader_o_details_selector.change(
 
499
  metrics_text = get_metrics_text()
500
  with gr.Row():
501
  winning_metric = plot_winning_metric_per_trader(
502
+ weekly_non_olas_winning_metrics
503
  )
504
 
505
  demo.queue(default_concurrency_limit=40).launch()
data/daily_info.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:b4e3e1e0f256e5b3d4f25d9ecebc55ec8b80d6544e3be47aa68d36ef5a753780
3
- size 229899
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fed76273653048f900faca2d612b07f42be43d076238f0dac7f30e8882a1ec1b
3
+ size 374565
data/unknown_traders.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:54312d1642f60df1ae5e0b13bc2ba283b0fa1216c3f5b776478e54b62b34cced
3
- size 11673
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0ab41a7a35d8bf5c588b95849ec650e048578ddcbb18bc62df0e7a3c96902ea5
3
+ size 368142
data/weekly_mech_calls.parquet ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7ae188cdae0c99e21307bddca6df7f914f376ec1d940929d7f8c2f2626aab6b
3
+ size 59309
notebooks/num_mech_calls.ipynb ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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": "code",
17
+ "execution_count": 3,
18
+ "metadata": {},
19
+ "outputs": [],
20
+ "source": [
21
+ "weekly_mech_calls = pd.read_parquet(\"../data/weekly_mech_calls.parquet\")"
22
+ ]
23
+ },
24
+ {
25
+ "cell_type": "code",
26
+ "execution_count": 7,
27
+ "metadata": {},
28
+ "outputs": [],
29
+ "source": [
30
+ "tools = pd.read_parquet(\"../tmp/tools.parquet\")"
31
+ ]
32
+ },
33
+ {
34
+ "cell_type": "code",
35
+ "execution_count": 5,
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "fpmmTrades = pd.read_parquet(\"../data/fpmmTrades.parquet\")"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "execution_count": null,
45
+ "metadata": {},
46
+ "outputs": [],
47
+ "source": []
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "execution_count": 8,
52
+ "metadata": {},
53
+ "outputs": [
54
+ {
55
+ "data": {
56
+ "text/plain": [
57
+ "Index(['request_id', 'request_block', 'prompt_request', 'tool', 'nonce',\n",
58
+ " 'trader_address', 'deliver_block', 'error', 'error_message',\n",
59
+ " 'prompt_response', 'mech_address', 'p_yes', 'p_no', 'confidence',\n",
60
+ " 'info_utility', 'vote', 'win_probability', 'market_creator', 'title',\n",
61
+ " 'currentAnswer', 'request_time', 'request_month_year',\n",
62
+ " 'request_month_year_week'],\n",
63
+ " dtype='object')"
64
+ ]
65
+ },
66
+ "execution_count": 8,
67
+ "metadata": {},
68
+ "output_type": "execute_result"
69
+ }
70
+ ],
71
+ "source": [
72
+ "tools.columns"
73
+ ]
74
+ },
75
+ {
76
+ "cell_type": "code",
77
+ "execution_count": null,
78
+ "metadata": {},
79
+ "outputs": [],
80
+ "source": []
81
+ },
82
+ {
83
+ "cell_type": "code",
84
+ "execution_count": 4,
85
+ "metadata": {},
86
+ "outputs": [
87
+ {
88
+ "data": {
89
+ "text/html": [
90
+ "<div>\n",
91
+ "<style scoped>\n",
92
+ " .dataframe tbody tr th:only-of-type {\n",
93
+ " vertical-align: middle;\n",
94
+ " }\n",
95
+ "\n",
96
+ " .dataframe tbody tr th {\n",
97
+ " vertical-align: top;\n",
98
+ " }\n",
99
+ "\n",
100
+ " .dataframe thead th {\n",
101
+ " text-align: right;\n",
102
+ " }\n",
103
+ "</style>\n",
104
+ "<table border=\"1\" class=\"dataframe\">\n",
105
+ " <thead>\n",
106
+ " <tr style=\"text-align: right;\">\n",
107
+ " <th></th>\n",
108
+ " <th>trader_address</th>\n",
109
+ " <th>month_year_week</th>\n",
110
+ " <th>total_trades</th>\n",
111
+ " <th>total_mech_calls</th>\n",
112
+ " </tr>\n",
113
+ " </thead>\n",
114
+ " <tbody>\n",
115
+ " <tr>\n",
116
+ " <th>0</th>\n",
117
+ " <td>0x75c0366bd0cbc3db434fd117267e32f26c5ed857</td>\n",
118
+ " <td>Sep-08</td>\n",
119
+ " <td>2</td>\n",
120
+ " <td>0</td>\n",
121
+ " </tr>\n",
122
+ " <tr>\n",
123
+ " <th>1</th>\n",
124
+ " <td>0x75c0366bd0cbc3db434fd117267e32f26c5ed857</td>\n",
125
+ " <td>Sep-15</td>\n",
126
+ " <td>103</td>\n",
127
+ " <td>0</td>\n",
128
+ " </tr>\n",
129
+ " <tr>\n",
130
+ " <th>2</th>\n",
131
+ " <td>0x75c0366bd0cbc3db434fd117267e32f26c5ed857</td>\n",
132
+ " <td>Sep-22</td>\n",
133
+ " <td>136</td>\n",
134
+ " <td>0</td>\n",
135
+ " </tr>\n",
136
+ " <tr>\n",
137
+ " <th>3</th>\n",
138
+ " <td>0x75c0366bd0cbc3db434fd117267e32f26c5ed857</td>\n",
139
+ " <td>Sep-29</td>\n",
140
+ " <td>165</td>\n",
141
+ " <td>0</td>\n",
142
+ " </tr>\n",
143
+ " <tr>\n",
144
+ " <th>4</th>\n",
145
+ " <td>0x75c0366bd0cbc3db434fd117267e32f26c5ed857</td>\n",
146
+ " <td>Oct-06</td>\n",
147
+ " <td>51</td>\n",
148
+ " <td>0</td>\n",
149
+ " </tr>\n",
150
+ " </tbody>\n",
151
+ "</table>\n",
152
+ "</div>"
153
+ ],
154
+ "text/plain": [
155
+ " trader_address month_year_week total_trades \\\n",
156
+ "0 0x75c0366bd0cbc3db434fd117267e32f26c5ed857 Sep-08 2 \n",
157
+ "1 0x75c0366bd0cbc3db434fd117267e32f26c5ed857 Sep-15 103 \n",
158
+ "2 0x75c0366bd0cbc3db434fd117267e32f26c5ed857 Sep-22 136 \n",
159
+ "3 0x75c0366bd0cbc3db434fd117267e32f26c5ed857 Sep-29 165 \n",
160
+ "4 0x75c0366bd0cbc3db434fd117267e32f26c5ed857 Oct-06 51 \n",
161
+ "\n",
162
+ " total_mech_calls \n",
163
+ "0 0 \n",
164
+ "1 0 \n",
165
+ "2 0 \n",
166
+ "3 0 \n",
167
+ "4 0 "
168
+ ]
169
+ },
170
+ "execution_count": 4,
171
+ "metadata": {},
172
+ "output_type": "execute_result"
173
+ }
174
+ ],
175
+ "source": [
176
+ "weekly_mech_calls.head()"
177
+ ]
178
+ },
179
+ {
180
+ "cell_type": "code",
181
+ "execution_count": 5,
182
+ "metadata": {},
183
+ "outputs": [
184
+ {
185
+ "data": {
186
+ "text/html": [
187
+ "<div>\n",
188
+ "<style scoped>\n",
189
+ " .dataframe tbody tr th:only-of-type {\n",
190
+ " vertical-align: middle;\n",
191
+ " }\n",
192
+ "\n",
193
+ " .dataframe tbody tr th {\n",
194
+ " vertical-align: top;\n",
195
+ " }\n",
196
+ "\n",
197
+ " .dataframe thead th {\n",
198
+ " text-align: right;\n",
199
+ " }\n",
200
+ "</style>\n",
201
+ "<table border=\"1\" class=\"dataframe\">\n",
202
+ " <thead>\n",
203
+ " <tr style=\"text-align: right;\">\n",
204
+ " <th></th>\n",
205
+ " <th>trader_address</th>\n",
206
+ " <th>month_year_week</th>\n",
207
+ " <th>total_trades</th>\n",
208
+ " <th>total_mech_calls</th>\n",
209
+ " </tr>\n",
210
+ " </thead>\n",
211
+ " <tbody>\n",
212
+ " <tr>\n",
213
+ " <th>14363</th>\n",
214
+ " <td>0xf278dfdb02ecddc1214a151906426b9171460ec8</td>\n",
215
+ " <td>Nov-24</td>\n",
216
+ " <td>0</td>\n",
217
+ " <td>0</td>\n",
218
+ " </tr>\n",
219
+ " <tr>\n",
220
+ " <th>14364</th>\n",
221
+ " <td>0xf278dfdb02ecddc1214a151906426b9171460ec8</td>\n",
222
+ " <td>Dec-01</td>\n",
223
+ " <td>0</td>\n",
224
+ " <td>0</td>\n",
225
+ " </tr>\n",
226
+ " <tr>\n",
227
+ " <th>14365</th>\n",
228
+ " <td>0xf278dfdb02ecddc1214a151906426b9171460ec8</td>\n",
229
+ " <td>Dec-08</td>\n",
230
+ " <td>0</td>\n",
231
+ " <td>0</td>\n",
232
+ " </tr>\n",
233
+ " <tr>\n",
234
+ " <th>14366</th>\n",
235
+ " <td>0xf278dfdb02ecddc1214a151906426b9171460ec8</td>\n",
236
+ " <td>Dec-15</td>\n",
237
+ " <td>0</td>\n",
238
+ " <td>0</td>\n",
239
+ " </tr>\n",
240
+ " <tr>\n",
241
+ " <th>14367</th>\n",
242
+ " <td>0xf278dfdb02ecddc1214a151906426b9171460ec8</td>\n",
243
+ " <td>Dec-22</td>\n",
244
+ " <td>1</td>\n",
245
+ " <td>0</td>\n",
246
+ " </tr>\n",
247
+ " </tbody>\n",
248
+ "</table>\n",
249
+ "</div>"
250
+ ],
251
+ "text/plain": [
252
+ " trader_address month_year_week \\\n",
253
+ "14363 0xf278dfdb02ecddc1214a151906426b9171460ec8 Nov-24 \n",
254
+ "14364 0xf278dfdb02ecddc1214a151906426b9171460ec8 Dec-01 \n",
255
+ "14365 0xf278dfdb02ecddc1214a151906426b9171460ec8 Dec-08 \n",
256
+ "14366 0xf278dfdb02ecddc1214a151906426b9171460ec8 Dec-15 \n",
257
+ "14367 0xf278dfdb02ecddc1214a151906426b9171460ec8 Dec-22 \n",
258
+ "\n",
259
+ " total_trades total_mech_calls \n",
260
+ "14363 0 0 \n",
261
+ "14364 0 0 \n",
262
+ "14365 0 0 \n",
263
+ "14366 0 0 \n",
264
+ "14367 1 0 "
265
+ ]
266
+ },
267
+ "execution_count": 5,
268
+ "metadata": {},
269
+ "output_type": "execute_result"
270
+ }
271
+ ],
272
+ "source": [
273
+ "weekly_mech_calls.tail()"
274
+ ]
275
+ },
276
+ {
277
+ "cell_type": "code",
278
+ "execution_count": 6,
279
+ "metadata": {},
280
+ "outputs": [
281
+ {
282
+ "data": {
283
+ "text/plain": [
284
+ "count 14368.0\n",
285
+ "mean 0.0\n",
286
+ "std 0.0\n",
287
+ "min 0.0\n",
288
+ "25% 0.0\n",
289
+ "50% 0.0\n",
290
+ "75% 0.0\n",
291
+ "max 0.0\n",
292
+ "Name: total_mech_calls, dtype: float64"
293
+ ]
294
+ },
295
+ "execution_count": 6,
296
+ "metadata": {},
297
+ "output_type": "execute_result"
298
+ }
299
+ ],
300
+ "source": [
301
+ "weekly_mech_calls.total_mech_calls.describe()"
302
+ ]
303
+ }
304
+ ],
305
+ "metadata": {
306
+ "kernelspec": {
307
+ "display_name": "hf_dashboards",
308
+ "language": "python",
309
+ "name": "python3"
310
+ },
311
+ "language_info": {
312
+ "codemirror_mode": {
313
+ "name": "ipython",
314
+ "version": 3
315
+ },
316
+ "file_extension": ".py",
317
+ "mimetype": "text/x-python",
318
+ "name": "python",
319
+ "nbconvert_exporter": "python",
320
+ "pygments_lexer": "ipython3",
321
+ "version": "3.12.2"
322
+ }
323
+ },
324
+ "nbformat": 4,
325
+ "nbformat_minor": 2
326
+ }
notebooks/winning_perc.ipynb CHANGED
@@ -2,25 +2,51 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 10,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
9
  "import pandas as pd\n",
10
- "import sys\n",
11
- "sys.path.append('..')\n",
12
- "from scripts.metrics import compute_weekly_metrics_by_market_creator"
13
  ]
14
  },
15
  {
16
  "cell_type": "code",
17
- "execution_count": 2,
18
  "metadata": {},
19
  "outputs": [],
20
  "source": [
21
  "all_trades = pd.read_parquet('../data/all_trades_profitability.parquet')"
22
  ]
23
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  {
25
  "cell_type": "code",
26
  "execution_count": 6,
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 3,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
9
  "import pandas as pd\n",
10
+ "# import sys\n",
11
+ "# sys.path.append('..')\n",
12
+ "# from scripts.metrics import compute_weekly_metrics_by_market_creator"
13
  ]
14
  },
15
  {
16
  "cell_type": "code",
17
+ "execution_count": 4,
18
  "metadata": {},
19
  "outputs": [],
20
  "source": [
21
  "all_trades = pd.read_parquet('../data/all_trades_profitability.parquet')"
22
  ]
23
  },
24
+ {
25
+ "cell_type": "code",
26
+ "execution_count": 5,
27
+ "metadata": {},
28
+ "outputs": [
29
+ {
30
+ "data": {
31
+ "text/plain": [
32
+ "Index(['trader_address', 'market_creator', 'trade_id', 'creation_timestamp',\n",
33
+ " 'title', 'market_status', 'collateral_amount', 'outcome_index',\n",
34
+ " 'trade_fee_amount', 'outcomes_tokens_traded', 'current_answer',\n",
35
+ " 'is_invalid', 'winning_trade', 'earnings', 'redeemed',\n",
36
+ " 'redeemed_amount', 'num_mech_calls', 'mech_fee_amount', 'net_earnings',\n",
37
+ " 'roi', 'staking', 'nr_mech_calls'],\n",
38
+ " dtype='object')"
39
+ ]
40
+ },
41
+ "execution_count": 5,
42
+ "metadata": {},
43
+ "output_type": "execute_result"
44
+ }
45
+ ],
46
+ "source": [
47
+ "all_trades.columns"
48
+ ]
49
+ },
50
  {
51
  "cell_type": "code",
52
  "execution_count": 6,
scripts/__init__.py ADDED
File without changes
scripts/metrics.py CHANGED
@@ -1,22 +1,18 @@
1
  import pandas as pd
2
  from tqdm import tqdm
 
 
 
 
3
 
4
  DEFAULT_MECH_FEE = 0.01 # xDAI
5
 
6
 
7
- def compute_total_nr_mech_calls_per_trader(trader_data: pd.DataFrame) -> int:
8
- """Function to compute the total number of mech calls for alll markets
9
- that the trader bet upon"""
10
- nr_mech_calls_per_market = (
11
- trader_data.groupby("title")["num_mech_calls"]
12
- .max()
13
- .reset_index(name="nr_mech_calls_per_market")
14
- )
15
- return nr_mech_calls_per_market.nr_mech_calls_per_market.sum()
16
-
17
-
18
  def compute_metrics(
19
- trader_address: str, trader_data: pd.DataFrame, live_metrics: bool = False
 
 
 
20
  ) -> dict:
21
 
22
  if len(trader_data) == 0:
@@ -26,9 +22,14 @@ def compute_metrics(
26
  agg_metrics = {}
27
  agg_metrics["trader_address"] = trader_address
28
  total_bet_amounts = trader_data.collateral_amount.sum()
29
- total_nr_mech_calls_all_markets = compute_total_nr_mech_calls_per_trader(
30
- trader_data
31
- )
 
 
 
 
 
32
  previous_total = trader_data.num_mech_calls.sum()
33
  agg_metrics["bet_amount"] = total_bet_amounts
34
  agg_metrics["nr_mech_calls"] = total_nr_mech_calls_all_markets
@@ -63,6 +64,7 @@ def compute_trader_metrics_by_market_creator(
63
  traders_data: pd.DataFrame,
64
  market_creator: str = "all",
65
  live_metrics: bool = False,
 
66
  ) -> dict:
67
  """This function computes for a specific time window (week or day) the different metrics:
68
  roi, net_earnings, earnings, bet_amount, nr_mech_calls and nr_trades.
@@ -81,17 +83,23 @@ def compute_trader_metrics_by_market_creator(
81
  # tqdm.write(f"No data. Skipping market creator {market_creator}")
82
  return {} # No Data
83
 
84
- metrics = compute_metrics(trader_address, filtered_traders_data, live_metrics)
 
 
85
  return metrics
86
 
87
 
88
  def merge_trader_weekly_metrics(
89
- trader: str, weekly_data: pd.DataFrame, week: str
90
  ) -> pd.DataFrame:
91
  trader_metrics = []
92
  # computation as specification 1 for all types of markets
93
  weekly_metrics_all = compute_trader_metrics_by_market_creator(
94
- trader, weekly_data, market_creator="all"
 
 
 
 
95
  )
96
  weekly_metrics_all["month_year_week"] = week
97
  weekly_metrics_all["market_creator"] = "all"
@@ -99,7 +107,11 @@ def merge_trader_weekly_metrics(
99
 
100
  # computation as specification 1 for quickstart markets
101
  weekly_metrics_qs = compute_trader_metrics_by_market_creator(
102
- trader, weekly_data, market_creator="quickstart"
 
 
 
 
103
  )
104
  if len(weekly_metrics_qs) > 0:
105
  weekly_metrics_qs["month_year_week"] = week
@@ -107,7 +119,11 @@ def merge_trader_weekly_metrics(
107
  trader_metrics.append(weekly_metrics_qs)
108
  # computation as specification 1 for pearl markets
109
  weekly_metrics_pearl = compute_trader_metrics_by_market_creator(
110
- trader, weekly_data, market_creator="pearl"
 
 
 
 
111
  )
112
  if len(weekly_metrics_pearl) > 0:
113
  weekly_metrics_pearl["month_year_week"] = week
@@ -168,7 +184,7 @@ def win_metrics_trader_level(weekly_data):
168
 
169
 
170
  def compute_weekly_metrics_by_market_creator(
171
- traders_data: pd.DataFrame, trader_filter: str = None
172
  ) -> pd.DataFrame:
173
  """Function to compute the metrics at the trader level per week
174
  and with different categories by market creator"""
@@ -181,7 +197,11 @@ def compute_weekly_metrics_by_market_creator(
181
  traders = list(weekly_data.trader_address.unique())
182
  for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
183
  if trader_filter is None:
184
- contents.append(merge_trader_weekly_metrics(trader, weekly_data, week))
 
 
 
 
185
  elif trader_filter == "Olas":
186
  filtered_data = weekly_data.loc[weekly_data["staking"] != "non_Olas"]
187
  contents.append(
 
1
  import pandas as pd
2
  from tqdm import tqdm
3
+ from scripts.num_mech_calls import (
4
+ get_daily_total_mech_calls,
5
+ get_weekly_total_mech_calls,
6
+ )
7
 
8
  DEFAULT_MECH_FEE = 0.01 # xDAI
9
 
10
 
 
 
 
 
 
 
 
 
 
 
 
11
  def compute_metrics(
12
+ trader_address: str,
13
+ trader_data: pd.DataFrame,
14
+ live_metrics: bool = False,
15
+ unknown_trader: bool = False,
16
  ) -> dict:
17
 
18
  if len(trader_data) == 0:
 
22
  agg_metrics = {}
23
  agg_metrics["trader_address"] = trader_address
24
  total_bet_amounts = trader_data.collateral_amount.sum()
25
+ if live_metrics:
26
+ # the total can be computed from daily_info.parquet
27
+ total_nr_mech_calls_all_markets = get_daily_total_mech_calls(trader_data)
28
+ elif unknown_trader:
29
+ # num of mech calls is always zero
30
+ total_nr_mech_calls_all_markets = 0
31
+ else:
32
+ total_nr_mech_calls_all_markets = get_weekly_total_mech_calls(trader_data)
33
  previous_total = trader_data.num_mech_calls.sum()
34
  agg_metrics["bet_amount"] = total_bet_amounts
35
  agg_metrics["nr_mech_calls"] = total_nr_mech_calls_all_markets
 
64
  traders_data: pd.DataFrame,
65
  market_creator: str = "all",
66
  live_metrics: bool = False,
67
+ unknown_trader: bool = False,
68
  ) -> dict:
69
  """This function computes for a specific time window (week or day) the different metrics:
70
  roi, net_earnings, earnings, bet_amount, nr_mech_calls and nr_trades.
 
83
  # tqdm.write(f"No data. Skipping market creator {market_creator}")
84
  return {} # No Data
85
 
86
+ metrics = compute_metrics(
87
+ trader_address, filtered_traders_data, live_metrics, unknown_trader
88
+ )
89
  return metrics
90
 
91
 
92
  def merge_trader_weekly_metrics(
93
+ trader: str, weekly_data: pd.DataFrame, week: str, unknown_trader: bool = False
94
  ) -> pd.DataFrame:
95
  trader_metrics = []
96
  # computation as specification 1 for all types of markets
97
  weekly_metrics_all = compute_trader_metrics_by_market_creator(
98
+ trader,
99
+ weekly_data,
100
+ market_creator="all",
101
+ live_metrics=False,
102
+ unknown_trader=unknown_trader,
103
  )
104
  weekly_metrics_all["month_year_week"] = week
105
  weekly_metrics_all["market_creator"] = "all"
 
107
 
108
  # computation as specification 1 for quickstart markets
109
  weekly_metrics_qs = compute_trader_metrics_by_market_creator(
110
+ trader,
111
+ weekly_data,
112
+ market_creator="quickstart",
113
+ live_metrics=False,
114
+ unknown_trader=unknown_trader,
115
  )
116
  if len(weekly_metrics_qs) > 0:
117
  weekly_metrics_qs["month_year_week"] = week
 
119
  trader_metrics.append(weekly_metrics_qs)
120
  # computation as specification 1 for pearl markets
121
  weekly_metrics_pearl = compute_trader_metrics_by_market_creator(
122
+ trader,
123
+ weekly_data,
124
+ market_creator="pearl",
125
+ live_metrics=False,
126
+ unknown_trader=unknown_trader,
127
  )
128
  if len(weekly_metrics_pearl) > 0:
129
  weekly_metrics_pearl["month_year_week"] = week
 
184
 
185
 
186
  def compute_weekly_metrics_by_market_creator(
187
+ traders_data: pd.DataFrame, trader_filter: str = None, unknown_trader: bool = False
188
  ) -> pd.DataFrame:
189
  """Function to compute the metrics at the trader level per week
190
  and with different categories by market creator"""
 
197
  traders = list(weekly_data.trader_address.unique())
198
  for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
199
  if trader_filter is None:
200
+ contents.append(
201
+ merge_trader_weekly_metrics(
202
+ trader, weekly_data, week, unknown_trader
203
+ )
204
+ )
205
  elif trader_filter == "Olas":
206
  filtered_data = weekly_data.loc[weekly_data["staking"] != "non_Olas"]
207
  contents.append(
scripts/num_mech_calls.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ from scripts.utils import DATA_DIR, TMP_DIR
3
+ from datetime import datetime, timezone
4
+ from tqdm import tqdm
5
+
6
+
7
+ def transform_to_datetime(x):
8
+ return datetime.fromtimestamp(int(x), tz=timezone.utc)
9
+
10
+
11
+ def get_daily_total_mech_calls(trader_data: pd.DataFrame) -> int:
12
+ """Function to compute the total daily number of mech calls for all markets
13
+ that the trader bet upon"""
14
+ daily_markets = trader_data.title.unique()
15
+ trading_day = trader_data.creation_date.unique()
16
+ if len(trading_day) > 1:
17
+ raise ValueError("The trader data should contain only one day information")
18
+ total_mech_calls = 0
19
+ for market in daily_markets:
20
+ # in num_mech_calls we have the total mech calls done for that market that day
21
+ total_mech_calls_on_market = trader_data.loc[
22
+ trader_data["title"] == market, "num_mech_calls"
23
+ ].iloc[0]
24
+ total_mech_calls += total_mech_calls_on_market
25
+ return total_mech_calls
26
+
27
+
28
+ def get_weekly_total_mech_calls(trader_data: pd.DataFrame) -> int:
29
+ """Function to compute the total weekly number of mech calls for all markets
30
+ that the trader bet upon"""
31
+ try:
32
+ all_mech_calls_df = pd.read_parquet(DATA_DIR / "weekly_mech_calls.parquet")
33
+ except Exception:
34
+ print("Error reading the weekly_mech_calls file")
35
+
36
+ trading_weeks = trader_data.month_year_week.unique()
37
+ trader_address = trader_data.trader_address.unique()[0]
38
+ if len(trading_weeks) > 1:
39
+ raise ValueError("The trader data should contain only one week information")
40
+ trading_week = trading_weeks[0]
41
+ return all_mech_calls_df.loc[
42
+ (all_mech_calls_df["trader_address"] == trader_address)
43
+ & (all_mech_calls_df["month_year_week"] == trading_week),
44
+ "total_mech_calls",
45
+ ].iloc[0]
46
+
47
+
48
+ def compute_weekly_total_mech_calls(
49
+ trader: str, week: str, weekly_trades: pd.DataFrame, weekly_tools: pd.DataFrame
50
+ ) -> dict:
51
+ weekly_total_mech_calls_dict = {}
52
+ weekly_total_mech_calls_dict["trader_address"] = trader
53
+ weekly_total_mech_calls_dict["month_year_week"] = week
54
+ weekly_total_mech_calls_dict["total_trades"] = len(weekly_trades)
55
+ weekly_total_mech_calls_dict["total_mech_calls"] = len(weekly_tools)
56
+ return weekly_total_mech_calls_dict
57
+
58
+
59
+ def compute_total_mech_calls():
60
+ """Function to compute the total number of mech calls for all traders and all markets
61
+ at a weekly level"""
62
+ try:
63
+ print("Reading tools file")
64
+ tools = pd.read_parquet(TMP_DIR / "tools.parquet")
65
+ tools["request_time"] = pd.to_datetime(tools["request_time"])
66
+ tools["request_date"] = tools["request_time"].dt.date
67
+ tools = tools.sort_values(by="request_time", ascending=True)
68
+ tools["month_year_week"] = (
69
+ tools["request_time"].dt.to_period("W").dt.strftime("%b-%d")
70
+ )
71
+
72
+ except Exception as e:
73
+ print(f"Error updating the invalid trades parquet {e}")
74
+
75
+ try:
76
+ print("Reading trades weekly info file")
77
+ fpmmTrades = pd.read_parquet(DATA_DIR / "fpmmTrades.parquet")
78
+ fpmmTrades["creationTimestamp"] = fpmmTrades["creationTimestamp"].apply(
79
+ lambda x: transform_to_datetime(x)
80
+ )
81
+ fpmmTrades["creation_timestamp"] = pd.to_datetime(
82
+ fpmmTrades["creationTimestamp"]
83
+ )
84
+ fpmmTrades["creation_date"] = fpmmTrades["creation_timestamp"].dt.date
85
+ fpmmTrades = fpmmTrades.sort_values(by="creation_timestamp", ascending=True)
86
+ fpmmTrades["month_year_week"] = (
87
+ fpmmTrades["creation_timestamp"].dt.to_period("W").dt.strftime("%b-%d")
88
+ )
89
+
90
+ except Exception as e:
91
+ print(f"Error reading fpmmTrades parquet {e}")
92
+
93
+ nr_traders = len(fpmmTrades["trader_address"].unique())
94
+ all_mech_calls = []
95
+ for trader in tqdm(
96
+ fpmmTrades["trader_address"].unique(),
97
+ total=nr_traders,
98
+ desc="creating mech calls estimation dataframe",
99
+ ):
100
+ # compute the mech calls estimations for each trader
101
+ all_trades = fpmmTrades[fpmmTrades["trader_address"] == trader]
102
+ all_tools = tools[tools["trader_address"] == trader]
103
+ weeks = fpmmTrades.month_year_week.unique()
104
+
105
+ for week in weeks:
106
+ weekly_trades = all_trades.loc[all_trades["month_year_week"] == week]
107
+ weekly_tools = all_tools.loc[all_tools["month_year_week"] == week]
108
+
109
+ weekly_mech_calls_dict = compute_weekly_total_mech_calls(
110
+ trader, week, weekly_trades, weekly_tools
111
+ )
112
+ all_mech_calls.append(weekly_mech_calls_dict)
113
+
114
+ all_mech_calls_df: pd.DataFrame = pd.DataFrame.from_dict(
115
+ all_mech_calls, orient="columns"
116
+ )
117
+ print("Saving weekly_mech_calls.parquet file")
118
+ print(all_mech_calls_df.total_mech_calls.describe())
119
+
120
+ all_mech_calls_df.to_parquet(DATA_DIR / "weekly_mech_calls.parquet", index=False)
121
+
122
+
123
+ if __name__ == "__main__":
124
+ compute_total_mech_calls()
scripts/utils.py CHANGED
@@ -1,4 +1,10 @@
1
  import pandas as pd
 
 
 
 
 
 
2
 
3
 
4
  def get_traders_family(row: pd.DataFrame) -> str:
 
1
  import pandas as pd
2
+ from pathlib import Path
3
+
4
+ SCRIPTS_DIR = Path(__file__).parent
5
+ ROOT_DIR = SCRIPTS_DIR.parent
6
+ DATA_DIR = ROOT_DIR / "data"
7
+ TMP_DIR = ROOT_DIR / "tmp"
8
 
9
 
10
  def get_traders_family(row: pd.DataFrame) -> str: