cyberosa commited on
Commit
efabdf9
·
1 Parent(s): de472db

adding new weekly and daily graphs

Browse files
Files changed (4) hide show
  1. app.py +117 -19
  2. scripts/metrics.py +104 -79
  3. scripts/utils.py +10 -0
  4. tabs/trader_plots.py +54 -0
app.py CHANGED
@@ -7,19 +7,20 @@ import logging
7
 
8
  from scripts.metrics import (
9
  compute_weekly_metrics_by_market_creator,
10
- compute_weekly_metrics_by_trader_type,
11
  compute_winning_metrics_by_trader,
12
  )
13
  from tabs.trader_plots import (
14
  plot_trader_metrics_by_market_creator,
 
15
  default_trader_metric,
16
  trader_metric_choices,
17
  get_metrics_text,
18
  plot_winning_metric_per_trader,
19
  get_interpretation_text,
20
- plot_median_roi_by_creation_date,
21
  )
22
 
 
23
  from tabs.market_plots import (
24
  plot_kl_div_per_market,
25
  )
@@ -86,8 +87,12 @@ def prepare_data():
86
  trader_agents_data = pd.merge(
87
  all_trades, volume_trades_per_trader_and_market, on=["trader_address", "title"]
88
  )
89
- # right now all traders are of the same type: singlebet
90
- trader_agents_data["trader_type"] = "singlebet"
 
 
 
 
91
 
92
  trader_agents_data = trader_agents_data.sort_values(
93
  by="creation_timestamp", ascending=True
@@ -104,19 +109,25 @@ def prepare_data():
104
 
105
 
106
  trader_agents_data, closed_markets = prepare_data()
107
- print("trader agents data before computing metrics")
108
- print(trader_agents_data.head())
109
  demo = gr.Blocks()
110
  # get weekly metrics by market creator: qs, pearl or all.
111
  weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
112
  trader_agents_data
113
  )
114
- print("weekly metrics by market creator")
115
- print(weekly_metrics_by_market_creator.head())
116
- # get weekly metrics by trader type: multibet, singlebet or all.
117
- weekly_metrics_by_trader_type = compute_weekly_metrics_by_trader_type(
118
  trader_agents_data
119
  )
 
 
 
 
 
 
 
 
 
120
  weekly_winning_metrics = compute_winning_metrics_by_trader(
121
  trader_agents_data=trader_agents_data
122
  )
@@ -127,12 +138,12 @@ with demo:
127
  )
128
 
129
  with gr.Tabs():
130
- with gr.TabItem("🔥Trader Agents Dashboard"):
131
  with gr.Row():
132
- gr.Markdown("# Weekly metrics of trader agents by market creator")
133
  with gr.Row():
134
  trader_details_selector = gr.Dropdown(
135
- label="Select a trader metric",
136
  choices=trader_metric_choices,
137
  value=default_trader_metric,
138
  )
@@ -157,12 +168,99 @@ with demo:
157
  inputs=trader_details_selector,
158
  outputs=trader_markets_plot,
159
  )
160
- # with gr.Row():
161
- # gr.Markdown("# Daily Median ROI by market creator")
162
- # with gr.Row():
163
- # daily_median = plot_median_roi_by_creation_date(
164
- # traders_df=trader_agents_data
165
- # )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
 
167
  with gr.TabItem("📉Closed Markets Kullback–Leibler divergence"):
168
  with gr.Row():
 
7
 
8
  from scripts.metrics import (
9
  compute_weekly_metrics_by_market_creator,
10
+ compute_daily_metrics_by_market_creator,
11
  compute_winning_metrics_by_trader,
12
  )
13
  from tabs.trader_plots import (
14
  plot_trader_metrics_by_market_creator,
15
+ plot_trader_daily_metrics_by_market_creator,
16
  default_trader_metric,
17
  trader_metric_choices,
18
  get_metrics_text,
19
  plot_winning_metric_per_trader,
20
  get_interpretation_text,
 
21
  )
22
 
23
+ from scripts.utils import get_traders_family
24
  from tabs.market_plots import (
25
  plot_kl_div_per_market,
26
  )
 
87
  trader_agents_data = pd.merge(
88
  all_trades, volume_trades_per_trader_and_market, on=["trader_address", "title"]
89
  )
90
+
91
+ # adding the trader family column
92
+ # trader_agents_data["trader_family"] = trader_agents_data.apply(
93
+ # lambda x: get_traders_family(x), axis=1
94
+ # )
95
+ # print(trader_agents_data.trader_family.value_counts())
96
 
97
  trader_agents_data = trader_agents_data.sort_values(
98
  by="creation_timestamp", ascending=True
 
109
 
110
 
111
  trader_agents_data, closed_markets = prepare_data()
112
+ # print("trader agents data before computing metrics")
113
+ # print(trader_agents_data.head())
114
  demo = gr.Blocks()
115
  # get weekly metrics by market creator: qs, pearl or all.
116
  weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
117
  trader_agents_data
118
  )
119
+ daily_metrics_by_market_creator = compute_daily_metrics_by_market_creator(
 
 
 
120
  trader_agents_data
121
  )
122
+ weekly_agent_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
123
+ trader_agents_data, trader_filter="agent"
124
+ )
125
+ weekly_non_agent_metrics_by_market_creator = compute_weekly_metrics_by_market_creator(
126
+ trader_agents_data, trader_filter="non_agent"
127
+ )
128
+ # print("weekly metrics by market creator")
129
+ # print(weekly_metrics_by_market_creator.head())
130
+
131
  weekly_winning_metrics = compute_winning_metrics_by_trader(
132
  trader_agents_data=trader_agents_data
133
  )
 
138
  )
139
 
140
  with gr.Tabs():
141
+ with gr.TabItem("🔥 Weekly metrics"):
142
  with gr.Row():
143
+ gr.Markdown("# Weekly metrics of all traders")
144
  with gr.Row():
145
  trader_details_selector = gr.Dropdown(
146
+ label="Select a weekly trader metric",
147
  choices=trader_metric_choices,
148
  value=default_trader_metric,
149
  )
 
168
  inputs=trader_details_selector,
169
  outputs=trader_markets_plot,
170
  )
171
+ # Agentic traders graph
172
+ with gr.Row():
173
+ gr.Markdown("# Weekly metrics of trader Agents")
174
+ with gr.Row():
175
+ trader_a_details_selector = gr.Dropdown(
176
+ label="Select a weekly trader metric",
177
+ choices=trader_metric_choices,
178
+ value=default_trader_metric,
179
+ )
180
+
181
+ with gr.Row():
182
+ with gr.Column(scale=3):
183
+ a_trader_markets_plot = plot_trader_metrics_by_market_creator(
184
+ metric_name=default_trader_metric,
185
+ traders_df=weekly_agent_metrics_by_market_creator,
186
+ )
187
+ with gr.Column(scale=1):
188
+ trade_details_text = get_metrics_text()
189
+
190
+ def update_a_trader_details(trader_detail):
191
+ return plot_trader_metrics_by_market_creator(
192
+ metric_name=trader_detail,
193
+ traders_df=weekly_agent_metrics_by_market_creator,
194
+ )
195
+
196
+ trader_a_details_selector.change(
197
+ update_a_trader_details,
198
+ inputs=trader_a_details_selector,
199
+ outputs=a_trader_markets_plot,
200
+ )
201
+
202
+ # Non-agentic traders graph
203
+ with gr.Row():
204
+ gr.Markdown("# Weekly metrics of Non-agent traders")
205
+ with gr.Row():
206
+ trader_na_details_selector = gr.Dropdown(
207
+ label="Select a weekly trader metric",
208
+ choices=trader_metric_choices,
209
+ value=default_trader_metric,
210
+ )
211
+
212
+ with gr.Row():
213
+ with gr.Column(scale=3):
214
+ na_trader_markets_plot = plot_trader_metrics_by_market_creator(
215
+ metric_name=default_trader_metric,
216
+ traders_df=weekly_non_agent_metrics_by_market_creator,
217
+ )
218
+ with gr.Column(scale=1):
219
+ trade_details_text = get_metrics_text()
220
+
221
+ def update_na_trader_details(trader_detail):
222
+ return plot_trader_metrics_by_market_creator(
223
+ metric_name=trader_detail,
224
+ traders_df=weekly_non_agent_metrics_by_market_creator,
225
+ )
226
+
227
+ trader_na_details_selector.change(
228
+ update_na_trader_details,
229
+ inputs=trader_na_details_selector,
230
+ outputs=na_trader_markets_plot,
231
+ )
232
+ with gr.TabItem("🔥 Daily metrics"):
233
+ with gr.Row():
234
+ gr.Markdown("# Daily metrics of last week of all traders")
235
+ with gr.Row():
236
+ trader_daily_details_selector = gr.Dropdown(
237
+ label="Select a daily trader metric",
238
+ choices=trader_metric_choices,
239
+ value=default_trader_metric,
240
+ )
241
+
242
+ with gr.Row():
243
+ with gr.Column(scale=3):
244
+ trader_daily_markets_plot = (
245
+ plot_trader_daily_metrics_by_market_creator(
246
+ metric_name=default_trader_metric,
247
+ traders_df=daily_metrics_by_market_creator,
248
+ )
249
+ )
250
+ with gr.Column(scale=1):
251
+ trade_details_text = get_metrics_text()
252
+
253
+ def update_trader_daily_details(trader_detail):
254
+ return plot_trader_daily_metrics_by_market_creator(
255
+ metric_name=trader_detail,
256
+ traders_df=daily_metrics_by_market_creator,
257
+ )
258
+
259
+ trader_daily_details_selector.change(
260
+ update_trader_daily_details,
261
+ inputs=trader_daily_details_selector,
262
+ outputs=trader_daily_markets_plot,
263
+ )
264
 
