rosacastillo commited on
Commit
e01feae
·
1 Parent(s): f2c9a4d

new pearl markets and new graphs

Browse files
app.py CHANGED
@@ -8,9 +8,13 @@ import logging
8
  from tabs.trades import (
9
  prepare_trades,
10
  get_overall_trades,
 
11
  get_overall_winning_trades,
 
12
  plot_trades_by_week,
 
13
  plot_winning_trades_by_week,
 
14
  plot_trade_details,
15
  )
16
  from tabs.tool_win import (
@@ -138,6 +142,7 @@ def prepare_data():
138
  Prepare the data for the dashboard
139
  """
140
  tools_df, trades_df, tools_accuracy_info, invalid_trades = get_all_data()
 
141
 
142
  tools_df["request_time"] = pd.to_datetime(tools_df["request_time"])
143
  trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"])
@@ -220,7 +225,20 @@ with demo:
220
  trade_details_selector
221
  with gr.Row():
222
  trade_details_plot
223
-
 
 
 
 
 
 
 
 
 
 
 
 
 
224
  with gr.TabItem("🚀 Tool Winning Dashboard"):
225
  with gr.Row():
226
  gr.Markdown("# All tools winning performance")
 
8
  from tabs.trades import (
9
  prepare_trades,
10
  get_overall_trades,
11
+ get_overall_by_market_trades,
12
  get_overall_winning_trades,
13
+ get_overall_winning_by_market_trades,
14
  plot_trades_by_week,
15
+ plot_trades_per_market_by_week,
16
  plot_winning_trades_by_week,
17
+ plot_winning_trades_per_market_by_week,
18
  plot_trade_details,
19
  )
20
  from tabs.tool_win import (
 
142
  Prepare the data for the dashboard
143
  """
144
  tools_df, trades_df, tools_accuracy_info, invalid_trades = get_all_data()
145
+ print(trades_df.info())
146
 
147
  tools_df["request_time"] = pd.to_datetime(tools_df["request_time"])
148
  trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"])
 
225
  trade_details_selector
226
  with gr.Row():
227
  trade_details_plot
228
+ with gr.TabItem("🔥Trades per market Dashboard"):
229
+ with gr.Row():
230
+ gr.Markdown("# Number of trades split by market type per week")
231
+ with gr.Row():
232
+ trades_by_week_plot = plot_trades_per_market_by_week(
233
+ trades_df=get_overall_by_market_trades(trades_df=trades_df)
234
+ )
235
+ with gr.Row():
236
+ gr.Markdown("# Percentage of winning trades per week")
237
+ with gr.Row():
238
+ winning_trades_by_week_plot = plot_winning_trades_per_market_by_week(
239
+ trades_df=get_overall_winning_by_market_trades(trades_df=trades_df)
240
+ )
241
+ # TODO add average ROI value per market
242
  with gr.TabItem("🚀 Tool Winning Dashboard"):
243
  with gr.Row():
244
  gr.Markdown("# All tools winning performance")
data/all_trades_profitability.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:f077d410e0e9118e024c64ec5a1b6c33cfbe2864a0cda91050c9a08b1443608a
3
- size 1481357
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2228c601aaa9c6f33d8a018b946bbd654e392a27b4d1b2b7310ea8d4019bf640
3
+ size 1651423
data/fpmmTrades.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:6ed74c013906f4b8af747c09f3a55fe8f8978d6c707a12f6ec21431c33e662fc
3
- size 4831023
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:56d7bc7c2dd1970b3f3d97d70a9d4e92134b17da9469bcfbd2ecdcf85e6b7aea
3
+ size 5345188
data/fpmms.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:de1475b066a0c1f953043529f0f6ffd740341cbc0dac219b46342fb6d78cf18b
3
- size 389209
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d9df2136521afbf13e5d3675f14eead02ae66b2fce1c5e9e09fdd10d057f7dec
3
+ size 411157
data/invalid_trades.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:9fcaad515535cdfee4cb3a853d61a77ce9f6ea9345120ef6717570c376a6af48
3
- size 251293
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:efdca1d658e69a2d61ead2e38513a66cfa37beb64ccd4d642493dd77f02c4ba8
3
+ size 247018
data/summary_profitability.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:000194cbb06cf7c42e4f54083a69e1d9dbbcc7f5a216b30a0756e0f66019c34e
3
- size 29506
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e6fb720990290b9df24681e10aca6d545a4bab615f166bf4861be14d2465cdd3
3
+ size 34952
requirements.txt CHANGED
@@ -1,10 +1,10 @@
1
- pandas==2.0.1
2
  seaborn
3
  matplotlib
4
  huggingface-hub
5
  pyarrow
6
  requests
7
- gradio==4.13.0
8
  plotly
9
  nbformat
10
  pytz
 
1
+ pandas==2.2.2
2
  seaborn
3
  matplotlib
4
  huggingface-hub
5
  pyarrow
6
  requests
7
+ gradio==4.27.0
8
  plotly
9
  nbformat
10
  pytz
scripts/markets.py CHANGED
@@ -47,8 +47,9 @@ SubgraphResponseType = Dict[str, ResponseItemType]
47
 
48
 
49
  CREATOR = "0x89c5cc945dd550BcFfb72Fe42BfF002429F46Fec"
 
50
  BATCH_SIZE = 1000
51
- # OMEN_SUBGRAPH = "https://api.thegraph.com/subgraphs/name/protofire/omen-xdai"
52
  OMEN_SUBGRAPH_URL = Template(
53
  """https://gateway-arbitrum.network.thegraph.com/api/${subgraph_api_key}/subgraphs/id/9fUVQpFwzpdWS9bq5WkAnmKbNNcoBwatMR4yZq81pbbz"""
54
  )
@@ -142,14 +143,19 @@ def query_subgraph(url: str, query: str, key: str) -> SubgraphResponseType:
142
  return data
143
 
144
 
145
- def fpmms_fetcher() -> Generator[ResponseItemType, int, None]:
146
  """An indefinite fetcher for the FPMMs."""
147
  omen_subgraph = OMEN_SUBGRAPH_URL.substitute(subgraph_api_key=SUBGRAPH_API_KEY)
148
  print(f"omen_subgraph = {omen_subgraph}")
 
 
 
 
 
149
  while True:
150
  fpmm_id = yield
151
  fpmms_query = FPMMS_QUERY.substitute(
152
- creator=CREATOR,
153
  fpmm_id=fpmm_id,
154
  fpmms_field=FPMMS_FIELD,
155
  first=BATCH_SIZE,
@@ -159,15 +165,38 @@ def fpmms_fetcher() -> Generator[ResponseItemType, int, None]:
159
  outcomes_field=OUTCOMES_FIELD,
160
  title_field=TITLE_FIELD,
161
  )
162
-
163
  yield query_subgraph(omen_subgraph, fpmms_query, FPMMS_FIELD)
164
 
165
 
166
- def fetch_fpmms() -> pd.DataFrame:
167
  """Fetch all the fpmms of the creator."""
168
  latest_id = ""
169
  fpmms = []
170
- fetcher = fpmms_fetcher()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  for _ in tqdm(fetcher, unit="fpmms", unit_scale=BATCH_SIZE):
172
  batch = fetcher.send(latest_id)
173
  if len(batch) == 0:
@@ -203,8 +232,16 @@ def transform_fpmms(fpmms: pd.DataFrame) -> pd.DataFrame:
203
 
204
  def etl(filename: Optional[str] = None) -> pd.DataFrame:
205
  """Fetch, process, store and return the markets as a Dataframe."""
206
- fpmms = fetch_fpmms()
207
- fpmms = transform_fpmms(fpmms)
 
 
 
 
 
 
 
 
208
 
209
  if filename:
210
  fpmms.to_parquet(DATA_DIR / filename, index=False)
@@ -213,4 +250,4 @@ def etl(filename: Optional[str] = None) -> pd.DataFrame:
213
 
214
 
215
  if __name__ == "__main__":
216
- etl(DEFAULT_FILENAME)
 
47
 
48
 
49
  CREATOR = "0x89c5cc945dd550BcFfb72Fe42BfF002429F46Fec"
50
+ PEARL_CREATOR = "0xFfc8029154ECD55ABED15BD428bA596E7D23f557"
51
  BATCH_SIZE = 1000
52
+
53
  OMEN_SUBGRAPH_URL = Template(
54
  """https://gateway-arbitrum.network.thegraph.com/api/${subgraph_api_key}/subgraphs/id/9fUVQpFwzpdWS9bq5WkAnmKbNNcoBwatMR4yZq81pbbz"""
55
  )
 
143
  return data
144
 
145
 
146
+ def fpmms_fetcher(trader_category: str) -> Generator[ResponseItemType, int, None]:
147
  """An indefinite fetcher for the FPMMs."""
148
  omen_subgraph = OMEN_SUBGRAPH_URL.substitute(subgraph_api_key=SUBGRAPH_API_KEY)
149
  print(f"omen_subgraph = {omen_subgraph}")
150
+
151
+ if trader_category == "pearl":
152
+ creator_id = PEARL_CREATOR
153
+ else: # quickstart
154
+ creator_id = CREATOR
155
  while True:
156
  fpmm_id = yield
157
  fpmms_query = FPMMS_QUERY.substitute(
158
+ creator=creator_id,
159
  fpmm_id=fpmm_id,
160
  fpmms_field=FPMMS_FIELD,
161
  first=BATCH_SIZE,
 
165
  outcomes_field=OUTCOMES_FIELD,
166
  title_field=TITLE_FIELD,
167
  )
168
+ print(f"markets query = {fpmms_query}")
169
  yield query_subgraph(omen_subgraph, fpmms_query, FPMMS_FIELD)
170
 
171
 
172
+ def fetch_qs_fpmms() -> pd.DataFrame:
173
  """Fetch all the fpmms of the creator."""
174
  latest_id = ""
175
  fpmms = []
176
+ trader_category = "quickstart"
177
+ print(f"Getting markets for {trader_category}")
178
+ fetcher = fpmms_fetcher(trader_category)
179
+ for _ in tqdm(fetcher, unit="fpmms", unit_scale=BATCH_SIZE):
180
+ batch = fetcher.send(latest_id)
181
+ if len(batch) == 0:
182
+ break
183
+
184
+ latest_id = batch[-1].get(ID_FIELD, "")
185
+ if latest_id == "":
186
+ raise ValueError(f"Unexpected data format retrieved: {batch}")
187
+
188
+ fpmms.extend(batch)
189
+
190
+ return pd.DataFrame(fpmms)
191
+
192
+
193
+ def fetch_pearl_fpmms() -> pd.DataFrame:
194
+ """Fetch all the fpmms of the creator."""
195
+ latest_id = ""
196
+ fpmms = []
197
+ trader_category = "pearl"
198
+ print(f"Getting markets for {trader_category}")
199
+ fetcher = fpmms_fetcher(trader_category)
200
  for _ in tqdm(fetcher, unit="fpmms", unit_scale=BATCH_SIZE):
201
  batch = fetcher.send(latest_id)
202
  if len(batch) == 0:
 
232
 
233
  def etl(filename: Optional[str] = None) -> pd.DataFrame:
234
  """Fetch, process, store and return the markets as a Dataframe."""
235
+ qs_fpmms = fetch_qs_fpmms()
236
+ qs_fpmms = transform_fpmms(qs_fpmms)
237
+ qs_fpmms["market_creator"] = "quickstart"
238
+ print(f"Results for the market creator quickstart. Len = {len(qs_fpmms)}")
239
+
240
+ pearl_fpmms = fetch_pearl_fpmms()
241
+ pearl_fpmms = transform_fpmms(pearl_fpmms)
242
+ pearl_fpmms["market_creator"] = "pearl"
243
+ print(f"Results for the market creator quickstart. Len = {len(pearl_fpmms)}")
244
+ fpmms = pd.concat([qs_fpmms, pearl_fpmms], ignore_index=True)
245
 
246
  if filename:
247
  fpmms.to_parquet(DATA_DIR / filename, index=False)
 
250
 
251
 
252
  if __name__ == "__main__":
253
+ etl("all_fpmms.parquet")
scripts/profitability.py CHANGED
@@ -36,7 +36,8 @@ from queries import omen_xdai_trades_query, conditional_tokens_gc_user_query
36
  QUERY_BATCH_SIZE = 1000
37
  DUST_THRESHOLD = 10000000000000
38
  INVALID_ANSWER = -1
39
- FPMM_CREATOR = "0x89c5cc945dd550bcffb72fe42bff002429f46fec"
 
40
  DEFAULT_FROM_DATE = "1970-01-01T00:00:00"
41
  DEFAULT_TO_DATE = "2038-01-19T03:14:07"
42
  DEFAULT_FROM_TIMESTAMP = 0
@@ -143,6 +144,7 @@ headers = {
143
 
144
 
145
  def _query_omen_xdai_subgraph(
 
146
  from_timestamp: float,
147
  to_timestamp: float,
148
  fpmm_from_timestamp: float,
@@ -156,10 +158,14 @@ def _query_omen_xdai_subgraph(
156
  print(f"omen_subgraph = {omen_subgraph}")
157
  grouped_results = defaultdict(list)
158
  id_gt = ""
 
 
 
 
159
 
160
  while True:
161
  query = omen_xdai_trades_query.substitute(
162
- fpmm_creator=FPMM_CREATOR.lower(),
163
  creationTimestamp_gte=int(from_timestamp),
164
  creationTimestamp_lte=int(to_timestamp),
165
  fpmm_creationTimestamp_gte=int(fpmm_from_timestamp),
@@ -251,22 +257,8 @@ def _is_redeemed(user_json: dict[str, Any], fpmmTrade: dict[str, Any]) -> bool:
251
  return False
252
 
253
 
254
- def create_fpmmTrades(rpc: str, from_timestamp: float = DEFAULT_FROM_TIMESTAMP):
255
- """Create fpmmTrades for all trades."""
256
- trades_json = _query_omen_xdai_subgraph(
257
- from_timestamp=from_timestamp,
258
- to_timestamp=DEFAULT_TO_TIMESTAMP,
259
- fpmm_from_timestamp=from_timestamp,
260
- fpmm_to_timestamp=DEFAULT_TO_TIMESTAMP,
261
- )
262
-
263
- print(f"length of the trades_json dataset {len(trades_json)}")
264
-
265
- # convert to dataframe
266
- df = pd.DataFrame(trades_json["data"]["fpmmTrades"])
267
- print(df.head())
268
- print(df.info())
269
-
270
  # convert creator to address
271
  df["creator"] = df["creator"].apply(lambda x: x["id"])
272
 
@@ -280,10 +272,48 @@ def create_fpmmTrades(rpc: str, from_timestamp: float = DEFAULT_FROM_TIMESTAMP):
280
 
281
  # change creator to creator_address
282
  df.rename(columns={"creator": "trader_address"}, inplace=True)
283
-
 
284
  return df
285
 
286
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  def prepare_profitalibity_data(
288
  rpc: str,
289
  tools_filename: str = "tools.parquet",
@@ -518,6 +548,7 @@ def run_profitability_analysis(
518
  rpc, tools_filename, trades_filename, from_timestamp
519
  )
520
  tools["trader_address"] = tools["trader_address"].str.lower()
 
521
 
522
  # all trades profitability df
523
  print("Analysing trades...")
 
36
  QUERY_BATCH_SIZE = 1000
37
  DUST_THRESHOLD = 10000000000000
38
  INVALID_ANSWER = -1
39
+ FPMM_QS_CREATOR = "0x89c5cc945dd550bcffb72fe42bff002429f46fec"
40
+ FPMM_PEARL_CREATOR = "0xFfc8029154ECD55ABED15BD428bA596E7D23f557"
41
  DEFAULT_FROM_DATE = "1970-01-01T00:00:00"
42
  DEFAULT_TO_DATE = "2038-01-19T03:14:07"
43
  DEFAULT_FROM_TIMESTAMP = 0
 
144
 
145
 
146
  def _query_omen_xdai_subgraph(
147
+ trader_category: str,
148
  from_timestamp: float,
149
  to_timestamp: float,
150
  fpmm_from_timestamp: float,
 
158
  print(f"omen_subgraph = {omen_subgraph}")
159
  grouped_results = defaultdict(list)
160
  id_gt = ""
161
+ if trader_category == "quickstart":
162
+ creator_id = FPMM_QS_CREATOR.lower()
163
+ else: # pearl
164
+ creator_id = FPMM_PEARL_CREATOR.lower()
165
 
166
  while True:
167
  query = omen_xdai_trades_query.substitute(
168
+ fpmm_creator=creator_id,
169
  creationTimestamp_gte=int(from_timestamp),
170
  creationTimestamp_lte=int(to_timestamp),
171
  fpmm_creationTimestamp_gte=int(fpmm_from_timestamp),
 
257
  return False
258
 
259
 
260
+ def transform_fpmmTrades(df: pd.DataFrame) -> pd.DataFrame:
261
+ print("Transforming trades dataframe")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  # convert creator to address
263
  df["creator"] = df["creator"].apply(lambda x: x["id"])
264
 
 
272
 
273
  # change creator to creator_address
274
  df.rename(columns={"creator": "trader_address"}, inplace=True)
275
+ print(df.head())
276
+ print(df.info())
277
  return df
278
 
279
 
280
+ def create_fpmmTrades(rpc: str, from_timestamp: float = DEFAULT_FROM_TIMESTAMP):
281
+ """Create fpmmTrades for all trades."""
282
+ # Quickstart trades
283
+ qs_trades_json = _query_omen_xdai_subgraph(
284
+ trader_category="quickstart",
285
+ from_timestamp=from_timestamp,
286
+ to_timestamp=DEFAULT_TO_TIMESTAMP,
287
+ fpmm_from_timestamp=from_timestamp,
288
+ fpmm_to_timestamp=DEFAULT_TO_TIMESTAMP,
289
+ )
290
+
291
+ print(f"length of the qs_trades_json dataset {len(qs_trades_json)}")
292
+
293
+ # convert to dataframe
294
+ qs_df = pd.DataFrame(qs_trades_json["data"]["fpmmTrades"])
295
+ qs_df["market_creator"] = "quickstart"
296
+ qs_df = transform_fpmmTrades(qs_df)
297
+
298
+ # Pearl trades
299
+ pearl_trades_json = _query_omen_xdai_subgraph(
300
+ trader_category="pearl",
301
+ from_timestamp=from_timestamp,
302
+ to_timestamp=DEFAULT_TO_TIMESTAMP,
303
+ fpmm_from_timestamp=from_timestamp,
304
+ fpmm_to_timestamp=DEFAULT_TO_TIMESTAMP,
305
+ )
306
+
307
+ print(f"length of the pearl_trades_json dataset {len(pearl_trades_json)}")
308
+
309
+ # convert to dataframe
310
+ pearl_df = pd.DataFrame(pearl_trades_json["data"]["fpmmTrades"])
311
+ pearl_df["market_creator"] = "pearl"
312
+ pearl_df = transform_fpmmTrades(pearl_df)
313
+
314
+ return pd.concat([qs_df, pearl_df], ignore_index=True)
315
+
316
+
317
  def prepare_profitalibity_data(
318
  rpc: str,
319
  tools_filename: str = "tools.parquet",
 
548
  rpc, tools_filename, trades_filename, from_timestamp
549
  )
550
  tools["trader_address"] = tools["trader_address"].str.lower()
551
+ print(f"List of market creators = {trades["trader_address"].unique()}")
552
 
553
  # all trades profitability df
554
  print("Analysing trades...")
tabs/trades.py CHANGED
@@ -2,51 +2,96 @@ import gradio as gr
2
  import pandas as pd
3
 
4
 
5
- HEIGHT=600
6
- WIDTH=1000
 
7
 
8
  def prepare_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
9
  """Prepares the trades data for analysis."""
10
- trades_df['creation_timestamp'] = pd.to_datetime(trades_df['creation_timestamp'])
11
- trades_df['creation_timestamp'] = trades_df['creation_timestamp'].dt.tz_convert('UTC')
12
- trades_df['month_year'] = trades_df['creation_timestamp'].dt.to_period('M').astype(str)
13
- trades_df['month_year_week'] = trades_df['creation_timestamp'].dt.to_period('W').astype(str)
14
- trades_df['winning_trade'] = trades_df['winning_trade'].astype(int)
 
 
 
 
 
 
15
  return trades_df
16
 
17
 
18
  def get_overall_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
19
  """Gets the overall trades data for the given tools and calculates the winning percentage."""
20
- trades_count = trades_df.groupby('month_year_week').size().reset_index()
 
 
 
 
 
 
 
 
 
 
21
  trades_count.columns = trades_count.columns.astype(str)
22
- trades_count.rename(columns={'0': 'trades'}, inplace=True)
23
  return trades_count
24
 
 
25
  def get_overall_winning_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
26
  """Gets the overall winning trades data for the given tools and calculates the winning percentage."""
27
- winning_trades = trades_df.groupby(['month_year_week'])['winning_trade'].sum() / trades_df.groupby(['month_year_week'])['winning_trade'].count() * 100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  # winning_trades is a series, give it a dataframe
29
  winning_trades = winning_trades.reset_index()
30
  winning_trades.columns = winning_trades.columns.astype(str)
31
- winning_trades.columns = ['month_year_week', 'winning_trade']
32
  return winning_trades
33
 
 
34
  def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlot:
35
  """Plots the trade details for the given trade detail."""
36
  if trade_detail == "mech calls":
37
  # this is to filter out the data before 2023-09-01
38
- trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
39
- trades_filtered = trades_filtered.groupby("month_year_week")["num_mech_calls"].quantile([0.25, 0.5, 0.75]).unstack()
 
 
 
 
40
  trades_filtered.columns = trades_filtered.columns.astype(str)
41
  trades_filtered.reset_index(inplace=True)
42
  trades_filtered.columns = [
43
  "month_year_week",
44
  "25th_percentile",
45
  "50th_percentile",
46
- "75th_percentile"
47
  ]
48
  # reformat the data as percentile, date, value
49
- trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="mech_calls")
 
 
50
 
51
  return gr.LinePlot(
52
  value=trades_filtered,
@@ -58,22 +103,30 @@ def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlo
58
  show_actions_button=True,
59
  tooltip=["month_year_week", "percentile", "mech_calls"],
60
  height=HEIGHT,
61
- width=WIDTH
62
  )
63
-
64
  if trade_detail == "collateral amount":
65
- trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
66
- trades_filtered = trades_filtered.groupby("month_year_week")["collateral_amount"].quantile([0.25, 0.5, 0.75]).unstack()
 
 
 
 
67
  trades_filtered.columns = trades_filtered.columns.astype(str)
68
  trades_filtered.reset_index(inplace=True)
69
  trades_filtered.columns = [
70
  "month_year_week",
71
  "25th_percentile",
72
  "50th_percentile",
73
- "75th_percentile"
74
  ]
75
  # reformat the data as percentile, date, value
76
- trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="collateral_amount")
 
 
 
 
77
 
78
  return gr.LinePlot(
79
  value=trades_filtered,
@@ -85,22 +138,28 @@ def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlo
85
  show_actions_button=True,
86
  tooltip=["month_year_week", "percentile", "collateral_amount"],
87
  height=HEIGHT,
88
- width=WIDTH
89
  )
90
 
91
  if trade_detail == "earnings":
92
- trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
93
- trades_filtered = trades_filtered.groupby("month_year_week")["earnings"].quantile([0.25, 0.5, 0.75]).unstack()
 
 
 
 
94
  trades_filtered.columns = trades_filtered.columns.astype(str)
95
  trades_filtered.reset_index(inplace=True)
96
  trades_filtered.columns = [
97
  "month_year_week",
98
  "25th_percentile",
99
  "50th_percentile",
100
- "75th_percentile"
101
  ]
102
  # reformat the data as percentile, date, value
103
- trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="earnings")
 
 
104
 
105
  return gr.LinePlot(
106
  value=trades_filtered,
@@ -112,22 +171,30 @@ def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlo
112
  show_actions_button=True,
113
  tooltip=["month_year_week", "percentile", "earnings"],
114
  height=HEIGHT,
115
- width=WIDTH
116
  )
117
-
118
  if trade_detail == "net earnings":
119
- trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
120
- trades_filtered = trades_filtered.groupby("month_year_week")["net_earnings"].quantile([0.25, 0.5, 0.75]).unstack()
 
 
 
 
121
  trades_filtered.columns = trades_filtered.columns.astype(str)
122
  trades_filtered.reset_index(inplace=True)
123
  trades_filtered.columns = [
124
  "month_year_week",
125
  "25th_percentile",
126
  "50th_percentile",
127
- "75th_percentile"
128
  ]
129
  # reformat the data as percentile, date, value
130
- trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="net_earnings")
 
 
 
 
131
 
132
  return gr.LinePlot(
133
  value=trades_filtered,
@@ -139,22 +206,28 @@ def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlo
139
  show_actions_button=True,
140
  tooltip=["month_year_week", "percentile", "net_earnings"],
141
  height=HEIGHT,
142
- width=WIDTH
143
- )
144
-
145
  if trade_detail == "ROI":
146
- trades_filtered = trades_df[trades_df["creation_timestamp"] >"2023-09-01"]
147
- trades_filtered = trades_filtered.groupby("month_year_week")["roi"].quantile([0.25, 0.5, 0.75]).unstack()
 
 
 
 
148
  trades_filtered.columns = trades_filtered.columns.astype(str)
149
  trades_filtered.reset_index(inplace=True)
150
  trades_filtered.columns = [
151
  "month_year_week",
152
  "25th_percentile",
153
  "50th_percentile",
154
- "75th_percentile"
155
  ]
156
  # reformat the data as percentile, date, value
157
- trades_filtered = trades_filtered.melt(id_vars=["month_year_week"], var_name="percentile", value_name="ROI")
 
 
158
 
159
  return gr.LinePlot(
160
  value=trades_filtered,
@@ -166,9 +239,32 @@ def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlo
166
  show_actions_button=True,
167
  tooltip=["month_year_week", "percentile", "ROI"],
168
  height=HEIGHT,
169
- width=WIDTH
170
- )
171
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  def plot_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
173
  """Plots the trades data for the given tools and calculates the winning percentage."""
174
  return gr.BarPlot(
@@ -180,9 +276,27 @@ def plot_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
180
  show_actions_button=True,
181
  tooltip=["month_year_week", "trades"],
182
  height=HEIGHT,
183
- width=WIDTH
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  )
185
 
 
186
  def plot_winning_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
187
  """Plots the winning trades data for the given tools and calculates the winning percentage."""
188
  return gr.BarPlot(
@@ -194,5 +308,22 @@ def plot_winning_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
194
  show_actions_button=True,
195
  tooltip=["month_year_week", "winning_trade"],
196
  height=HEIGHT,
197
- width=WIDTH
198
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import pandas as pd
3
 
4
 
5
+ HEIGHT = 600
6
+ WIDTH = 1000
7
+
8
 
9
  def prepare_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
10
  """Prepares the trades data for analysis."""
11
+ trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"])
12
+ trades_df["creation_timestamp"] = trades_df["creation_timestamp"].dt.tz_convert(
13
+ "UTC"
14
+ )
15
+ trades_df["month_year"] = (
16
+ trades_df["creation_timestamp"].dt.to_period("M").astype(str)
17
+ )
18
+ trades_df["month_year_week"] = (
19
+ trades_df["creation_timestamp"].dt.to_period("W").astype(str)
20
+ )
21
+ trades_df["winning_trade"] = trades_df["winning_trade"].astype(int)
22
  return trades_df
23
 
24
 
25
  def get_overall_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
26
  """Gets the overall trades data for the given tools and calculates the winning percentage."""
27
+ trades_count = trades_df.groupby("month_year_week").size().reset_index()
28
+ trades_count.columns = trades_count.columns.astype(str)
29
+ trades_count.rename(columns={"0": "trades"}, inplace=True)
30
+ return trades_count
31
+
32
+
33
+ def get_overall_by_market_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
34
+ """Gets the overall trades data for the given tools and calculates the winning percentage."""
35
+ trades_count = (
36
+ trades_df.groupby(["market_creator", "month_year_week"]).size().reset_index()
37
+ )
38
  trades_count.columns = trades_count.columns.astype(str)
39
+ trades_count.rename(columns={"0": "trades"}, inplace=True)
40
  return trades_count
41
 
42
+
43
  def get_overall_winning_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
44
  """Gets the overall winning trades data for the given tools and calculates the winning percentage."""
45
+ winning_trades = (
46
+ trades_df.groupby(["month_year_week"])["winning_trade"].sum()
47
+ / trades_df.groupby(["month_year_week"])["winning_trade"].count()
48
+ * 100
49
+ )
50
+ # winning_trades is a series, give it a dataframe
51
+ winning_trades = winning_trades.reset_index()
52
+ winning_trades.columns = winning_trades.columns.astype(str)
53
+ winning_trades.columns = ["month_year_week", "winning_trade"]
54
+ return winning_trades
55
+
56
+
57
+ def get_overall_winning_by_market_trades(trades_df: pd.DataFrame) -> pd.DataFrame:
58
+ """Gets the overall winning trades data for the given tools and calculates the winning percentage."""
59
+ winning_trades = (
60
+ trades_df.groupby(["market_creator", "month_year_week"])["winning_trade"].sum()
61
+ / trades_df.groupby(["market_creator", "month_year_week"])[
62
+ "winning_trade"
63
+ ].count()
64
+ * 100
65
+ )
66
  # winning_trades is a series, give it a dataframe
67
  winning_trades = winning_trades.reset_index()
68
  winning_trades.columns = winning_trades.columns.astype(str)
69
+ winning_trades.columns = ["market_creator", "month_year_week", "winning_trade"]
70
  return winning_trades
71
 
72
+
73
  def plot_trade_details(trade_detail: str, trades_df: pd.DataFrame) -> gr.LinePlot:
74
  """Plots the trade details for the given trade detail."""
75
  if trade_detail == "mech calls":
76
  # this is to filter out the data before 2023-09-01
77
+ trades_filtered = trades_df[trades_df["creation_timestamp"] > "2023-09-01"]
78
+ trades_filtered = (
79
+ trades_filtered.groupby("month_year_week")["num_mech_calls"]
80
+ .quantile([0.25, 0.5, 0.75])
81
+ .unstack()
82
+ )
83
  trades_filtered.columns = trades_filtered.columns.astype(str)
84
  trades_filtered.reset_index(inplace=True)
85
  trades_filtered.columns = [
86
  "month_year_week",
87
  "25th_percentile",
88
  "50th_percentile",
89
+ "75th_percentile",
90
  ]
91
  # reformat the data as percentile, date, value
92
+ trades_filtered = trades_filtered.melt(
93
+ id_vars=["month_year_week"], var_name="percentile", value_name="mech_calls"
94
+ )
95
 
96
  return gr.LinePlot(
97
  value=trades_filtered,
 
103
  show_actions_button=True,
104
  tooltip=["month_year_week", "percentile", "mech_calls"],
105
  height=HEIGHT,
106
+ width=WIDTH,
107
  )
108
+
109
  if trade_detail == "collateral amount":
110
+ trades_filtered = trades_df[trades_df["creation_timestamp"] > "2023-09-01"]
111
+ trades_filtered = (
112
+ trades_filtered.groupby("month_year_week")["collateral_amount"]
113
+ .quantile([0.25, 0.5, 0.75])
114
+ .unstack()
115
+ )
116
  trades_filtered.columns = trades_filtered.columns.astype(str)
117
  trades_filtered.reset_index(inplace=True)
118
  trades_filtered.columns = [
119
  "month_year_week",
120
  "25th_percentile",
121
  "50th_percentile",
122
+ "75th_percentile",
123
  ]
124
  # reformat the data as percentile, date, value
125
+ trades_filtered = trades_filtered.melt(
126
+ id_vars=["month_year_week"],
127
+ var_name="percentile",
128
+ value_name="collateral_amount",
129
+ )
130
 
131
  return gr.LinePlot(
132
  value=trades_filtered,
 
138
  show_actions_button=True,
139
  tooltip=["month_year_week", "percentile", "collateral_amount"],
140
  height=HEIGHT,
141
+ width=WIDTH,
142
  )
143
 
144
  if trade_detail == "earnings":
145
+ trades_filtered = trades_df[trades_df["creation_timestamp"] > "2023-09-01"]
146
+ trades_filtered = (
147
+ trades_filtered.groupby("month_year_week")["earnings"]
148
+ .quantile([0.25, 0.5, 0.75])
149
+ .unstack()
150
+ )
151
  trades_filtered.columns = trades_filtered.columns.astype(str)
152
  trades_filtered.reset_index(inplace=True)
153
  trades_filtered.columns = [
154
  "month_year_week",
155
  "25th_percentile",
156
  "50th_percentile",
157
+ "75th_percentile",
158
  ]
159
  # reformat the data as percentile, date, value
160
+ trades_filtered = trades_filtered.melt(
161
+ id_vars=["month_year_week"], var_name="percentile", value_name="earnings"
162
+ )
163
 
164
  return gr.LinePlot(
165
  value=trades_filtered,
 
171
  show_actions_button=True,
172
  tooltip=["month_year_week", "percentile", "earnings"],
173
  height=HEIGHT,
174
+ width=WIDTH,
175
  )
176
+
177
  if trade_detail == "net earnings":
178
+ trades_filtered = trades_df[trades_df["creation_timestamp"] > "2023-09-01"]
179
+ trades_filtered = (
180
+ trades_filtered.groupby("month_year_week")["net_earnings"]
181
+ .quantile([0.25, 0.5, 0.75])
182
+ .unstack()
183
+ )
184
  trades_filtered.columns = trades_filtered.columns.astype(str)
185
  trades_filtered.reset_index(inplace=True)
186
  trades_filtered.columns = [
187
  "month_year_week",
188
  "25th_percentile",
189
  "50th_percentile",
190
+ "75th_percentile",
191
  ]
192
  # reformat the data as percentile, date, value
193
+ trades_filtered = trades_filtered.melt(
194
+ id_vars=["month_year_week"],
195
+ var_name="percentile",
196
+ value_name="net_earnings",
197
+ )
198
 
199
  return gr.LinePlot(
200
  value=trades_filtered,
 
206
  show_actions_button=True,
207
  tooltip=["month_year_week", "percentile", "net_earnings"],
208
  height=HEIGHT,
209
+ width=WIDTH,
210
+ )
211
+
212
  if trade_detail == "ROI":
213
+ trades_filtered = trades_df[trades_df["creation_timestamp"] > "2023-09-01"]
214
+ trades_filtered = (
215
+ trades_filtered.groupby("month_year_week")["roi"]
216
+ .quantile([0.25, 0.5, 0.75])
217
+ .unstack()
218
+ )
219
  trades_filtered.columns = trades_filtered.columns.astype(str)
220
  trades_filtered.reset_index(inplace=True)
221
  trades_filtered.columns = [
222
  "month_year_week",
223
  "25th_percentile",
224
  "50th_percentile",
225
+ "75th_percentile",
226
  ]
227
  # reformat the data as percentile, date, value
228
+ trades_filtered = trades_filtered.melt(
229
+ id_vars=["month_year_week"], var_name="percentile", value_name="ROI"
230
+ )
231
 
232
  return gr.LinePlot(
233
  value=trades_filtered,
 
239
  show_actions_button=True,
240
  tooltip=["month_year_week", "percentile", "ROI"],
241
  height=HEIGHT,
242
+ width=WIDTH,
243
+ )
244
+
245
+
246
+ def plot_average_roi_per_market_by_week(trades_df: pd.DataFrame) -> gr.LinePlot:
247
+
248
+ mean_roi_per_market_by_week = (
249
+ trades_df.groupby(["market_creator", "month_year_week"])["roi"]
250
+ .mean()
251
+ .reset_index()
252
+ )
253
+ mean_roi_per_market_by_week.rename(columns={"roi": "mean_roi"}, inplace=True)
254
+ return gr.LinePlot(
255
+ value=mean_roi_per_market_by_week,
256
+ x="month_year_week",
257
+ y="ROI",
258
+ color="market_creator",
259
+ show_label=True,
260
+ interactive=True,
261
+ show_actions_button=True,
262
+ tooltip=["month_year_week", "market_creator", "mean_roi"],
263
+ height=HEIGHT,
264
+ width=WIDTH,
265
+ )
266
+
267
+
268
  def plot_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
269
  """Plots the trades data for the given tools and calculates the winning percentage."""
270
  return gr.BarPlot(
 
276
  show_actions_button=True,
277
  tooltip=["month_year_week", "trades"],
278
  height=HEIGHT,
279
+ width=WIDTH,
280
+ )
281
+
282
+
283
+ def plot_trades_per_market_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
284
+ """Plots the trades data for the given tools and calculates the winning percentage."""
285
+ assert "market_creator" in trades_df.columns
286
+ return gr.BarPlot(
287
+ value=trades_df,
288
+ x="month_year_week",
289
+ y="trades",
290
+ color="market_creator",
291
+ show_label=True,
292
+ interactive=True,
293
+ show_actions_button=True,
294
+ tooltip=["month_year_week", "trades"],
295
+ height=HEIGHT,
296
+ width=WIDTH,
297
  )
298
 
299
+
300
  def plot_winning_trades_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
301
  """Plots the winning trades data for the given tools and calculates the winning percentage."""
302
  return gr.BarPlot(
 
308
  show_actions_button=True,
309
  tooltip=["month_year_week", "winning_trade"],
310
  height=HEIGHT,
311
+ width=WIDTH,
312
+ )
313
+
314
+
315
+ def plot_winning_trades_per_market_by_week(trades_df: pd.DataFrame) -> gr.BarPlot:
316
+ """Plots the winning trades data for the given tools and calculates the winning percentage."""
317
+ assert "market_creator" in trades_df.columns
318
+ return gr.BarPlot(
319
+ value=trades_df,
320
+ x="month_year_week",
321
+ y="winning_trade",
322
+ color="market_creator",
323
+ show_label=True,
324
+ interactive=True,
325
+ show_actions_button=True,
326
+ tooltip=["month_year_week", "winning_trade"],
327
+ height=HEIGHT,
328
+ width=WIDTH,
329
+ )