cyberosa commited on
Commit
355fb10
Β·
1 Parent(s): e91be24

first prototype of wow retention graph for different trader types

Browse files
app.py CHANGED
@@ -9,6 +9,11 @@ from scripts.metrics import (
9
  compute_daily_metrics_by_market_creator,
10
  compute_winning_metrics_by_trader,
11
  )
 
 
 
 
 
12
  from tabs.trader_plots import (
13
  plot_trader_metrics_by_market_creator,
14
  default_trader_metric,
@@ -30,6 +35,10 @@ from tabs.market_plots import (
30
  plot_kl_div_per_market,
31
  plot_total_bet_amount_per_trader_per_market,
32
  )
 
 
 
 
33
 
34
 
35
  def get_logger():
@@ -130,6 +139,9 @@ def prepare_data():
130
 
131
 
132
  traders_data, closed_markets, daily_info, unknown_traders = prepare_data()
 
 
 
133
 
134
  demo = gr.Blocks()
135
  # get weekly metrics by market creator: qs, pearl or all.
@@ -390,6 +402,19 @@ with demo:
390
  inputs=[no_trader_live_details_selector, no_trader_live_details_plot],
391
  outputs=[no_trader_live_details_plot],
392
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
393
  with gr.TabItem("βš™οΈ Active traders"):
394
  with gr.Row():
395
  gr.Markdown("# Active traders for all markets by trader categories")
 
9
  compute_daily_metrics_by_market_creator,
10
  compute_winning_metrics_by_trader,
11
  )
12
+ from scripts.retention_metrics import (
13
+ prepare_retention_dataset,
14
+ calculate_wow_retention_by_type,
15
+ calculate_cohort_retention,
16
+ )
17
  from tabs.trader_plots import (
18
  plot_trader_metrics_by_market_creator,
19
  default_trader_metric,
 
35
  plot_kl_div_per_market,
36
  plot_total_bet_amount_per_trader_per_market,
37
  )
38
+ from tabs.retention_plots import (
39
+ plot_wow_retention_by_type,
40
+ plot_cohort_retention_heatmap,
41
+ )
42
 
43
 
44
  def get_logger():
 
139
 
140
 
141
  traders_data, closed_markets, daily_info, unknown_traders = prepare_data()
142
+ retention_df = prepare_retention_dataset(
143
+ traders_df=traders_data, unknown_df=unknown_traders
144
+ )
145
 
146
  demo = gr.Blocks()
147
  # get weekly metrics by market creator: qs, pearl or all.
 
402
  inputs=[no_trader_live_details_selector, no_trader_live_details_plot],
403
  outputs=[no_trader_live_details_plot],
404
  )
405
+ with gr.TabItem("πŸͺ Retention metrics (WIP)"):
406
+ with gr.Row():
407
+ # wow retention
408
+ gr.Markdown("# Wow retention by trader type")
409
+ with gr.Row():
410
+ wow_retention = calculate_wow_retention_by_type(retention_df)
411
+ wow_retention_plot = plot_wow_retention_by_type(
412
+ wow_retention=wow_retention
413
+ )
414
+ with gr.Row():
415
+ # cohort retention
416
+ gr.Markdown("# Cohort retention")
417
+
418
  with gr.TabItem("βš™οΈ Active traders"):
419
  with gr.Row():
420
  gr.Markdown("# Active traders for all markets by trader categories")
notebooks/closed_markets.ipynb CHANGED
@@ -2,7 +2,7 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 1,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
@@ -11,7 +11,7 @@
11
  },