265
  with gr.TabItem("📉Closed Markets Kullback–Leibler divergence"):
266
  with gr.Row():
scripts/metrics.py CHANGED
@@ -7,76 +7,79 @@ DEFAULT_MECH_FEE = 0.01 # xDAI
7
  def compute_metrics(trader_address: str, trader_data: pd.DataFrame) -> dict:
8
 
9
  if len(trader_data) == 0:
10
- print("No data to compute metrics")
11
  return {}
12
 
13
- weekly_metrics = {}
14
- weekly_metrics["trader_address"] = trader_address
15
  total_net_earnings = trader_data.net_earnings.sum()
16
  total_bet_amounts = trader_data.collateral_amount.sum()
17
  total_num_mech_calls = trader_data.num_mech_calls.sum()
18
- weekly_metrics["net_earnings"] = total_net_earnings
19
- weekly_metrics["earnings"] = trader_data.earnings.sum()
20
- weekly_metrics["bet_amount"] = total_bet_amounts
21
- weekly_metrics["nr_mech_calls"] = total_num_mech_calls
 
22
  total_fee_amounts = trader_data.mech_fee_amount.sum()
23
  total_costs = (
24
  total_bet_amounts
25
  + total_fee_amounts
26
  + (total_num_mech_calls * DEFAULT_MECH_FEE)
27
  )
28
- weekly_metrics["roi"] = total_net_earnings / total_costs
29
- return weekly_metrics
30
 
31
 
32
- def compute_trader_metrics_by_trader_type(
33
- trader_address: str, week_traders_data: pd.DataFrame, trader_type: str = "all"
34
- ) -> pd.DataFrame:
35
- """This function computes for a specific week the different metrics: roi, net_earnings, earnings, bet_amount, nr_mech_calls.
36
- The global roi of the trader agent by computing the individual net profit and the indivicual costs values
 
37
  achieved per market and dividing both.
38
- It is possible to filter by trader type: multibet, singlebet, all"""
39
- assert "trader_type" in week_traders_data.columns
40
- filtered_traders_data = week_traders_data.loc[
41
- week_traders_data["trader_address"] == trader_address
42
  ]
43
-
44
- if trader_type != "all": # compute only for the specific type
45
  filtered_traders_data = filtered_traders_data.loc[
46
- filtered_traders_data["trader_type"] == trader_type
47
  ]
48
  if len(filtered_traders_data) == 0:
49
- return pd.DataFrame() # No Data
 
50
 
51
- return compute_metrics(trader_address, filtered_traders_data)
 
52
 
53
 
54
- def compute_trader_metrics_by_market_creator(
55
- trader_address: str, week_traders_data: pd.DataFrame, market_creator: str = "all"
56
  ) -> dict:
57
- """This function computes for a specific week the different metrics: roi, net_earnings, earnings, bet_amount, nr_mech_calls.
58
- The global roi of the trader agent by computing the individual net profit and the indivicual costs values
 
59
  achieved per market and dividing both.
60
- It is possible to filter by market creator: quickstart, pearl, all"""
61
- assert "market_creator" in week_traders_data.columns
62
- filtered_traders_data = week_traders_data.loc[
63
- week_traders_data["trader_address"] == trader_address
 
64
  ]
