{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import gc"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get all activity info from tools.parquet"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"retention_df = pd.read_parquet(\"../data/retention_activity.parquet\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1119622"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(retention_df)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['trader_address', 'request_time', 'market_creator', 'request_date',\n",
" 'staking', 'month_year_week'],\n",
" dtype='object')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.columns"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"staking\n",
"quickstart 1002306\n",
"pearl 70258\n",
"non_staking 47058\n",
"Name: count, dtype: int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.staking.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 232,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"month_year_week\n",
"Jan-06-2025 148192\n",
"Dec-09-2024 136640\n",
"Dec-16-2024 136529\n",
"Dec-30-2024 136190\n",
"Dec-23-2024 128665\n",
"Dec-02-2024 109545\n",
"Nov-18-2024 72777\n",
"Nov-25-2024 67851\n",
"Jan-13-2025 53165\n",
"Nov-11-2024 31089\n",
"Name: count, dtype: int64"
]
},
"execution_count": 232,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.month_year_week.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 233,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"148192"
]
},
"execution_count": 233,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jan6 = retention_df.loc[retention_df[\"month_year_week\"]==\"Jan-06-2025\"]\n",
"len(jan6)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'jan6' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[5], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mjan6\u001b[49m\u001b[38;5;241m.\u001b[39mstaking\u001b[38;5;241m.\u001b[39mvalue_counts()\n",
"\u001b[0;31mNameError\u001b[0m: name 'jan6' is not defined"
]
}
],
"source": [
"jan6.staking.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 235,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"185"
]
},
"execution_count": 235,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"olas_jan6 = jan6.loc[jan6[\"staking\"]!= \"non_Olas\"]\n",
"olas_jan6.trader_address.nunique()"
]
},
{
"cell_type": "code",
"execution_count": 237,
"metadata": {},
"outputs": [],
"source": [
"retention_df[\"trader_type\"] = retention_df[\"staking\"].apply(\n",
" lambda x: \"non_Olas\" if x == \"non_Olas\" else \"Olas\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 238,
"metadata": {},
"outputs": [],
"source": [
" \n",
"active_traders = (\n",
" retention_df.groupby(by=[\"month_year_week\", \"trader_type\"])[\n",
" \"trader_address\"\n",
" ]\n",
" .nunique()\n",
" .reset_index(name=\"nr_traders\")\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 239,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" month_year_week | \n",
" trader_type | \n",
" nr_traders | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Dec-02-2024 | \n",
" Olas | \n",
" 233 | \n",
"
\n",
" \n",
" 1 | \n",
" Dec-02-2024 | \n",
" non_Olas | \n",
" 324 | \n",
"
\n",
" \n",
" 2 | \n",
" Dec-09-2024 | \n",
" Olas | \n",
" 227 | \n",
"
\n",
" \n",
" 3 | \n",
" Dec-09-2024 | \n",
" non_Olas | \n",
" 325 | \n",
"
\n",
" \n",
" 4 | \n",
" Dec-16-2024 | \n",
" Olas | \n",
" 214 | \n",
"
\n",
" \n",
" 5 | \n",
" Dec-16-2024 | \n",
" non_Olas | \n",
" 344 | \n",
"
\n",
" \n",
" 6 | \n",
" Dec-23-2024 | \n",
" Olas | \n",
" 194 | \n",
"
\n",
" \n",
" 7 | \n",
" Dec-23-2024 | \n",
" non_Olas | \n",
" 353 | \n",
"
\n",
" \n",
" 8 | \n",
" Dec-30-2024 | \n",
" Olas | \n",
" 193 | \n",
"
\n",
" \n",
" 9 | \n",
" Dec-30-2024 | \n",
" non_Olas | \n",
" 360 | \n",
"
\n",
" \n",
" 10 | \n",
" Jan-06-2025 | \n",
" Olas | \n",
" 185 | \n",
"
\n",
" \n",
" 11 | \n",
" Jan-06-2025 | \n",
" non_Olas | \n",
" 358 | \n",
"
\n",
" \n",
" 12 | \n",
" Jan-13-2025 | \n",
" Olas | \n",
" 153 | \n",
"
\n",
" \n",
" 13 | \n",
" Jan-13-2025 | \n",
" non_Olas | \n",
" 344 | \n",
"
\n",
" \n",
" 14 | \n",
" Nov-11-2024 | \n",
" Olas | \n",
" 202 | \n",
"
\n",
" \n",
" 15 | \n",
" Nov-11-2024 | \n",
" non_Olas | \n",
" 180 | \n",
"
\n",
" \n",
" 16 | \n",
" Nov-18-2024 | \n",
" Olas | \n",
" 221 | \n",
"
\n",
" \n",
" 17 | \n",
" Nov-18-2024 | \n",
" non_Olas | \n",
" 186 | \n",
"
\n",
" \n",
" 18 | \n",
" Nov-25-2024 | \n",
" Olas | \n",
" 202 | \n",
"
\n",
" \n",
" 19 | \n",
" Nov-25-2024 | \n",
" non_Olas | \n",
" 196 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" month_year_week trader_type nr_traders\n",
"0 Dec-02-2024 Olas 233\n",
"1 Dec-02-2024 non_Olas 324\n",
"2 Dec-09-2024 Olas 227\n",
"3 Dec-09-2024 non_Olas 325\n",
"4 Dec-16-2024 Olas 214\n",
"5 Dec-16-2024 non_Olas 344\n",
"6 Dec-23-2024 Olas 194\n",
"7 Dec-23-2024 non_Olas 353\n",
"8 Dec-30-2024 Olas 193\n",
"9 Dec-30-2024 non_Olas 360\n",
"10 Jan-06-2025 Olas 185\n",
"11 Jan-06-2025 non_Olas 358\n",
"12 Jan-13-2025 Olas 153\n",
"13 Jan-13-2025 non_Olas 344\n",
"14 Nov-11-2024 Olas 202\n",
"15 Nov-11-2024 non_Olas 180\n",
"16 Nov-18-2024 Olas 221\n",
"17 Nov-18-2024 non_Olas 186\n",
"18 Nov-25-2024 Olas 202\n",
"19 Nov-25-2024 non_Olas 196"
]
},
"execution_count": 239,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"active_traders"
]
},
{
"cell_type": "code",
"execution_count": 236,
"metadata": {},
"outputs": [],
"source": [
"olas_data = retention_df.loc[retention_df[\"staking\"]!= \"non_Olas\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"olas_data.groupby([\"month_year_week\"])[\"trader_address\"].nunique"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.staking.value_counts"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [],
"source": [
"retention_df[\"trader_type\"] = retention_df[\"staking\"].apply(\n",
" lambda x: \"non_Olas\" if x == \"non_Olas\" else \"Olas\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [],
"source": [
"olas_data = retention_df.loc[retention_df[\"trader_type\"]==\"Olas\"]"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [],
"source": [
"jan5 = olas_data.loc[olas_data[\"month_year_week\"]==\"Jan-05-2025\"]"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"193"
]
},
"execution_count": 134,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jan5.trader_address.nunique()"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"31363"
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(jan5)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" request_time | \n",
" market_creator | \n",
" request_date | \n",
" staking | \n",
" month_year_week | \n",
" trader_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 2 | \n",
" 0x8fb970f4aff9b61e6b3bc5a8117b437b89c88711 | \n",
" 2024-11-13 00:04:25+00:00 | \n",
" quickstart | \n",
" 2024-11-13 | \n",
" non_staking | \n",
" Nov-13-2024 | \n",
" Olas | \n",
"
\n",
" \n",
" 3 | \n",
" 0x1fe2b09de07475b1027b0c73a5bf52693b31a52e | \n",
" 2024-11-13 00:05:10+00:00 | \n",
" pearl | \n",
" 2024-11-13 | \n",
" pearl | \n",
" Nov-13-2024 | \n",
" Olas | \n",
"
\n",
" \n",
" 6 | \n",
" 0x1fe2b09de07475b1027b0c73a5bf52693b31a52e | \n",
" 2024-11-13 00:08:05+00:00 | \n",
" pearl | \n",
" 2024-11-13 | \n",
" pearl | \n",
" Nov-13-2024 | \n",
" Olas | \n",
"
\n",
" \n",
" 10 | \n",
" 0xd71b78ce490776a8f0cad6876ea79bc190f7bcce | \n",
" 2024-11-13 00:19:45+00:00 | \n",
" pearl | \n",
" 2024-11-13 | \n",
" pearl | \n",
" Nov-13-2024 | \n",
" Olas | \n",
"
\n",
" \n",
" 11 | \n",
" 0x6f40dbf1f102d47248802a423c0cd117ac4a3781 | \n",
" 2024-11-13 00:27:30+00:00 | \n",
" quickstart | \n",
" 2024-11-13 | \n",
" non_staking | \n",
" Nov-13-2024 | \n",
" Olas | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_address request_time \\\n",
"2 0x8fb970f4aff9b61e6b3bc5a8117b437b89c88711 2024-11-13 00:04:25+00:00 \n",
"3 0x1fe2b09de07475b1027b0c73a5bf52693b31a52e 2024-11-13 00:05:10+00:00 \n",
"6 0x1fe2b09de07475b1027b0c73a5bf52693b31a52e 2024-11-13 00:08:05+00:00 \n",
"10 0xd71b78ce490776a8f0cad6876ea79bc190f7bcce 2024-11-13 00:19:45+00:00 \n",
"11 0x6f40dbf1f102d47248802a423c0cd117ac4a3781 2024-11-13 00:27:30+00:00 \n",
"\n",
" market_creator request_date staking month_year_week trader_type \n",
"2 quickstart 2024-11-13 non_staking Nov-13-2024 Olas \n",
"3 pearl 2024-11-13 pearl Nov-13-2024 Olas \n",
"6 pearl 2024-11-13 pearl Nov-13-2024 Olas \n",
"10 pearl 2024-11-13 pearl Nov-13-2024 Olas \n",
"11 quickstart 2024-11-13 non_staking Nov-13-2024 Olas "
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"olas_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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1rhy5QrGjRuHrKwsxMbGVtlvaWkpLCws8N5772Hz5s3VjiEjI0MtM+XRjGBN6H3ZLYkEB7euAcDsUSKqX+amJnjjnffrrH9moNKT0GqJETs7Oxw8eBBeXl74/PPPsXHjRiQnJ2P37t0YN24cLl68qNVgbt68CYVCgaSkJPTq1Qv5+flwdHTE+vXr8corrwAAzp49C29vb6SkpKBr166V9qNSqXDmzBkkJCSobR82bBg8PT0hlUqxdevWCjNrVbl8+TI8PDxw/Pjxx87gbdq0Ca+//jru3r2rlvhRldGjRyMvLw9bt25V256YmIjevXvj1q1bsLW11WicRUVFauv3FRQUQKlUYt6yL/U6O/VhzFQlIkPC7FeqjKZLjGg1PVNSUiK+D/fbb79hwIABAIBWrVrh+vXr2nQJAOJjSHt7ewAPZtlKSkoQGBgotmnVqhVcXV2RkpJSbT/lfZSLjo7GxYsXxff66kr5DdckgNNEhw4d4OLigueff16cfazK/PnzIZfLxY9SqayVMRAREZHu0SqIa9OmDVatWoX9+/djz5494rIiWVlZcHBw0GogZWVliIiIQPfu3dG2bVsAQHZ2NkxNTSvMRDk5OVX5btiBAwewceNGhIaGitvOnz+PKVOmICYmptaCq8r8/fff+Oijj9TOrS0XFxesWrUKmzdvxubNm6FUKuHv749jx45VeczUqVORn58vfq5evfrE4yAiIiLdpFUQ98knn+Crr76Cv78/hg8fjmeeeQYAsH37dnTu3FmrgahUKqSlpWHDhg1aHQ8AaWlpGDhwIKKiohAUFATgwftnI0aMwJw5c/D0009Xety6detgbW0tfvbv31/jcxcUFODFF19E69atMXv2bHF7mzZtxH779euncX9eXl5455134OPjg27duuG7775Dt27dsGTJkiqPMTMzg42NjdqHiIiIDJNW01L+/v74+++/UVBQADu7/71kHhoaCktLyxr3FxYWhh07dmDfvn1o3ry5uN3Z2RnFxcXIy8tTm43LycmBs7OzWh/p6eno06cPQkNDMWPGDHH77du3ceTIERw/flxMdCgrK4MgCDA2Nsbu3bsxYMAAdOnSRTymWbNmNRr/7du30bdvX8hkMsTFxcHExETct2vXLpSUlAAALJ7wvbTOnTvj999/r/Fxep/Y8LCHkhzqAhMniAxLQ5bN0oSjnayh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6QnWTiUiqkcvvPACTp48iYyMDFhZWanty8vLg62tLTIzMxEeHo74+HgYGRmhb9+++OKLL+Dk5AQAGD16NPLy8tRm0SIiIpCamorExEQAgL+/P9q3bw9zc3OsXr0apqamGDduHGbPng0AcHd3x5UrV8Tj3dzccPny5bq8dCKqZXycSkRUT3Jzc/HLL79ApVJVCOAAwNbWFmVlZRg4cCByc3ORlJSEPXv24OLFixg6dGiNz7d27VpYWVnh0KFDWLhwIT788EPs2bMHAHD48GEAQHR0NK5fvy5+JyL9wcepRET15MKFCxAEAa1ataqyTXx8PE6dOoVLly5BqVQCAL7//nu0adMGhw8fhq+vr8bna9++PaKiogAAnp6e+PLLLxEfH4/nn38ejo6OAB4Ejs7Ozk9wVUTUUDgTR0RUTzR5e+XMmTNQKpViAAcArVu3hq2tLc6cOVOj87Vv317tu4uLC27cuFGjPohIdzGIIyKqJ56enpBIJE+cvGBkZFQhICwpKanQzsTERO27RCJBWVnZE52biHQHgzgionpib2+P4OBgLF++HHfv3q2wPy8vD97e3rh69SquXr0qbk9PT0deXh5at24NAHB0dMT169fVjk1NTa3xeExMTFBaWlrj44hINzCIIyKqR8uXL0dpaSk6d+6MzZs34/z58zhz5gw+//xz+Pn5ITAwEO3atcNrr72GY8eO4Y8//sDIkSPx3HPP4dlnnwUABAQE4MiRI/j+++9x/vx5REVFIS0trcZjcXd3R3x8PLKzs3Hr1q3avlQiqmMM4oiI6lGLFi1w7Ngx9O7dGxMmTEDbtm3x/PPPIz4+HitXroREIsG2bdtgZ2eHXr16ITAwEC1atMDGjRvFPoKDgzFz5kx88MEH8PX1xe3btzFy5Mgaj2Xx4sXYs2cPlEolOnbsWJuXSUT1gOvEEREREekhzsQRERER6SEGcURERER6iEEcERERkR5iEEdERESkhxjEEREREekhBnFEREREeohBHBEREZEeYhBHREREpIcYxBERERHpIQZxRERERHqIQRwRERGRHvo/s22I/I1Ra7IAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.histplot(olas_data, y=\"request_date\", hue=\"market_creator\")"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['trader_address', 'request_time', 'market_creator', 'request_date',\n",
" 'staking', 'month_year_week'],\n",
" dtype='object')"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.columns"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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FxcXnD59Gl27dsW8efNaoyYiIiIiugeHzol7/vnn8dFHH7V0LURERETURA6dE/ef//wHa9euxb/+9S8MGTKkzuO23n///RYpjoiIiIjq51CIy83NxeDBgwEAX3/9td02PnaLiIiIqPU5FOL279/f0nUQERERUTM4dE4cEREREcmLIY6IiIhIgRz6OZWUxZJ3HDdLS+Qug4hI0SquFwMA8vPz4evrC6PRKHNF1NmphBBC7iKoddhsNuj1ernLICLqcDQaD5w7l88gR62i9vvbarVCp9M12I9H4jqBgc8kQB8YKncZRESKp1arcau0CMfWLsT169cZ4khWDHGdgG9wbxhCB8ldBhFRh1Ba6Cp3CUQAeGEDERERkSIxxBEREREpEEMcERERkQIxxBEREREpEEMcERERkQIxxBEREREpEEMcERERkQIxxBEREREpEEMcERERkQIxxBEREREpEEMcERERkQLx2amdgCXvOG6WlshdBhFRq3Px0EKj92nVfdiKL7fq+ERNxRDXCeR/tk7uEoiI2ogKgGj1vWg0HvD19W31/RA1hiGuExj4TAL0gaFyl0FE1KpuXC1ETtpipKamwmQyteq+fH19YTQaW3UfRPfCENcJ+Ab3hiF0kNxlEBG1qtIuHgAAk8mEwYMHy1wNUeuT9cKG5ORkDB06FFqtFgaDARMmTEBBQYFdn9u3b8NsNsPHxweenp6Ii4tDScmP53edOnUKkydPRlBQEDQaDUwmE5YtW9bgPg8fPgy1Wo1Bgwbds7709HTExMTAx8cHKpUKOTk5dfqsXr0ao0aNgk6ng0qlQllZ2T3HbWrNH374IUwmEzQaDfr06YP169ffc2wiIiLqHGQNcZmZmTCbzTh69CgyMjJQVVWFmJgYVFRUSH1mz56NnTt3YvPmzcjMzERRUREmTpwobc/OzobBYEBqairy8vIwb948zJ07F8uXL6+zv7KyMkydOhVRUVFNqq+iogIjR47E4sWLG+xz8+ZNjB49Gm+99VaT592UmleuXIm5c+diwYIFyMvLw8KFC2E2m7Fz584m74eIiIg6LpUQovXPAG2ia9euwWAwIDMzExEREbBarfDz80NaWhp+/etfAwDOnTsHk8mErKwsDB8+vN5xzGYz8vPzsW/fPrv2Z599FqGhoXB2dsa2bdvqPbJWn8uXLyMkJAQnT55s8AjegQMH8Pjjj+OHH36Al5dXU6fcYM2PPPIIRowYgSVLlkh9Xn/9dRw7dgxffPFFk8a02WzQ6/V4/L9X8OdUIurwSgsLkLFoOrKzs/lzKila7fe31WqFTqdrsF+7uk+c1WoFAHh7ewO4e8SqqqoK0dHRUp++ffvCaDQiKyur0XFqx6iVkpKCixcvIikpqRUqv38/r7myshLu7u52fTQaDY4fP46qqqp6x6isrITNZrN7ERERUcfUbkJcTU0NEhISMGLECAwYMAAAYLFY4OrqWufIlr+/PywWS73jHDlyBJs2bcLMmTOltvPnz2POnDlITU2FWt3+ruWor+bY2FisWbMG2dnZEELgxIkTWLNmDaqqqnD9+vV6x0lOToZer5deQUFBbTUFIiIiamPtJsSZzWbk5uZi48aNDo+Rm5uL8ePHIykpCTExMQCA6upqTJkyBQsXLkTv3r3r/dyGDRvg6ekpvQ4dOuRwDT83ZswYadz+/fs3qWYA+OMf/4gxY8Zg+PDhcHFxwfjx4zFt2jQAgJNT/f/b5s6dC6vVKr2uXLnSYvMgIiKi9qVdHJaaNWsWdu3ahYMHD6JHjx5Se0BAAO7cuYOysjK7o3ElJSUICAiwG+Ps2bOIiorCzJkzMX/+fKm9vLwcJ06cwMmTJzFr1iwAd4/6CSGgVquxZ88ejBs3DsOGDZM+ExgY2GJzW7NmDW7dugUAcHFxaVLNwN2fTteuXYu//e1vKCkpQbdu3bB69WpotVr4+fnVuy83Nze4ubm1WO1ERETUfska4oQQiI+Px9atW3HgwAGEhITYbR8yZAhcXFywd+9exMXFAQAKCgpQWFiI8PBwqV9eXh4iIyMxbdo0LFq0yG4MnU6HM2fO2LWtWLEC+/btw5YtWxASEoIuXbpAq9W2yhwbCoSN1fxTLi4uUrDduHEjnnrqqQaPxBEREVHnIWuIM5vNSEtLw/bt26HVaqXz3PR6PTQaDfR6PWbMmIHExER4e3tDp9MhPj4e4eHh0pWpubm5iIyMRGxsLBITE6UxnJ2d4efnBycnJ+kcu1oGgwHu7u512n+utLQUhYWFKCoqAgDpHnYBAQHSkUCLxQKLxYILFy4AAM6cOQOtVguj0Vjn4opa96oZAL7++mscP34cw4YNww8//ID3338fubm5+Mc//tG8RSYiIqIOSdZDOitXroTVasWoUaPQrVs36bVp0yapz9KlS/HUU08hLi4OERERCAgIQHp6urR9y5YtuHbtGlJTU+3GGDp06H3Xt2PHDoSFhWHs2LEA7t6iJCwsDKtWrZL6rFq1CmFhYXj55ZcBABEREQgLC8OOHTsaHLcpNVdXV+O9997Dgw8+iCeeeAK3b9/GkSNH0LNnz/ueFxERESlfu7pPHLWs2vvMmMa8CF23YLnLISJqVRXXi5G7Y3WbPDu1Kfh8VXJUU+8TxxDXgdX+ISAioran0Xjg3Ll8BjlqtqaGuHZxdSq1roHPJEAfGCp3GURErU6tVsPFzVXuMmArvoxjaxfi+vXrDHHUahjiOgHf4N587BYREVEHw3tVEBERESkQQxwRERGRAjHEERERESkQQxwRERGRAjHEERERESkQQxwRERGRAjHEERERESkQQxwRERGRAjHEERERESkQQxwRERGRAjHEERERESkQn53aCdgshVC7aeQug4io07AVX5a7BOoEGOI6gezUd+QugYio09FoPODr6yt3GdSBMcR1AqtXr8aQIUPkLoOIqFPx9fWF0WiUuwzqwBjiOoE+ffpg8ODBcpdBRERELYgXNhAREREpkKwhLjk5GUOHDoVWq4XBYMCECRNQUFBg1+f27dswm83w8fGBp6cn4uLiUFJSIm0/deoUJk+ejKCgIGg0GphMJixbtqzBfR4+fBhqtRqDBg26Z33p6emIiYmBj48PVCoVcnJy7LaXlpYiPj4effr0gUajgdFoxKuvvgqr1XrPsU+fPo1HH30U7u7uCAoKwrvvvmu3PS8vD3FxcejZsydUKhU++OCDe45JREREnYesIS4zMxNmsxlHjx5FRkYGqqqqEBMTg4qKCqnP7NmzsXPnTmzevBmZmZkoKirCxIkTpe3Z2dkwGAxITU1FXl4e5s2bh7lz52L58uV19ldWVoapU6ciKiqqSfVVVFRg5MiRWLx4cb3bi4qKUFRUhD//+c/Izc3FunXrsHv3bsyYMaPRcW02G2JiYhAcHIzs7GwsWbIECxYswOrVq6U+N2/eRK9evfDOO+8gICCgSfUSERFR56ESQgi5i6h17do1GAwGZGZmIiIiAlarFX5+fkhLS8Ovf/1rAMC5c+dgMpmQlZWF4cOH1zuO2WxGfn4+9u3bZ9f+7LPPIjQ0FM7Ozti2bVudI2sNuXz5MkJCQnDy5Ml7HsHbvHkznn/+eVRUVECtrv+Uw5UrV2LevHmwWCxwdXUFAMyZMwfbtm3DuXPn6vTv2bMnEhISkJCQ0Oi+KysrUVlZKb232WwICgqS1pOIiIjaP5vNBr1eD6vVCp1O12C/dnVOXO3PkN7e3gDuHmWrqqpCdHS01Kdv374wGo3IyspqdJzaMWqlpKTg4sWLSEpKaoXK7fet0+kaDHAAkJWVhYiICCnAAUBsbCwKCgrwww8/OLzv5ORk6PV66RUUFOTwWERERNS+tZsQV1NTg4SEBIwYMQIDBgwAAOlIlZeXl11ff39/WCyWesc5cuQINm3ahJkzZ0pt58+fx5w5c5CamtpouLpf169fx5/+9Ce7fdfHYrHA39/frq32fUPzaoq5c+fCarVKrytXrjg8FhEREbVv7SbEmc1m5ObmYuPGjQ6PkZubi/HjxyMpKQkxMTEAgOrqakyZMgULFy5E79696/3chg0b4OnpKb0OHTrU7H3bbDaMHTsW/fr1w4IFC6T2/v37S+OOGTPGoXk1lZubG3Q6nd2LiIiIOqZ2cZ+4WbNmYdeuXTh48CB69OghtQcEBODOnTsoKyuzOxpXUlJS52T/s2fPIioqCjNnzsT8+fOl9vLycpw4cQInT57ErFmzANw96ieEgFqtxp49ezBu3DgMGzZM+kxgYGCz6i8vL8fo0aOh1WqxdetWuLi4SNs+/fRTVFVVAQA0Go00r59eYVs7p9ptRERERPcia4gTQiA+Ph5bt27FgQMHEBISYrd9yJAhcHFxwd69exEXFwcAKCgoQGFhIcLDw6V+eXl5iIyMxLRp07Bo0SK7MXQ6Hc6cOWPXtmLFCuzbtw9btmxBSEgIunTpAq1W69AcbDYbYmNj4ebmhh07dsDd3d1ue3BwcJ3PhIeHY968eaiqqpICX0ZGBvr06YOuXbs6VAcRERF1LrKGOLPZjLS0NGzfvh1arVY6H0yv10Oj0UCv12PGjBlITEyEt7c3dDod4uPjER4eLl2Zmpubi8jISMTGxiIxMVEaw9nZGX5+fnBycpLOsatlMBjg7u5ep/3nSktLUVhYiKKiIgCQ7mEXEBCAgIAA6VYhN2/eRGpqKmw2G2w2GwDAz88Pzs7O9Y5b+/PujBkz8OabbyI3NxfLli3D0qVLpT537tzB2bNnpf/+/vvvkZOTA09PTzzwwAPNWmciIiLqgISMANT7SklJkfrcunVL/P73vxddu3YVHh4e4umnnxbFxcXS9qSkpHrHCA4ObnC/SUlJ4sEHH7xnfSkpKfWOnZSUJIQQYv/+/Q3O4dKlS42OferUKTFy5Ejh5uYmAgMDxTvvvGO3/dKlS/WO+9hjj92z7lpWq1UAEJmZmU3+DBEREcmr9vvbarU22q9d3SeOWlbtfWYOHTqEkSNHyl0OERERNYEi7xNHraOmpkbuEoiIiKiFMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDXCfg5MT/zURERB0Nv907gZqaGrlLICIiohbGEEdERESkQAxxRERERArEEEdERESkQAxxRERERArEEEdERESkQAxxRERERArEEEdERESkQAxxRERERArEEEdERESkQAxxRERERArEEEdERESkQAxxRERERArEEEdERESkQAxxnYCTE/83ExERdTT8du8Eampq5C6BiIiIWhhDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDXCfg5MT/zURERB0Nv907gZqaGrlLICIiohbGEEdERESkQAxxRERERAoka4hLTk7G0KFDodVqYTAYMGHCBBQUFNj1uX37NsxmM3x8fODp6Ym4uDiUlJRI20+dOoXJkycjKCgIGo0GJpMJy5Yta3Cfhw8fhlqtxqBBg+5ZX3p6OmJiYuDj4wOVSoWcnBy77aWlpYiPj0efPn2g0WhgNBrx6quvwmq13nPs06dP49FHH4W7uzuCgoLw7rvv2m1ft24dVCqV3cvd3f2e4xIREVHnIGuIy8zMhNlsxtGjR5GRkYGqqirExMSgoqJC6jN79mzs3LkTmzdvRmZmJoqKijBx4kRpe3Z2NgwGA1JTU5GXl4d58+Zh7ty5WL58eZ39lZWVYerUqYiKimpSfRUVFRg5ciQWL15c7/aioiIUFRXhz3/+M3Jzc7Fu3Trs3r0bM2bMaHRcm82GmJgYBAcHIzs7G0uWLMGCBQuwevVqu346nQ7FxcXS69tvv21S3URERNQJiHbk6tWrAoDI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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"\n",
"sns.histplot(retention_df, y=\"request_date\")"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2024-10-25 00:00:20+0000', tz='UTC')"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"min(retention_df.request_time)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"from datetime import datetime\n",
"cutoff_date1 = \"2024-11-13\"\n",
"timestamp1 = pd.Timestamp(\n",
"datetime.strptime(cutoff_date1, \"%Y-%m-%d\")\n",
").tz_localize(\"UTC\")"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2024-11-13 00:00:15+0000', tz='UTC')"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df = retention_df.loc[retention_df[\"request_time\"]>=timestamp1]\n",
"min(retention_df.request_time)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['trader_address', 'request_time', 'market_creator', 'request_date',\n",
" 'staking', 'month_year_week'],\n",
" dtype='object')"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.columns"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"retention_df.to_parquet(\"../data/retention_activity.parquet\", index=False)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" request_time | \n",
" market_creator | \n",
" request_date | \n",
" staking | \n",
" month_year_week | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0x721de88cee9be146c8f0c7ef1a4188bee36494d6 | \n",
" 2024-10-25 00:00:20+00:00 | \n",
" quickstart | \n",
" 2024-10-25 | \n",
" non_staking | \n",
" Oct-25-2024 | \n",
"
\n",
" \n",
" 1 | \n",
" 0x8a1d5f22b5a3bea34697b85e7b4ad894bf9ee36a | \n",
" 2024-10-25 00:00:25+00:00 | \n",
" quickstart | \n",
" 2024-10-25 | \n",
" non_staking | \n",
" Oct-25-2024 | \n",
"
\n",
" \n",
" 2 | \n",
" 0xf839eaf4b42eadd917b46d7b6da0dd0e1fd6f684 | \n",
" 2024-10-25 00:00:55+00:00 | \n",
" quickstart | \n",
" 2024-10-25 | \n",
" non_staking | \n",
" Oct-25-2024 | \n",
"
\n",
" \n",
" 3 | \n",
" 0x01274796ce41aa8e8312e05a427ffb4b0d2148f6 | \n",
" 2024-10-25 00:00:55+00:00 | \n",
" quickstart | \n",
" 2024-10-25 | \n",
" non_staking | \n",
" Oct-25-2024 | \n",
"
\n",
" \n",
" 4 | \n",
" 0xc20678890f94d0162593c46fe5da67d9a4b7a6fb | \n",
" 2024-10-25 00:01:05+00:00 | \n",
" quickstart | \n",
" 2024-10-25 | \n",
" non_staking | \n",
" Oct-25-2024 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_address request_time \\\n",
"0 0x721de88cee9be146c8f0c7ef1a4188bee36494d6 2024-10-25 00:00:20+00:00 \n",
"1 0x8a1d5f22b5a3bea34697b85e7b4ad894bf9ee36a 2024-10-25 00:00:25+00:00 \n",
"2 0xf839eaf4b42eadd917b46d7b6da0dd0e1fd6f684 2024-10-25 00:00:55+00:00 \n",
"3 0x01274796ce41aa8e8312e05a427ffb4b0d2148f6 2024-10-25 00:00:55+00:00 \n",
"4 0xc20678890f94d0162593c46fe5da67d9a4b7a6fb 2024-10-25 00:01:05+00:00 \n",
"\n",
" market_creator request_date staking month_year_week \n",
"0 quickstart 2024-10-25 non_staking Oct-25-2024 \n",
"1 quickstart 2024-10-25 non_staking Oct-25-2024 \n",
"2 quickstart 2024-10-25 non_staking Oct-25-2024 \n",
"3 quickstart 2024-10-25 non_staking Oct-25-2024 \n",
"4 quickstart 2024-10-25 non_staking Oct-25-2024 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"staking\n",
"non_Olas 738323\n",
"non_staking 199043\n",
"pearl 44001\n",
"quickstart 39276\n",
"Name: count, dtype: int64"
]
},
"execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.staking.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"staking\n",
"non_Olas 764956\n",
"non_staking 275246\n",
"pearl 56487\n",
"quickstart 48511\n",
"Name: count, dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_df.staking.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Join the two datasets"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [],
"source": [
"def prepare_retention_dataset(\n",
" retention_df: pd.DataFrame, unknown_df: pd.DataFrame\n",
") -> pd.DataFrame:\n",
"\n",
" retention_df[\"trader_type\"] = retention_df[\"staking\"].apply(\n",
" lambda x: \"non_Olas\" if x == \"non_Olas\" else \"Olas\"\n",
" )\n",
" retention_df.rename(columns={\"request_time\": \"creation_timestamp\"}, inplace=True)\n",
" retention_df = retention_df[\n",
" [\"trader_type\", \"market_creator\", \"trader_address\", \"creation_timestamp\"]\n",
" ]\n",
" unknown_df[\"trader_type\"] = \"unclassified\"\n",
" unknown_df = unknown_df[\n",
" [\"trader_type\", \"market_creator\", \"trader_address\", \"creation_timestamp\"]\n",
" ]\n",
" all_traders = pd.concat([retention_df, unknown_df], ignore_index=True)\n",
"\n",
" all_traders[\"creation_timestamp\"] = pd.to_datetime(\n",
" all_traders[\"creation_timestamp\"]\n",
" )\n",
" all_traders = all_traders.sort_values(by=\"creation_timestamp\", ascending=True)\n",
" all_traders[\"month_year_week\"] = (\n",
" all_traders[\"creation_timestamp\"].dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n",
" )\n",
" return all_traders"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [],
"source": [
"\n",
"unknown_df = pd.read_parquet(\"../data/unknown_traders.parquet\")\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"staking\n",
"non_Olas 1654\n",
"Name: count, dtype: int64"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"unknown_df.staking.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"unknown_df[\"trader_type\"] = \"unclassified\""
]
},
{
"cell_type": "code",
"execution_count": 136,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/2945974734.py:23: UserWarning: Converting to PeriodArray/Index representation will drop timezone information.\n",
" all_traders[\"creation_timestamp\"].dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n"
]
}
],
"source": [
"all_traders = prepare_retention_dataset(retention_df=retention_df, unknown_df=unknown_df)"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"trader_type\n",
"non_Olas 738323\n",
"Olas 282320\n",
"unclassified 3531\n",
"Name: count, dtype: int64"
]
},
"execution_count": 137,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_traders.trader_type.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/2488528526.py:5: UserWarning: Converting to PeriodArray/Index representation will drop timezone information.\n",
" all_traders[\"creation_timestamp\"].dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n"
]
}
],
"source": [
"# First, create week numbers from timestamps\n",
"all_traders[\"creation_timestamp\"] = pd.to_datetime(all_traders[\"creation_timestamp\"])\n",
"all_traders = all_traders.sort_values(by=\"creation_timestamp\", ascending=True)\n",
"all_traders[\"month_year_week\"] = (\n",
"all_traders[\"creation_timestamp\"].dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# WoW Retention"
]
},
{
"cell_type": "code",
"execution_count": 212,
"metadata": {},
"outputs": [],
"source": [
"def calculate_wow_retention_by_type(\n",
" df: pd.DataFrame, market_creator: str\n",
") -> pd.DataFrame:\n",
" filtered_df = df.loc[df[\"market_creator\"] == market_creator]\n",
" # Get unique traders per week and type\n",
" weekly_traders = filtered_df.groupby(['month_year_week', 'trader_type'], sort=False)['trader_address'].nunique().reset_index()\n",
" #weekly_traders = weekly_traders.sort_values(['trader_type', 'month_year_week'])\n",
" # Get ordered list of unique weeks - converting to datetime for proper sorting\n",
" all_weeks = filtered_df[\"month_year_week\"].unique()\n",
" weeks_datetime = pd.to_datetime(all_weeks)\n",
" sorted_weeks_idx = weeks_datetime.argsort()\n",
" all_weeks = all_weeks[sorted_weeks_idx]\n",
"\n",
" # Create mapping from week string to numeric index\n",
" week_to_number = {week: idx for idx, week in enumerate(all_weeks)}\n",
" # Calculate retention\n",
" retention = []\n",
" # Iterate through each trader type\n",
" for trader_type in weekly_traders['trader_type'].unique():\n",
" type_data = weekly_traders[weekly_traders['trader_type'] == trader_type]\n",
" \n",
" # Calculate retention for each week within this trader type\n",
" for i in range(1, len(type_data)):\n",
" current_week = type_data.iloc[i]['month_year_week']\n",
" print(f\"current_week={current_week}\")\n",
" week_number = week_to_number[current_week]\n",
" if week_to_number == 0:\n",
" # no previous week info\n",
" continue\n",
" previous_week_number = week_number -1\n",
" # this should give only one value\n",
" previous_week = [key for key in week_to_number.keys() if week_to_number[key] == previous_week_number][0]\n",
" #previous_week = type_data.iloc[i-1]['month_year_week']\n",
" print(f\"previous week = {previous_week}\")\n",
" \n",
" # Get traders in both weeks for this type\n",
" current_traders = set(df[\n",
" (df['month_year_week'] == current_week) & \n",
" (df['trader_type'] == trader_type)\n",
" ]['trader_address'])\n",
" \n",
" previous_traders = set(df[\n",
" (df['month_year_week'] == previous_week) & \n",
" (df['trader_type'] == trader_type)\n",
" ]['trader_address'])\n",
" \n",
" retained = len(current_traders.intersection(previous_traders))\n",
" retention_rate = (retained / len(previous_traders)) * 100 if len(previous_traders) > 0 else 0\n",
" \n",
" retention.append({\n",
" 'trader_type': trader_type,\n",
" 'week': current_week,\n",
" 'retained_traders': retained,\n",
" 'new_traders': \n",
" 'previous_traders': len(previous_traders),\n",
" 'retention_rate': round(retention_rate, 2)\n",
" })\n",
" \n",
" return pd.DataFrame(retention)"
]
},
{
"cell_type": "code",
"execution_count": 213,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"current_week=Nov-24-2024\n",
"previous week = Nov-17-2024\n",
"current_week=Dec-01-2024\n",
"previous week = Nov-24-2024\n",
"current_week=Dec-08-2024\n",
"previous week = Dec-01-2024\n",
"current_week=Dec-15-2024\n",
"previous week = Dec-08-2024\n",
"current_week=Dec-22-2024\n",
"previous week = Dec-15-2024\n",
"current_week=Dec-29-2024\n",
"previous week = Dec-22-2024\n",
"current_week=Jan-05-2025\n",
"previous week = Dec-29-2024\n",
"current_week=Jan-12-2025\n",
"previous week = Jan-05-2025\n",
"current_week=Jan-19-2025\n",
"previous week = Jan-12-2025\n",
"current_week=Nov-24-2024\n",
"previous week = Nov-17-2024\n",
"current_week=Dec-01-2024\n",
"previous week = Nov-24-2024\n",
"current_week=Dec-08-2024\n",
"previous week = Dec-01-2024\n",
"current_week=Dec-15-2024\n",
"previous week = Dec-08-2024\n",
"current_week=Dec-22-2024\n",
"previous week = Dec-15-2024\n",
"current_week=Dec-29-2024\n",
"previous week = Dec-22-2024\n",
"current_week=Jan-05-2025\n",
"previous week = Dec-29-2024\n",
"current_week=Jan-12-2025\n",
"previous week = Jan-05-2025\n",
"current_week=Jan-19-2025\n",
"previous week = Jan-12-2025\n",
"current_week=Nov-24-2024\n",
"previous week = Nov-17-2024\n",
"current_week=Dec-01-2024\n",
"previous week = Nov-24-2024\n",
"current_week=Dec-08-2024\n",
"previous week = Dec-01-2024\n",
"current_week=Dec-15-2024\n",
"previous week = Dec-08-2024\n",
"current_week=Dec-22-2024\n",
"previous week = Dec-15-2024\n",
"current_week=Dec-29-2024\n",
"previous week = Dec-22-2024\n",
"current_week=Jan-05-2025\n",
"previous week = Dec-29-2024\n",
"current_week=Jan-12-2025\n",
"previous week = Jan-05-2025\n"
]
}
],
"source": [
"wow_retention = calculate_wow_retention_by_type(all_traders, market_creator=\"pearl\")"
]
},
{
"cell_type": "code",
"execution_count": 216,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_type | \n",
" week | \n",
" retained_traders | \n",
" previous_traders | \n",
" retention_rate | \n",
"
\n",
" \n",
" \n",
" \n",
" 6 | \n",
" non_Olas | \n",
" 2025-01-05 | \n",
" 333 | \n",
" 353 | \n",
" 94.33 | \n",
"
\n",
" \n",
" 15 | \n",
" Olas | \n",
" 2025-01-05 | \n",
" 177 | \n",
" 194 | \n",
" 91.24 | \n",
"
\n",
" \n",
" 24 | \n",
" unclassified | \n",
" 2025-01-05 | \n",
" 2 | \n",
" 19 | \n",
" 10.53 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_type week retained_traders previous_traders \\\n",
"6 non_Olas 2025-01-05 333 353 \n",
"15 Olas 2025-01-05 177 194 \n",
"24 unclassified 2025-01-05 2 19 \n",
"\n",
" retention_rate \n",
"6 94.33 \n",
"15 91.24 \n",
"24 10.53 "
]
},
"execution_count": 216,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jan5 = wow_retention.loc[wow_retention[\"week\"]==\"Jan-05-2025\"]\n",
"jan5"
]
},
{
"cell_type": "code",
"execution_count": 214,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_type | \n",
" week | \n",
" retained_traders | \n",
" previous_traders | \n",
" retention_rate | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" non_Olas | \n",
" Nov-24-2024 | \n",
" 157 | \n",
" 180 | \n",
" 87.22 | \n",
"
\n",
" \n",
" 1 | \n",
" non_Olas | \n",
" Dec-01-2024 | \n",
" 173 | \n",
" 186 | \n",
" 93.01 | \n",
"
\n",
" \n",
" 2 | \n",
" non_Olas | \n",
" Dec-08-2024 | \n",
" 182 | \n",
" 196 | \n",
" 92.86 | \n",
"
\n",
" \n",
" 3 | \n",
" non_Olas | \n",
" Dec-15-2024 | \n",
" 303 | \n",
" 324 | \n",
" 93.52 | \n",
"
\n",
" \n",
" 4 | \n",
" non_Olas | \n",
" Dec-22-2024 | \n",
" 313 | \n",
" 325 | \n",
" 96.31 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_type week retained_traders previous_traders retention_rate\n",
"0 non_Olas Nov-24-2024 157 180 87.22\n",
"1 non_Olas Dec-01-2024 173 186 93.01\n",
"2 non_Olas Dec-08-2024 182 196 92.86\n",
"3 non_Olas Dec-15-2024 303 324 93.52\n",
"4 non_Olas Dec-22-2024 313 325 96.31"
]
},
"execution_count": 214,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wow_retention.head()"
]
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_type | \n",
" week | \n",
" retained_traders | \n",
" previous_traders | \n",
" retention_rate | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Olas | \n",
" Dec-08-2024 | \n",
" 187 | \n",
" 202 | \n",
" 92.57 | \n",
"
\n",
" \n",
" 1 | \n",
" Olas | \n",
" Dec-15-2024 | \n",
" 212 | \n",
" 233 | \n",
" 90.99 | \n",
"
\n",
" \n",
" 2 | \n",
" Olas | \n",
" Dec-22-2024 | \n",
" 204 | \n",
" 227 | \n",
" 89.87 | \n",
"
\n",
" \n",
" 3 | \n",
" Olas | \n",
" Dec-29-2024 | \n",
" 187 | \n",
" 214 | \n",
" 87.38 | \n",
"
\n",
" \n",
" 4 | \n",
" Olas | \n",
" Jan-05-2025 | \n",
" 177 | \n",
" 194 | \n",
" 91.24 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_type week retained_traders previous_traders retention_rate\n",
"0 Olas Dec-08-2024 187 202 92.57\n",
"1 Olas Dec-15-2024 212 233 90.99\n",
"2 Olas Dec-22-2024 204 227 89.87\n",
"3 Olas Dec-29-2024 187 214 87.38\n",
"4 Olas Jan-05-2025 177 194 91.24"
]
},
"execution_count": 141,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wow_retention.head()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_type | \n",
" week | \n",
" retained_traders | \n",
" previous_traders | \n",
" retention_rate | \n",
"
\n",
" \n",
" \n",
" \n",
" 9 | \n",
" non_Olas | \n",
" 2024-12-08 | \n",
" 154 | \n",
" 154 | \n",
" 100.00 | \n",
"
\n",
" \n",
" 10 | \n",
" non_Olas | \n",
" 2024-12-15 | \n",
" 301 | \n",
" 324 | \n",
" 92.90 | \n",
"
\n",
" \n",
" 11 | \n",
" non_Olas | \n",
" 2024-12-22 | \n",
" 310 | \n",
" 321 | \n",
" 96.57 | \n",
"
\n",
" \n",
" 12 | \n",
" non_Olas | \n",
" 2024-12-29 | \n",
" 312 | \n",
" 341 | \n",
" 91.50 | \n",
"
\n",
" \n",
" 13 | \n",
" non_Olas | \n",
" 2025-01-05 | \n",
" 304 | \n",
" 326 | \n",
" 93.25 | \n",
"
\n",
" \n",
" 14 | \n",
" non_Olas | \n",
" 2025-01-12 | \n",
" 246 | \n",
" 333 | \n",
" 73.87 | \n",
"
\n",
" \n",
" 15 | \n",
" non_Olas | \n",
" 2024-11-10 | \n",
" 51 | \n",
" 251 | \n",
" 20.32 | \n",
"
\n",
" \n",
" 16 | \n",
" non_Olas | \n",
" 2024-11-17 | \n",
" 90 | \n",
" 100 | \n",
" 90.00 | \n",
"
\n",
" \n",
" 17 | \n",
" non_Olas | \n",
" 2024-11-24 | \n",
" 151 | \n",
" 181 | \n",
" 83.43 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_type week retained_traders previous_traders retention_rate\n",
"9 non_Olas 2024-12-08 154 154 100.00\n",
"10 non_Olas 2024-12-15 301 324 92.90\n",
"11 non_Olas 2024-12-22 310 321 96.57\n",
"12 non_Olas 2024-12-29 312 341 91.50\n",
"13 non_Olas 2025-01-05 304 326 93.25\n",
"14 non_Olas 2025-01-12 246 333 73.87\n",
"15 non_Olas 2024-11-10 51 251 20.32\n",
"16 non_Olas 2024-11-17 90 100 90.00\n",
"17 non_Olas 2024-11-24 151 181 83.43"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"non_olas = wow_retention.loc[wow_retention[\"trader_type\"]==\"non_Olas\"]\n",
"non_olas"
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [],
"source": [
"import plotly.express as px\n",
"import plotly.graph_objects as go\n",
"\n",
"def plot_wow_retention_by_type(wow_retention):\n",
" wow_retention['week'] = pd.to_datetime(wow_retention['week'])\n",
" wow_retention = wow_retention.sort_values(['trader_type', 'week'])\n",
" fig = px.line(\n",
" wow_retention, \n",
" x='week', \n",
" y='retention_rate',\n",
" color='trader_type',\n",
" markers=True,\n",
" title='Weekly Retention Rate by Trader Type',\n",
" labels={\n",
" 'week': 'Week',\n",
" 'retention_rate': 'Retention Rate (%)',\n",
" 'trader_type': 'Trader Type'\n",
" }\n",
" )\n",
" \n",
" fig.update_layout(\n",
" hovermode='x unified',\n",
" legend=dict(\n",
" yanchor=\"middle\",\n",
" y=0.5,\n",
" xanchor=\"left\",\n",
" x=1.02, # Move legend outside\n",
" orientation=\"v\"\n",
" ),\n",
" yaxis=dict(\n",
" ticksuffix='%',\n",
" range=[0, max(wow_retention['retention_rate']) * 1.1] # Add 10% padding to y-axis\n",
" ),\n",
" xaxis=dict(\n",
" tickformat='%Y-%m-%d'\n",
" ),\n",
" margin=dict(r=150) # Add right margin to make space for legend\n",
" )\n",
" \n",
" # Add hover template\n",
" fig.update_traces(\n",
" hovertemplate='%{y:.1f}%
Week: %{x|%Y-%m-%d}'\n",
" )\n",
" \n",
" return fig\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 215,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "%{y:.1f}%
Week: %{x|%Y-%m-%d}",
"legendgroup": "Olas",
"line": {
"color": "#636efa",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines+markers",
"name": "Olas",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
"2024-11-24T00:00:00",
"2024-12-01T00:00:00",
"2024-12-08T00:00:00",
"2024-12-15T00:00:00",
"2024-12-22T00:00:00",
"2024-12-29T00:00:00",
"2025-01-05T00:00:00",
"2025-01-12T00:00:00",
"2025-01-19T00:00:00"
],
"xaxis": "x",
"y": [
94.55,
83.26,
92.57,
90.99,
89.87,
87.38,
91.24,
91.71,
78.92
],
"yaxis": "y"
},
{
"hovertemplate": "%{y:.1f}%
Week: %{x|%Y-%m-%d}",
"legendgroup": "non_Olas",
"line": {
"color": "#EF553B",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines+markers",
"name": "non_Olas",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
"2024-11-24T00:00:00",
"2024-12-01T00:00:00",
"2024-12-08T00:00:00",
"2024-12-15T00:00:00",
"2024-12-22T00:00:00",
"2024-12-29T00:00:00",
"2025-01-05T00:00:00",
"2025-01-12T00:00:00",
"2025-01-19T00:00:00"
],
"xaxis": "x",
"y": [
87.22,
93.01,
92.86,
93.52,
96.31,
95.64,
94.33,
94.72,
94.13
],
"yaxis": "y"
},
{
"hovertemplate": "%{y:.1f}%
Week: %{x|%Y-%m-%d}",
"legendgroup": "unclassified",
"line": {
"color": "#00cc96",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines+markers",
"name": "unclassified",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
"2024-11-24T00:00:00",
"2024-12-01T00:00:00",
"2024-12-08T00:00:00",
"2024-12-15T00:00:00",
"2024-12-22T00:00:00",
"2024-12-29T00:00:00",
"2025-01-05T00:00:00",
"2025-01-12T00:00:00"
],
"xaxis": "x",
"y": [
13.21,
17.07,
80,
7.09,
90,
20.97,
10.53,
28.57
],
"yaxis": "y"
}
],
"layout": {
"hovermode": "x unified",
"legend": {
"orientation": "v",
"title": {
"text": "Trader Type"
},
"tracegroupgap": 0,
"x": 1.02,
"xanchor": "left",
"y": 0.5,
"yanchor": "middle"
},
"margin": {
"r": 150
},
"template": {
"data": {
"bar": [
{
"error_x": {
"color": "#2a3f5f"
},
"error_y": {
"color": "#2a3f5f"
},
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "bar"
}
],
"barpolar": [
{
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "barpolar"
}
],
"carpet": [
{
"aaxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"baxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"type": "carpet"
}
],
"choropleth": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "choropleth"
}
],
"contour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "contour"
}
],
"contourcarpet": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "contourcarpet"
}
],
"heatmap": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmap"
}
],
"heatmapgl": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmapgl"
}
],
"histogram": [
{
"marker": {
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "histogram"
}
],
"histogram2d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2d"
}
],
"histogram2dcontour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2dcontour"
}
],
"mesh3d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "mesh3d"
}
],
"parcoords": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "parcoords"
}
],
"pie": [
{
"automargin": true,
"type": "pie"
}
],
"scatter": [
{
"fillpattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
},
"type": "scatter"
}
],
"scatter3d": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter3d"
}
],
"scattercarpet": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattercarpet"
}
],
"scattergeo": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergeo"
}
],
"scattergl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergl"
}
],
"scattermapbox": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermapbox"
}
],
"scatterpolar": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolar"
}
],
"scatterpolargl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolargl"
}
],
"scatterternary": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterternary"
}
],
"surface": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "surface"
}
],
"table": [
{
"cells": {
"fill": {
"color": "#EBF0F8"
},
"line": {
"color": "white"
}
},
"header": {
"fill": {
"color": "#C8D4E3"
},
"line": {
"color": "white"
}
},
"type": "table"
}
]
},
"layout": {
"annotationdefaults": {
"arrowcolor": "#2a3f5f",
"arrowhead": 0,
"arrowwidth": 1
},
"autotypenumbers": "strict",
"coloraxis": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"colorscale": {
"diverging": [
[
0,
"#8e0152"
],
[
0.1,
"#c51b7d"
],
[
0.2,
"#de77ae"
],
[
0.3,
"#f1b6da"
],
[
0.4,
"#fde0ef"
],
[
0.5,
"#f7f7f7"
],
[
0.6,
"#e6f5d0"
],
[
0.7,
"#b8e186"
],
[
0.8,
"#7fbc41"
],
[
0.9,
"#4d9221"
],
[
1,
"#276419"
]
],
"sequential": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"sequentialminus": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
]
},
"colorway": [
"#636efa",
"#EF553B",
"#00cc96",
"#ab63fa",
"#FFA15A",
"#19d3f3",
"#FF6692",
"#B6E880",
"#FF97FF",
"#FECB52"
],
"font": {
"color": "#2a3f5f"
},
"geo": {
"bgcolor": "white",
"lakecolor": "white",
"landcolor": "#E5ECF6",
"showlakes": true,
"showland": true,
"subunitcolor": "white"
},
"hoverlabel": {
"align": "left"
},
"hovermode": "closest",
"mapbox": {
"style": "light"
},
"paper_bgcolor": "white",
"plot_bgcolor": "#E5ECF6",
"polar": {
"angularaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"radialaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"scene": {
"xaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"yaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"zaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
}
},
"shapedefaults": {
"line": {
"color": "#2a3f5f"
}
},
"ternary": {
"aaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"baxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"caxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"title": {
"x": 0.05
},
"xaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
},
"yaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
}
}
},
"title": {
"text": "Weekly Retention Rate by Trader Type"
},
"xaxis": {
"anchor": "y",
"domain": [
0,
1
],
"tickformat": "%Y-%m-%d",
"title": {
"text": "Week"
}
},
"yaxis": {
"anchor": "x",
"domain": [
0,
1
],
"range": [
0,
105.94100000000002
],
"ticksuffix": "%",
"title": {
"text": "Retention Rate (%)"
}
}
}
}
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create and show the plot\n",
"fig = plot_wow_retention_by_type(wow_retention)\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "%{y:.1f}%
Week: %{x|%Y-%m-%d}",
"legendgroup": "Olas",
"line": {
"color": "#636efa",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines+markers",
"name": "Olas",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
"2024-11-17T00:00:00",
"2024-11-24T00:00:00",
"2024-12-08T00:00:00",
"2024-12-15T00:00:00",
"2024-12-22T00:00:00",
"2024-12-29T00:00:00",
"2025-01-05T00:00:00",
"2025-01-12T00:00:00",
"2025-01-19T00:00:00"
],
"xaxis": "x",
"y": [
79.08,
94.55,
92.57,
90.99,
89.87,
87.38,
91.24,
91.71,
78.92
],
"yaxis": "y"
},
{
"hovertemplate": "%{y:.1f}%
Week: %{x|%Y-%m-%d}",
"legendgroup": "non_Olas",
"line": {
"color": "#EF553B",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines+markers",
"name": "non_Olas",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
"2024-11-17T00:00:00",
"2024-11-24T00:00:00",
"2024-12-08T00:00:00",
"2024-12-15T00:00:00",
"2024-12-22T00:00:00",
"2024-12-29T00:00:00",
"2025-01-05T00:00:00",
"2025-01-12T00:00:00",
"2025-01-19T00:00:00"
],
"xaxis": "x",
"y": [
35.76,
87.22,
92.86,
93.52,
96.31,
95.64,
94.33,
94.72,
94.13
],
"yaxis": "y"
},
{
"hovertemplate": "%{y:.1f}%
Week: %{x|%Y-%m-%d}",
"legendgroup": "unclassified",
"line": {
"color": "#00cc96",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines+markers",
"name": "unclassified",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
"2024-11-17T00:00:00",
"2024-11-24T00:00:00",
"2024-12-08T00:00:00",
"2024-12-15T00:00:00",
"2024-12-22T00:00:00",
"2024-12-29T00:00:00",
"2025-01-05T00:00:00",
"2025-01-12T00:00:00",
"2025-01-19T00:00:00"
],
"xaxis": "x",
"y": [
75,
13.21,
80,
7.09,
90,
20.97,
10.53,
28.57,
30.77
],
"yaxis": "y"
}
],
"layout": {
"hovermode": "x unified",
"legend": {
"orientation": "v",
"title": {
"text": "Trader Type"
},
"tracegroupgap": 0,
"x": 1.02,
"xanchor": "left",
"y": 0.5,
"yanchor": "middle"
},
"margin": {
"r": 150
},
"template": {
"data": {
"bar": [
{
"error_x": {
"color": "#2a3f5f"
},
"error_y": {
"color": "#2a3f5f"
},
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "bar"
}
],
"barpolar": [
{
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "barpolar"
}
],
"carpet": [
{
"aaxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"baxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"type": "carpet"
}
],
"choropleth": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "choropleth"
}
],
"contour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "contour"
}
],
"contourcarpet": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "contourcarpet"
}
],
"heatmap": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmap"
}
],
"heatmapgl": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmapgl"
}
],
"histogram": [
{
"marker": {
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "histogram"
}
],
"histogram2d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2d"
}
],
"histogram2dcontour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2dcontour"
}
],
"mesh3d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "mesh3d"
}
],
"parcoords": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "parcoords"
}
],
"pie": [
{
"automargin": true,
"type": "pie"
}
],
"scatter": [
{
"fillpattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
},
"type": "scatter"
}
],
"scatter3d": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter3d"
}
],
"scattercarpet": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattercarpet"
}
],
"scattergeo": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergeo"
}
],
"scattergl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergl"
}
],
"scattermapbox": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermapbox"
}
],
"scatterpolar": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolar"
}
],
"scatterpolargl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolargl"
}
],
"scatterternary": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterternary"
}
],
"surface": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "surface"
}
],
"table": [
{
"cells": {
"fill": {
"color": "#EBF0F8"
},
"line": {
"color": "white"
}
},
"header": {
"fill": {
"color": "#C8D4E3"
},
"line": {
"color": "white"
}
},
"type": "table"
}
]
},
"layout": {
"annotationdefaults": {
"arrowcolor": "#2a3f5f",
"arrowhead": 0,
"arrowwidth": 1
},
"autotypenumbers": "strict",
"coloraxis": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"colorscale": {
"diverging": [
[
0,
"#8e0152"
],
[
0.1,
"#c51b7d"
],
[
0.2,
"#de77ae"
],
[
0.3,
"#f1b6da"
],
[
0.4,
"#fde0ef"
],
[
0.5,
"#f7f7f7"
],
[
0.6,
"#e6f5d0"
],
[
0.7,
"#b8e186"
],
[
0.8,
"#7fbc41"
],
[
0.9,
"#4d9221"
],
[
1,
"#276419"
]
],
"sequential": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"sequentialminus": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
]
},
"colorway": [
"#636efa",
"#EF553B",
"#00cc96",
"#ab63fa",
"#FFA15A",
"#19d3f3",
"#FF6692",
"#B6E880",
"#FF97FF",
"#FECB52"
],
"font": {
"color": "#2a3f5f"
},
"geo": {
"bgcolor": "white",
"lakecolor": "white",
"landcolor": "#E5ECF6",
"showlakes": true,
"showland": true,
"subunitcolor": "white"
},
"hoverlabel": {
"align": "left"
},
"hovermode": "closest",
"mapbox": {
"style": "light"
},
"paper_bgcolor": "white",
"plot_bgcolor": "#E5ECF6",
"polar": {
"angularaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"radialaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"scene": {
"xaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"yaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"zaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
}
},
"shapedefaults": {
"line": {
"color": "#2a3f5f"
}
},
"ternary": {
"aaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"baxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"caxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"title": {
"x": 0.05
},
"xaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
},
"yaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
}
}
},
"title": {
"text": "Weekly Retention Rate by Trader Type"
},
"xaxis": {
"anchor": "y",
"domain": [
0,
1
],
"tickformat": "%Y-%m-%d",
"title": {
"text": "Week"
}
},
"yaxis": {
"anchor": "x",
"domain": [
0,
1
],
"range": [
0,
105.94100000000002
],
"ticksuffix": "%",
"title": {
"text": "Retention Rate (%)"
}
}
}
}
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create and show the plot\n",
"fig = plot_wow_retention_by_type(wow_retention)\n",
"fig.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Cohort retention OLD computation"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
"def calculate_cohort_retention(\n",
" df: pd.DataFrame, market_creator: str, trader_type: str\n",
") -> pd.DataFrame:\n",
" df_filtered = df.loc[\n",
" (df[\"market_creator\"] == market_creator) & (df[\"trader_type\"] == trader_type)\n",
" ]\n",
" # Get first week for each trader\n",
" first_trades = (\n",
" df_filtered.groupby(\"trader_address\")\n",
" .agg({\"creation_timestamp\": \"min\", \"month_year_week\": \"first\"})\n",
" .reset_index()\n",
" )\n",
" first_trades.columns = [\"trader_address\", \"first_trade\", \"cohort_week\"]\n",
"\n",
" # Get ordered list of unique weeks - converting to datetime for proper sorting\n",
" all_weeks = df_filtered[\"month_year_week\"].unique()\n",
" weeks_datetime = pd.to_datetime(all_weeks)\n",
" sorted_weeks_idx = weeks_datetime.argsort()\n",
" all_weeks = all_weeks[sorted_weeks_idx]\n",
" print(f\"all_weeks={all_weeks}\")\n",
"\n",
" # Create mapping from week string to numeric index\n",
" week_to_number = {week: idx for idx, week in enumerate(all_weeks)}\n",
"\n",
" # Merge back to get all activities\n",
" cohort_data = pd.merge(\n",
" df_filtered,\n",
" first_trades[[\"trader_address\", \"cohort_week\"]],\n",
" on=\"trader_address\",\n",
" )\n",
" print(cohort_data.tail())\n",
" print(cohort_data.cohort_week.value_counts())\n",
"\n",
" # Calculate week number since first activity\n",
" cohort_data[\"cohort_number\"] = cohort_data[\"cohort_week\"].map(week_to_number)\n",
" cohort_data[\"activity_number\"] = cohort_data[\"month_year_week\"].map(week_to_number)\n",
" cohort_data[\"week_number\"] = (\n",
" cohort_data[\"activity_number\"] - cohort_data[\"cohort_number\"]\n",
" )\n",
"\n",
" # Calculate retention by cohort\n",
" cohort_sizes = cohort_data.groupby(\"cohort_week\")[\"trader_address\"].nunique()\n",
" print(\"COHORT SIZES\")\n",
" print(cohort_sizes)\n",
" retention_matrix = cohort_data.groupby([\"cohort_week\", \"week_number\"])[\n",
" \"trader_address\"\n",
" ].nunique()\n",
" retention_matrix = retention_matrix.unstack(fill_value=0)\n",
"\n",
" # Convert to percentages\n",
" retention_matrix = retention_matrix.div(cohort_sizes, axis=0) * 100\n",
"\n",
" # Sort index (cohort_week) chronologically\n",
" retention_matrix.index = pd.to_datetime(retention_matrix.index)\n",
" retention_matrix = retention_matrix.sort_index()\n",
"\n",
" return retention_matrix.round(2)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"def prepare_retention_dataset(\n",
" retention_df: pd.DataFrame, unknown_df: pd.DataFrame\n",
") -> pd.DataFrame:\n",
"\n",
" retention_df[\"trader_type\"] = retention_df[\"staking\"].apply(\n",
" lambda x: \"non_Olas\" if x == \"non_Olas\" else \"Olas\"\n",
" )\n",
" retention_df.rename(columns={\"request_time\": \"creation_timestamp\"}, inplace=True)\n",
" retention_df = retention_df[\n",
" [\"trader_type\", \"market_creator\", \"trader_address\", \"creation_timestamp\"]\n",
" ]\n",
" unknown_df[\"trader_type\"] = \"unclassified\"\n",
" unknown_df = unknown_df[\n",
" [\"trader_type\", \"market_creator\", \"trader_address\", \"creation_timestamp\"]\n",
" ]\n",
" all_traders = pd.concat([retention_df, unknown_df], ignore_index=True)\n",
"\n",
" all_traders[\"creation_timestamp\"] = pd.to_datetime(\n",
" all_traders[\"creation_timestamp\"]\n",
" )\n",
" all_traders = all_traders.sort_values(by=\"creation_timestamp\", ascending=True)\n",
" all_traders[\"month_year_week\"] = (\n",
" all_traders[\"creation_timestamp\"].dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n",
" )\n",
" return all_traders"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/2945974734.py:23: UserWarning:\n",
"\n",
"Converting to PeriodArray/Index representation will drop timezone information.\n",
"\n"
]
}
],
"source": [
"all_traders = prepare_retention_dataset(retention_df=retention_df, unknown_df=unknown_df)"
]
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"all_weeks=['Nov-17-2024' 'Nov-24-2024' 'Dec-01-2024' 'Dec-08-2024' 'Dec-15-2024'\n",
" 'Dec-22-2024' 'Dec-29-2024' 'Jan-05-2025' 'Jan-12-2025' 'Jan-19-2025']\n",
" trader_type market_creator trader_address \\\n",
"49834 Olas pearl 0x92b62e835d5ebf0e79b76715fcb87284e069ff81 \n",
"49835 Olas pearl 0x92b62e835d5ebf0e79b76715fcb87284e069ff81 \n",
"49836 Olas pearl 0x92b62e835d5ebf0e79b76715fcb87284e069ff81 \n",
"49837 Olas pearl 0x92b62e835d5ebf0e79b76715fcb87284e069ff81 \n",
"49838 Olas pearl 0x3badd0a1beb34fc1532f6c717fa857b3325da184 \n",
"\n",
" creation_timestamp month_year_week cohort_week \n",
"49834 2025-01-15 13:45:45+00:00 Jan-19-2025 Nov-17-2024 \n",
"49835 2025-01-15 13:48:30+00:00 Jan-19-2025 Nov-17-2024 \n",
"49836 2025-01-15 13:52:00+00:00 Jan-19-2025 Nov-17-2024 \n",
"49837 2025-01-15 13:55:50+00:00 Jan-19-2025 Nov-17-2024 \n",
"49838 2025-01-15 14:01:00+00:00 Jan-19-2025 Nov-17-2024 \n",
"cohort_week\n",
"Nov-17-2024 43957\n",
"Nov-24-2024 3368\n",
"Dec-01-2024 1430\n",
"Dec-08-2024 589\n",
"Dec-15-2024 429\n",
"Jan-19-2025 52\n",
"Dec-22-2024 7\n",
"Dec-29-2024 7\n",
"Name: count, dtype: int64\n",
"COHORT SIZES\n",
"cohort_week\n",
"Dec-01-2024 9\n",
"Dec-08-2024 6\n",
"Dec-15-2024 10\n",
"Dec-22-2024 2\n",
"Dec-29-2024 1\n",
"Jan-19-2025 1\n",
"Nov-17-2024 133\n",
"Nov-24-2024 13\n",
"Name: trader_address, dtype: int64\n"
]
}
],
"source": [
"olas_cohort_pearl = calculate_cohort_retention(df=all_traders, market_creator=\"pearl\", trader_type=\"Olas\")"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" week_number | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
"
\n",
" \n",
" cohort_week | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2024-12-08 | \n",
" 100.0 | \n",
" 83.33 | \n",
" 66.67 | \n",
" 66.67 | \n",
" 33.33 | \n",
" 50.0 | \n",
" 50.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2024-12-15 | \n",
" 100.0 | \n",
" 40.00 | \n",
" 30.00 | \n",
" 30.00 | \n",
" 20.00 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2024-12-22 | \n",
" 100.0 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2024-12-29 | \n",
" 100.0 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2025-01-19 | \n",
" 100.0 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"week_number 0 1 2 3 4 5 6 7 8 9\n",
"cohort_week \n",
"2024-12-08 100.0 83.33 66.67 66.67 33.33 50.0 50.0 0.0 0.0 0.0\n",
"2024-12-15 100.0 40.00 30.00 30.00 20.00 0.0 0.0 0.0 0.0 0.0\n",
"2024-12-22 100.0 0.00 0.00 0.00 0.00 0.0 0.0 0.0 0.0 0.0\n",
"2024-12-29 100.0 0.00 0.00 0.00 0.00 0.0 0.0 0.0 0.0 0.0\n",
"2025-01-19 100.0 0.00 0.00 0.00 0.00 0.0 0.0 0.0 0.0 0.0"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"olas_cohort_pearl.tail()"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64', name='week_number')"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"olas_cohort_pearl.columns"
]
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/3309953326.py:1: SettingWithCopyWarning:\n",
"\n",
"\n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
"\n"
]
}
],
"source": [
"olas_data.rename(columns={\"request_time\": \"creation_timestamp\"}, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 146,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/1537996894.py:3: UserWarning:\n",
"\n",
"Converting to PeriodArray/Index representation will drop timezone information.\n",
"\n"
]
}
],
"source": [
"olas_data = olas_data.sort_values(by=\"creation_timestamp\", ascending=True)\n",
"olas_data[\"month_year_week\"] = (\n",
" olas_data[\"creation_timestamp\"].dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 147,
"metadata": {},
"outputs": [],
"source": [
"first_trades = (\n",
" olas_data.groupby(\"trader_address\")\n",
" .agg({\"creation_timestamp\": \"min\", \"month_year_week\": \"first\"})\n",
" .reset_index()\n",
" )\n",
"first_trades.columns = [\"trader_address\", \"first_trade\", \"cohort_week\"]"
]
},
{
"cell_type": "code",
"execution_count": 151,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"cohort_week\n",
"Nov-17-2024 202\n",
"Nov-24-2024 30\n",
"Dec-01-2024 12\n",
"Dec-08-2024 12\n",
"Dec-15-2024 10\n",
"Dec-22-2024 2\n",
"Jan-05-2025 1\n",
"Jan-19-2025 1\n",
"Dec-29-2024 1\n",
"Name: count, dtype: int64"
]
},
"execution_count": 151,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_trades.cohort_week.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 150,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" first_trade | \n",
" cohort_week | \n",
"
\n",
" \n",
" \n",
" \n",
" 74 | \n",
" 0x3784c7866a0d308d72719aa17e888b457d399ca7 | \n",
" 2025-01-01 14:46:45+00:00 | \n",
" Jan-05-2025 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_address first_trade \\\n",
"74 0x3784c7866a0d308d72719aa17e888b457d399ca7 2025-01-01 14:46:45+00:00 \n",
"\n",
" cohort_week \n",
"74 Jan-05-2025 "
]
},
"execution_count": 150,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_trades.loc[first_trades[\"cohort_week\"]==\"Jan-05-2025\"]"
]
},
{
"cell_type": "code",
"execution_count": 152,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Nov-17-2024', 'Nov-24-2024', 'Dec-01-2024', 'Dec-08-2024',\n",
" 'Dec-15-2024', 'Dec-22-2024', 'Dec-29-2024', 'Jan-05-2025',\n",
" 'Jan-12-2025', 'Jan-19-2025'], dtype=object)"
]
},
"execution_count": 152,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_weeks = olas_data[\"month_year_week\"].unique()\n",
"all_weeks"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [],
"source": [
"all_weeks = olas_data[\"month_year_week\"].unique()\n",
"weeks_datetime = pd.to_datetime(all_weeks)\n",
"sorted_weeks_idx = weeks_datetime.argsort()\n",
"all_weeks = all_weeks[sorted_weeks_idx]"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Nov-17-2024', 'Nov-24-2024', 'Dec-01-2024', 'Dec-08-2024',\n",
" 'Dec-15-2024', 'Dec-22-2024', 'Dec-29-2024', 'Jan-05-2025',\n",
" 'Jan-12-2025', 'Jan-19-2025'], dtype=object)"
]
},
"execution_count": 124,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_weeks"
]
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {},
"outputs": [],
"source": [
"# Create mapping from week string to numeric index\n",
"week_to_number = {week: idx for idx, week in enumerate(all_weeks)}"
]
},
{
"cell_type": "code",
"execution_count": 154,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Nov-17-2024': 0,\n",
" 'Nov-24-2024': 1,\n",
" 'Dec-01-2024': 2,\n",
" 'Dec-08-2024': 3,\n",
" 'Dec-15-2024': 4,\n",
" 'Dec-22-2024': 5,\n",
" 'Dec-29-2024': 6,\n",
" 'Jan-05-2025': 7,\n",
" 'Jan-12-2025': 8,\n",
" 'Jan-19-2025': 9}"
]
},
"execution_count": 154,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"week_to_number"
]
},
{
"cell_type": "code",
"execution_count": 155,
"metadata": {},
"outputs": [],
"source": [
"# Merge back to get all activities\n",
"cohort_data = pd.merge(\n",
" olas_data,\n",
" first_trades[[\"trader_address\", \"cohort_week\"]],\n",
" on=\"trader_address\",\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 156,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" creation_timestamp | \n",
" market_creator | \n",
" request_date | \n",
" staking | \n",
" month_year_week | \n",
" trader_type | \n",
" cohort_week | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0x1c1bb5398ba525c5bca07eeade45958e455de4b3 | \n",
" 2024-11-14 00:00:05+00:00 | \n",
" quickstart | \n",
" 2024-11-14 | \n",
" non_staking | \n",
" Nov-17-2024 | \n",
" Olas | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 1 | \n",
" 0xf839eaf4b42eadd917b46d7b6da0dd0e1fd6f684 | \n",
" 2024-11-14 00:00:10+00:00 | \n",
" quickstart | \n",
" 2024-11-14 | \n",
" non_staking | \n",
" Nov-17-2024 | \n",
" Olas | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 2 | \n",
" 0xa761001fdebabef8f8c2efe91850c3b8b69c2769 | \n",
" 2024-11-14 00:00:15+00:00 | \n",
" quickstart | \n",
" 2024-11-14 | \n",
" non_staking | \n",
" Nov-17-2024 | \n",
" Olas | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 3 | \n",
" 0xc598397ce2b8bdf93071c0446d1eedc2141f01d0 | \n",
" 2024-11-14 00:00:15+00:00 | \n",
" quickstart | \n",
" 2024-11-14 | \n",
" quickstart | \n",
" Nov-17-2024 | \n",
" Olas | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 4 | \n",
" 0x01274796ce41aa8e8312e05a427ffb4b0d2148f6 | \n",
" 2024-11-14 00:00:20+00:00 | \n",
" quickstart | \n",
" 2024-11-14 | \n",
" non_staking | \n",
" Nov-17-2024 | \n",
" Olas | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_address creation_timestamp \\\n",
"0 0x1c1bb5398ba525c5bca07eeade45958e455de4b3 2024-11-14 00:00:05+00:00 \n",
"1 0xf839eaf4b42eadd917b46d7b6da0dd0e1fd6f684 2024-11-14 00:00:10+00:00 \n",
"2 0xa761001fdebabef8f8c2efe91850c3b8b69c2769 2024-11-14 00:00:15+00:00 \n",
"3 0xc598397ce2b8bdf93071c0446d1eedc2141f01d0 2024-11-14 00:00:15+00:00 \n",
"4 0x01274796ce41aa8e8312e05a427ffb4b0d2148f6 2024-11-14 00:00:20+00:00 \n",
"\n",
" market_creator request_date staking month_year_week trader_type \\\n",
"0 quickstart 2024-11-14 non_staking Nov-17-2024 Olas \n",
"1 quickstart 2024-11-14 non_staking Nov-17-2024 Olas \n",
"2 quickstart 2024-11-14 non_staking Nov-17-2024 Olas \n",
"3 quickstart 2024-11-14 quickstart Nov-17-2024 Olas \n",
"4 quickstart 2024-11-14 non_staking Nov-17-2024 Olas \n",
"\n",
" cohort_week \n",
"0 Nov-17-2024 \n",
"1 Nov-17-2024 \n",
"2 Nov-17-2024 \n",
"3 Nov-17-2024 \n",
"4 Nov-17-2024 "
]
},
"execution_count": 156,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cohort_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"outputs": [],
"source": [
"# Calculate week number since first activity\n",
"cohort_data[\"cohort_number\"] = cohort_data[\"cohort_week\"].map(week_to_number)\n",
"cohort_data[\"activity_number\"] = cohort_data[\"month_year_week\"].map(week_to_number)\n",
"cohort_data[\"week_number\"] = (\n",
" cohort_data[\"activity_number\"] - cohort_data[\"cohort_number\"]\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cohort_data.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cohort_data.loc[cohort_data[\"trader_address\"]==\"0x59fab0cc4dd160862a55e5cf8b37719f156111a4\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cohort_data.loc[cohort_data[\"cohort_week\"]==\"Jan-05-2025\"]"
]
},
{
"cell_type": "code",
"execution_count": 163,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cohort_week\n",
"Dec-01-2024 12\n",
"Dec-08-2024 12\n",
"Dec-15-2024 10\n",
"Dec-22-2024 2\n",
"Dec-29-2024 1\n",
"Jan-05-2025 1\n",
"Jan-19-2025 1\n",
"Nov-17-2024 202\n",
"Nov-24-2024 30\n",
"Name: trader_address, dtype: int64\n"
]
}
],
"source": [
"cohort_sizes = cohort_data.groupby(\"cohort_week\")[\"trader_address\"].nunique()\n",
"\n",
"print(cohort_sizes)"
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cohort_week\n",
"Dec-01-2024 12\n",
"Dec-08-2024 12\n",
"Dec-15-2024 10\n",
"Dec-22-2024 2\n",
"Dec-29-2024 1\n",
"Jan-05-2025 1\n",
"Jan-19-2025 1\n",
"Nov-17-2024 202\n",
"Nov-24-2024 30\n",
"Name: trader_address, dtype: int64\n"
]
}
],
"source": [
"cohort_sizes = cohort_data.groupby(\"cohort_week\")[\"trader_address\"].nunique()\n",
"\n",
"print(cohort_sizes)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cohort_week\n",
"Dec-01-2024 10\n",
"Dec-08-2024 12\n",
"Dec-15-2024 10\n",
"Dec-22-2024 2\n",
"Dec-29-2024 1\n",
"Jan-05-2025 1\n",
"Jan-19-2025 1\n",
"Nov-17-2024 220\n",
"Nov-24-2024 16\n",
"Name: trader_address, dtype: int64\n"
]
}
],
"source": [
"cohort_sizes = cohort_data.groupby(\"cohort_week\")[\"trader_address\"].nunique()\n",
"# these are the new users each week\n",
"print(cohort_sizes)"
]
},
{
"cell_type": "code",
"execution_count": 164,
"metadata": {},
"outputs": [],
"source": [
"retention_matrix = cohort_data.groupby([\"cohort_week\", \"week_number\"])[\n",
" \"trader_address\"\n",
" ].nunique()\n"
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"cohort_week week_number\n",
"Dec-01-2024 0 12\n",
" 1 6\n",
" 2 7\n",
" 3 6\n",
" 4 4\n",
" 5 4\n",
" 6 2\n",
" 7 2\n",
"Dec-08-2024 0 12\n",
" 1 9\n",
" 2 8\n",
" 3 8\n",
" 4 5\n",
" 5 6\n",
" 6 7\n",
"Dec-15-2024 0 10\n",
" 1 4\n",
" 2 3\n",
" 3 3\n",
" 4 2\n",
"Dec-22-2024 0 2\n",
"Dec-29-2024 0 1\n",
"Jan-05-2025 0 1\n",
" 1 1\n",
"Jan-19-2025 0 1\n",
"Nov-17-2024 0 202\n",
" 1 191\n",
" 2 181\n",
" 3 187\n",
" 4 175\n",
" 5 166\n",
" 6 152\n",
" 7 153\n",
" 8 147\n",
" 9 121\n",
"Nov-24-2024 0 30\n",
" 1 9\n",
" 2 28\n",
" 3 26\n",
" 4 28\n",
" 5 26\n",
" 6 27\n",
" 7 27\n",
" 8 22\n",
"Name: trader_address, dtype: int64"
]
},
"execution_count": 165,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_matrix"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [],
"source": [
"retention_matrix = retention_matrix.unstack(fill_value=0)"
]
},
{
"cell_type": "code",
"execution_count": 167,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" week_number | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
"
\n",
" \n",
" cohort_week | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Dec-01-2024 | \n",
" 12 | \n",
" 6 | \n",
" 7 | \n",
" 6 | \n",
" 4 | \n",
" 4 | \n",
" 2 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Dec-08-2024 | \n",
" 12 | \n",
" 9 | \n",
" 8 | \n",
" 8 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Dec-15-2024 | \n",
" 10 | \n",
" 4 | \n",
" 3 | \n",
" 3 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Dec-22-2024 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Dec-29-2024 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Jan-05-2025 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Jan-19-2025 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Nov-17-2024 | \n",
" 202 | \n",
" 191 | \n",
" 181 | \n",
" 187 | \n",
" 175 | \n",
" 166 | \n",
" 152 | \n",
" 153 | \n",
" 147 | \n",
" 121 | \n",
"
\n",
" \n",
" Nov-24-2024 | \n",
" 30 | \n",
" 9 | \n",
" 28 | \n",
" 26 | \n",
" 28 | \n",
" 26 | \n",
" 27 | \n",
" 27 | \n",
" 22 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"week_number 0 1 2 3 4 5 6 7 8 9\n",
"cohort_week \n",
"Dec-01-2024 12 6 7 6 4 4 2 2 0 0\n",
"Dec-08-2024 12 9 8 8 5 6 7 0 0 0\n",
"Dec-15-2024 10 4 3 3 2 0 0 0 0 0\n",
"Dec-22-2024 2 0 0 0 0 0 0 0 0 0\n",
"Dec-29-2024 1 0 0 0 0 0 0 0 0 0\n",
"Jan-05-2025 1 1 0 0 0 0 0 0 0 0\n",
"Jan-19-2025 1 0 0 0 0 0 0 0 0 0\n",
"Nov-17-2024 202 191 181 187 175 166 152 153 147 121\n",
"Nov-24-2024 30 9 28 26 28 26 27 27 22 0"
]
},
"execution_count": 167,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_matrix"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"first_trades = (\n",
" all_traders.groupby(\"trader_address\")\n",
" .agg({\"creation_timestamp\": \"min\", \"month_year_week\": \"first\"})\n",
" .reset_index()\n",
")\n",
"first_trades.columns = [\"trader_address\", \"first_trade\", \"cohort_week\"]"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" market_creator | \n",
" trade_id | \n",
" creation_timestamp | \n",
" title | \n",
" market_status | \n",
" collateral_amount | \n",
" outcome_index | \n",
" trade_fee_amount | \n",
" outcomes_tokens_traded | \n",
" ... | \n",
" earnings | \n",
" redeemed | \n",
" redeemed_amount | \n",
" num_mech_calls | \n",
" mech_fee_amount | \n",
" net_earnings | \n",
" roi | \n",
" staking | \n",
" trader_type | \n",
" month_year_week | \n",
"
\n",
" \n",
" \n",
" \n",
" 15931 | \n",
" 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 | \n",
" pearl | \n",
" 0x0d72a8dcb46ea982ad9c82c5a6f03cba72a6b71d0x00... | \n",
" 2024-11-12 00:36:55+00:00 | \n",
" Will the Chancay mega port in Peru be virtuall... | \n",
" CLOSED | \n",
" 0.1 | \n",
" 1 | \n",
" 0.001 | \n",
" 0.224338 | \n",
" ... | \n",
" 0.000000 | \n",
" False | \n",
" 0.0 | \n",
" 2 | \n",
" 0.02 | \n",
" -0.121000 | \n",
" -1.000000 | \n",
" pearl | \n",
" Olas | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 15933 | \n",
" 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 | \n",
" pearl | \n",
" 0xa7392614f48e129f6796f523a47777a5f36dd7030x00... | \n",
" 2024-11-20 07:37:10+00:00 | \n",
" Will Google issue a public apology regarding t... | \n",
" CLOSED | \n",
" 0.1 | \n",
" 0 | \n",
" 0.001 | \n",
" 0.213349 | \n",
" ... | \n",
" 0.213349 | \n",
" False | \n",
" 0.0 | \n",
" 1 | \n",
" 0.01 | \n",
" 0.102349 | \n",
" 0.922059 | \n",
" pearl | \n",
" Olas | \n",
" Nov-24-2024 | \n",
"
\n",
" \n",
" 15932 | \n",
" 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 | \n",
" pearl | \n",
" 0x8984bfbca1805f7355a49c261832043cb39b519e0x00... | \n",
" 2024-11-20 07:41:00+00:00 | \n",
" Will Tesla confirm a location for the installa... | \n",
" CLOSED | \n",
" 0.1 | \n",
" 0 | \n",
" 0.001 | \n",
" 0.228212 | \n",
" ... | \n",
" 0.000000 | \n",
" False | \n",
" 0.0 | \n",
" 1 | \n",
" 0.01 | \n",
" -0.111000 | \n",
" -1.000000 | \n",
" pearl | \n",
" Olas | \n",
" Nov-24-2024 | \n",
"
\n",
" \n",
"
\n",
"
3 rows × 23 columns
\n",
"
"
],
"text/plain": [
" trader_address market_creator \\\n",
"15931 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 pearl \n",
"15933 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 pearl \n",
"15932 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 pearl \n",
"\n",
" trade_id \\\n",
"15931 0x0d72a8dcb46ea982ad9c82c5a6f03cba72a6b71d0x00... \n",
"15933 0xa7392614f48e129f6796f523a47777a5f36dd7030x00... \n",
"15932 0x8984bfbca1805f7355a49c261832043cb39b519e0x00... \n",
"\n",
" creation_timestamp \\\n",
"15931 2024-11-12 00:36:55+00:00 \n",
"15933 2024-11-20 07:37:10+00:00 \n",
"15932 2024-11-20 07:41:00+00:00 \n",
"\n",
" title market_status \\\n",
"15931 Will the Chancay mega port in Peru be virtuall... CLOSED \n",
"15933 Will Google issue a public apology regarding t... CLOSED \n",
"15932 Will Tesla confirm a location for the installa... CLOSED \n",
"\n",
" collateral_amount outcome_index trade_fee_amount \\\n",
"15931 0.1 1 0.001 \n",
"15933 0.1 0 0.001 \n",
"15932 0.1 0 0.001 \n",
"\n",
" outcomes_tokens_traded ... earnings redeemed redeemed_amount \\\n",
"15931 0.224338 ... 0.000000 False 0.0 \n",
"15933 0.213349 ... 0.213349 False 0.0 \n",
"15932 0.228212 ... 0.000000 False 0.0 \n",
"\n",
" num_mech_calls mech_fee_amount net_earnings roi staking \\\n",
"15931 2 0.02 -0.121000 -1.000000 pearl \n",
"15933 1 0.01 0.102349 0.922059 pearl \n",
"15932 1 0.01 -0.111000 -1.000000 pearl \n",
"\n",
" trader_type month_year_week \n",
"15931 Olas Nov-17-2024 \n",
"15933 Olas Nov-24-2024 \n",
"15932 Olas Nov-24-2024 \n",
"\n",
"[3 rows x 23 columns]"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_trader = all_traders.loc[all_traders[\"trader_address\"]==\"0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2\"]\n",
"one_trader.head()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" first_trade | \n",
" cohort_week | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 | \n",
" 2024-11-12 00:36:55+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 1 | \n",
" 0x00897abcbbefe4f558956b7a9d1b7819677e4d90 | \n",
" 2024-11-12 09:10:25+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 2 | \n",
" 0x01274796ce41aa8e8312e05a427ffb4b0d2148f6 | \n",
" 2024-11-08 00:26:05+00:00 | \n",
" Nov-10-2024 | \n",
"
\n",
" \n",
" 3 | \n",
" 0x01c72d0743a22b70d73c76c5e16ba7524e20e0c0 | \n",
" 2024-11-08 19:12:20+00:00 | \n",
" Nov-10-2024 | \n",
"
\n",
" \n",
" 4 | \n",
" 0x0244169d0fe1014b9e71f71070099d9c2364af28 | \n",
" 2024-11-16 06:20:25+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" trader_address first_trade \\\n",
"0 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 2024-11-12 00:36:55+00:00 \n",
"1 0x00897abcbbefe4f558956b7a9d1b7819677e4d90 2024-11-12 09:10:25+00:00 \n",
"2 0x01274796ce41aa8e8312e05a427ffb4b0d2148f6 2024-11-08 00:26:05+00:00 \n",
"3 0x01c72d0743a22b70d73c76c5e16ba7524e20e0c0 2024-11-08 19:12:20+00:00 \n",
"4 0x0244169d0fe1014b9e71f71070099d9c2364af28 2024-11-16 06:20:25+00:00 \n",
"\n",
" cohort_week \n",
"0 Nov-17-2024 \n",
"1 Nov-17-2024 \n",
"2 Nov-10-2024 \n",
"3 Nov-10-2024 \n",
"4 Nov-17-2024 "
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_trades.head()"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
"all_weeks = all_traders[\"month_year_week\"].unique()\n",
"weeks_datetime = pd.to_datetime(all_weeks)\n",
"sorted_weeks_idx = weeks_datetime.argsort()\n",
"all_weeks = all_weeks[sorted_weeks_idx]"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Nov-10-2024', 'Nov-17-2024', 'Nov-24-2024', 'Dec-01-2024',\n",
" 'Dec-08-2024', 'Dec-15-2024', 'Dec-22-2024', 'Dec-29-2024',\n",
" 'Jan-05-2025', 'Jan-12-2025'], dtype=object)"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_weeks"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"# Create mapping from week string to numeric index\n",
"week_to_number = {week: idx for idx, week in enumerate(all_weeks)}\n",
"\n",
"# Merge back to get all activities\n",
"cohort_data = pd.merge(\n",
" all_traders, first_trades[[\"trader_address\", \"cohort_week\"]], on=\"trader_address\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"cohort_data[\"cohort_number\"] = cohort_data[\"cohort_week\"].map(week_to_number)\n",
"cohort_data[\"activity_number\"] = cohort_data[\"month_year_week\"].map(week_to_number)\n",
"cohort_data[\"week_number\"] = (\n",
" cohort_data[\"activity_number\"] - cohort_data[\"cohort_number\"]\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"cohort_retention = calculate_cohort_retention(all_traders)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" week_number | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
"
\n",
" \n",
" cohort_week | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2024-11-10 | \n",
" 100.0 | \n",
" 91.83 | \n",
" 81.71 | \n",
" 56.42 | \n",
" 86.77 | \n",
" 82.88 | \n",
" 80.54 | \n",
" 70.04 | \n",
" 64.59 | \n",
" 41.25 | \n",
"
\n",
" \n",
" 2024-11-17 | \n",
" 100.0 | \n",
" 75.00 | \n",
" 45.00 | \n",
" 66.88 | \n",
" 67.50 | \n",
" 67.50 | \n",
" 51.25 | \n",
" 48.12 | \n",
" 33.75 | \n",
" 0.00 | \n",
"
\n",
" \n",
" 2024-11-24 | \n",
" 100.0 | \n",
" 51.72 | \n",
" 75.86 | \n",
" 72.41 | \n",
" 75.86 | \n",
" 65.52 | \n",
" 62.07 | \n",
" 51.72 | \n",
" 0.00 | \n",
" 0.00 | \n",
"
\n",
" \n",
" 2024-12-01 | \n",
" 100.0 | \n",
" 100.00 | \n",
" 90.48 | \n",
" 80.95 | \n",
" 66.67 | \n",
" 71.43 | \n",
" 52.38 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
"
\n",
" \n",
" 2024-12-08 | \n",
" 100.0 | \n",
" 88.82 | \n",
" 86.47 | \n",
" 85.88 | \n",
" 78.24 | \n",
" 70.59 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"week_number 0 1 2 3 4 5 6 7 8 \\\n",
"cohort_week \n",
"2024-11-10 100.0 91.83 81.71 56.42 86.77 82.88 80.54 70.04 64.59 \n",
"2024-11-17 100.0 75.00 45.00 66.88 67.50 67.50 51.25 48.12 33.75 \n",
"2024-11-24 100.0 51.72 75.86 72.41 75.86 65.52 62.07 51.72 0.00 \n",
"2024-12-01 100.0 100.00 90.48 80.95 66.67 71.43 52.38 0.00 0.00 \n",
"2024-12-08 100.0 88.82 86.47 85.88 78.24 70.59 0.00 0.00 0.00 \n",
"\n",
"week_number 9 \n",
"cohort_week \n",
"2024-11-10 41.25 \n",
"2024-11-17 0.00 \n",
"2024-11-24 0.00 \n",
"2024-12-01 0.00 \n",
"2024-12-08 0.00 "
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cohort_retention.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wow retention by cohorts"
]
},
{
"cell_type": "code",
"execution_count": 199,
"metadata": {},
"outputs": [],
"source": [
"def calculate_cohort_retention(\n",
" df: pd.DataFrame, market_creator: str, trader_type: str\n",
") -> pd.DataFrame:\n",
" df_filtered = df.loc[\n",
" (df[\"market_creator\"] == market_creator) & (df[\"trader_type\"] == trader_type)\n",
" ]\n",
" df_filtered = df_filtered.sort_values(by=\"creation_timestamp\", ascending=True)\n",
" # Get first week of activity for each trader\n",
" first_activity = (\n",
" df_filtered.groupby(\"trader_address\")\n",
" .agg({\"creation_timestamp\": \"min\", \"month_year_week\": \"first\"})\n",
" .reset_index()\n",
" )\n",
" first_activity.columns = [\"trader_address\", \"first_activity\", \"cohort_week\"]\n",
"\n",
" # Get ordered list of unique weeks - converting to datetime for proper sorting\n",
" all_weeks = df_filtered[\"month_year_week\"].unique()\n",
" weeks_datetime = pd.to_datetime(all_weeks)\n",
" sorted_weeks_idx = weeks_datetime.argsort()\n",
" all_weeks = all_weeks[sorted_weeks_idx]\n",
"\n",
" # Create mapping from week string to numeric index\n",
" week_to_number = {week: idx for idx, week in enumerate(all_weeks)}\n",
"\n",
" # Merge back to get all activities\n",
" cohort_data = pd.merge(\n",
" df_filtered,\n",
" first_activity[[\"trader_address\", \"cohort_week\"]],\n",
" on=\"trader_address\",\n",
" )\n",
"\n",
" # Calculate week number since first activity\n",
" cohort_data[\"cohort_number\"] = cohort_data[\"cohort_week\"].map(week_to_number)\n",
" cohort_data[\"activity_number\"] = cohort_data[\"month_year_week\"].map(week_to_number)\n",
" cohort_data[\"week_number\"] = (\n",
" cohort_data[\"activity_number\"] - cohort_data[\"cohort_number\"]\n",
" )\n",
"\n",
" # Get all unique weeks and cohorts\n",
" all_cohorts = cohort_data[\"cohort_week\"].unique()\n",
" print(f\"all cohorts = {all_cohorts}\")\n",
" retention_data = []\n",
"\n",
" for cohort in all_cohorts:\n",
" print(f\"analyzing cohort {cohort}\")\n",
" # Get all traders in this cohort\n",
" cohort_traders = set(\n",
" cohort_data[cohort_data[\"cohort_week\"] == cohort][\"trader_address\"]\n",
" )\n",
" cohort_size = len(cohort_traders)\n",
" print(f\"cohort size = {cohort_size}\")\n",
"\n",
" if cohort_size == 0:\n",
" print(f\"NO new traders for cohort week={cohort}\")\n",
" continue\n",
"\n",
" # Calculate retention for each week after the cohort week\n",
" for week_idx, week in enumerate(all_weeks):\n",
" print(f\"Analyzing week = {week}\")\n",
" weeks_since_cohort = week_idx - week_to_number[cohort]\n",
" if weeks_since_cohort < 0:\n",
" print(\"Skipping\")\n",
" continue\n",
" # Get active traders from the cohort in current week\n",
" current_traders = set(\n",
" cohort_data[\n",
" (cohort_data[\"cohort_week\"] == cohort)\n",
" & (cohort_data[\"month_year_week\"] == week)\n",
" ][\"trader_address\"]\n",
" )\n",
"\n",
" # Get active traders from the cohort in previous week\n",
" if week == cohort:\n",
" # For the first week, retention is 100% by definition\n",
" retained = len(current_traders)\n",
" retention_rate = 100 if len(current_traders) > 0 else 0\n",
" \n",
" elif week_idx > 0:\n",
" previous_week = all_weeks[week_idx - 1]\n",
" previous_traders = set(\n",
" cohort_data[\n",
" (cohort_data[\"cohort_week\"] == cohort)\n",
" & (cohort_data[\"month_year_week\"] == previous_week)\n",
" ][\"trader_address\"]\n",
" )\n",
" retained = len(current_traders.intersection(previous_traders))\n",
" retention_rate = (\n",
" (retained / len(previous_traders)) * 100\n",
" if len(previous_traders) > 0\n",
" else 0\n",
" )\n",
" print(f\"Retention rate = {retention_rate}\")\n",
"\n",
"\n",
" retention_data.append(\n",
" {\n",
" \"cohort_week\": cohort,\n",
" \"week\": week,\n",
" \"weeks_since_cohort\": weeks_since_cohort,\n",
" \"cohort_size\": cohort_size,\n",
" \"active_traders\": len(current_traders),\n",
" \"retained_traders\": retained,\n",
" \"previous_traders\": (\n",
" len(previous_traders) if week_idx > 0 else cohort_size\n",
" ),\n",
" \"retention_rate\": round(retention_rate, 2),\n",
" }\n",
" )\n",
" return pd.DataFrame(retention_data)"
]
},
{
"cell_type": "code",
"execution_count": 200,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"all cohorts = ['Nov-17-2024' 'Nov-24-2024' 'Dec-01-2024' 'Dec-08-2024' 'Dec-15-2024'\n",
" 'Dec-22-2024' 'Dec-29-2024' 'Jan-19-2025']\n",
"analyzing cohort Nov-17-2024\n",
"cohort size = 133\n",
"Analyzing week = Nov-17-2024\n",
"Analyzing week = Nov-24-2024\n",
"Retention rate = 91.72932330827066\n",
"Analyzing week = Dec-01-2024\n",
"Retention rate = 96.72131147540983\n",
"Analyzing week = Dec-08-2024\n",
"Retention rate = 94.35483870967742\n",
"Analyzing week = Dec-15-2024\n",
"Retention rate = 90.83333333333333\n",
"Analyzing week = Dec-22-2024\n",
"Retention rate = 89.38053097345133\n",
"Analyzing week = Dec-29-2024\n",
"Retention rate = 84.90566037735849\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 91.30434782608695\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 91.48936170212765\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 71.42857142857143\n",
"analyzing cohort Nov-24-2024\n",
"cohort size = 13\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Analyzing week = Dec-01-2024\n",
"Retention rate = 69.23076923076923\n",
"Analyzing week = Dec-08-2024\n",
"Retention rate = 88.88888888888889\n",
"Analyzing week = Dec-15-2024\n",
"Retention rate = 81.81818181818183\n",
"Analyzing week = Dec-22-2024\n",
"Retention rate = 88.88888888888889\n",
"Analyzing week = Dec-29-2024\n",
"Retention rate = 72.72727272727273\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 88.88888888888889\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 90.0\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 50.0\n",
"analyzing cohort Dec-01-2024\n",
"cohort size = 9\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Skipping\n",
"Analyzing week = Dec-01-2024\n",
"Analyzing week = Dec-08-2024\n",
"Retention rate = 66.66666666666666\n",
"Analyzing week = Dec-15-2024\n",
"Retention rate = 100.0\n",
"Analyzing week = Dec-22-2024\n",
"Retention rate = 83.33333333333334\n",
"Analyzing week = Dec-29-2024\n",
"Retention rate = 80.0\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 75.0\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 50.0\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 50.0\n",
"analyzing cohort Dec-08-2024\n",
"cohort size = 6\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Skipping\n",
"Analyzing week = Dec-01-2024\n",
"Skipping\n",
"Analyzing week = Dec-08-2024\n",
"Analyzing week = Dec-15-2024\n",
"Retention rate = 83.33333333333334\n",
"Analyzing week = Dec-22-2024\n",
"Retention rate = 80.0\n",
"Analyzing week = Dec-29-2024\n",
"Retention rate = 75.0\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 50.0\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 100.0\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 100.0\n",
"analyzing cohort Dec-15-2024\n",
"cohort size = 10\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Skipping\n",
"Analyzing week = Dec-01-2024\n",
"Skipping\n",
"Analyzing week = Dec-08-2024\n",
"Skipping\n",
"Analyzing week = Dec-15-2024\n",
"Analyzing week = Dec-22-2024\n",
"Retention rate = 40.0\n",
"Analyzing week = Dec-29-2024\n",
"Retention rate = 50.0\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 66.66666666666666\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 33.33333333333333\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 0.0\n",
"analyzing cohort Dec-22-2024\n",
"cohort size = 2\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Skipping\n",
"Analyzing week = Dec-01-2024\n",
"Skipping\n",
"Analyzing week = Dec-08-2024\n",
"Skipping\n",
"Analyzing week = Dec-15-2024\n",
"Skipping\n",
"Analyzing week = Dec-22-2024\n",
"Analyzing week = Dec-29-2024\n",
"Retention rate = 0.0\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 0\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 0\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 0\n",
"analyzing cohort Dec-29-2024\n",
"cohort size = 1\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Skipping\n",
"Analyzing week = Dec-01-2024\n",
"Skipping\n",
"Analyzing week = Dec-08-2024\n",
"Skipping\n",
"Analyzing week = Dec-15-2024\n",
"Skipping\n",
"Analyzing week = Dec-22-2024\n",
"Skipping\n",
"Analyzing week = Dec-29-2024\n",
"Analyzing week = Jan-05-2025\n",
"Retention rate = 0.0\n",
"Analyzing week = Jan-12-2025\n",
"Retention rate = 0\n",
"Analyzing week = Jan-19-2025\n",
"Retention rate = 0\n",
"analyzing cohort Jan-19-2025\n",
"cohort size = 1\n",
"Analyzing week = Nov-17-2024\n",
"Skipping\n",
"Analyzing week = Nov-24-2024\n",
"Skipping\n",
"Analyzing week = Dec-01-2024\n",
"Skipping\n",
"Analyzing week = Dec-08-2024\n",
"Skipping\n",
"Analyzing week = Dec-15-2024\n",
"Skipping\n",
"Analyzing week = Dec-22-2024\n",
"Skipping\n",
"Analyzing week = Dec-29-2024\n",
"Skipping\n",
"Analyzing week = Jan-05-2025\n",
"Skipping\n",
"Analyzing week = Jan-12-2025\n",
"Skipping\n",
"Analyzing week = Jan-19-2025\n"
]
}
],
"source": [
"pearl_result = calculate_cohort_retention(df=all_traders, market_creator=\"pearl\", trader_type=\"Olas\")"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"all cohorts = ['Nov-17-2024' 'Nov-24-2024' 'Dec-01-2024' 'Dec-08-2024' 'Jan-05-2025']\n",
"analyzing cohort Nov-17-2024\n",
"cohort size = 69\n",
"analyzing cohort Nov-24-2024\n",
"cohort size = 17\n",
"analyzing cohort Dec-01-2024\n",
"cohort size = 3\n",
"analyzing cohort Dec-08-2024\n",
"cohort size = 6\n",
"analyzing cohort Jan-05-2025\n",
"cohort size = 1\n"
]
}
],
"source": [
"result = calculate_cohort_retention(df=all_traders, market_creator=\"quickstart\", trader_type=\"Olas\")"
]
},
{
"cell_type": "code",
"execution_count": 190,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" cohort_week | \n",
" week | \n",
" weeks_since_cohort | \n",
" cohort_size | \n",
" active_traders | \n",
" retained_traders | \n",
" previous_traders | \n",
" retention_rate | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Nov-17-2024 | \n",
" Nov-17-2024 | \n",
" 0 | \n",
" 69 | \n",
" 69 | \n",
" 69 | \n",
" 69 | \n",
" 100.0 | \n",
"
\n",
" \n",
" 1 | \n",
" Nov-17-2024 | \n",
" Nov-24-2024 | \n",
" 1 | \n",
" 69 | \n",
" 69 | \n",
" 69 | \n",
" 69 | \n",
" 100.0 | \n",
"
\n",
" \n",
" 2 | \n",
" Nov-24-2024 | \n",
" Nov-24-2024 | \n",
" 0 | \n",
" 17 | \n",
" 17 | \n",
" 0 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 5 | \n",
" Dec-01-2024 | \n",
" Dec-01-2024 | \n",
" 0 | \n",
" 3 | \n",
" 3 | \n",
" 0 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 6 | \n",
" Dec-01-2024 | \n",
" Dec-08-2024 | \n",
" 1 | \n",
" 3 | \n",
" 0 | \n",
" 0 | \n",
" 3 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" cohort_week week weeks_since_cohort cohort_size active_traders \\\n",
"0 Nov-17-2024 Nov-17-2024 0 69 69 \n",
"1 Nov-17-2024 Nov-24-2024 1 69 69 \n",
"2 Nov-24-2024 Nov-24-2024 0 17 17 \n",
"5 Dec-01-2024 Dec-01-2024 0 3 3 \n",
"6 Dec-01-2024 Dec-08-2024 1 3 0 \n",
"\n",
" retained_traders previous_traders retention_rate \n",
"0 69 69 100.0 \n",
"1 69 69 100.0 \n",
"2 0 0 0.0 \n",
"5 0 0 0.0 \n",
"6 0 3 0.0 "
]
},
"execution_count": 190,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result.head()"
]
},
{
"cell_type": "code",
"execution_count": 202,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" cohort_week | \n",
" week | \n",
" weeks_since_cohort | \n",
" cohort_size | \n",
" active_traders | \n",
" retained_traders | \n",
" previous_traders | \n",
" retention_rate | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Nov-17-2024 | \n",
" Nov-17-2024 | \n",
" 0 | \n",
" 133 | \n",
" 133 | \n",
" 133 | \n",
" 133 | \n",
" 100.00 | \n",
"
\n",
" \n",
" 1 | \n",
" Nov-17-2024 | \n",
" Nov-24-2024 | \n",
" 1 | \n",
" 133 | \n",
" 122 | \n",
" 122 | \n",
" 133 | \n",
" 91.73 | \n",
"
\n",
" \n",
" 2 | \n",
" Nov-17-2024 | \n",
" Dec-01-2024 | \n",
" 2 | \n",
" 133 | \n",
" 124 | \n",
" 118 | \n",
" 122 | \n",
" 96.72 | \n",
"
\n",
" \n",
" 3 | \n",
" Nov-17-2024 | \n",
" Dec-08-2024 | \n",
" 3 | \n",
" 133 | \n",
" 120 | \n",
" 117 | \n",
" 124 | \n",
" 94.35 | \n",
"
\n",
" \n",
" 4 | \n",
" Nov-17-2024 | \n",
" Dec-15-2024 | \n",
" 4 | \n",
" 133 | \n",
" 113 | \n",
" 109 | \n",
" 120 | \n",
" 90.83 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" cohort_week week weeks_since_cohort cohort_size active_traders \\\n",
"0 Nov-17-2024 Nov-17-2024 0 133 133 \n",
"1 Nov-17-2024 Nov-24-2024 1 133 122 \n",
"2 Nov-17-2024 Dec-01-2024 2 133 124 \n",
"3 Nov-17-2024 Dec-08-2024 3 133 120 \n",
"4 Nov-17-2024 Dec-15-2024 4 133 113 \n",
"\n",
" retained_traders previous_traders retention_rate \n",
"0 133 133 100.00 \n",
"1 122 133 91.73 \n",
"2 118 122 96.72 \n",
"3 117 124 94.35 \n",
"4 109 120 90.83 "
]
},
"execution_count": 202,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pearl_result.head()"
]
},
{
"cell_type": "code",
"execution_count": 217,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"start of the week = 2025-01-12 00:00:00\n"
]
}
],
"source": [
"from datetime import timedelta\n",
"now = datetime.now()\n",
"\n",
"# Get start of the current week (Sunday)\n",
"start_of_week = now - timedelta(days=(now.weekday()) + 1)\n",
"start_of_week = start_of_week.replace(hour=0, minute=0, second=0, microsecond=0)\n",
"print(f\"start of the week = {start_of_week}\")"
]
},
{
"cell_type": "code",
"execution_count": 218,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2025-01-15 14:11:00+0000', tz='UTC')"
]
},
"execution_count": 218,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"max(retention_df.creation_timestamp)"
]
},
{
"cell_type": "code",
"execution_count": 219,
"metadata": {},
"outputs": [],
"source": [
"all_traders[\"creation_date\"] = all_traders[\"creation_timestamp\"].dt.date\n",
"all_traders[\"creation_date\"] = pd.to_datetime(all_traders[\"creation_date\"])"
]
},
{
"cell_type": "code",
"execution_count": 222,
"metadata": {},
"outputs": [],
"source": [
"filtered_traders = all_traders[all_traders[\"creation_date\"] < start_of_week]\n"
]
},
{
"cell_type": "code",
"execution_count": 223,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2025-01-11 00:00:00')"
]
},
"execution_count": 223,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"max(filtered_traders.creation_date)"
]
},
{
"cell_type": "code",
"execution_count": 228,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/777837414.py:2: UserWarning:\n",
"\n",
"Converting to PeriodArray/Index representation will drop timezone information.\n",
"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Nov-17-2024' 'Nov-24-2024' 'Dec-01-2024' 'Dec-08-2024' 'Dec-15-2024'\n",
" 'Dec-22-2024' 'Dec-29-2024' 'Jan-05-2025' 'Jan-12-2025']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/gp/02mb1d514ng739czlxw1lhh00000gn/T/ipykernel_51242/777837414.py:1: SettingWithCopyWarning:\n",
"\n",
"\n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
"\n"
]
}
],
"source": [
"filtered_traders[\"month_year_week\"] =(\n",
" pd.to_datetime(filtered_traders[\"creation_timestamp\"]).dt.to_period(\"W\").dt.strftime(\"%b-%d-%Y\")\n",
")\n",
"\n",
"print(filtered_traders.month_year_week.unique())"
]
},
{
"cell_type": "code",
"execution_count": 229,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_type | \n",
" market_creator | \n",
" trader_address | \n",
" creation_timestamp | \n",
" month_year_week | \n",
" creation_date | \n",
"
\n",
" \n",
" \n",
" \n",
" 819286 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0xd37ea497bfc5303eba99756c700b701443cb9c3d | \n",
" 2025-01-06 00:00:10+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-06 | \n",
"
\n",
" \n",
" 819287 | \n",
" Olas | \n",
" quickstart | \n",
" 0x080a6922f4d85e288f956402bebe6310b13af8e6 | \n",
" 2025-01-06 00:00:25+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-06 | \n",
"
\n",
" \n",
" 819289 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0x5f35a67f81f7278e0e61ae797fc1f34969055b3e | \n",
" 2025-01-06 00:00:45+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-06 | \n",
"
\n",
" \n",
" 819288 | \n",
" Olas | \n",
" quickstart | \n",
" 0x17c17ca981b7e244d0bad80b632a082dc1db36e5 | \n",
" 2025-01-06 00:00:45+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-06 | \n",
"
\n",
" \n",
" 819291 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0xb5f3e3e2738035eead5f3e332c04d9951b95cab2 | \n",
" 2025-01-06 00:00:50+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-06 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 950521 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0xb43b4aee8b0d09244fb5f8df72714595c9f307bb | \n",
" 2025-01-11 23:59:20+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-11 | \n",
"
\n",
" \n",
" 950522 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0x8b61e3164f546880ae26f433d51db788addc4d70 | \n",
" 2025-01-11 23:59:35+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-11 | \n",
"
\n",
" \n",
" 950523 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0x0b3db72453ebce8af6f577e9cf85f56bd07e05db | \n",
" 2025-01-11 23:59:45+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-11 | \n",
"
\n",
" \n",
" 950524 | \n",
" non_Olas | \n",
" quickstart | \n",
" 0x4aebc783154b7763093adb94f4f162bc0bc6d77d | \n",
" 2025-01-11 23:59:50+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-11 | \n",
"
\n",
" \n",
" 950525 | \n",
" Olas | \n",
" quickstart | \n",
" 0x080a6922f4d85e288f956402bebe6310b13af8e6 | \n",
" 2025-01-11 23:59:50+00:00 | \n",
" Jan-12-2025 | \n",
" 2025-01-11 | \n",
"
\n",
" \n",
"
\n",
"
131701 rows × 6 columns
\n",
"
"
],
"text/plain": [
" trader_type market_creator trader_address \\\n",
"819286 non_Olas quickstart 0xd37ea497bfc5303eba99756c700b701443cb9c3d \n",
"819287 Olas quickstart 0x080a6922f4d85e288f956402bebe6310b13af8e6 \n",
"819289 non_Olas quickstart 0x5f35a67f81f7278e0e61ae797fc1f34969055b3e \n",
"819288 Olas quickstart 0x17c17ca981b7e244d0bad80b632a082dc1db36e5 \n",
"819291 non_Olas quickstart 0xb5f3e3e2738035eead5f3e332c04d9951b95cab2 \n",
"... ... ... ... \n",
"950521 non_Olas quickstart 0xb43b4aee8b0d09244fb5f8df72714595c9f307bb \n",
"950522 non_Olas quickstart 0x8b61e3164f546880ae26f433d51db788addc4d70 \n",
"950523 non_Olas quickstart 0x0b3db72453ebce8af6f577e9cf85f56bd07e05db \n",
"950524 non_Olas quickstart 0x4aebc783154b7763093adb94f4f162bc0bc6d77d \n",
"950525 Olas quickstart 0x080a6922f4d85e288f956402bebe6310b13af8e6 \n",
"\n",
" creation_timestamp month_year_week creation_date \n",
"819286 2025-01-06 00:00:10+00:00 Jan-12-2025 2025-01-06 \n",
"819287 2025-01-06 00:00:25+00:00 Jan-12-2025 2025-01-06 \n",
"819289 2025-01-06 00:00:45+00:00 Jan-12-2025 2025-01-06 \n",
"819288 2025-01-06 00:00:45+00:00 Jan-12-2025 2025-01-06 \n",
"819291 2025-01-06 00:00:50+00:00 Jan-12-2025 2025-01-06 \n",
"... ... ... ... \n",
"950521 2025-01-11 23:59:20+00:00 Jan-12-2025 2025-01-11 \n",
"950522 2025-01-11 23:59:35+00:00 Jan-12-2025 2025-01-11 \n",
"950523 2025-01-11 23:59:45+00:00 Jan-12-2025 2025-01-11 \n",
"950524 2025-01-11 23:59:50+00:00 Jan-12-2025 2025-01-11 \n",
"950525 2025-01-11 23:59:50+00:00 Jan-12-2025 2025-01-11 \n",
"\n",
"[131701 rows x 6 columns]"
]
},
"execution_count": 229,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filtered_traders.loc[filtered_traders[\"month_year_week\"]==\"Jan-12-2025\"]"
]
},
{
"cell_type": "code",
"execution_count": 174,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" trader_address | \n",
" creation_timestamp | \n",
" month_year_week | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 | \n",
" 2024-11-20 07:26:35+00:00 | \n",
" Nov-24-2024 | \n",
"
\n",
" \n",
" 1 | \n",
" 0x00897abcbbefe4f558956b7a9d1b7819677e4d90 | \n",
" 2024-11-15 09:01:10+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 2 | \n",
" 0x01c72d0743a22b70d73c76c5e16ba7524e20e0c0 | \n",
" 2024-11-14 18:53:00+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 3 | \n",
" 0x0244169d0fe1014b9e71f71070099d9c2364af28 | \n",
" 2024-11-16 06:06:20+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 4 | \n",
" 0x047f8663b254d90d28af6d8ca7181947e94577ce | \n",
" 2024-11-14 16:55:25+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 170 | \n",
" 0xf792f6a308525b72b5d47f12798668c140f5968e | \n",
" 2024-11-16 11:15:40+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 171 | \n",
" 0xf8e68d9f66d2534df36c23db6770467da1c1ff1b | \n",
" 2024-11-15 01:19:25+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
" 172 | \n",
" 0xfaa64c148c32af3552413438ec78599bffbd077a | \n",
" 2024-11-20 16:07:55+00:00 | \n",
" Nov-24-2024 | \n",
"
\n",
" \n",
" 173 | \n",
" 0xfe16926cefc4db4a7496bfc3e961445228fbbf39 | \n",
" 2024-12-15 12:47:10+00:00 | \n",
" Dec-15-2024 | \n",
"
\n",
" \n",
" 174 | \n",
" 0xfe94203ab2c1c22fe8585cbebf865f7b69eb7027 | \n",
" 2024-11-14 04:05:45+00:00 | \n",
" Nov-17-2024 | \n",
"
\n",
" \n",
"
\n",
"
175 rows × 3 columns
\n",
"
"
],
"text/plain": [
" trader_address creation_timestamp \\\n",
"0 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2 2024-11-20 07:26:35+00:00 \n",
"1 0x00897abcbbefe4f558956b7a9d1b7819677e4d90 2024-11-15 09:01:10+00:00 \n",
"2 0x01c72d0743a22b70d73c76c5e16ba7524e20e0c0 2024-11-14 18:53:00+00:00 \n",
"3 0x0244169d0fe1014b9e71f71070099d9c2364af28 2024-11-16 06:06:20+00:00 \n",
"4 0x047f8663b254d90d28af6d8ca7181947e94577ce 2024-11-14 16:55:25+00:00 \n",
".. ... ... \n",
"170 0xf792f6a308525b72b5d47f12798668c140f5968e 2024-11-16 11:15:40+00:00 \n",
"171 0xf8e68d9f66d2534df36c23db6770467da1c1ff1b 2024-11-15 01:19:25+00:00 \n",
"172 0xfaa64c148c32af3552413438ec78599bffbd077a 2024-11-20 16:07:55+00:00 \n",
"173 0xfe16926cefc4db4a7496bfc3e961445228fbbf39 2024-12-15 12:47:10+00:00 \n",
"174 0xfe94203ab2c1c22fe8585cbebf865f7b69eb7027 2024-11-14 04:05:45+00:00 \n",
"\n",
" month_year_week \n",
"0 Nov-24-2024 \n",
"1 Nov-17-2024 \n",
"2 Nov-17-2024 \n",
"3 Nov-17-2024 \n",
"4 Nov-17-2024 \n",
".. ... \n",
"170 Nov-17-2024 \n",
"171 Nov-17-2024 \n",
"172 Nov-24-2024 \n",
"173 Dec-15-2024 \n",
"174 Nov-17-2024 \n",
"\n",
"[175 rows x 3 columns]"
]
},
"execution_count": 174,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"market_creator=\"pearl\"\n",
"trader_type= \"Olas\"\n",
"df_filtered = all_traders.loc[\n",
" (all_traders[\"market_creator\"] == market_creator) & (all_traders[\"trader_type\"] == trader_type)\n",
"]\n",
"df_filtered = df_filtered.sort_values(by=\"creation_timestamp\", ascending=True)\n",
"# Get first week of activity for each trader\n",
"first_activity = (\n",
" df_filtered.groupby(\"trader_address\")\n",
" .agg({\"creation_timestamp\": \"min\", \"month_year_week\": \"first\"})\n",
" .reset_index()\n",
")\n",
"first_activity"
]
},
{
"cell_type": "code",
"execution_count": 176,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Nov-24-2024', 'Nov-17-2024', 'Dec-01-2024', 'Dec-15-2024',\n",
" 'Dec-08-2024', 'Jan-19-2025', 'Dec-22-2024', 'Dec-29-2024'],\n",
" dtype=object)"
]
},
"execution_count": 176,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_activity.month_year_week.unique()"
]
},
{
"cell_type": "code",
"execution_count": 193,
"metadata": {},
"outputs": [],
"source": [
"def create_retention_matrix(cohort_retention_df: pd.DataFrame) -> pd.DataFrame:\n",
" # Pivot the data to create the retention matrix\n",
" retention_matrix = cohort_retention_df.pivot(\n",
" index='cohort_week',\n",
" columns='weeks_since_cohort',\n",
" values='retention_rate'\n",
" )\n",
" \n",
" # Sort index chronologically\n",
" retention_matrix.index = pd.to_datetime(retention_matrix.index)\n",
" retention_matrix = retention_matrix.sort_index()\n",
" \n",
" # Rename columns to show week numbers\n",
" retention_matrix.columns = [f'Week {i}' for i in retention_matrix.columns]\n",
" \n",
" return retention_matrix\n",
"\n",
"# Example usage:\n",
"# cohort_retention = calculate_cohort_wow_retention(df, market_creator)\n",
"# retention_matrix = create_retention_matrix(cohort_retention)"
]
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Week 0 | \n",
" Week 1 | \n",
" Week 2 | \n",
" Week 3 | \n",
" Week 4 | \n",
" Week 5 | \n",
" Week 6 | \n",
" Week 7 | \n",
" Week 8 | \n",
" Week 9 | \n",
"
\n",
" \n",
" cohort_week | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2024-11-17 | \n",
" 100.0 | \n",
" 91.73 | \n",
" 96.72 | \n",
" 94.35 | \n",
" 90.83 | \n",
" 89.38 | \n",
" 84.91 | \n",
" 91.3 | \n",
" 91.49 | \n",
" 71.43 | \n",
"
\n",
" \n",
" 2024-11-24 | \n",
" 100.0 | \n",
" 69.23 | \n",
" 88.89 | \n",
" 81.82 | \n",
" 88.89 | \n",
" 72.73 | \n",
" 88.89 | \n",
" 90.0 | \n",
" 50.00 | \n",
" NaN | \n",
"
\n",
" \n",
" 2024-12-01 | \n",
" 100.0 | \n",
" 66.67 | \n",
" 100.00 | \n",
" 83.33 | \n",
" 80.00 | \n",
" 75.00 | \n",
" 50.00 | \n",
" 50.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2024-12-08 | \n",
" 100.0 | \n",
" 83.33 | \n",
" 80.00 | \n",
" 75.00 | \n",
" 50.00 | \n",
" 100.00 | \n",
" 100.00 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2024-12-15 | \n",
" 100.0 | \n",
" 40.00 | \n",
" 50.00 | \n",
" 66.67 | \n",
" 33.33 | \n",
" 0.00 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2024-12-22 | \n",
" 100.0 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2024-12-29 | \n",
" 100.0 | \n",
" 0.00 | \n",
" 0.00 | \n",
" 0.00 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2025-01-19 | \n",
" 100.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Week 0 Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 \\\n",
"cohort_week \n",
"2024-11-17 100.0 91.73 96.72 94.35 90.83 89.38 84.91 91.3 \n",
"2024-11-24 100.0 69.23 88.89 81.82 88.89 72.73 88.89 90.0 \n",
"2024-12-01 100.0 66.67 100.00 83.33 80.00 75.00 50.00 50.0 \n",
"2024-12-08 100.0 83.33 80.00 75.00 50.00 100.00 100.00 NaN \n",
"2024-12-15 100.0 40.00 50.00 66.67 33.33 0.00 NaN NaN \n",
"2024-12-22 100.0 0.00 0.00 0.00 0.00 NaN NaN NaN \n",
"2024-12-29 100.0 0.00 0.00 0.00 NaN NaN NaN NaN \n",
"2025-01-19 100.0 NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" Week 8 Week 9 \n",
"cohort_week \n",
"2024-11-17 91.49 71.43 \n",
"2024-11-24 50.00 NaN \n",
"2024-12-01 NaN NaN \n",
"2024-12-08 NaN NaN \n",
"2024-12-15 NaN NaN \n",
"2024-12-22 NaN NaN \n",
"2024-12-29 NaN NaN \n",
"2025-01-19 NaN NaN "
]
},
"execution_count": 203,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retention_matrix = create_retention_matrix(pearl_result)\n",
"retention_matrix"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visualization of the cohort matrix"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.ticker import PercentFormatter\n",
"\n",
"def plot_cohort_retention_heatmap(retention_matrix):\n",
" # Create a copy of the matrix to avoid modifying the original\n",
" retention_matrix = retention_matrix.copy()\n",
" \n",
" # Convert index to datetime and format to date string\n",
" retention_matrix.index = pd.to_datetime(retention_matrix.index).strftime('%a-%b %d')\n",
" \n",
" # Create figure and axes with specified size\n",
" plt.figure(figsize=(12, 8))\n",
" \n",
" # Create mask for NaN values\n",
" mask = retention_matrix.isna()\n",
" \n",
" # Create heatmap\n",
" ax = sns.heatmap(\n",
" data=retention_matrix,\n",
" annot=True, # Show numbers in cells\n",
" fmt='.1f', # Format numbers to 1 decimal place\n",
" cmap='YlOrRd', # Yellow to Orange to Red color scheme\n",
" vmin=0,\n",
" vmax=100,\n",
" center=50,\n",
" cbar_kws={'label': 'Retention Rate (%)', 'format': PercentFormatter()},\n",
" mask=mask,\n",
" annot_kws={'size': 8}\n",
" )\n",
" \n",
" # Customize the plot\n",
" plt.title('Cohort Retention Analysis', pad=20, size=14)\n",
" plt.xlabel('Weeks Since First Trade', size=12)\n",
" plt.ylabel('Cohort Starting Week', size=12)\n",
" \n",
" # Format week numbers on x-axis\n",
" x_labels = [f'Week {i}' for i in retention_matrix.columns]\n",
" ax.set_xticklabels(x_labels, rotation=45, ha='right')\n",
" \n",
" # Set y-axis labels rotation\n",
" plt.yticks(rotation=0)\n",
" \n",
" # Add gridlines\n",
" ax.set_axisbelow(True)\n",
" \n",
" # Adjust layout to prevent label cutoff\n",
" plt.tight_layout()\n",
" \n",
" return plt\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABGwAAAMWCAYAAACk7hB1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3QU1fvH8feWVBISIJBCSSgSinSkCFKVXkREQVSaCEhRkS71K0gR7IUiAiqKqIioP0FaUBAVUKR3Qg0hCSSBhNSd3x+BhZiEpmQ34fM6Z89hZ+7cee7sskmefe4dk2EYBiIiIiIiIiIi4jTMjg5AREREREREREQyU8JGRERERERERMTJKGEjIiIiIiIiIuJklLAREREREREREXEyStiIiIiIiIiIiDgZJWxERERERERERJyMEjYiIiIiIiIiIk5GCRsRERERERERESejhI2IiIiIiIiIiJNRwkZERO46PXv2xGQyER4e7uhQ5BaEh4djMpno2bOno0Nxarn5/p44cSImk4mwsLA7fi4REZG7jRI2IiLilLZt20afPn245557KFCgAB4eHpQtW5annnqK1atXOzq8fyUsLAyTycTEiRNv67hrH25uboSEhNCrVy8OHjz4r2Nr0qQJJpPpX/dzu0JCQggJCXHY+f+N3r17YzKZKFKkCMnJyY4OR0RERPI4q6MDEBERuZbNZmPYsGG88cYbWK1WmjVrRocOHXBxceHIkSP88MMPfPrpp/zvf/9j3Lhxjg7XIWrVqkW7du0AiIuLY9OmTSxcuJBly5bxxx9/EBoa6uAI74zixYuzd+9efHx8HB1KFhcuXGDp0qWYTCbOnTvH8uXLefzxxx0d1h03aNAgunbtSqlSpRwdioiISL6jhI2IiDiVsWPH8sYbb1C9enW++uorypYtm2n/pUuXePfdd4mJiXFQhI5Xu3btLNU5/fv3Z86cObz66qssWrTIMYHdYS4uLlSoUMHRYWTriy++ICEhgaFDh/Lmm28yf/78uyJh4+fnh5+fn6PDEBERyZc0JUpERJzGoUOHmDFjBkWKFGHlypVZkjUAHh4eDB8+nEmTJmXaHh0dzQsvvEDp0qVxc3OjWLFiPPbYY+zatSvH8xmGwdtvv02FChVwc3MjODiYSZMmYbPZsrRNS0vj9ddfp1q1anh4eODj40PTpk357rvvsrRduHAhJpOJhQsX8t1339GgQQO8vb0JCQlh4sSJNG3aFIBJkyZlmt70b9Yc6dOnD5AxleyfLly4wIQJE6hcuTIeHh74+vrSsmVLNm7cmKmdyWRiw4YN9n9fefxzzZgdO3bQtWtXAgMDcXV1JTg4mMGDB2dJol275syhQ4fo1KkThQoVokCBAjz44IP8/fffWdoeO3aMY8eOZTr/leTU9dawOXbsGH369KF48eK4urpSokQJ+vTpw/Hjx7O0vTLtKzU1lYkTJxISEoKbmxvly5fn/fffv+G1zs78+fOxWq2MGDGCpk2bsnbtWo4dO5Zt2yvTvi5evMjzzz9PUFAQbm5uVK1ala+++ipL+wMHDjBixAhq1qxJkSJFcHd3p3z58owaNYqLFy/eMLY1a9ZgMpl47rnnst1/+PBhzGYzLVu2tG+LiIjg+eef55577rG/ZypWrEj//v2Ji4uzt8tpDZv169fTunVr+9j8/f154IEHmDt37g3jFRERkQyqsBEREaexcOFC0tPT6devH/7+/tdt6+bmZv93VFQU9evX5/DhwzRp0oSuXbty9OhRvvrqK3744QdWrVpFw4YNs/QxfPhwNmzYQLt27WjZsiXLly9n4sSJpKSkMGXKFHs7wzB49NFH+fbbbylfvjwDBw4kISGBL774gg4dOvD666/z4osvZun/yy+/5KeffqJdu3Y899xzxMfH06RJE8LDw1m0aBGNGzemSZMm9va+vr63ftH+wWrN/KP93LlzNGrUiN27d9OgQQP69+9PfHw83377LU2bNuXLL7/k4YcfBmDChAksXLiQY8eOMWHCBHsf1atXt/97xYoVPPbYY5jNZjp27EjJkiXZs2cP7777LqtWreL333+nUKFCmWIIDw+nXr16VK5cmd69e3P48GH7+ffu3Yu/vz++vr5MmDCBN998E4AXXnjBfvy11yg7Bw4coGHDhkRFRdG+fXsqV67Mrl27+Oijj/juu+/YuHEj5cuXz3Jct27d+OOPP2jdujUWi4WlS5cycOBAXFxc6Nu3740v9mV79uzht99+o02bNvj7+/P000+zdu1aFixYkOM6RampqbRo0YLz58/TuXNnEhMTWbJkCY899hgrV66kRYsW9rbLli1j/vz5NG3alCZNmmCz2fjtt9+YPn06GzZs4Oeff8bFxSXH+Jo3b07ZsmX57LPPmDlzJp6enpn2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RERERETEyShhIyIiIiIiIiLiZJSwERERERERERFxMkrYiIiIiIiIiIg4GSVsREREREREREScjBI2IiIiIiIiIiJORgkbEREREREREREno4SNiIiIiIiIiIiTUcJGRERERERERMTJKGEjIiIiIiIiIuJklLAREREREREREXEyStiIiIiIiIiIiDgZJWxERERERERERJyMEjYiIiIiIiIiIk5GCRsRERERERERESejhI2IiIiIiIiIOIWff/6Z9u3bExQUhMlkYvny5Zn2G4bB+PHjCQwMxMPDgwcffJCDBw9manPu3Dm6d+9OwYIF8fX1pU+fPly8eNG+Pzw8nEaNGlGgQAEaNWpEeHh4puPbtWvH119/faeGeNOUsBERERERERERp5CQkEC1atV47733st0/Y8YM3n77bWbPns3vv/9OgQIFaNmyJUlJSfY23bt3Z/fu3axevZrvv/+en3/+mWeffda+/6WXXqJ48eJs376dwMBAhg0bZt/3xRdfYDab6dy5850b5E0yGYZhODoIEREREREREZFrmUwmvvnmGx5++GEgo7omKCiIl156yZ5kiYuLw9/fn4ULF9K1a1f27t1LpUqV2LJlC7Vr1wZg5cqVtGnThpMnTxIUFESlSpV4/fXXadWqFT/++CPDhg1j9+7dxMbGct9997Fu3TpKlizpqGHbqcJGRERERERERJze0aNHOXPmDA8++KB9m4+PD3Xr1mXz5s0AbN68GV9fX3uyBuDBBx/EbDbz+++/A1CtWjXWrFmDzWbjp59+omrVqgAMHz6cgQMHOkWyBpSwEREREREREZE7KDk5mfj4+EyP5OTkW+7nzJkzAPj7+2fa7u/vb9935swZihUrlmm/1WqlcOHC9jYzZ85k3759hISEcPDgQWbOnMnPP//M9u3befrpp3nssccoU6YM/fv3JyUl5XaG/J+wOuzM4hCTTKGODuGu84CjA7hLNX7G09Eh3JW2fHLB0SHcldxcNLvZEVytNkeHcFcKruzi6BDuSukper87gkcRvd8dwfXHvY4O4T/n6L8DjQndmDRpUqZtEyZMYOLEiQ6Jp3jx4nz//ff258nJybRs2ZJFixYxefJkvL292b9/P61atWLOnDkMHjzYIXGqwkZERERERERE7pjRo0cTFxeX6TF69Ohb7icgIACAyMjITNsjIyPt+wICAjh79mym/WlpaZw7d87e5p9effVVWrRoQa1atQgLC6Nz5864uLjwyCOPEBYWdstx/ldUYSMiIiIiIiKSjzm6UsPNzQ03N7d/3U/p0qUJCAhg7dq1VK9eHYD4+Hh+//13BgwYAED9+vWJjY1l27Zt1KpVC4B169Zhs9moW7dulj737t3LZ599xvbt2wFIT08nNTUVgNTUVNLT0/913LdLCRsRERERERERcQoXL17k0KFD9udHjx5l+/btFC5cmFKlSvHCCy8wefJk7rnnHkqXLs24ceMICgqy30mqYsWKtGrVir59+zJ79mxSU1MZNGgQXbt2JSgoKNO5DMPg2Wef5Y033qBAgQIANGjQgHnz5lG+fHk+/vhjunXrlmtj/ydHJ9pERERERERERADYunUrNWrUoEaNGgAMHTqUGjVqMH78eABGjBjB4MGDefbZZ7nvvvu4ePEiK1euxN3d3d7H4sWLqVChAs2bN6dNmzY0bNiQuXPnZjnX3Llz8ff3p127dvZtEydOJCkpibp161KuXDkGDhx4h0ecM5NhGFqp8C7i6MWm7kZadNgxtOiwY2jRYcfQosOOoUWHHUOLDjuGFh12DC067Bj5cdHhKQ7+O/BlY79Dz59XqcJGRERERERERMTJaA0bERERERERkXxMlRp5k143EREREREREREno4SNiIiIiIiIiIiT0ZQoERERERERkXxMlRp5k143EREREREREREnowobERERERERkXxMlRp5k143EREREREREREno4SNiIiIiIiIiIiT0ZQoERERERERkXzM5OgA5LaowkZERERERERExMmowkZEREREREQkH1OlRt6k101ERERERERExMkoYSMiIiIiIiIi4mQ0JUpEREREREQkH1OlRt6k101ERERERERExMkoYSMiIiIiIiIi4mQ0JUpEREREREQkH1OlRt6k101ERERERERExMmowkZEREREREQkH1OlRt6k101ERERERERExMkoYSMiIiIiIiIi4mQ0JUpEREREREQkH1OlRt6k101ERERERERExMk4VcImKiqKAQMGUKpUKdzc3AgICKBly5Zs2rTpjp974sSJmEwm+vfvn2n79u3bMZlMhIeH39HzT5kyhfvvvx9PT098fX2z7F+4cCEmkynbx9mzZ+9obCIiIiIiIpJ3mR38kNvjVFOiOnfuTEpKCosWLaJMmTJE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lLAREREREREREXEymhIlIiIiIiIiko+pUiNv0usmIiIiIiIiIuJkVGEjIiIiIiIiko+pUiNv0usmIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+pUiNv0usmIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+pUiNv0usmIiIiIiIiIuJkVGEjIiIiIiIiko+pUiNv0usmIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+pUiNv0usmIiIiIiIiIuJkVGEjIiIiIiIiko+pUiNv0usmIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+pUiNvUsJG5A5r8k6go0O4K+0fH+7oEO5KISUMR4dwV0pNtDk6hLtSUO2Cjg7hrpQUm+roEO5KXuU8HR3CXcny2QJHhyAiDqSEjYiIiIiIiEg+ZnJ0AHJbVBklIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+pUiNv0usmIiIiIiIiIuJkVGEjIiIiIiIiko+pUiNv0usmIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+pUiNv0usmIiIiIiIiIuJkVGEjIiIiIiIiko+ZTI6OQG6HKmxERERERERERJyMEjYiIiIiIiIiIk5GU6JERERERERE8jGzyXB0CHIbVGEjIiIiIiIiIuJkVGEjIiIiIiIiko9p0eG8SRU2IiIiIiIiIiJORgkbEREREREREREnoylRIiIiIiIiIvmYZkTlTaqwERERERERERFxMqqwEREREREREcnHTLqtd56kChsRERERERERESejhI2IiIiIiIiIiJPRlCgRERERERGRfMykVYfzJFXYiIiIiIiIiIg4GVXYiIiIiIiIiORjqrDJm1RhIyIiIiIiIiLiZJSwERERERERERFxMpoSJSIiIiIiIpKPmU2Go0OQ2+BUFTZRUVEMGDCAUqVK4ebmRkBAAC1btmTTpk13/NwTJ07EZDLRv3//TNu3b9+OyWQiPDz8jp07PDycPn36ULp0aTw8PChbtiwTJkwgJSUl2/aHDh3C29sbX1/fOxaTiIiIiIiIiDiOU1XYdO7cmZSUFBYtWkSZMmWIjIxk7dq1xMTE5Mr53d3dmT9/Pi+99BL33HNPrpwTYN++fdhsNubMmUO5cuXYtWsX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jpCaaHN0CHeloNoFHR3CXSkpNtXRIdyV3Eu437iR/Ocsny1wdAh3qVqODuA/t7dwiEPPX/FcuEPPn1epwkZEREREREQkHzM5etVhuS1aw0ZERERERERExMkoYSMiIiIiIiIi4mQ0JUpEREREREQkHzNrSlSepAobEREREREREREnowobERERERERkXwsL93WW65ShY2IiIiIiIiIiJNRwkZERERERERExMloSpTIHfbK4AhHh3BXqoSbo0O4K5VOTnN0CHelMuUdHcHdKfLvC44O4a5U+B5PR4dwV7J8tsDRIYjIv6A1h/MmVdiIiIiIiIiIiDgZJWxERERERERERJyMpkSJiIiIiIiI5GMmzYnKk1RhIyIiIiIiIiLiZFRhIyIiIiIiIpKPmUyGo0OQ26AKGxERERERERERJ6OEjYiIiIiIiIiIk9GUKBEREREREZF8zKxFh/MkVdiIiIiIiIiIiDgZVdiIiIiIiIiI5GO6rXfepAobEREREREREREno4SNiIiIiIiIiIiT0ZQoERERERERkXxMU6LyJlXYiIiIiIiIiIg4GVXYiIiIiIiIiORjJgxHhyC3QRU2IiIiIiIiIiJORgkbEREREREREREnoylRIiIiIiIiIvmYFh3Om1RhIyIiIiIiIiLiZFRhIyIiIiIiIpKPmcwqscmLVGEjIiIiIiIiIuJklLAREREREREREXEymhIlIiIiIiIiko+ZVKqRJ+llExERERERERFxMqqwEREREREREcnHdFvvvEkVNiIiIiIiIiIiTkYJGxERERERERERJ6MpUSIiIiIiIiL5mVlzovIiVdiIiIiIiIiIiDgZp0rYREVFMWDAAEqVKoWbmxsBAQG0bNmSTZs23fFzT5w4EZPJhMlkwmq14ufnR6NGjXjzzTdJTk6+4+ffsWMHDzzwAO7u7pQsWZIZM2Zk2r979246d+5MSEgIJpOJN998847HJCIiIiIiInmfyezYh9wep5oS1blzZ1JSUli0aBFlypQhMjKStWvXEhMTkyvnr1y5MmvWrMFmsxETE0NYWBiTJ0/mk08+ISwsDG9v7zty3vj4eFq0aMGDDz7I7Nmz2blzJ71798bX15dnn30WgMTERMqUKUOXLl148cUX70gcuaHVWy8T2qEZviElmF29I5F/7wOgcLlgHl40DU+/QiTFXeTbnqOI2nPohvv+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OP0aNiIiIiIiIiIidxslbEREREREREREnIwzr/QkIiIiIiIiIv+SyWxydAhyG1RhIyIiIiIiIiLiZJSwERERERERERFxMpoSJSIiIiIiIpKPmTQjKk9ShY2IiIiIiIiIiJNRhY2IiIiIiIhIPmZSqUaepJdNRERERERERMTJKGEjIiIiIiIiIuJkNCVKREREREREJD8za9XhvEgVNiIiIiIiIiIiTkYVNiIiIiIiIiL5mG7rnTepwkZERERERERExMkoYSMiIiIiIiIi4mQ0JUpEREREREQkHzNp0eE8SRU2IiIiIiIiIiJORhU2IiIiIiIiIvmYSaUaeZJeNhERERERERERJ6OEjYiIiIiIiIiIk9GUKBEREREREZF8zGTSosN5kSpsREREREREREScjCpsRERERERERPIzlWrkSXrZREREREREREScjBI2IiIiIiIiIiJORlOiRERERERERPIxrTmcN6nCRkRERERERETEyajCRkRERERERCQfM5lVYpMXqcJGRERERERERMTJKGEjIiIiIiIiIuJkNCVKREREREREJB8zqVQjT1LCRuQOq+noAO5SBRwdwF3qUrLF0SHclY4fSnN0CHellDRXR4dwVwo6ttjRIYiIiOQKJWxERERERERE8jPd1ztPUmGUiIiIiIiIiIiTUcJGRERERERERMTJaEqUiIiIiIiISD6mRYfzJr1sIiIiIiIiIiJORhU2IiIiIiIiIvmYyaxFh/MiVdiIiIiIiIiIiDgZJWxERERERERERJyMpkSJiIiIiIiI5GMmzYjKk1RhIyIiIiIiIiLiZFRhIyIiIiIiIpKPadHhvEkVNiIiIiIiIiIiTkYJGxERERERERERJ6MpUSIiIiIiIiL5mWZE5UmqsBERERERERERcTJK2IiIiIiIiIiIOBlNiRIRERERERHJx0wq1ciT9LKJiIiIiIiIiDgZVdiIiIiIiIiI5GMms1Ydzotuq8Lmt99+u2GbDz744Ha6FhERERERERG5691WwqZ169b8+eefOe6fOnUqgwYNuu2gRERERERERETuZreVsGnQoAEtWrRg586dWfaNHj2al19+meHDh//r4ERERERERETk3zGZHPuQ23NbCZtly5ZRs2ZNHnzwQfbt22ffPnDgQKZPn86UKVOYNm3afxakiIiIiIiIiMjd5LYSNq6urqxYsYKK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amSti3Lw4EF9//33Kl26tKZOnWpXQAAAAAAAIB/dHE0ulho5cqQyMzPVrl07Xbp0SS1btpSnp6eGDx+uoUOH2jWmXYsOS1JcXJwmT56sL7/8UseOHZOU9Riru+++WyNHjlTp0qXtCggFi0WHCx+LDluDRYdxM2HRYQAA8lMRXHR4eSdLr288cPM8RTotLU2HDh3ShQsXFBoaKl9fX/3555/y9s777yd2ddhIUunSpTVjxgzNmDHD3iEAAAAAAACKDA8PD4WGhkqSUlNT9corr2jatGmF95QoAAAAAADgJFh0uMCkpqZq1KhRatiwoZo1a6ZVq1ZJkhYsWKDKlStrxowZeuaZZ+wa2+4OmwMHDmjBggX6/fffde7cOf1zZpVhGFq3bp29wwMAAAAAADi0F198UXPnzlX79u21ZcsWRUZGqm/fvtq2bZteeeUVRUZGytXV1a6x7eqweffdd1WnTh299tprOnTokDIzM2WaZrYtMzPTroAAAAAAAEA+Mize7DRlyhQZhqGnn37ati8lJUVPPPGESpYsKV9fX0VEROj06dO242fPnlXXrl3l6+ursLAw/fjjj9nGfOKJJzR9+nT7g/qHDz74QIsXL9aHH36or776ShkZGbp8+bL27NmjBx54wO5ijWRnh8348eMVFhamL7/8UqVKlbL74gAAAAAAAP/0ww8/aO7cuapbt262/c8884w+//xzffDBB/L399eQIUN07733avPmzZKkSZMmKTk5Wbt27dKbb76pAQMGaMeOHZKkbdu2afv27Xr11fx7YMPx48fVoEHWQtW1a9eWp6ennnnmGRn5MBXMrg6bkydPql+/fhRrAAAAAABAvrpw4YIeeughzZs3T8WLF7ftT0pK0vz58/XKK6+obdu2atCggRYsWKAtW7Zo27ZtkrKWb3nggQd06623auDAgTpw4IAkKT09XYMGDdKcOXNuqOvlnzIyMuTh4WF77ebmJl9f33wZ264Om7p16+rkyZP5EgAAAAAAAChALtYu/JuamqrU1NRs+zw9PeXp6XnV85944gl17txZ7du318SJE237d+7cqfT0dLVv3962r2bNmqpQoYK2bt2qJk2a6Pbbb9f69ev16KOPau3atbYOnWnTpql169Zq2LBhvt6baZrq06eP7V5SUlI0aNAgFStWLNt5K1euzPPYdnXYvPLKK5o/f762bNliz9sBAAAAAMBNYvLkyfL398+2TZ48+arnLl++XLt27brq8VOnTsnDw0MBAQHZ9pcpU8b22OyRI0fKzc1NVatW1ccff6z58+frt99+06JFizR27FgNGjRIVapU0f3336+kpKQbvrdHHnlEpUuXtt1Xr169FBISkuN+7ZGrDptu3brl2Ofv768777xToaGhqlChQo6WIsMw9Mknn9gVFAAAAAAAyCcWP1l71KhRGjZsWLZ9V+uu+eOPP/TUU0/p66+/lpeXl13X8vf319KlS7Pta9u2rf773/9qyZIl+v3333Xw4EENGDBAEyZMuOEFiBcsWHBD77+eXHXY7N27Vz/99FO2LSUlRRUqVNCFCxe0f//+HMd/+umnPAcTHx+vwYMHq0KFCvL09FRQUJDCw8NtiwcVpPHjx8swDBmGITc3N5UqVUotW7bUzJkzc7Ru5bfo6Gh1795dwcHBKlasmOrVq6clS5ZkO2fevHm68847Vbx4cRUvXlzt27fX999/X6BxAQAAAABwozw9PXXLLbdk265WsNm5c6fi4uJUv359ubm5yc3NTRs3btSrr74qNzc3lSlTRmlpaUpMTMz2vtOnTysoKOiq116wYIECAgLUvXt3RUdH65577pG7u7siIyMVHR1dAHebf3LVYXP06NECDiNLRESE0tLStGjRIlWpUkWnT5/WunXrlJCQUCjXr1Wrlr755htlZmYqISFB0dHRmjhxot59911FR0fLz8+vQK67ZcsW1a1bV88//7zKlCmjzz77TL1795a/v7+6dOkiKauo07NnTzVr1kxeXl6aOnWqOnbsqJ9//llly5YtkLgKQqdZY1SjW1sFVCqnOfW66/SeXyRJJapV1D2LpsinVHGlJF3QJ31GKn7/oX899k9h/e5T85EDZLi46Oj6bfr88ShlXr5caPfnLFwmfSZdTpPSs4qR5poFMg9sl8szc/46ycNLKlVWmcPbS5fO5xykeJBcHhwpla4gZWbK/PYDmRveL6Q7cE7G4A+ljHTp8v/nfeu70oF1Mjo8LVVrISMgWJnz+0hxv119gAphMu6fLp2Nse0yFw/M+lzimsi79Y4ejdXIkXN07lyyfH19NGXKIFWvXi7HeR98sEHz5q1WZqapJk1qady4vnJ3t2u5PYi8W4W8W4O8W4O8I7+1a9cuR/NH3759VbNmTT3//PMqX768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2DAMZWZmqmrVqho0aJA++OADHT9+3MLoirZBgwbpv//9ryTp5MmTeuqpp/Sf//xHgYGBaty4sTp27KiNGzey6DZQQPipCYUqKChIvXv3Vlpamp577jn98ssvcnPLWkopJCREt9xyC48kLUBX5njXrVtXTz75pFq0aKGXXnpJ7du31+uvv64aNWpYHGHR9PdfUN3d3W2/aI0ZM0bDhw+Xt7e3VaEVaa6urho1apRatmxpy/n58+cVGBjIWioF4Mr3l1tvvVU7duxQjx49tG7dOq1du1affvqpEhIS1KVLF36ozydXpjmZpqkePXro008/VVhYmKS/nlZUrFgxhYSEqESJElaGWiT16dNHHTt2VFJSknbu3Ckp63vOlf+GhIRYGV6Rd+Xf1VatWumnn37SoUOHJPGkroLg6empZ555RjNnzpSHh4dKlSol6a+icXp6umrUqEExHiggLDqMQnPlr6/33XefLl26pMWLF+vee+/VtGnTFBAQoC+++EJnzpxR/fr1rQ61SLvyeahTp44GDRqkr7/+WidOnNDu3btVt25dq8Mrsq7k/dy5c/Lw8NCMGTP0yiuv6IcffrA9YQT570rerxQTZs2apTNnzqhRo0YWR1Z0lSlTRp988omCg4P1+eef24oIa9askYeHBz/U56O/L7T690Vur+R40aJFcnd3t3WdIf80bNhQTz/9tP7880/16NFDkydPVunSpfXLL79o586dmjVrltUh3hS6d++uDh06aNSoUfrmm294cEUBq1evnt544w21a9dOt9xyi959911t375d06ZNszo0oMiiYIMCceWXpIyMDNtfnK60sLq4uKh3796qXLmyFi9erMjISFWpUkWS9OWXX9rauZF3V8v7P135AT8jI0PLli3T6dOn9cMPP6h27dqFGWqRkpe8lypVSi+++KLS0tL03XffUaC8AXnJ+65du7Rw4UK99957Wr9+vcqVK1eYoRYp/5b39u3ba+LEiWrdunW2YmTNmjULM8wiJzdf71fs2LFDCxcu1NKlS7VhwwaejGana+X8yv5WrVrZfpZ566235OfnJ19fX61du1bVq1e3MHLnltuv9b9Pw1y2bJlSU1Mp2NyA3OS9c+fO+umnn9SgQQPVrl1baWlpWrNmDR3aQAEyTJMl1ZF/rnyzl6QvvvhCCQkJtnU8rnaOJP3+++/y8fGRu7t7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AgMDsXr1aixduhSVlZWIi4tDr169cPbsWezZswfz5s3DW2+9BScnJ/z+97+HXq/HyJEjMXfuXDzyyCOoqqrCwYMH4enpidzcXKt1OTk54ZNPPkFcXBzi4+Px5ZdfYvLkycjPz8eCBQswc+ZMDB06FC0tLdi+fTs0Gg1mzJjR7s/Z2NiIsLAwPPXUU4iNjcXAgQNx7do15OTkoKCgAHFxcQgNDX3gnpMmTcKLL76IjRs3oqKiQn2Up6CgAJMmTcKCBQs63M4WOtpTp9PBYDBg/fr18PPzQ0BAAMaPH9+pa/H09ERkZCTeeecd3Lx5E4888gj279+Ps2fPWl2bnp6Offv2YcKECXj11VfR0tKC9957DyNHjsTx48fV6+ypNREREd0bDmyIiMjhRUREoKCgQH0E6lbh4eHIzMxEr169EBISYnFuyZIlGDp0KDZs2KDeUTJw4EBMnToV06dPV6+bOHEiiouLsWrVKmzatAnXr1+Hr68vxo8f3+YeNWYuLi7485//DL1ej+effx4GgwEhISGIiYlBbm4uqqqq4O7ujpCQEOzdu1f9bUJt6d27N373u9/hiy++QFZWFi5dugSNRoPHH38ca9euxaJFi+4nXZuysrIQHByMjz76CIsXL4aXlxfGjBljcfdSR9s9bB3tuX79esybNw/Lli1DU1MTEhMTO31gAwA7d+7EwoULsXnzZgghMHXqVOzduxd+fn4W1wUHByMvLw9vvvkmli9fDn9/f6Snp+OHH36wGNgA9tOaiIiI7o0ibr8/loiIiIiIiIiIpOIeNkREREREREREdoYDGyIiIiIiIiIiO8OBDRERERERERGRneHAhoiIiIiIiIjIznBgQ0RERERERERkZziwISIiIiIiIiKyMxzYEBERERERERHZGQ5siIiIiIiIiIjsDAc2RERERERERER2hgMbIiIiIiIiIiI7w4ENEREREREREZGd4cCGiIiIiIiIiMjOcGBDRERERERERGRn/g8w0CKSbf1YlgAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plot_cohort_retention_heatmap(cohort_retention)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "hf_dashboards",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}