12
  {
13
  "cell_type": "code",
14
- "execution_count": 3,
15
  "metadata": {},
16
  "outputs": [
17
  {
@@ -36,7 +36,7 @@
36
  },
37
  {
38
  "cell_type": "code",
39
- "execution_count": 4,
40
  "metadata": {},
41
  "outputs": [],
42
  "source": [
@@ -48,7 +48,7 @@
48
  },
49
  {
50
  "cell_type": "code",
51
- "execution_count": 5,
52
  "metadata": {},
53
  "outputs": [
54
  {
@@ -56,36 +56,38 @@
56
  "output_type": "stream",
57
  "text": [
58
  "<class 'pandas.core.frame.DataFrame'>\n",
59
- "RangeIndex: 85876 entries, 0 to 85875\n",
60
- "Data columns (total 24 columns):\n",
61
- " # Column Non-Null Count Dtype \n",
62
- "--- ------ -------------- ----- \n",
63
- " 0 collateralAmount 85876 non-null object\n",
64
- " 1 collateralAmountUSD 85876 non-null object\n",
65
- " 2 collateralToken 85876 non-null object\n",
66
- " 3 creationTimestamp 85876 non-null object\n",
67
- " 4 trader_address 85876 non-null object\n",
68
- " 5 feeAmount 85876 non-null object\n",
69
- " 6 id 85876 non-null object\n",
70
- " 7 oldOutcomeTokenMarginalPrice 85876 non-null object\n",
71
- " 8 outcomeIndex 85876 non-null object\n",
72
- " 9 outcomeTokenMarginalPrice 85876 non-null object\n",
73
- " 10 outcomeTokensTraded 85876 non-null object\n",
74
- " 11 title 85876 non-null object\n",
75
- " 12 transactionHash 85876 non-null object\n",
76
- " 13 type 85876 non-null object\n",
77
- " 14 market_creator 85876 non-null object\n",
78
- " 15 fpmm.answerFinalizedTimestamp 54399 non-null object\n",
79
- " 16 fpmm.arbitrationOccurred 85876 non-null bool \n",
80
- " 17 fpmm.currentAnswer 54399 non-null object\n",
81
- " 18 fpmm.id 85876 non-null object\n",
82
- " 19 fpmm.isPendingArbitration 85876 non-null bool \n",
83
- " 20 fpmm.openingTimestamp 85876 non-null object\n",
84
- " 21 fpmm.outcomes 85876 non-null object\n",
85
- " 22 fpmm.title 85876 non-null object\n",
86
- " 23 fpmm.condition.id 85876 non-null object\n",
87
- "dtypes: bool(2), object(22)\n",
88
- "memory usage: 14.6+ MB\n"
 
 
89
  ]
90
  }
91
  ],
@@ -93,6 +95,248 @@
93
  "markets_df.info()"
94
  ]
95
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  {
97
  "cell_type": "code",
98
  "execution_count": 6,
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 3,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
 
11
  },
12
  {
13
  "cell_type": "code",
14
+ "execution_count": 4,
15
  "metadata": {},
16
  "outputs": [
17
  {
 
36
  },
37
  {
38
  "cell_type": "code",
39
+ "execution_count": 9,
40
  "metadata": {},
41
  "outputs": [],
42
  "source": [
 
48
  },
49
  {
50
  "cell_type": "code",
51
+ "execution_count": 6,
52
  "metadata": {},
53
  "outputs": [
54
  {
 
56
  "output_type": "stream",
57
  "text": [
58
  "<class 'pandas.core.frame.DataFrame'>\n",
59
+ "RangeIndex: 118880 entries, 0 to 118879\n",
60
+ "Data columns (total 26 columns):\n",
61
+ " # Column Non-Null Count Dtype \n",
62
+ "--- ------ -------------- ----- \n",
63
+ " 0 collateralAmount 118880 non-null object \n",
64
+ " 1 collateralAmountUSD 118880 non-null object \n",
65
+ " 2 collateralToken 118880 non-null object \n",
66
+ " 3 creationTimestamp 118880 non-null datetime64[ns, UTC]\n",
67
+ " 4 trader_address 118880 non-null object \n",
68
+ " 5 feeAmount 118880 non-null object \n",
69
+ " 6 id 118880 non-null object \n",
70
+ " 7 oldOutcomeTokenMarginalPrice 118880 non-null object \n",
71
+ " 8 outcomeIndex 118880 non-null object \n",
72
+ " 9 outcomeTokenMarginalPrice 118880 non-null object \n",
73
+ " 10 outcomeTokensTraded 118880 non-null object \n",
74
+ " 11 title 118880 non-null object \n",
75
+ " 12 transactionHash 118880 non-null object \n",
76
+ " 13 type 118880 non-null object \n",
77
+ " 14 market_creator 118880 non-null object \n",
78
+ " 15 fpmm.answerFinalizedTimestamp 78679 non-null object \n",
79
+ " 16 fpmm.arbitrationOccurred 118880 non-null bool \n",
80
+ " 17 fpmm.currentAnswer 78679 non-null object \n",
81
+ " 18 fpmm.id 118880 non-null object \n",
82
+ " 19 fpmm.isPendingArbitration 118880 non-null bool \n",
83
+ " 20 fpmm.openingTimestamp 118880 non-null object \n",
84
+ " 21 fpmm.outcomes 118880 non-null object \n",
85
+ " 22 fpmm.title 118880 non-null object \n",
86
+ " 23 fpmm.condition.id 118880 non-null object \n",
87
+ " 24 creation_timestamp 118880 non-null datetime64[ns, UTC]\n",
88
+ " 25 creation_date 118880 non-null object \n",
89
+ "dtypes: bool(2), datetime64[ns, UTC](2), object(22)\n",
90
+ "memory usage: 22.0+ MB\n"
91
  ]
92
  }
93
  ],
 
95
  "markets_df.info()"
96
  ]
97
  },
98
+ {
99
+ "cell_type": "code",
100
+ "execution_count": 10,
101
+ "metadata": {},
102
+ "outputs": [],
103
+ "source": [
104
+ "markets_df[\"creation_timestamp\"] = pd.to_datetime(markets_df[\"creationTimestamp\"])\n",
105
+ "markets_df[\"creation_date\"] = markets_df[\"creation_timestamp\"].dt.date\n",
106
+ "markets_df[\"creation_date\"] = pd.to_datetime(markets_df[\"creation_date\"])"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": 11,
112
+ "metadata": {},
113
+ "outputs": [
114
+ {
115
+ "data": {
116
+ "text/plain": [
117
+ "Timestamp('2025-01-13 00:00:00')"
118
+ ]
119
+ },
120
+ "execution_count": 11,
121
+ "metadata": {},
122
+ "output_type": "execute_result"
123
+ }
124
+ ],
125
+ "source": [
126
+ "max(markets_df.creation_date)"
127
+ ]
128
+ },
129
+ {
130
+ "cell_type": "code",
131
+ "execution_count": 14,
132
+ "metadata": {},
133
+ "outputs": [
134
+ {
135
+ "data": {
136
+ "text/plain": [
137
+ "creation_date\n",
138
+ "2025-01-11 5275\n",
139
+ "2024-12-12 5156\n",
140
+ "2025-01-12 3919\n",
141
+ "2024-12-21 3849\n",
142
+ "2024-12-10 3799\n",
143
+ "2024-12-11 3739\n",
144
+ "2025-01-10 3711\n",
145
+ "2024-12-24 3676\n",
146
+ "2024-12-19 3486\n",
147
+ "2024-12-20 3189\n",
148
+ "2024-11-23 3124\n",
149
+ "2024-11-30 3078\n",
150
+ "2024-11-18 3069\n",
151
+ "2024-12-09 3068\n",
152
+ "2024-12-26 3066\n",
153
+ "2024-12-23 2921\n",
154
+ "2024-11-27 2905\n",
155
+ "2024-11-28 2841\n",
156
+ "2024-11-22 2840\n",
157
+ "2024-12-02 2826\n",
158
+ "2024-12-22 2663\n",
159
+ "2024-11-24 2626\n",
160
+ "2024-12-08 2621\n",
161
+ "2024-12-04 2612\n",
162
+ "2024-11-26 2549\n",
163
+ "2024-11-25 2542\n",
164
+ "2024-11-29 2541\n",
165
+ "2024-12-01 2521\n",
166
+ "2025-01-09 2517\n",
167
+ "2024-11-20 2503\n",
168
+ "2024-11-16 2502\n",
169
+ "2024-11-14 2348\n",
170
+ "2024-11-21 2315\n",
171
+ "2024-12-07 2242\n",
172
+ "2025-01-08 2231\n",
173
+ "2024-11-15 2207\n",
174
+ "2024-12-06 2203\n",
175
+ "2024-11-19 2183\n",
176
+ "2024-12-16 2168\n",
177
+ "2024-12-14 2144\n",
178
+ "2024-12-18 2088\n",
179
+ "2024-12-13 2079\n",
180
+ "2024-12-05 2060\n",
181
+ "2024-12-27 1900\n",
182
+ "Name: count, dtype: int64"
183
+ ]
184
+ },
185
+ "execution_count": 14,
186
+ "metadata": {},
187
+ "output_type": "execute_result"
188
+ }
189
+ ],
190
+ "source": [
191
+ "markets_df.creation_date.value_counts()"
192
+ ]
193
+ },
194
+ {
195
+ "cell_type": "code",
196
+ "execution_count": 18,
197
+ "metadata": {},
198
+ "outputs": [
199
+ {
200
+ "data": {
201
+ "text/plain": [
202
+ "<Axes: xlabel='Count', ylabel='creation_date'>"
203
+ ]
204
+ },
205
+ "execution_count": 18,
206
+ "metadata": {},
207
+ "output_type": "execute_result"
208
+ },
209
+ {
210
+ "data": {
211
+ "image/png": "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",
212
+ "text/plain": [
213
+ "<Figure size 640x480 with 1 Axes>"
214
+ ]
215
+ },
216
+ "metadata": {},
217
+ "output_type": "display_data"
218
+ }
219
+ ],
220
+ "source": [
221
+ "import seaborn as sns\n",
222
+ "\n",
223
+ "sns.histplot(markets_df, y=\"creation_date\")"
224
+ ]
225
+ },
226
+ {
227
+ "cell_type": "code",
228
+ "execution_count": 25,
229
+ "metadata": {},
230
+ "outputs": [],
231
+ "source": [
232
+ "from datetime import datetime\n",
233
+ "cutoff_date1 = \"2024-12-28\"\n",
234
+ "cutoff_date2 = \"2025-01-08\"\n",
235
+ "timestamp1 = pd.Timestamp(\n",
236
+ "datetime.strptime(cutoff_date1, \"%Y-%m-%d\")\n",
237
+ ").tz_localize(\"UTC\")\n",
238
+ "timestamp2 = pd.Timestamp(\n",
239
+ "datetime.strptime(cutoff_date2, \"%Y-%m-%d\")\n",
240
+ ").tz_localize(\"UTC\")"
241
+ ]
242
+ },
243
+ {
244
+ "cell_type": "code",
245
+ "execution_count": 26,
246
+ "metadata": {},
247
+ "outputs": [],
248
+ "source": [
249
+ "missing_data = markets_df.loc[(markets_df[\"creation_timestamp\"]>=timestamp1) & (markets_df[\"creation_timestamp\"]<=timestamp2)]"
250
+ ]
251
+ },
252
+ {
253
+ "cell_type": "code",
254
+ "execution_count": 27,
255
+ "metadata": {},
256
+ "outputs": [
257
+ {
258
+ "data": {
259
+ "text/plain": [
260
+ "creation_date\n",
261
+ "2025-01-07 194\n",
262
+ "2024-12-28 106\n",
263
+ "Name: count, dtype: int64"
264
+ ]
265
+ },
266
+ "execution_count": 27,
267
+ "metadata": {},
268
+ "output_type": "execute_result"
269
+ }
270
+ ],
271
+ "source": [
272
+ "missing_data.creation_date.value_counts()"
273
+ ]
274
+ },
275
+ {
276
+ "cell_type": "code",
277
+ "execution_count": 28,
278
+ "metadata": {},
279
+ "outputs": [
280
+ {
281
+ "data": {
282
+ "text/plain": [
283
+ "<Axes: xlabel='Count', ylabel='creation_date'>"
284
+ ]
285
+ },
286
+ "execution_count": 28,
287
+ "metadata": {},
288
+ "output_type": "execute_result"
289
+ },
290
+ {
291
+ "data": {
292
+ "image/png": "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RntIZIzCYgh1AADY3QUR6iZOnKj33ntPmzZtUtu2ba32yMhIlZeXq7i42ONs3aFDhxQZGekxx+7duzV06FCNHz9e06dPt9qPHj2qzz77TDt27NDEiRMlnTwraIxRkyZN9NFHH+mWW25R3759rXXatGlTp/qPHj2qG264QcHBwVqzZo38/Pysvg8++EAVFRWSTl4+/aWsrCz9+te/1oIFCzR69GiPvlatWuntt99WaWmpfvjhB7Vu3VoPP/yw2rdvX6faAADApaFBQ50xRpMmTdKaNWu0ceNGxcXFefT36tVLfn5+ysjI0MiRIyVJ+fn5KigoUEJCgjVu165dGjJkiMaMGaM5c+Z4zBESEqIvvvjCo+2ZZ55RZmam3nzzTcXFxalZs2YKDg72aR/cbreSk5MVEBCgd955p8bn4GJjY2tdb+PGjfrVr36lxx577LSXawMDA9WmTRtVVFTorbfe0u233+5TnQAAwN4aNNSlpKRoxYoVWrt2rYKDg63PyblcLjmdTrlcLo0bN06pqakKCwtTSEiIJk2apISEBOsmiby8PA0ZMkTJyclKTU215mjcuLFatWqlRo0aWZ/RqxYeHq7AwMAa7f/tyJEjKigo0MGDByXJeoZeZGSkIiMj5Xa7lZSUpBMnTmjZsmVyu91yu92STp5pa9y4ca3zbtiwQb/61a/0xz/+USNHjrRq9vf3t27wyMnJ0bfffqsePXro22+/1axZs1RVVaU///nPdf45AwAA+2vQ59QtWrRIJSUlGjRokKKioqxl5cqV1pgFCxboV7/6lUaOHKmBAwcqMjJSq1evtvrffPNNfffdd1q2bJnHHL179z7r+t555x317NlTN998s6STj0Tp2bOnFi9eLEnavn27cnJy9MUXX6hjx44e2//mm29OOe/LL7+sEydOKD093WOdXz5/r7S0VNOnT9fll1+uESNGqE2bNtq8eXONm0YAAACkC+w5dag/1c+5GfynZxTeqUdDlwOggRwpyNf6OWO1bds2XXXVVQ1dDoAzOJvn1PHdrwAAADZAqAMAALABQh0AAIANEOoAAABsgFAHAABgA4Q6AAAAGyDUAQAA2AChDgAAwAYIdQAAADZAqAMAALABQh0AAIANEOoAAABsgFAHAABgA4Q6AAAAGyDUAQAA2AChDgAAwAYIdQAAADZAqAMAALABQh0AAIANEOoA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",
293
+ "text/plain": [
294
+ "<Figure size 640x480 with 1 Axes>"
295
+ ]
296
+ },
297
+ "metadata": {},
298
+ "output_type": "display_data"
299
+ }
300
+ ],
301
+ "source": [
302
+ "sns.histplot(missing_data, y=\"creation_date\")"
303
+ ]
304
+ },
305
+ {
306
+ "cell_type": "code",
307
+ "execution_count": 24,
308
+ "metadata": {},
309
+ "outputs": [
310
+ {
311
+ "data": {
312
+ "text/plain": [
313
+ "creation_date\n",
314
+ "2025-01-11 5275\n",
315
+ "2025-01-12 3919\n",
316
+ "2025-01-10 3711\n",
317
+ "2025-01-09 2517\n",
318
+ "2025-01-08 2231\n",
319
+ "2025-01-13 1124\n",
320
+ "2025-01-07 194\n",
321
+ "Name: count, dtype: int64"
322
+ ]
323
+ },
324
+ "execution_count": 24,
325
+ "metadata": {},
326
+ "output_type": "execute_result"
327
+ }
328
+ ],
329
+ "source": [
330
+ "markets_df.loc[markets_df[\"creation_timestamp\"]>timestamp2].creation_date.value_counts()"
331
+ ]
332
+ },
333
+ {
334
+ "cell_type": "code",
335
+ "execution_count": null,
336
+ "metadata": {},
337
+ "outputs": [],
338
+ "source": []
339
+ },
340
  {
341
  "cell_type": "code",
342
  "execution_count": 6,
notebooks/{wow_retention.ipynb β†’ retention_metrics.ipynb} RENAMED
File without changes
scripts/{wow_retentions.py β†’ retention_metrics.py} RENAMED
@@ -1,6 +1,6 @@
1
  import pandas as pd
2
  from datetime import datetime, timedelta
3
- from utils import DATA_DIR
4
 
5
 
6
  # Basic Week over Week Retention
@@ -111,10 +111,10 @@ def calculate_cohort_retention(df, max_weeks=12) -> pd.DataFrame:
111
  return retention_matrix.round(2)
112
 
113
 
114
- def prepare_retention_dataset() -> pd.DataFrame:
115
- # read all datasets
116
- traders_df = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
117
- unknown_df = pd.read_parquet(DATA_DIR / "unknown_traders.parquet")
118
  traders_df["trader_type"] = traders_df["staking"].apply(
119
  lambda x: "non_Olas" if x == "non_Olas" else "Olas"
120
  )
@@ -132,7 +132,10 @@ def prepare_retention_dataset() -> pd.DataFrame:
132
 
133
 
134
  if __name__ == "__main__":
135
- all_traders = prepare_retention_dataset()
 
 
 
136
  # Usage example:
137
  wow_retention = calculate_wow_retention_by_type(all_traders)
138
  cohort_retention = calculate_cohort_retention(all_traders)
 
1
  import pandas as pd
2
  from datetime import datetime, timedelta
3
+ from scripts.utils import DATA_DIR
4
 
5
 
6
  # Basic Week over Week Retention
 
111
  return retention_matrix.round(2)
112
 
113
 
114
+ def prepare_retention_dataset(
115
+ traders_df: pd.DataFrame, unknown_df: pd.DataFrame
116
+ ) -> pd.DataFrame:
117
+
118
  traders_df["trader_type"] = traders_df["staking"].apply(
119
  lambda x: "non_Olas" if x == "non_Olas" else "Olas"
120
  )
 
132
 
133
 
134
  if __name__ == "__main__":
135
+ # read all datasets
136
+ traders_df = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
137
+ unknown_df = pd.read_parquet(DATA_DIR / "unknown_traders.parquet")
138
+ all_traders = prepare_retention_dataset(traders_df, unknown_df)
139
  # Usage example:
140
  wow_retention = calculate_wow_retention_by_type(all_traders)
141
  cohort_retention = calculate_cohort_retention(all_traders)
tabs/retention_plots.py CHANGED
@@ -1,6 +1,8 @@
1
  import plotly.express as px
 
2
  import plotly.graph_objects as go
3
  import seaborn as sns
 
4
  import matplotlib.pyplot as plt
5
  from matplotlib.ticker import PercentFormatter
6
 
@@ -46,8 +48,9 @@ def plot_wow_retention_by_type(wow_retention):
46
  fig.update_traces(
47
  hovertemplate="<b>%{y:.1f}%</b><br>Week: %{x|%Y-%m-%d}<extra></extra>"
48
  )
49
-
50
- return fig
 
51
 
52
 
53
  def plot_cohort_retention_heatmap(retention_matrix):
@@ -95,4 +98,5 @@ def plot_cohort_retention_heatmap(retention_matrix):
95
  # Adjust layout to prevent label cutoff
96
  plt.tight_layout()
97
 
98
- return plt
 
 
1
  import plotly.express as px
2
+ import gradio as gr
3
  import plotly.graph_objects as go
4
  import seaborn as sns
5
+ import pandas as pd
6
  import matplotlib.pyplot as plt
7
  from matplotlib.ticker import PercentFormatter
8
 
 
48
  fig.update_traces(
49
  hovertemplate="<b>%{y:.1f}%</b><br>Week: %{x|%Y-%m-%d}<extra></extra>"
50
  )
51
+ return gr.Plot(
52
+ value=fig,
53
+ )
54
 
55
 
56
  def plot_cohort_retention_heatmap(retention_matrix):
 
98
  # Adjust layout to prevent label cutoff
99
  plt.tight_layout()
100
 
101
+ cohort_fig = ax.get_figure()
102
+ return gr.Plot(value=cohort_fig)