65
- if market_creator != "all": # compute only for the specific market creator
66
  filtered_traders_data = filtered_traders_data.loc[
67
- filtered_traders_data["market_creator"] == market_creator
68
  ]
69
  if len(filtered_traders_data) == 0:
70
- tqdm.write(f"No data. Skipping market creator {market_creator}")
71
  return {} # No Data
72
- # tqdm.write(
73
- # f"Volume of data for trader {trader_address} and market creator {market_creator} = {len(filtered_traders_data)}"
74
- # )
75
  metrics = compute_metrics(trader_address, filtered_traders_data)
76
  return metrics
77
 
78
 
79
- def merge_trader_metrics(
80
  trader: str, weekly_data: pd.DataFrame, week: str
81
  ) -> pd.DataFrame:
82
  trader_metrics = []
@@ -105,41 +108,38 @@ def merge_trader_metrics(
105
  weekly_metrics_pearl["market_creator"] = "pearl"
106
  trader_metrics.append(weekly_metrics_pearl)
107
  result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
108
- # tqdm.write(f"Total length of all trader metrics for this week = {len(result)}")
109
  return result
110
 
111
 
112
- def merge_trader_metrics_by_type(
113
- trader: str, weekly_data: pd.DataFrame, week: str
114
  ) -> pd.DataFrame:
115
  trader_metrics = []
116
- # computation as specification 1 for all types of traders
117
- weekly_metrics_all = compute_trader_metrics_by_trader_type(
118
- trader, weekly_data, trader_type="all"
119
  )
120
- weekly_metrics_all["month_year_week"] = week
121
- weekly_metrics_all["trader_type"] = "all"
122
- trader_metrics.append(weekly_metrics_all)
123
 
124
- # computation as specification 1 for multibet traders
125
- weekly_metrics_mb = compute_trader_metrics_by_trader_type(
126
- trader, weekly_data, trader_type="multibet"
127
  )
128
- if len(weekly_metrics_mb) > 0:
129
- weekly_metrics_mb["month_year_week"] = week
130
- weekly_metrics_mb["trader_type"] = "multibet"
131
- trader_metrics.append(weekly_metrics_mb)
132
-
133
- # computation as specification 1 for singlebet traders
134
- weekly_metrics_sb = compute_trader_metrics_by_trader_type(
135
- trader, weekly_data, trader_type="singlebet"
136
  )
137
- if len(weekly_metrics_sb) > 0:
138
- weekly_metrics_sb["month_year_week"] = week
139
- weekly_metrics_sb["trader_type"] = "singlebet"
140
- trader_metrics.append(weekly_metrics_sb)
141
  result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
142
- # tqdm.write(f"Total length of all trader metrics for this week = {len(result)}")
143
  return result
144
 
145
 
@@ -161,9 +161,10 @@ def win_metrics_trader_level(weekly_data):
161
 
162
 
163
  def compute_weekly_metrics_by_market_creator(
164
- trader_agents_data: pd.DataFrame,
165
  ) -> pd.DataFrame:
166
- """Function to compute the metrics at the trader level per week and with different categories by market creator"""
 
167
  contents = []
168
  all_weeks = list(trader_agents_data.month_year_week.unique())
169
  for week in all_weeks:
@@ -174,27 +175,51 @@ def compute_weekly_metrics_by_market_creator(
174
  # traverse each trader agent
175
  traders = list(weekly_data.trader_address.unique())
176
  for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
177
- contents.append(merge_trader_metrics(trader, weekly_data, week))
 
 
 
 
 
 
 
 
 
 
 
 
178
  print("End computing all weekly metrics by market creator")
179
  return pd.concat(contents, ignore_index=True)
180
 
181
 
182
- def compute_weekly_metrics_by_trader_type(
183
- trader_agents_data: pd.DataFrame,
184
  ) -> pd.DataFrame:
185
- """Function to compute the metrics at the trader level per week and with different types of traders"""
 
186
  contents = []
187
- all_weeks = list(trader_agents_data.month_year_week.unique())
188
- for week in all_weeks:
189
- weekly_data = trader_agents_data.loc[
190
- trader_agents_data["month_year_week"] == week
191
- ]
192
- print(f"Computing weekly metrics for week ={week} by trader type")
 
 
 
 
193
  # traverse each trader agent
194
- traders = list(weekly_data.trader_address.unique())
195
- for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
196
- contents.append(merge_trader_metrics_by_type(trader, weekly_data, week))
197
- print("End computing all weekly metrics by trader types")
 
 
 
 
 
 
 
198
  return pd.concat(contents, ignore_index=True)
199
 
200
 
 
7
  def compute_metrics(trader_address: str, trader_data: pd.DataFrame) -> dict:
8
 
9
  if len(trader_data) == 0:
10
+ # print("No data to compute metrics")
11
  return {}
12
 
13
+ agg_metrics = {}
14
+ agg_metrics["trader_address"] = trader_address
15
  total_net_earnings = trader_data.net_earnings.sum()
16
  total_bet_amounts = trader_data.collateral_amount.sum()
17
  total_num_mech_calls = trader_data.num_mech_calls.sum()
18
+ agg_metrics["net_earnings"] = total_net_earnings
19
+ agg_metrics["earnings"] = trader_data.earnings.sum()
20
+ agg_metrics["bet_amount"] = total_bet_amounts
21
+ agg_metrics["nr_mech_calls"] = total_num_mech_calls
22
+ agg_metrics["nr_trades"] = len(trader_data)
23
  total_fee_amounts = trader_data.mech_fee_amount.sum()
24
  total_costs = (
25
  total_bet_amounts
26
  + total_fee_amounts
27
  + (total_num_mech_calls * DEFAULT_MECH_FEE)
28
  )
29
+ agg_metrics["roi"] = total_net_earnings / total_costs
30
+ return agg_metrics
31
 
32
 
33
+ def compute_trader_metrics_by_market_creator(
34
+ trader_address: str, traders_data: pd.DataFrame, market_creator: str = "all"
35
+ ) -> dict:
36
+ """This function computes for a specific time window (week or day) the different metrics:
37
+ roi, net_earnings, earnings, bet_amount, nr_mech_calls and nr_trades.
38
+ The global roi of the trader agent by computing the individual net profit and the individual costs values
39
  achieved per market and dividing both.
40
+ It is possible to filter by market creator: quickstart, pearl, all"""
41
+ assert "market_creator" in traders_data.columns
42
+ filtered_traders_data = traders_data.loc[
43
+ traders_data["trader_address"] == trader_address
44
  ]
45
+ if market_creator != "all": # compute only for the specific market creator
 
46
  filtered_traders_data = filtered_traders_data.loc[
47
+ filtered_traders_data["market_creator"] == market_creator
48
  ]
49
  if len(filtered_traders_data) == 0:
50
+ # tqdm.write(f"No data. Skipping market creator {market_creator}")
51
+ return {} # No Data
52
 
53
+ metrics = compute_metrics(trader_address, filtered_traders_data)
54
+ return metrics
55
 
56
 
57
+ def compute_trader_metrics_by_trader_family(
58
+ trader_address: str, traders_data: pd.DataFrame, trader_family: str = "all"
59
  ) -> dict:
60
+ """This function computes for a specific time window (week or day) the different metrics:
61
+ roi, net_earnings, earnings, bet_amount, nr_mech_calls and nr_trades.
62
+ The global roi of the trader agent by computing the individual net profit and the individual costs values
63
  achieved per market and dividing both.
64
+ It is possible to filter by trader family: quickstart_agent, pearl_agent, non_agent, all
65
+ """
66
+ assert "trader_family" in traders_data.columns
67
+ filtered_traders_data = traders_data.loc[
68
+ traders_data["trader_address"] == trader_address
69
  ]
70
+ if trader_family != "all": # compute only for the specific trader family
71
  filtered_traders_data = filtered_traders_data.loc[
72
+ filtered_traders_data["trader_family"] == trader_family
73
  ]
74
  if len(filtered_traders_data) == 0:
75
+ # tqdm.write(f"No data. Skipping trader family {trader_family}")
76
  return {} # No Data
77
+
 
 
78
  metrics = compute_metrics(trader_address, filtered_traders_data)
79
  return metrics
80
 
81
 
82
+ def merge_trader_weekly_metrics(
83
  trader: str, weekly_data: pd.DataFrame, week: str
84
  ) -> pd.DataFrame:
85
  trader_metrics = []
 
108
  weekly_metrics_pearl["market_creator"] = "pearl"
109
  trader_metrics.append(weekly_metrics_pearl)
110
  result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
 
111
  return result
112
 
113
 
114
+ def merge_trader_daily_metrics(
115
+ trader: str, daily_data: pd.DataFrame, day: str
116
  ) -> pd.DataFrame:
117
  trader_metrics = []
118
+ # computation as specification 1 for all types of markets
119
+ daily_metrics_all = compute_trader_metrics_by_market_creator(
120
+ trader, daily_data, market_creator="all"
121
  )
122
+ daily_metrics_all["creation_date"] = day
123
+ daily_metrics_all["market_creator"] = "all"
124
+ trader_metrics.append(daily_metrics_all)
125
 
126
+ # computation as specification 1 for quickstart markets
127
+ daily_metrics_qs = compute_trader_metrics_by_market_creator(
128
+ trader, daily_data, market_creator="quickstart"
129
  )
130
+ if len(daily_metrics_qs) > 0:
131
+ daily_metrics_qs["creation_date"] = day
132
+ daily_metrics_qs["market_creator"] = "quickstart"
133
+ trader_metrics.append(daily_metrics_qs)
134
+ # computation as specification 1 for pearl markets
135
+ daily_metrics_pearl = compute_trader_metrics_by_market_creator(
136
+ trader, daily_data, market_creator="pearl"
 
137
  )
138
+ if len(daily_metrics_pearl) > 0:
139
+ daily_metrics_pearl["creation_date"] = day
140
+ daily_metrics_pearl["market_creator"] = "pearl"
141
+ trader_metrics.append(daily_metrics_pearl)
142
  result = pd.DataFrame.from_dict(trader_metrics, orient="columns")
 
143
  return result
144
 
145
 
 
161
 
162
 
163
  def compute_weekly_metrics_by_market_creator(
164
+ trader_agents_data: pd.DataFrame, trader_filter: str = None
165
  ) -> pd.DataFrame:
166
+ """Function to compute the metrics at the trader level per week
167
+ and with different categories by market creator"""
168
  contents = []
169
  all_weeks = list(trader_agents_data.month_year_week.unique())
170
  for week in all_weeks:
 
175
  # traverse each trader agent
176
  traders = list(weekly_data.trader_address.unique())
177
  for trader in tqdm(traders, desc=f"Trader' metrics", unit="metrics"):
178
+ if trader_filter is None:
179
+ contents.append(merge_trader_weekly_metrics(trader, weekly_data, week))
180
+ elif trader_filter == "agent":
181
+ filtered_data = weekly_data.loc[weekly_data["staking"] != "non_agent"]
182
+ contents.append(
183
+ merge_trader_weekly_metrics(trader, filtered_data, week)
184
+ )
185
+ else: # non_agent traders
186
+ filtered_data = weekly_data.loc[weekly_data["staking"] == "non_agent"]
187
+ contents.append(
188
+ merge_trader_weekly_metrics(trader, filtered_data, week)
189
+ )
190
+
191
  print("End computing all weekly metrics by market creator")
192
  return pd.concat(contents, ignore_index=True)
193
 
194
 
195
+ def compute_daily_metrics_by_market_creator(
196
+ trader_agents_data: pd.DataFrame, trader_filter: str = None
197
  ) -> pd.DataFrame:
198
+ """Function to compute the metrics at the trader level per day
199
+ and with different categories by market creator"""
200
  contents = []
201
+ # trader_agents_data is already sorted by timestamp, so last item is last week
202
+ last_week = trader_agents_data.iloc[-1].month_year_week
203
+ print(f"Computing daily metrics for week ={last_week} by market creator")
204
+ last_week_data = trader_agents_data.loc[
205
+ trader_agents_data["month_year_week"] == last_week
206
+ ]
207
+ all_days = list(last_week_data.creation_date.unique())
208
+ for day in all_days:
209
+ daily_data = last_week_data.loc[last_week_data["creation_date"] == day]
210
+ print(f"Computing daily metrics for {day}")
211
  # traverse each trader agent
212
+ traders = list(daily_data.trader_address.unique())
213
+ for trader in tqdm(traders, desc=f"Trader' daily metrics", unit="metrics"):
214
+ if trader_filter is None:
215
+ contents.append(merge_trader_daily_metrics(trader, daily_data, day))
216
+ elif trader_filter == "agentic":
217
+ filtered_data = daily_data.loc[daily_data["staking"] != "non_agent"]
218
+ contents.append(merge_trader_daily_metrics(trader, filtered_data, day))
219
+ else: # non_agent traders
220
+ filtered_data = daily_data.loc[daily_data["staking"] == "non_agent"]
221
+ contents.append(merge_trader_daily_metrics(trader, filtered_data, day))
222
+ print("End computing all daily metrics by market creator")
223
  return pd.concat(contents, ignore_index=True)
224
 
225
 
scripts/utils.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+
3
+
4
+ def get_traders_family(row: pd.DataFrame) -> str:
5
+ if row.staking == "non_agent":
6
+ return "non_agent"
7
+ elif row.market_creator == "pearl":
8
+ return "pearl_agent"
9
+ # quickstart
10
+ return "quickstart_agent"
tabs/trader_plots.py CHANGED
@@ -8,6 +8,7 @@ trader_metric_choices = [
8
  "earnings",
9
  "net earnings",
10
  "ROI",
 
11
  ]
12
  default_trader_metric = "ROI"
13
 
@@ -63,6 +64,9 @@ def plot_trader_metrics_by_market_creator(
63
  metric_name = "net_earnings"
64
  column_name = metric_name
65
  yaxis_title = "Total net profit per trader (xDAI)"
 
 
 
66
  else: # earnings
67
  column_name = metric_name
68
  yaxis_title = "Total gross profit per trader (xDAI)"
@@ -90,6 +94,56 @@ def plot_trader_metrics_by_market_creator(
90
  )
91
 
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  def plot_median_roi_by_creation_date(traders_df: pd.DataFrame) -> gr.Plot:
94
  traders_df["creation_date"] = traders_df["creation_timestamp"].dt.date
95
 
 
8
  "earnings",
9
  "net earnings",
10
  "ROI",
11
+ "nr_trades",
12
  ]
13
  default_trader_metric = "ROI"
14
 
 
64
  metric_name = "net_earnings"
65
  column_name = metric_name
66
  yaxis_title = "Total net profit per trader (xDAI)"
67
+ elif metric_name == "nr_trades":
68
+ column_name = metric_name
69
+ yaxis_title = "Total nr of trades per trader"
70
  else: # earnings
71
  column_name = metric_name
72
  yaxis_title = "Total gross profit per trader (xDAI)"
 
94
  )
95
 
96
 
97
+ def plot_trader_daily_metrics_by_market_creator(
98
+ metric_name: str, traders_df: pd.DataFrame
99
+ ) -> gr.Plot:
100
+ """Plots the daily trader metrics."""
101
+
102
+ if metric_name == "mech calls":
103
+ metric_name = "mech_calls"
104
+ column_name = "nr_mech_calls"
105
+ yaxis_title = "Total nr of mech calls per trader"
106
+ elif metric_name == "ROI":
107
+ column_name = "roi"
108
+ yaxis_title = "Total ROI (net profit/cost)"
109
+ elif metric_name == "bet amount":
110
+ metric_name = "bet_amount"
111
+ column_name = metric_name
112
+ yaxis_title = "Total bet amount per trader (xDAI)"
113
+ elif metric_name == "net earnings":
114
+ metric_name = "net_earnings"
115
+ column_name = metric_name
116
+ yaxis_title = "Total net profit per trader (xDAI)"
117
+ elif metric_name == "nr_trades":
118
+ column_name = metric_name
119
+ yaxis_title = "Total nr of trades per trader"
120
+ else: # earnings
121
+ column_name = metric_name
122
+ yaxis_title = "Total gross profit per trader (xDAI)"
123
+
124
+ traders_filtered = traders_df[["creation_date", "market_creator", column_name]]
125
+
126
+ fig = px.box(
127
+ traders_filtered,
128
+ x="creation_date",
129
+ y=column_name,
130
+ color="market_creator",
131
+ color_discrete_sequence=["purple", "goldenrod", "darkgreen"],
132
+ category_orders={"market_creator": ["pearl", "quickstart", "all"]},
133
+ )
134
+ fig.update_traces(boxmean=True)
135
+ fig.update_layout(
136
+ xaxis_title="Day",
137
+ yaxis_title=yaxis_title,
138
+ legend=dict(yanchor="top", y=0.5),
139
+ )
140
+ fig.update_xaxes(tickformat="%b %d\n%Y")
141
+
142
+ return gr.Plot(
143
+ value=fig,
144
+ )
145
+
146
+
147
  def plot_median_roi_by_creation_date(traders_df: pd.DataFrame) -> gr.Plot:
148
  traders_df["creation_date"] = traders_df["creation_timestamp"].dt.date
149