Created
May 16, 2022 16:36
-
-
Save garethtdavies/4964305c7e496c5b4024cb4368a41450 to your computer and use it in GitHub Desktop.
Epoch 14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"id": "8ff8b803", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The blackcellmagic extension is already loaded. To reload it, use:\n", | |
" %reload_ext blackcellmagic\n", | |
"The autoreload extension is already loaded. To reload it, use:\n", | |
" %reload_ext autoreload\n" | |
] | |
} | |
], | |
"source": [ | |
"%matplotlib inline\n", | |
"%load_ext blackcellmagic\n", | |
"%load_ext autoreload\n", | |
"%autoreload 2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"id": "61d997ca", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import pickle\n", | |
"import seaborn as sns\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"from scipy.stats import binom\n", | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"\n", | |
"from minavrfpy import lib" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "f1e3d196", | |
"metadata": {}, | |
"source": [ | |
"## single epoch" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"id": "54d2da3f", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"epoch = 14\n", | |
"bp_key = \"B62qrQiw9JhUumq457sMxicgQ94Z1WD9JChzJu19kBE8Szb5T8tcUAC\"\n", | |
"\n", | |
"results = lib.get_epoch_df(epoch, block_producer_key=bp_key)\n", | |
"\n", | |
"df = results['df']\n", | |
"stakes_df = results['stakes_df']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "0bc680d4", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "f7f45cde", | |
"metadata": {}, | |
"source": [ | |
"## data quick look" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"id": "069a62ec", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"dict_keys(['df', 'total_time', 'stakes_df', 'winner_df', 'my_winner_df', 'epoch_data'])" | |
] | |
}, | |
"execution_count": 22, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"results.keys()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"id": "073a2d89", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>epoch</th>\n", | |
" <th>slot</th>\n", | |
" <th>global_slot</th>\n", | |
" <th>block</th>\n", | |
" <th>winner_exists</th>\n", | |
" <th>saw_my_producer</th>\n", | |
" <th>bp_won</th>\n", | |
" <th>block_time</th>\n", | |
" <th>received_time</th>\n", | |
" <th>winner_pk</th>\n", | |
" <th>super_charged</th>\n", | |
" <th>block_height_equal</th>\n", | |
" <th>too_late</th>\n", | |
" <th>min_bt</th>\n", | |
" <th>min_bt_minutes</th>\n", | |
" <th>outcome</th>\n", | |
" <th>next_block_in</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>14</td>\n", | |
" <td>88</td>\n", | |
" <td>100048</td>\n", | |
" <td>69811</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>[]</td>\n", | |
" <td>2021-10-11 10:26:48.554000+00:00</td>\n", | |
" <td>B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>True</td>\n", | |
" <td>0 days 00:00:00</td>\n", | |
" <td>0.00</td>\n", | |
" <td>LOST</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>14</td>\n", | |
" <td>162</td>\n", | |
" <td>100122</td>\n", | |
" <td>69852</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>[]</td>\n", | |
" <td>2021-10-11 14:08:03.649000+00:00</td>\n", | |
" <td>B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7A...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>True</td>\n", | |
" <td>0 days 00:00:00</td>\n", | |
" <td>0.00</td>\n", | |
" <td>LOST</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>14</td>\n", | |
" <td>206</td>\n", | |
" <td>100166</td>\n", | |
" <td>69871</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>[]</td>\n", | |
" <td>2021-10-11 16:20:40.128000+00:00</td>\n", | |
" <td>B62qopfSgwEn28YdwZHh4khMy3KEG9dy8Jfrv7cveUJw2s...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>True</td>\n", | |
" <td>0 days 00:00:00</td>\n", | |
" <td>0.00</td>\n", | |
" <td>MISSED_NOT_PRODUCED</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>14</td>\n", | |
" <td>295</td>\n", | |
" <td>100255</td>\n", | |
" <td>69925</td>\n", | |
" <td>True</td>\n", | |
" <td>True</td>\n", | |
" <td>True</td>\n", | |
" <td>[0 days 00:02:21.657000, 0 days 00:02:31.84300...</td>\n", | |
" <td>2021-10-11 20:47:21.657000+00:00</td>\n", | |
" <td>B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7A...</td>\n", | |
" <td>False</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>0 days 00:02:21.657000</td>\n", | |
" <td>2.35</td>\n", | |
" <td>WON</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>14</td>\n", | |
" <td>404</td>\n", | |
" <td>100364</td>\n", | |
" <td>69987</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>[]</td>\n", | |
" <td>2021-10-12 02:15:21.287000+00:00</td>\n", | |
" <td>B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>True</td>\n", | |
" <td>0 days 00:00:00</td>\n", | |
" <td>0.00</td>\n", | |
" <td>LOST</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" epoch slot global_slot block winner_exists saw_my_producer bp_won \\\n", | |
"0 14 88 100048 69811 True False False \n", | |
"1 14 162 100122 69852 True False False \n", | |
"2 14 206 100166 69871 True False False \n", | |
"3 14 295 100255 69925 True True True \n", | |
"4 14 404 100364 69987 True False False \n", | |
"\n", | |
" block_time \\\n", | |
"0 [] \n", | |
"1 [] \n", | |
"2 [] \n", | |
"3 [0 days 00:02:21.657000, 0 days 00:02:31.84300... \n", | |
"4 [] \n", | |
"\n", | |
" received_time \\\n", | |
"0 2021-10-11 10:26:48.554000+00:00 \n", | |
"1 2021-10-11 14:08:03.649000+00:00 \n", | |
"2 2021-10-11 16:20:40.128000+00:00 \n", | |
"3 2021-10-11 20:47:21.657000+00:00 \n", | |
"4 2021-10-12 02:15:21.287000+00:00 \n", | |
"\n", | |
" winner_pk super_charged \\\n", | |
"0 B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp... False \n", | |
"1 B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7A... False \n", | |
"2 B62qopfSgwEn28YdwZHh4khMy3KEG9dy8Jfrv7cveUJw2s... False \n", | |
"3 B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7A... False \n", | |
"4 B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp... False \n", | |
"\n", | |
" block_height_equal too_late min_bt min_bt_minutes \\\n", | |
"0 False True 0 days 00:00:00 0.00 \n", | |
"1 False True 0 days 00:00:00 0.00 \n", | |
"2 False True 0 days 00:00:00 0.00 \n", | |
"3 True False 0 days 00:02:21.657000 2.35 \n", | |
"4 False True 0 days 00:00:00 0.00 \n", | |
"\n", | |
" outcome next_block_in \n", | |
"0 LOST NaN \n", | |
"1 LOST NaN \n", | |
"2 MISSED_NOT_PRODUCED NaN \n", | |
"3 WON NaN \n", | |
"4 LOST NaN " | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"id": "20cf1025", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(87, 17)" | |
] | |
}, | |
"execution_count": 24, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"id": "1ca5487c", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>balance</th>\n", | |
" <th>public_key</th>\n", | |
" <th>timing_timed_weighting</th>\n", | |
" <th>timing</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1.266174e+06</td>\n", | |
" <td>B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp...</td>\n", | |
" <td>0.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>9.530386e+05</td>\n", | |
" <td>B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7A...</td>\n", | |
" <td>0.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>9.179291e+05</td>\n", | |
" <td>B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq...</td>\n", | |
" <td>0.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>6.352116e+05</td>\n", | |
" <td>B62qopfSgwEn28YdwZHh4khMy3KEG9dy8Jfrv7cveUJw2s...</td>\n", | |
" <td>0.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>1.860791e+05</td>\n", | |
" <td>B62qnKL3FsuFybueAX1GUy74FCaRmxFXayNaP1MKTJZu3Q...</td>\n", | |
" <td>1.0</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" balance public_key \\\n", | |
"0 1.266174e+06 B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp... \n", | |
"1 9.530386e+05 B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7A... \n", | |
"2 9.179291e+05 B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq... \n", | |
"3 6.352116e+05 B62qopfSgwEn28YdwZHh4khMy3KEG9dy8Jfrv7cveUJw2s... \n", | |
"4 1.860791e+05 B62qnKL3FsuFybueAX1GUy74FCaRmxFXayNaP1MKTJZu3Q... \n", | |
"\n", | |
" timing_timed_weighting timing \n", | |
"0 0.0 NaN \n", | |
"1 0.0 NaN \n", | |
"2 0.0 NaN \n", | |
"3 0.0 NaN \n", | |
"4 1.0 NaN " | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"stakes_df.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"id": "9bea33fd", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGpaufBop6Si 19\n", | |
"B62qkBoe9qNqxTiXBe5euvRvZi8rCUq9TgHfM2BwmcED7ADJHFkDQJN 16\n", | |
"B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq8KdFtKnYb 11\n", | |
"B62qopfSgwEn28YdwZHh4khMy3KEG9dy8Jfrv7cveUJw2sHzSCnWoqA 9\n", | |
"B62qnKL3FsuFybueAX1GUy74FCaRmxFXayNaP1MKTJZu3QDxH8AttJD 3\n", | |
"B62qiu87TTkY8D8pEyH7XNx8RzLXiSHN1Ej2P3Q4H28zNajvXswJCeh 2\n", | |
"B62qj2gPKXJW6S2Q5qZQ2FZiL5jcMMvHdZYx9EWJnNDeRkTKPURSSPG 2\n", | |
"B62qkBMexQj12N8fYEeXMz23qVYpPtXwJYsnmRGsXJYcprgie5onhdz 1\n", | |
"B62qodVAxivpw1ver1GkXSAXh2aPuQEQXMs44mqALK9Tb7BWKdBxUaz 1\n", | |
"B62qpMAH6caaCb4rXPp2cRHYTdbiEvSKMzRtAsRdnh9oCstRJxxVHK2 1\n", | |
"B62qmCkwZeZyFAruCq5gGtCWEmiJJMvoFgb3todqzuemCZFT4oAJ6NF 1\n", | |
"B62qiwdP5ZgWkVy1yFWjTqMKC6dLC4NoZv9iKsSGvPnTFuX7RHhpAAB 1\n", | |
"B62qrz3TPNCKYDWsb11jcvzKKHKGySopEbm7tpRYYt495qLfDSEdYm1 1\n", | |
"B62qkTvL5o8LqNb6AtVR84smE4qgTJh2uySj8ufQd8cG8Qy4rPP1UDg 1\n", | |
"B62qoa1HoPXEQQCqPDoma3u2h6dRHtfdNA8xGnPaNDggbQNUtk6SxF1 1\n", | |
"B62qmGXshi4i4NzjTGADJpbxVxqvChgUcohZzYZtzpB8BV1QDrYNs9B 1\n", | |
"B62qqzpxAzjZweRe5dYuTkiHDtENStJjYj3tvJMVWNeLQTMvUCMUg1v 1\n", | |
"B62qkU9odZBJZVDkkQTcZiVm5N86Dq3vqJBJxHziNgzVMJVqmKmm73J 1\n", | |
"B62qpSFWPM7B8oaXBWZrX91c1unnf5Q8EYCbicKHQRwt3RpaQvCYHbi 1\n", | |
"B62qidNtQcb2hTiTy15LBLMbVJ2ArRTTyUArFMYZ6S4Cp8CXWQpwnDf 1\n", | |
"B62qrXo8soPBcTi8G2EHAUxJk1hpsQKqBoc2oXsHkwczxheJTeMzrCh 1\n", | |
"B62qqM2CqymZt3DEtvqCxqBfNzejFtiRsD8ffGVd2E8FeJHNZJW5nMz 1\n", | |
"B62qjT8M41Cwk5nbfipV4skYVTuj6pMZzURKMY4rHzPEzH1zfzaf8Ph 1\n", | |
"B62qpUXHbTVzyvZT8cs6fS3h8g74PNa4nFHTC7rhK29geJECWZnj1EY 1\n", | |
"B62qjSB9vyW6RqkNvkeYtbw9RhCFseKjdmXownB2wHAxpYFh2GLsTdZ 1\n", | |
"B62qpUuLibGgBTL9tjTmrnnHvKA7rSf6yTsevbZ9gAbuoAeEG9LnWZb 1\n", | |
"B62qkSEyPYcWrHx6wVgNn9ptoncWtp9vnzvj7W18d3Bco1sYQLih4ma 1\n", | |
"B62qrc1oV3hwHn8B6ShcUtSXo4kfr7ES4N14V7bzUTe5dAU8TmL1Y3V 1\n", | |
"B62qo4ptt2LrTSGFagi9YGqQTumdQWiXe9Jfxs9eVckk9XndgcPg1rd 1\n", | |
"B62qr5Kat2je68ni2TyEZiaPCf5iKPxCZPWjsEgdEJh9g3ZCB7GLWXs 1\n", | |
"B62qntv5zyGRmSuRaJa7CHTFqhJPpoH2kixuCqmLaFP7Bs5Um1Gcmay 1\n", | |
"B62qnf4ieWyJWjLhL4GGXE3tLTLofHfgLTK6ZCPrrRnFrS4KEZ94m5K 1\n", | |
"Name: winner_pk, dtype: int64" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.winner_pk.value_counts()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"id": "4cd3ed83", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>winner_pk</th>\n", | |
" <th>slot</th>\n", | |
" <th>super_charged</th>\n", | |
" <th>next_block_in</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
"Empty DataFrame\n", | |
"Columns: [winner_pk, slot, super_charged, next_block_in]\n", | |
"Index: []" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[df.outcome == 'FUTURE'][['winner_pk', 'slot', 'super_charged', 'next_block_in']]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"id": "50086e9d", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>epoch</th>\n", | |
" <th>slot</th>\n", | |
" <th>global_slot</th>\n", | |
" <th>block</th>\n", | |
" <th>winner_exists</th>\n", | |
" <th>saw_my_producer</th>\n", | |
" <th>bp_won</th>\n", | |
" <th>block_time</th>\n", | |
" <th>received_time</th>\n", | |
" <th>winner_pk</th>\n", | |
" <th>super_charged</th>\n", | |
" <th>block_height_equal</th>\n", | |
" <th>too_late</th>\n", | |
" <th>min_bt</th>\n", | |
" <th>min_bt_minutes</th>\n", | |
" <th>outcome</th>\n", | |
" <th>next_block_in</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
"Empty DataFrame\n", | |
"Columns: [epoch, slot, global_slot, block, winner_exists, saw_my_producer, bp_won, block_time, received_time, winner_pk, super_charged, block_height_equal, too_late, min_bt, min_bt_minutes, outcome, next_block_in]\n", | |
"Index: []" | |
] | |
}, | |
"execution_count": 28, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[df.outcome == 'FUTURE']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"id": "14fbb490", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"epoch 24\n", | |
"slot 24\n", | |
"global_slot 24\n", | |
"block 24\n", | |
"winner_exists 24\n", | |
"saw_my_producer 24\n", | |
"bp_won 24\n", | |
"block_time 24\n", | |
"received_time 22\n", | |
"winner_pk 24\n", | |
"super_charged 24\n", | |
"block_height_equal 24\n", | |
"too_late 24\n", | |
"min_bt 24\n", | |
"min_bt_minutes 24\n", | |
"outcome 24\n", | |
"next_block_in 0\n", | |
"dtype: int64" | |
] | |
}, | |
"execution_count": 29, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[df.super_charged == True].count()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"id": "c9fdc0ef", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"87" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"slots_won = df[(df.epoch == epoch)].slot.nunique()\n", | |
"slots_won" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "a925542b", | |
"metadata": {}, | |
"source": [ | |
"## outcome per epoch" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"id": "58a5ba86", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<AxesSubplot:xlabel='epoch', ylabel='outcome_count'>" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAE/CAYAAAC5EpGHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA1dklEQVR4nO3dd3RU5fr28e9MJoEE6QlFmggIBJReojQpkQ5SFFAiSD/SkV6VjhQpgqAUQUBBUSk5gIbXgiD10BQpCh5KgAAJxUgmU94/cpgfIYUJZBJ2cn3Wci1mzy73Rlau7Gfv/dwmp9PpRERERAzFnN4FiIiISMopwEVERAxIAS4iImJACnAREREDUoCLiIgYkAJcRETEgBTgIiIiBmRJ7wJSKjLybxwOvbouIiIZm9lsInfubEl+b7gAdzicCnAREcn0NIQuIiJiQApwERERAzLcELqIyF12u43IyAhsNmt6lyLySCwWH3LnDsDLy/1YVoCLiGFFRkaQNasf2bIVwGQypXc5Ig/F6XTy9983iYyMwN+/oNvbaQhdRAzLZrOSLVsOhbcYmslkIlu2HCkeSVKAi4ihKbwlI3iYf8cKcBEREQNSgIuIZFKbNn3Nhg3r07sMeUgKcBGRTOrIkUPcuXMnvcuQh6Sn0D0se46sZM3ind5lpIk7MbHcuqkfBiLp5ZtvNvDFF59hNnuRJ08eBg0axqpVyylevASdOnUGYPLkCRQvXoJChQqzc+eP7Nu3hyxZstCqVRsWLZrHzz/vxGLxonz55xgyZAQmk4n582dz4MA+zGYzgYHl6d9/MH5+2WjXrgWNGjVm166d3Lx5g27denLkyGFOnPgdi8XC9Omz8fcPICLiCrNnz+Dy5UvY7TYaNAgmJOTNdP7bMj4FuIdlzeJNp2Gr07uMNLFmxmvcQgEukh4OHNjHmjUr+fDD5eTOnZvQ0E2MGvU2ZcoEJrp+3bovsnPnDxQvXoK2bV9h/frPOHHidz75ZA3e3j5MmDCasLDtXLhwnqtXI1ixYi1ms5lp0ybywQdzGTp0FABWawyffLKWsLDtvPPOGJYu/ZRSpZ5h5Mi3CQ3dREjIm0ycOI5XXulErVp1iImJYejQARQqVIQGDRql5V9RhqMhdBGRDGDPnl3Ur9+I3LlzA9C0aQsiIq64vf3+/Xt46aWmZMmSFbPZzLvvTqVx42b88svPtG7dFovFgtlspl27V/nll12u7erWrQ9AoUKFyZMnL6VKPeP6fPPmTf755x8OHTrIxx9/SJcunejVqyuXL1/i9OmTqXj2mZOuwEVEMgCHw4mXV/xlTidcvnyJp58u4VoWGxub6PZeXhbufZPp+vVriTaPcjic2Gw212cfHx/Xny2WhJHicNhxOp18+OEysmbNCkBUVFS87eTh6ApcRCQDqFGjJjt2fEtkZCQAW7ZsJGfOnJQtG8jvvx8H4oLzyJFDrm28vLyw2+PCuGrV6nz77TasVisOh4OZM6fx3XdbqV69Jl9//SU2mw2Hw8GGDeuoVq2G23Vly/YE5co9y2effQrArVu36NPnTXbu/CGVzjzz0hW4iEgGUK1aTV55pRMDBvTG4XCSK1cupk+fQ7Zs2Xj33bF07NiGggWfpFKlyq5tatZ8njlzZgDQqVMIly5dpFu313E6oVKlKrRr1wG73caCBXPp0qUTdruNwMByDBw4LEW1jR8/iTlzZhAS8iqxsbE0bPgSwcFNUvX8MyOT0+k0VHPta9duG6ofeEBA9kz1EFtExK30LkMykUuX/qJAgWLpXYZIqrj/37PZbCJv3ieSXF9D6CIiIgakABcRETEgBbiIiIgBKcBFREQMSAEuIiJiQApwERERA9J74CKSYXiqeZAa9cjjSAEuIhmGp5oHudOoZ+DAf/Hyy+2pW/dFABYseJ9vvvmS0NAdeHvH/VLRqlVjFi1ayrFjR1i9eiV2ux2z2UT9+o3o3LkrXl5eHDy4nyFD+rF06afxpkCtVasqO3fuT/VzE+PSELqISCqoUqU6x44dcX3ev38vgYHPuqYuPX/+HL6+vhw6dJDVqz9hypT3+PTTdXz44TJOnjzBjBmT4+1vypR3sNvtaXkKYjAKcBGRVFClSlWOHj0MQETEFby9vXnxxQbs2bMbgMOH/0PVqjVYtmwJAwa8TaFChQHw88vGiBFj+fbbbVy6FA5AuXLPkj17dlav/iR9TkYMQQEuIpIKSpcuy4UL54mJiWHv3l+oXr0m1avXZO/eX4C4AK9cuSqXLoUTGFg+3rY5cuSgePGnOXHiuGvZ8OFjWbduDX/++UeanocYhwJcRCQVeHl5Ua5ceX7//Th79+6mevWaPPlkIe7cucPNmzc5duwIgYHlAFwdwO5ls8Vv81mgQAF69nxLQ+mSJAW4iEgqqVKlOkePHuK3336jXLlngbg2nTt3/kDOnDkpUKAghQoV5tixo/G2i4qK4sKF85QuHRhvecuWL2soXZKkABcRSSVVqlRl69ZQSpQogcUS95JPtWo1+OyzT6laNa6Hdo8efZg3bxYXLpwHIDo6munTJ9KgQTAFChRIsM+7Q+ki99NrZCKSYdyJiWXNjNc8sl93PP10SW7evEG1au1cy6pUqca4cSOoXr0mAA0bvoSXlxfjxo3Eao3B4XDQsOFLdO7cNdF93h1Kv/8pdRH1A/cw9QMX8Rz1A5eMRP3ARUREMgEFuIiIiAEpwEVERAxIAS4iImJACnAREREDUoCLiIgYkN4DF5EMI3dOHyw+WVJ9vzZrDJE3rA9c7+DB/SxbtoQFC5bEWx4dHc2iRfPZu3c3WbP6ki1bNt58sydVq1YH4NatW8yePZ0//jgFgL9/PgYNGkqRIkUZOfJtwsMv8s8/0Vy/fo1ChYoA0KdPP2rUCErlMxUjUYCLSIZh8cnCgRndU32/VYZ9DDw4wBPjdDoZPnwQpUo9w6efrsfb25uTJ39n6NCBjB8/icqVq7J48QKefroE48dPAuDbb7cyfvxIli1bzdSpM4GkfzmQzEsBLiLiQf/5zwEuXbrEvHkfYjKZAHjmmTK88UY3PvlkKZUrV+XatWvkzp0Hh8OB2WymQYNgfH390rlyedzpHriIiAf9/vtvlClT1hXed1WsWInjx38D4I03urFly0Zatgxm3LiRbNmykWrVaqRHuWIgCnAREY8yJdoONDb2/1qKlilTlnXrvmHixOkUKVKUzz77lLfe6oHNlrDtqMhdCnAREQ+K6xH+W4IwPnbsCGXLBuJ0Opk5cyp2u51KlarQo0cfPvnkM6KiIjl16kQ6VS1GoAAXEfGgChUqUbx4CebOneUK8d9/P87KlUt5441umEwmzp49w9q1q3A4HABcvRqB3W6nUKHC6Vm6POY8/hDb9OnTiYyMZNq0aRw/fpwxY8Zw+/ZtqlatyjvvvOPqmSsi8qhs1pj/PTGe+vt115Ejh2jUqLbrc3BwE6ZMmcGSJQvp3PkVvLy8yJ49B2PHTqRy5aoATJgwhfnzZ9G+fUt8fX3Jlu0Jxo+fRI4cOVP9XCTj8Gg70d27dzNo0CDq1avHtGnTaN68OZMmTaJixYqMGjWK8uXL06lTpxTtU+1EH19qJyppTe1EJSN5bNqJRkVFMWfOHHr37g3AhQsXuHPnDhUrVgSgTZs2bN261VOHFxERydA8Nn49btw4Bg0aRHh4OABXrlwhICDA9X1AQACXL19O8X6T+21E0l9AQPb0LkEykStXzFgsepRHMgaz2Zyin6EeCfD169dTsGBBgoKC2LBhAxA3G9H97n8v0h1GHELPTDSELmnJ4XBgsznSuwyRVOFwOOL9DH3QELpHAjw0NJSIiAhatWrFjRs3iI6OxmQycfXqVdc6ERER5MuXzxOHFxERyfA8EuDLly93/XnDhg3s3buXqVOn0rx5cw4cOECVKlX4+uuvqVOnjicOLyIikuGl6TtcM2fOZMyYMfz9998EBgYSEhKSlocXERHJMDwe4G3atKFNmzYAlClThi+++MLThxSRTCpHzixk8fFJ9f3GWK3cvOH+u+AiaUGzqIhIhpHFx4cuywek+n5XdJ0LKMDl8aIAFxFJJeHhF2nfviUtW77MsGGjXctPnTpB166vMWrUeEJDN/Hmmz2pXLkqp0+fYt68Wdy4cQO73U758s8yYMDb+Pr6YrVamT9/DocOHcBsNvPEE9np23cgZcuWIzz8Ih07tuGpp56Od/wWLVrTtu0rtGvXgqxZs2KxeGOzxZI9e3b69RtMYGD5ZOvv27enq7a7Jk+eQKVKVWjatEW8/d71zDOlGTVqPEuXLgagW7deAJw8+TtLlizk/PlzADz5ZCH69RtM8eJxNdeqVZWdO/fHO367di2YP38xa9as4ujRw9hssZw/f851nu3bd6BZs5aJ1n7w4H6GDx9EoUJFcDqdxMTEULFiJfr3H4Kfnx/h4Rfp168XX3yxKd6691q6dBXTpk3kwIF98WbBCwp6gV693kr27y49KMBFRFJRzpw52bNnN3a7HS8vLwDCwr4lV67cCdYdP34kI0eOo3z553A4HMyePZ2PP15Ev36DWbduDU6ng5UrP8dkMnHkyCFGjBjMl19uAcDfP4AVK9YkWcd7782lYMEnAdi1aydDhw5g9eovyZUr1yOd3737Tcq5c/9l8OC+jB49gaCgWgD89NP3DB06gDVrvsTnAbc5hgwZDuAK3eTO816lS5dlwYIlANhsNqZOfYdZs6YyduzEZNe9X/fuvWnatIVbx0xPmgFBRCQV+fr68cwzpTl8+D+uZXv3/kLVqtUTrHvt2jXu3LkDxE3i0bVrD158sREA169fIzY21tUA5bnnKjJy5PhEW5M+yPPP16Js2XJ8+23azH65Zs0qmjZt4QpvgNq16/H6612Ijo5OkxosFgv/+tcAvvtuO7duZcz5KXQFLiKSyl58sRH/7/+FUblyVY4f/5WSJUslOplV//6DGTFiMP7+AVSqVJXatevy/PNxode+fUeGDh1I8+YNqVSpClWqVKdJk+ZkyZIFiOtY1qVL/F4SY8e+S4kSJROt6emnS/DXX2cfWPv06ZPw9fVzfb58+RKVKlVxfR46dEC8IfTEhrV/++0oPXsmHHJu3bptvM/313/1asQD60uJvHn9yZ49B+fO/UXu3HnifXfixPF4x+/UqTPBwU0A+PjjD1m3bq3ru4ULP8LPL1uq1pYaFOAiIqmsVq3afPTRIhwOB2Fh31K/fiPCwrYnWK9p0xbUq1efffv2sn//XqZMmUCjRk0YMGAIBQs+yapVn3P8+K/s37+XrVu3sG7dGpYti2uO9KAh9IRMrvBPzvDhYxLcA7+XO0PoEH+mzQED/sWNG1H8/fdtevfuS4MGwQAJ6m/XLvWHrU0mE1myZE2wXEPoIiKSgJ9fNkqWLMWRI4c4eHBfosPn5879lxUrPsbPLxt1677IkCHDWbRoGZs2fQXA4sUfcPVqBIGB5QkJeZOlS1fh7+/Pvn17HqqmP/44TfHixR/pvNxVpkwgR48edn2eO3chK1asoWLFysTEpN3T/NeuXeXvv29n2L7qugIXkQwjxmr93ytfqb/flKpfvyEffriA0qUDsVgS/qjNlSs369ev5dlnK1ClSjUAzpz5k1KlSgMQEXGFFSs+ZuDAoXh7e3Pz5g0iI6OSHCJPzs6dP3Lq1AkmTpya4m0fxuuvd+Gtt3rw3HMVXPfBL168wOnTJ13n6mlWq5WFC+fRpElzsmZNeAWeESjARSTDiJts5fF4X/uFF+owbdpEunfvnej32bNnZ8aMuSxaNI9p0ybh7W2haNFiTJgwGYDBg4cxf/77dOzYhqxZffH2ttCnT1+KFXuK8PCLid4Dr1ixEgMHDgXi36vOmTMXs2bNS5X7uPffA8+aNSsffrgs3jpFihRl7txFLFnyAQsXzsNsNuPjk4XWrdvRqFHjR64hKffe17bbbVSpUo0+ffp77HjpzeRM7MmKx5gRu5F1GrY6vctIE2tmvKZuZJKmLl36iwIFiqV3GSKp4v5/z+nSjUxERB5P/fr1SvS1qtat29C6dbt0qMh9YWHbWbVqRaLfpeyBvoxBAS4ikonMn784vUt4aA0aBLueYBc9hS4iImJICnAREREDUoCLiIgYkO6Bi0iGkSu7D95ZHzzbWErF3okh6lbK3wUX8SQFuIhkGN5ZsxAa0jXV99t05XJwI8AzQjvRgIB8jB8/ybXs/jah27f/m9WrV2K32zGbTdSv34jOnbvi5eXFyJFvEx5+kX/+ieb69Wuudp19+vSjRo2gRI8ZGrqJ+fPnkD9/AQBiYu5QsWIVhgwZjsVioVatqpQs+QwATqeT27dvUaNGEEOGjMDLywubzcayZUvYseNbsmTJgo+PDx06dKZBg0au+r/5ZgN58uTF6XRis8XStGkLXnvtjUTP725N//nPAUaPngDEdXNbtWoZ0dH/4HDYqVPnRbp164XZbGby5AkJ2o/G7XcV27aFus7N6XRitcZQq1Zdevfu6+pU9ygU4CIiqcjo7US//z6M+vUbUrt2vQTfhYZu4vPPVzNlykwKFSpMdPTfTJo0gRkzJjNy5DimTp0JxPXmXrZsSZJzjd+vVq06rrC02+3069eLDRvW88orHYH4r4j9/fdtOnd+lb17fyEo6AWmT5+E1RrDsmWf4ueXjQsXzjN06ABiY600btwMgFat2rgCOjIykgEDepMzZ06aN2/9wNp++WUXc+bMYNas+RQtWoyYmDuMGzeSpUsX06NHHyD5udPvPbfo6GhGjnybZcuWuLZ9FLoHLiKSiozeTvSNN7oxa9Z0bt68keC7ZcuWMGDA2665xf38sjFixFi+/XYbly6Fp7iuxHh5eVG+/HOcO/ffRL+PiooiJuYOOXLk5OLFC3z//Q5GjBjnmmWuUKHC9Os3iGXLEv/lIXfu3LzxRnc2bFjvVj0rVy6ja9ceFC0aN8FKlixZGTJkBBUrVk7xufn5+dGr17/4+usvEu1Ol1K6AhcRSWVGbif63HMVuXHjBnPmvBdvKD0yMpJLl8ITDMPnyJGD4sWf5sSJ4xQoUPCB+3+QGzei2LNnF6+91sW1rEuXTthsNqKirlOsWHEGDBhKuXLl2bHjO5566il8fX3j7aNChcpcvHgh0V9CwP2/C4i7/XH/OefLl598+fK7Pt/ffvTZZyswZMjwJI5dkhs3bhAVFZmgxWlKKcBFRFKZkduJAvTq9RZdunTkp5++/7+t/9ce1G63JVjfZotNQR0J7dz5I126dMLpdOJ0Oqhbtz6NGr3k+v7ueX7++Wq2bNno+iXHZCLREYkH1XNvi1Gz2YzD4Yj3vdPpdJ2vyWR+4NVyStqP3u2y6u7/i+RoCF1EJJUZvZ1o1qxZGTlyHLNmTefWrZsA5MqVi0KFCnPs2NF460ZFRXHhwnlKlw58qLog7j7xihVr+OSTtaxc+TnduvWK10/8rldffQ1//wAWLozrOFe2bHnOnfsvN2/ejLfesWNHefLJQgkeLLvrjz9O8dRTcX8X2bNn5/bt2/G+j4y8TvbsOQAoU6Ysv//+W7zv//vfv5g4cdxDnevp06fJly9/qjSW0RW4iGQYsXdi4p4Y98B+U8ro7UQrVKjEiy825Ouvv+D117sA0KNHH+bNm8WMGe//7yG2aKZPn0iDBsEUKFAgxXU9jL59B/Hmm6/Rps0rlCxZiuDgJkybNpExY97Bz8+PCxfOM3/+bN58s2ei21+9epWVK5fTuXPcOVWuXJX16z8jJORNcufOze3btwkL207Pnm8B0KlTCLNnT6d8+ecoUqQo0dHRLFgwx/VkfErcvn2bjz9exMsvt3/o87+XAlxEMoyoW1a3XvdKCxmhnWivXm+xe/dO1+eGDV/Cy8uLceNGYrXG4HA4aNjwJTp3Tv1X95Ly9NMlaNKkOQsWzOH99xcyePBwVq1aTo8eIZhMZnx8fOjevXe8OdO/+WYDP/30AyYTOJ3QsuXLNGz40v/2V5LOnbsycOC/gLgh+ZYtWxMU9AIANWs+T8+e/2L8+JHY7Q7sdhsvvtiQrl17uPZ//z1wwPX8wN3bA3eH++vVa8Brr4Wkyt+F2ol6mNqJiniO2olKRqJ2oiIikqT0aCf6+eer+fe/tyRY7u/vz8yZ8zxyzMxAAS4ikomkRzvRV199jVdffS3Nj5vR6Sl0ERERA1KAi4iIGJACXERExIB0D1xEMoycOXzxyZL6P9asMTZu3Pwn1fcr8igU4CKSYfhksTBl9Bepvt9Rkz3zdLbIo1CAi4ikkvv7dMfE3KFEiVIMHjyMPHnyUqtWVXbu3P/A9e72FZ8zZwHVqtV07b9duxbMn7+YNWtWcfToYWy2WM6fP+faT/v2HWjWrGWitSXW4jM8/CL9+vXiiy82uZZ9+eXnzJ8/hy+/3EzevP6u5Xf7cptM4HA48PPz4+23R1GiRMkEPbFjY620adOetm1f5eDB/QwfPsjVG/yurl17ULfui9SqVZVhw0bTsuXLru/69u3p6pkuSVOAi4ikonubjDidThYv/oAxY4azcOHHKVrPYrEwffpkVq78LMEManc7Xd0N4JQ1NUneli2bqFWrLps3f8Mbb3SL9929x/n66y+ZNGkcy5fHLbu3ocf169fo1Kkdzz1XEYDSpcsm2xt8yZKF1KgRRP78aTMda0ahh9hERDzEZDLRrVsv/vzzD06fPpWi9fz9A6hWrQbz57+fRtXC6dOnuHnzBq+/3oVNm75O0KXrXhUrVk6yZ3eePHkpUqQo586dc+u47dt3YPr0SQ9eUeLRFbiIiAd5e3tTpEiRB/afvne9wMByAPTtO5CQkA7s2/dLvKH0h3XixPF486ff33YzNHQj9es3pEyZsnh5ebFnzy6Cgmol2I/T6WT79n/z7LMVEj3OqVMnOXfuL8qWDSQ8/GKC4wLMnbuQnDlzAfDaa2/w44/fs3HjV/GG0iV5CnAREY9ztxd3/PWyZXuC4cPHuIbSH9X9Q9l3h+ABbDYb27dvZfbs+QDUr9+Ib77ZEC/A74ZwbKyVYsWKM2zYaNd3dxt6OBx2smTJytChoylY8EnCwy8+cAjdYrEwevR4+vfvQ40aQY98npmFAlxExINiY2M5d+4vihd/+qHWq169ZpoMpf/880/cunWTUaPiupnZbDYiI69z5cpl8uXLD5DsvfZ774E/jKefLqmh9BRSgItIhmGNsXnklS9rjO2htnM4HCxdupjAwGcpVKiw2+uFh1+M9/3dofRr164+VB3uCA3dSI8efVy9v+OO25NNm76mW7deHjvuve4Opf/55+k0OZ7RKcBFJMN4HCZbubdPt8Nhp1Sp0kyYkPCq0t314P+G0gcP7uuRmq9fv8bBg/sZOXJ8vOUdOrzOrFnT6NKl+yPtP7F74A0aBNO5c5d4y+4OpXfr1vmRjpdZuNUPvHv37nz8cfxXIF555RXWrVvnscKSon7gjy/1A5e0pn7gkpGkaj/w/v37c+bMGc6dO0eLFv93b8Nms2E26w00EZHHSVjYdlatWpHod6n5rrg8HpIN8GHDhnHhwgXGjh3L2LFjXcu9vLwoVaqUx4sTERH3NWgQTIMGweldhqSRZAO8cOHCFC5cmK1bt+qKW0RE5DHi1kNs27Zt47333uPGjRs4nU6cTicmk4mDBw96uj4xEIctloCA7OldRpqxWWOIvGFN7zJEJJNyK8Dff/99RowYQWBgICaTydM1iUGZLd4cmPFoT6saSZVhHwMKcBFJH24FeI4cOQgOTvl9lblz57Jt2zZMJhPt2rWja9eu7Nq1i6lTpxITE0OTJk0YNGhQivcrIpKYnDl88HFrxrOUscbEcOOmflmTx4tbAV6hQgV++OEH6tat6/aO9+7dyy+//MLGjRux2Ww0bdqUoKAgRo0axapVqyhYsCC9evVK8X5FRJLikyULs0em/qQjg6cuxp3RlrttQFu2fDneNKOnTp2ga9fXGDVqPKGhm1ytMk+fPsW8ebO4ceMGdrud8uWfZcCAt/H19cVqtTJ//hwOHTqA2WzmiSey07fvQMqWLZegHeldLVq0pm3bV2jXrgVZs2bFYvHGZosle/bs9Os3mMDA8knWvmfPbhYtiptG9cKFc+TJkxdfXz8KFnySqVNncv36NRYseJ9jx47g6+tL3rz+9O7dl2eeKePax/bt/2b16pXY7XbMZhP16zeic+eueHl5JXncxNqc3uvPP08TEtKBSZOmU69eA/744zQTJ44D4PLlS/j6+pIjR068vb356KNP4p37Xc88U5pRo8Ynun8jcyvAf/jhBz799FO8vb3x9vZ26x549erVWblyJRaLhcuXL2O327l58ybFihWjSJG4vrAtWrRg69atCnARyTBy5szJnj27sdvtruAKC/uWXLlyJ1h3/PiRjBw5jvLln8PhcDB79nQ+/ngR/foNZt26NTidDlau/ByTycSRI4cYMWIwX365BYjfjjQx7703l4IFnwRg166dDB06gNWrvyRXrlyJrl+jRpBrHvL7+3HHxNyhf//eNG3akrFj38VkMrFv3y8MHtyXhQs/pmjRpwgN3cTnn69mypSZFCpUmOjov5k0aQIzZkxm5MhxD/33uWXLJurVa8DXX39JvXoNKFGipOu8J0+eQKVKVRJM4XrvuWdkbgX4ihUrHmrn3t7ezJs3j2XLltG4cWOuXLlCQECA6/t8+fJx+fLlFO0zuZfaRdJaZnpo73F05YoZiyVt3pBx5zheXmZ8ff145pnSHDt2iCpVqgGwb98vVK9eA7PZhMlkwssrru7r168RGxvzv32b6dGjF+HhF7FYzERFXcdutwEOLBZvKleuzJgx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1QqTycTmzZupW7eup2sTERGRJLgV4MOGDWP16tWEhYVhsVho1KgRHTp08HRtIiIikgS3AtzLy4uQkBBCQkISfPf666/z6aefpnphIiIikjS37oEn5/bt26lRh4iIiKTAIwe45h8WERFJe48c4CIiIpL2FOAiIiIGpAAXERExoEcO8IdpQi4iIiKPxu0A37p1K3PmzOGff/5xTasKsHr1ao8UJiIiIklzK8CXLFnC2rVr2bp1K3fu3GHBggV88MEHAGTLls2jBYqIiEhCbgX4li1b+Oijj/D19SV37tysW7cu3lW4iIiIpC23AtxiseDj4+P6nCNHDiwWt1uJi4iISCpzK4ULFizI999/j8lkwmq1snTpUgoVKuTp2kRERCQJbgX42LFjGTZsGCdOnKBixYpUqFCBmTNnero2ERERSYJbAZ4/f34++eQT/vnnH+x2O0888YSn6xIREZFkuBXgERERfPXVV0RFRcVbPmzYME/UJCIiIg/g1kNsffr04ciRIzidznj/iYiISPpw6wo8NjaWBQsWeLoWERERcZNbV+DlypXj5MmTnq5FRERE3OTWFXjlypVp3bo1AQEB8d7/DgsL81hhIiIikjS3AnzBggXMnDmTokWLeroeERERcYNbAZ4zZ06aNm3q6VpERETETW4FeL169Zg+fTrBwcHxplQtV66cxwoTERGRpLkV4Js2bQJg27ZtrmUmk0n3wEVERNKJWwG+Y8cOT9chIiIiKeBWgEdHRzNjxgx+/PFHbDYbL7zwAqNHj9aUqiIiIunErffAp06ditVq5YMPPmDhwoWYTCYmTpzo6dpEREQkCW5dgR8+fJiNGze6Pk+aNIlmzZp5rCgRERFJnltX4Ha7HYfD4frscDjw8vLyWFEiIiKSPLeuwIOCghg4cCAdO3YEYO3atVSvXt2jhYmIiEjS3ArwESNGsGjRImbPno3D4aB27dr06dPH07WJiIhIEtwKcIBixYqxfv16IiIi2LJlC97e3p6sS0RERJLh1j3wCRMm8P3338dtYDZz4MABpkyZ4sm6REREJBluBfihQ4eYPXs2AHnz5mXu3Lns2bPngdstWLCAZs2a0axZM2bMmAHArl27aNGiBcHBwcyZM+cRShcREcm83Arw2NhYrFar67PNZnvgNrt27WLnzp189dVXfP311/z6669s3ryZUaNGsXDhQkJDQzl27Bg//PDDw1cvIiKSSbndzKRbt260atUKk8nE5s2bqVOnTrLbBAQEMGLECFfzkxIlSnD27FmKFStGkSJFAGjRogVbt26lbt26j3gaIiIimYtbAT5s2DBWr15NWFgYFouFRo0auV4pS0qpUqVcfz579iyhoaF07tyZgIAA1/J8+fJx+fLlFBWcN6+mb5XHR0BA9vQuQUQyKbcC/PPPPyckJISQkBDXsiVLltCzZ88Hbnvq1Cl69erF8OHDsVgsnDlzJt73JpMpRQVfu3Ybh8OZom3Sk37AZ2wREbfSuwQRyaDMZlOyF63JBvjatWu5c+cOK1asICYmxrU8NjaWVatWPTDADxw4QP/+/Rk1ahTNmjVj7969XL161fX9lStXyJcvn7vnIiIiIv+TbIBbLBZOnjzJnTt3OHnypGu5l5cXY8eOTXbH4eHhvPXWW8yZM4egoCAAKlSowJkzZ/jrr78oXLgwmzdvpm3btqlwGiIiIplLsgHevn172rdvz3fffUfDhg1TtOOlS5cSExPDtGnTXMs6dOjAtGnT6NevHzExMdStW5fGjRs/XOUiIiKZmFv3wM+dO8fy5csTLO/atWuS24wZM4YxY8Yk+t29nc1EREQk5dwK8HuHz61WKwcOHKBGjRoeK0pERESS51aAT506Nd7n69evM2zYMI8UJCIiIg/m1kxs98uTJw8XLlxI7VpERETETW5dgd97/9vpdHL06FHy5s3rsaJEREQkeSm+B37x4kWeffZZhg8f7rGiREREJHluBXivXr146623uHz5Mk6nkwsXLvDyyy97ujYRERFJglv3wCdOnEj37t3Zv38/Bw4coE+fPrzzzjuerk1ERESS4FaAX7t2Ld4Vd9u2bYmMjPRYUSIiIpI8twLcbrcTFRXl+nz9+nVP1SMiIiJucOse+Ouvv86rr75KkyZNAPj3v//NG2+84dHCREREJGluBfirr75K0aJF2blzJw6Hg/Hjx/P88897ujYRERFJglsBDhAUFOTqKiYiIiLp66FmYhMREZH0pQAXERExIAW4iIiIASnARUREDEgBLiIiYkAKcBEREQNSgIuIiBiQAlxERMSAFOAiIiIGpAAXERExIAW4iIiIASnARUREDEgBLiIiYkAKcBEREQNSgIuIiBiQAlxERMSAFOAiIiIGpAAXERExIAW4iIiIASnARUREDEgBLiIiYkAKcBEREQNSgIuIiBiQAlxERMSAFOAiIiIGpAAXERExIAW4iIiIASnARUREDEgBLiIiYkAKcBEREQNSgIuIiBiQAlxERMSAFOAiIiIGpAAXERExII8H+O3bt2nevDnnz58HYNeuXbRo0YLg4GDmzJnj6cOLiIhkSB4N8MOHD9OxY0fOnj0LwJ07dxg1ahQLFy4kNDSUY8eO8cMPP3iyBBERkQzJowG+bt06xo8fT758+QA4cuQIxYoVo0iRIlgsFlq0aMHWrVs9WYKIiEiGZPHkzidPnhzv85UrVwgICHB9zpcvH5cvX07RPvPmfSJVahNJDQEB2dO7BBHJpDwa4PdzOp0JlplMphTt49q12zgcCffzuNIP+IwtIuJWepcgIhmU2WxK9qI1TZ9Cz58/P1evXnV9vnLlimt4XURERNyXpgFeoUIFzpw5w19//YXdbmfz5s3UqVMnLUsQERHJENJ0CD1LlixMmzaNfv36ERMTQ926dWncuHFaliAiIpIhpEmA79ixw/XnoKAgNm7cmBaHFRERybA0E5uIiIgBKcBFREQMSAEuIiJiQApwERERA1KAi4iIGJACXERExIAU4CIiIgakABcRETEgBbiIiIgBKcBFREQMSAEuIiJiQApwERERA1KAi4iIGJACXERExIAU4CIiIgakABcRETEgBbiIiIgBKcBFREQMSAEuIiJiQApwERERA1KAi4iIGJACXERExIAU4CIiIgakABcRETEgBbiIiIgBKcBFREQMSAEuIiJiQApwERERA1KAi4iIGJACXERExIAU4CIiIgakABcRETEgBbiIiIgBWdK7ABGjstpiCQjInt5lpAm71YqXj096l5FmYu/EEHXLmt5liCRLAS7ykHws3nRZPiC9y0gTK7rOJTSka3qXkWaarlwOCnB5zGkIXURExIAU4CIiIgakABcRETEg3QMXEbmPLdaeaR5QtMbYuHHzn/QuQx6CAlxE5D4Wby+mjP4ivctIE6Mmt0vvEuQhaQhdRETEgBTgIiIiBqQAFxERMSAFuIiIiAHpITYRkUzMFpt5pgQGsMbEcONmxphlTwEuIpKJWby9mT2yV3qXkWYGT10MZIwAT5ch9E2bNtG0aVMaNWrE6tWr06MEERERQ0vzK/DLly8zZ84cNmzYgI+PDx06dKBGjRqULFkyrUsRERExrDQP8F27dlGzZk1y5coFwEsvvcTWrVvp27evW9ubzSYPVucZ/rmzpXcJacYnR970LiFN+T+RJ71LSDO+/pnr/23OXH7pXUKayZErc/2/NUqOPKhOk9PpdKZRLQAsXryY6OhoBg0aBMD69es5cuQIEydOTMsyREREDC3N74En9vuCyWSM34ZEREQeF2ke4Pnz5+fq1auuz1euXCFfvnxpXYaIiIihpXmAP//88+zevZvr16/zzz//sH37durUqZPWZYiIiBhamj/Elj9/fgYNGkRISAixsbG0a9eO5557Lq3LEBERMbQ0f4hNREREHp3mQhcRETEgBbiIiIgBKcBFREQMSAEuIiJiQApwERERA1KAi0gCt2/fpnnz5pw/fz7e8tWrV9O5c+d0qkpE7qUAF5F4Dh8+TMeOHTl79my85adPn2bx4sXpU5SIJKAAF5F41q1bx/jx4+NNcWy1Whk3bhwDBgxIx8pE5F5pPhObiDzeJk+enGDZrFmzaNu2LYULF06HikQkMboCF5Fk/fzzz4SHh9O2bdv0LkVE7qErcBFJ1ubNmzl16hStWrUiOjqaq1evMnDgQN5///30Lk0kU1OAi0iypk6d6vrznj17WLBggcJb5DGgIXQREREDUjcyERERA9IVuIiIiAEpwEVERAxIAS4iImJACnAREREDUoCLiIgYkAJcRFLFnj17aN68eXqXIZJpKMBFREQMSDOxiWQSO3bsYNGiRcTGxpI1a1aGDx/Ozp07OXXqFFevXuXatWuUKVOGyZMn88QTT3Dq1CneffddoqKiMJlMvPnmm7Ru3RqAL774guXLl2M2m8mdOzfTp08HIDo6mkGDBvHnn38SExPDpEmTqFq1ajqetUgG5hSRDO/MmTPO5s2bO69fv+50Op3OkydPOl944QXntGnTnHXq1HFGREQ47Xa7c/Dgwc5p06Y5Y2NjnQ0aNHBu27bN6XQ6nZcuXXLWrl3befDgQefx48edNWrUcF68eNHpdDqdy5cvd44dO9b5yy+/OMuWLes8dOiQa3lISEj6nLBIJqArcJFM4Oeff+bKlSt06dLFtcxkMvHf//6Xxo0b4+/vD0C7du2YMmUKbdu2JSYmhuDgYADy589PcHAwP/30E9mzZ6dWrVoULFgQwLXPPXv2UKRIESpUqABAmTJl+PLLL9PuJEUyGQW4SCbgcDgICgqK14QkPDyczz//HKvVGm89s9mMw+FIsA+n04nNZsPLywuTyeRafufOHS5cuACAt7e3a7nJZMKpmZpFPEYPsYlkAjVr1uTnn3/mjz/+AOCHH36gZcuWxMTEEBYWxq1bt3A4HKxbt44XX3yR4sWL4+3tzfbt2wG4fPky27Zt4/nnn6dGjRrs3r2bK1euAPDZZ5/x3nvvpdu5iWRWugIXyQRKlSrFu+++y+DBg3E6nVgsFhYtWsTu3bvx9/enR48eREZGUq1aNXr37o23tzcLFy5k0qRJzJ8/H7vdzltvvUXNmjUBGDp0KN27dwcgICCAKVOmcPbs2XQ8Q5HMR93IRDKx+fPnExkZybhx49K7FBFJIQ2hi4iIGJCuwEVERAxIV+AiIiIGpAAXERExIAW4iIiIASnARUREDEgBLiIiYkD/Hz/cT6B7r8TEAAAAAElFTkSuQmCC", | |
"text/plain": [ | |
"<Figure size 576x360 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"sns.set(rc={\"figure.figsize\": (8, 5)})\n", | |
"\n", | |
"\n", | |
"counts_df = (\n", | |
" df.groupby(\"epoch\")\n", | |
" .outcome.value_counts()\n", | |
" .to_frame()\n", | |
" .rename(columns={\"outcome\": \"outcome_count\"})\n", | |
" .reset_index()\n", | |
")\n", | |
"\n", | |
"sns.barplot(x=\"epoch\", y=\"outcome_count\", data=counts_df, hue=\"outcome\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "91b054a0", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "e9813d2d", | |
"metadata": {}, | |
"source": [ | |
"## outcome grouped by super_charged" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"id": "c91da8fe", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"epoch super_charged outcome \n", | |
"14 False WON 33\n", | |
" LOST 24\n", | |
" MISSED_HEIGHT_DIFF 3\n", | |
" MISSED_NOT_PRODUCED 2\n", | |
" DIDNT_HAPPEN 1\n", | |
" True WON 14\n", | |
" LOST 7\n", | |
" DIDNT_HAPPEN 1\n", | |
" MISSED_NOT_PRODUCED 1\n", | |
" MISSED_TOO_LATE 1\n", | |
"Name: outcome, dtype: int64" | |
] | |
}, | |
"execution_count": 32, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.groupby([\"epoch\", \"super_charged\"]).outcome.value_counts()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"id": "5babe6c5", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"epoch outcome \n", | |
"14 WON 47\n", | |
" LOST 31\n", | |
" MISSED_HEIGHT_DIFF 3\n", | |
" MISSED_NOT_PRODUCED 3\n", | |
" DIDNT_HAPPEN 2\n", | |
" MISSED_TOO_LATE 1\n", | |
"Name: outcome, dtype: int64" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.groupby([\"epoch\"]).outcome.value_counts()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"id": "d6d5965f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>epoch</th>\n", | |
" <th>slot</th>\n", | |
" <th>global_slot</th>\n", | |
" <th>block</th>\n", | |
" <th>winner_exists</th>\n", | |
" <th>saw_my_producer</th>\n", | |
" <th>bp_won</th>\n", | |
" <th>block_time</th>\n", | |
" <th>received_time</th>\n", | |
" <th>winner_pk</th>\n", | |
" <th>super_charged</th>\n", | |
" <th>block_height_equal</th>\n", | |
" <th>too_late</th>\n", | |
" <th>min_bt</th>\n", | |
" <th>min_bt_minutes</th>\n", | |
" <th>outcome</th>\n", | |
" <th>next_block_in</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>14</td>\n", | |
" <td>776</td>\n", | |
" <td>100736</td>\n", | |
" <td>70205</td>\n", | |
" <td>True</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>[0 days 00:01:37.085000]</td>\n", | |
" <td>2021-10-12 20:50:57.504000+00:00</td>\n", | |
" <td>B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>0 days 00:01:37.085000</td>\n", | |
" <td>1.616667</td>\n", | |
" <td>MISSED_HEIGHT_DIFF</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>38</th>\n", | |
" <td>14</td>\n", | |
" <td>3407</td>\n", | |
" <td>103367</td>\n", | |
" <td>71936</td>\n", | |
" <td>True</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>[0 days 02:53:13.904000]</td>\n", | |
" <td>2021-10-18 08:24:03.980000+00:00</td>\n", | |
" <td>B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>True</td>\n", | |
" <td>0 days 02:53:13.904000</td>\n", | |
" <td>173.216667</td>\n", | |
" <td>MISSED_HEIGHT_DIFF</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>39</th>\n", | |
" <td>14</td>\n", | |
" <td>3464</td>\n", | |
" <td>103424</td>\n", | |
" <td>71977</td>\n", | |
" <td>True</td>\n", | |
" <td>True</td>\n", | |
" <td>False</td>\n", | |
" <td>[0 days 00:02:15.646000]</td>\n", | |
" <td>2021-10-18 11:14:34.750000+00:00</td>\n", | |
" <td>B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp...</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>False</td>\n", | |
" <td>0 days 00:02:15.646000</td>\n", | |
" <td>2.250000</td>\n", | |
" <td>MISSED_HEIGHT_DIFF</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" epoch slot global_slot block winner_exists saw_my_producer bp_won \\\n", | |
"6 14 776 100736 70205 True True False \n", | |
"38 14 3407 103367 71936 True True False \n", | |
"39 14 3464 103424 71977 True True False \n", | |
"\n", | |
" block_time received_time \\\n", | |
"6 [0 days 00:01:37.085000] 2021-10-12 20:50:57.504000+00:00 \n", | |
"38 [0 days 02:53:13.904000] 2021-10-18 08:24:03.980000+00:00 \n", | |
"39 [0 days 00:02:15.646000] 2021-10-18 11:14:34.750000+00:00 \n", | |
"\n", | |
" winner_pk super_charged \\\n", | |
"6 B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq... False \n", | |
"38 B62qiap2uo2Kt8RzoupS8jqCvAKiUZZmiXZUJM9gpmc1zq... False \n", | |
"39 B62qo8FPFHTQ2J5eaCK74yfsMRBFT5bnr2iPomWLv61iGp... False \n", | |
"\n", | |
" block_height_equal too_late min_bt min_bt_minutes \\\n", | |
"6 False False 0 days 00:01:37.085000 1.616667 \n", | |
"38 False True 0 days 02:53:13.904000 173.216667 \n", | |
"39 False False 0 days 00:02:15.646000 2.250000 \n", | |
"\n", | |
" outcome next_block_in \n", | |
"6 MISSED_HEIGHT_DIFF NaN \n", | |
"38 MISSED_HEIGHT_DIFF NaN \n", | |
"39 MISSED_HEIGHT_DIFF NaN " | |
] | |
}, | |
"execution_count": 34, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[df.outcome == 'MISSED_HEIGHT_DIFF']" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "ed2b008b", | |
"metadata": {}, | |
"source": [ | |
"## slot luck - example of a super unlucky epoch\n", | |
"try to visualize \"slot luck\"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"id": "83f7b677", | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"epoch 14 - expected 73 slots - got 87... \n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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", | |
"text/plain": [ | |
"<Figure size 1440x1440 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"<Figure size 576x360 with 0 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(1, 1, figsize=(20, 20))\n", | |
"\n", | |
"SLOTS_PER_EPOCH = 7140\n", | |
"\n", | |
"def get_slot_win_perc(stake, total_currency):\n", | |
" return (1 - ((1 / 4) ** (stake / total_currency)))\n", | |
"\n", | |
"\n", | |
"epoch_data = []\n", | |
"\n", | |
"total_currency = results['epoch_data']['total_currency']\n", | |
"total_staking_balance = results['stakes_df'].balance.sum()\n", | |
"\n", | |
"slot_win_pct = get_slot_win_perc(\n", | |
" total_staking_balance, total_currency\n", | |
") \n", | |
"expected_blocks_value = slot_win_pct * SLOTS_PER_EPOCH \n", | |
"\n", | |
"won_blocks = df[(df.epoch == epoch) & (df.outcome == 'WON')].block.count()\n", | |
"slots_won = df[(df.epoch == epoch)].slot.nunique()\n", | |
"\n", | |
"data = binom.rvs(n=SLOTS_PER_EPOCH, p=slot_win_pct, size=100000)\n", | |
"\n", | |
"k = np.arange(int(expected_blocks_value - 50), int(expected_blocks_value) + 50, 1)\n", | |
"\n", | |
"plt.figure(epoch)\n", | |
"\n", | |
"sns.histplot(data, kde=True, bins=k, ax=ax)\n", | |
"ax.axvline(slots_won, 0, 1, color=\"b\")\n", | |
"ax.set_title(f\"epoch {epoch}\")\n", | |
"\n", | |
"epoch_data.append({\n", | |
" 'epoch': epoch,\n", | |
" 'expected_slots': expected_blocks_value,\n", | |
" 'expected_slots_binom': binom(SLOTS_PER_EPOCH, slot_win_pct).expect(),\n", | |
" 'slot_win_pct': slot_win_pct,\n", | |
" 'won_slots': slots_won,\n", | |
" 'won_blocks': won_blocks,\n", | |
" 'orphan_rate': 1 - (won_blocks/slots_won)\n", | |
"})\n", | |
"\n", | |
"print(f\"epoch {epoch} - expected {round(expected_blocks_value)} slots - got {slots_won}... \")\n", | |
"\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"id": "a7570509", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>epoch</th>\n", | |
" <th>expected_slots</th>\n", | |
" <th>expected_slots_binom</th>\n", | |
" <th>slot_win_pct</th>\n", | |
" <th>won_slots</th>\n", | |
" <th>won_blocks</th>\n", | |
" <th>orphan_rate</th>\n", | |
" <th>cdf</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>14</td>\n", | |
" <td>72.918575</td>\n", | |
" <td>72.918575</td>\n", | |
" <td>0.010213</td>\n", | |
" <td>87</td>\n", | |
" <td>47</td>\n", | |
" <td>0.45977</td>\n", | |
" <td>0.953779</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" epoch expected_slots expected_slots_binom slot_win_pct won_slots \\\n", | |
"0 14 72.918575 72.918575 0.010213 87 \n", | |
"\n", | |
" won_blocks orphan_rate cdf \n", | |
"0 47 0.45977 0.953779 " | |
] | |
}, | |
"execution_count": 36, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# this us SUPER unlucky\n", | |
"\n", | |
"epoch_slots_df = pd.DataFrame(epoch_data)\n", | |
"\n", | |
"epoch_slots_df[\"cdf\"] = epoch_slots_df.apply(\n", | |
" lambda row: binom.cdf(row[\"won_slots\"], SLOTS_PER_EPOCH, row[\"slot_win_pct\"]),\n", | |
" axis=1,\n", | |
")\n", | |
"epoch_slots_df" | |
] | |
} | |
], | |
"metadata": { | |
"interpreter": { | |
"hash": "9e68364d74284f911249cee0972a432a3ed0906e70133099656b5573c54e5919" | |
}, | |
"kernelspec": { | |
"display_name": "Python 3.9.12 ('.venv': venv)", | |
"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.9.12" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment