why2025-polygen-stats/notebook.ipynb
2025-08-19 23:24:06 +02:00

1572 lines
89 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"id": "b1623679",
"metadata": {
"vscode": {
"languageId": "plaintext"
},
"ExecuteTime": {
"end_time": "2025-08-19T21:11:06.528706Z",
"start_time": "2025-08-19T21:11:06.090989Z"
}
},
"source": [
"import pandas\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from dataclasses import dataclass\n",
"from math import floor"
],
"outputs": [],
"execution_count": 1
},
{
"cell_type": "code",
"id": "388b7c16-61c3-4ddc-ac85-bf2094cbfda0",
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:06.595407Z",
"start_time": "2025-08-19T21:11:06.563450Z"
}
},
"source": [
"scorelog = pandas.read_csv('PolyGenStats-vinzenz-scorelog.csv', sep=',', dtype={'score': int, 'sourcename': str, 'name': str, 'mapx': int, 'mapy': int}, parse_dates=['when'])\n",
"scorelog['mapcoord'] = list(zip(scorelog['mapx'], scorelog['mapy']))\n",
"scorelog"
],
"outputs": [
{
"data": {
"text/plain": [
" when score sourcename name mapx \\\n",
"0 2025-08-08 20:14:00 100 First Visit Info Desk 216 \n",
"1 2025-08-08 20:19:00 282 Capture Info Desk 216 \n",
"2 2025-08-08 20:20:00 58 Capture Info Desk 216 \n",
"3 2025-08-08 20:22:00 100 First Visit Main Bar 190 \n",
"4 2025-08-08 20:23:00 100 First Visit Badge Tent 328 \n",
".. ... ... ... ... ... \n",
"896 2025-12-08 13:34:00 91 Capture 0E 0 \n",
"897 2025-12-08 13:39:00 50 Visit Pixelbar 379 \n",
"898 2025-12-08 13:42:00 164 Output Boost Site Sign 207 \n",
"899 2025-12-08 13:50:00 694 Capture Pixelbar 379 \n",
"900 2025-12-08 14:00:00 284 Output Boost Maker Days Eindhoven 115 \n",
"\n",
" mapy mapcoord \n",
"0 505 (216, 505) \n",
"1 505 (216, 505) \n",
"2 505 (216, 505) \n",
"3 570 (190, 570) \n",
"4 607 (328, 607) \n",
".. ... ... \n",
"896 0 (0, 0) \n",
"897 602 (379, 602) \n",
"898 874 (207, 874) \n",
"899 602 (379, 602) \n",
"900 749 (115, 749) \n",
"\n",
"[901 rows x 7 columns]"
],
"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>when</th>\n",
" <th>score</th>\n",
" <th>sourcename</th>\n",
" <th>name</th>\n",
" <th>mapx</th>\n",
" <th>mapy</th>\n",
" <th>mapcoord</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2025-08-08 20:14:00</td>\n",
" <td>100</td>\n",
" <td>First Visit</td>\n",
" <td>Info Desk</td>\n",
" <td>216</td>\n",
" <td>505</td>\n",
" <td>(216, 505)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2025-08-08 20:19:00</td>\n",
" <td>282</td>\n",
" <td>Capture</td>\n",
" <td>Info Desk</td>\n",
" <td>216</td>\n",
" <td>505</td>\n",
" <td>(216, 505)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2025-08-08 20:20:00</td>\n",
" <td>58</td>\n",
" <td>Capture</td>\n",
" <td>Info Desk</td>\n",
" <td>216</td>\n",
" <td>505</td>\n",
" <td>(216, 505)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2025-08-08 20:22:00</td>\n",
" <td>100</td>\n",
" <td>First Visit</td>\n",
" <td>Main Bar</td>\n",
" <td>190</td>\n",
" <td>570</td>\n",
" <td>(190, 570)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2025-08-08 20:23:00</td>\n",
" <td>100</td>\n",
" <td>First Visit</td>\n",
" <td>Badge Tent</td>\n",
" <td>328</td>\n",
" <td>607</td>\n",
" <td>(328, 607)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>896</th>\n",
" <td>2025-12-08 13:34:00</td>\n",
" <td>91</td>\n",
" <td>Capture</td>\n",
" <td>0E</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>(0, 0)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>897</th>\n",
" <td>2025-12-08 13:39:00</td>\n",
" <td>50</td>\n",
" <td>Visit</td>\n",
" <td>Pixelbar</td>\n",
" <td>379</td>\n",
" <td>602</td>\n",
" <td>(379, 602)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>898</th>\n",
" <td>2025-12-08 13:42:00</td>\n",
" <td>164</td>\n",
" <td>Output Boost</td>\n",
" <td>Site Sign</td>\n",
" <td>207</td>\n",
" <td>874</td>\n",
" <td>(207, 874)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>899</th>\n",
" <td>2025-12-08 13:50:00</td>\n",
" <td>694</td>\n",
" <td>Capture</td>\n",
" <td>Pixelbar</td>\n",
" <td>379</td>\n",
" <td>602</td>\n",
" <td>(379, 602)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>900</th>\n",
" <td>2025-12-08 14:00:00</td>\n",
" <td>284</td>\n",
" <td>Output Boost</td>\n",
" <td>Maker Days Eindhoven</td>\n",
" <td>115</td>\n",
" <td>749</td>\n",
" <td>(115, 749)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>901 rows × 7 columns</p>\n",
"</div>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 2
},
{
"cell_type": "code",
"id": "e8888706-1439-4b73-97cc-06dd416d9e23",
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:06.706214Z",
"start_time": "2025-08-19T21:11:06.692755Z"
}
},
"source": [
"summary = pandas.read_csv('PolyGenStats-vinzenz-summary.csv', sep=',', dtype={'name': str, 'totalvisits': int, 'captures': int, 'totalheldduration': int, 'maxheldduration': int})\n",
"summary"
],
"outputs": [
{
"data": {
"text/plain": [
" name totalvisits captures totalheldduration \\\n",
"0 Site Sign 15 21 61707 \n",
"1 Maker Days Eindhoven 13 10 61044 \n",
"2 Pixelbar 18 17 51151 \n",
"3 Cold North 17 20 49590 \n",
"4 Karaoke Bar 19 16 44169 \n",
"5 CoderDojo Belgium 15 13 42973 \n",
"6 Entrance Arch 19 18 40416 \n",
"7 Main Bar 42 67 33999 \n",
"8 Badge Tent 21 21 31452 \n",
"9 Bridge over troubled waters 28 28 27990 \n",
"10 BornHack 8 5 16419 \n",
"11 Info Desk 19 23 13685 \n",
"12 PolyGen Home Base 18 17 12688 \n",
"13 Milliways 23 47 9763 \n",
"14 Party Bar 12 11 9251 \n",
"15 Heaven 15 9 8980 \n",
"16 Chaos Mauldasch 21 30 7426 \n",
"17 Adyen 24 22 7007 \n",
"18 Tilde Industries 5 4 6215 \n",
"19 Geraffel 9 6 5286 \n",
"20 Food Hacking Base 16 13 4427 \n",
"21 Rose Island Italian Embassy 9 7 3667 \n",
"22 FALSE 7 5 2798 \n",
"23 Matrix 7 6 2251 \n",
"24 0E 1 1 91 \n",
"\n",
" maxheldduration \n",
"0 46380 \n",
"1 44313 \n",
"2 36261 \n",
"3 22971 \n",
"4 23180 \n",
"5 23237 \n",
"6 28498 \n",
"7 16913 \n",
"8 18329 \n",
"9 18829 \n",
"10 7753 \n",
"11 3304 \n",
"12 5316 \n",
"13 3386 \n",
"14 7694 \n",
"15 3756 \n",
"16 1394 \n",
"17 3483 \n",
"18 3365 \n",
"19 1782 \n",
"20 993 \n",
"21 1258 \n",
"22 1969 \n",
"23 1096 \n",
"24 91 "
],
"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>name</th>\n",
" <th>totalvisits</th>\n",
" <th>captures</th>\n",
" <th>totalheldduration</th>\n",
" <th>maxheldduration</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Site Sign</td>\n",
" <td>15</td>\n",
" <td>21</td>\n",
" <td>61707</td>\n",
" <td>46380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Maker Days Eindhoven</td>\n",
" <td>13</td>\n",
" <td>10</td>\n",
" <td>61044</td>\n",
" <td>44313</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Pixelbar</td>\n",
" <td>18</td>\n",
" <td>17</td>\n",
" <td>51151</td>\n",
" <td>36261</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Cold North</td>\n",
" <td>17</td>\n",
" <td>20</td>\n",
" <td>49590</td>\n",
" <td>22971</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Karaoke Bar</td>\n",
" <td>19</td>\n",
" <td>16</td>\n",
" <td>44169</td>\n",
" <td>23180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>CoderDojo Belgium</td>\n",
" <td>15</td>\n",
" <td>13</td>\n",
" <td>42973</td>\n",
" <td>23237</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Entrance Arch</td>\n",
" <td>19</td>\n",
" <td>18</td>\n",
" <td>40416</td>\n",
" <td>28498</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Main Bar</td>\n",
" <td>42</td>\n",
" <td>67</td>\n",
" <td>33999</td>\n",
" <td>16913</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Badge Tent</td>\n",
" <td>21</td>\n",
" <td>21</td>\n",
" <td>31452</td>\n",
" <td>18329</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Bridge over troubled waters</td>\n",
" <td>28</td>\n",
" <td>28</td>\n",
" <td>27990</td>\n",
" <td>18829</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>BornHack</td>\n",
" <td>8</td>\n",
" <td>5</td>\n",
" <td>16419</td>\n",
" <td>7753</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Info Desk</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>13685</td>\n",
" <td>3304</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>PolyGen Home Base</td>\n",
" <td>18</td>\n",
" <td>17</td>\n",
" <td>12688</td>\n",
" <td>5316</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Milliways</td>\n",
" <td>23</td>\n",
" <td>47</td>\n",
" <td>9763</td>\n",
" <td>3386</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Party Bar</td>\n",
" <td>12</td>\n",
" <td>11</td>\n",
" <td>9251</td>\n",
" <td>7694</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Heaven</td>\n",
" <td>15</td>\n",
" <td>9</td>\n",
" <td>8980</td>\n",
" <td>3756</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Chaos Mauldasch</td>\n",
" <td>21</td>\n",
" <td>30</td>\n",
" <td>7426</td>\n",
" <td>1394</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Adyen</td>\n",
" <td>24</td>\n",
" <td>22</td>\n",
" <td>7007</td>\n",
" <td>3483</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Tilde Industries</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>6215</td>\n",
" <td>3365</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Geraffel</td>\n",
" <td>9</td>\n",
" <td>6</td>\n",
" <td>5286</td>\n",
" <td>1782</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Food Hacking Base</td>\n",
" <td>16</td>\n",
" <td>13</td>\n",
" <td>4427</td>\n",
" <td>993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Rose Island Italian Embassy</td>\n",
" <td>9</td>\n",
" <td>7</td>\n",
" <td>3667</td>\n",
" <td>1258</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>FALSE</td>\n",
" <td>7</td>\n",
" <td>5</td>\n",
" <td>2798</td>\n",
" <td>1969</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Matrix</td>\n",
" <td>7</td>\n",
" <td>6</td>\n",
" <td>2251</td>\n",
" <td>1096</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>0E</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 3
},
{
"cell_type": "code",
"id": "3c3ca9ba-b545-4f10-a34d-4c35323363fc",
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:07.091537Z",
"start_time": "2025-08-19T21:11:07.071338Z"
}
},
"source": [
"summary = pandas.merge(summary, scorelog[scorelog['sourcename'] == 'First Visit'][['name', 'mapx', 'mapy', 'when']], on='name')\n",
"summary = pandas.merge(summary, scorelog[['name', 'score']].groupby('name').sum(), on='name', validate='1:1')\n",
"summary.rename(columns={'when': 'first_visit'}, inplace=True)\n",
"\n",
"summary"
],
"outputs": [
{
"data": {
"text/plain": [
" name totalvisits captures totalheldduration \\\n",
"0 Site Sign 15 21 61707 \n",
"1 Maker Days Eindhoven 13 10 61044 \n",
"2 Pixelbar 18 17 51151 \n",
"3 Cold North 17 20 49590 \n",
"4 Karaoke Bar 19 16 44169 \n",
"5 CoderDojo Belgium 15 13 42973 \n",
"6 Entrance Arch 19 18 40416 \n",
"7 Main Bar 42 67 33999 \n",
"8 Badge Tent 21 21 31452 \n",
"9 Bridge over troubled waters 28 28 27990 \n",
"10 BornHack 8 5 16419 \n",
"11 Info Desk 19 23 13685 \n",
"12 PolyGen Home Base 18 17 12688 \n",
"13 Milliways 23 47 9763 \n",
"14 Party Bar 12 11 9251 \n",
"15 Heaven 15 9 8980 \n",
"16 Chaos Mauldasch 21 30 7426 \n",
"17 Adyen 24 22 7007 \n",
"18 Tilde Industries 5 4 6215 \n",
"19 Geraffel 9 6 5286 \n",
"20 Food Hacking Base 16 13 4427 \n",
"21 Rose Island Italian Embassy 9 7 3667 \n",
"22 FALSE 7 5 2798 \n",
"23 Matrix 7 6 2251 \n",
"24 0E 1 1 91 \n",
"\n",
" maxheldduration mapx mapy first_visit score \n",
"0 46380 207 874 2025-08-08 22:12:00 63688 \n",
"1 44313 115 749 2025-08-08 22:28:00 62440 \n",
"2 36261 379 602 2025-09-08 00:42:00 52601 \n",
"3 22971 305 402 2025-08-08 21:56:00 50757 \n",
"4 23180 292 446 2025-08-08 21:55:00 45272 \n",
"5 23237 34 523 2025-08-08 21:39:00 44374 \n",
"6 28498 240 916 2025-08-08 22:10:00 41486 \n",
"7 16913 190 570 2025-08-08 20:22:00 36884 \n",
"8 18329 328 607 2025-08-08 20:23:00 32599 \n",
"9 18829 251 553 2025-09-08 02:28:00 29550 \n",
"10 7753 82 337 2025-10-08 19:51:00 17711 \n",
"11 3304 216 505 2025-08-08 20:14:00 17026 \n",
"12 5316 322 591 2025-09-08 17:52:00 14376 \n",
"13 3386 95 498 2025-09-08 17:07:00 11003 \n",
"14 7694 67 289 2025-08-08 22:54:00 13340 \n",
"15 3756 183 227 2025-08-08 21:46:00 10057 \n",
"16 1394 164 635 2025-08-08 22:37:00 8564 \n",
"17 3483 120 637 2025-08-08 22:34:00 8281 \n",
"18 3365 361 468 2025-11-08 17:42:00 6515 \n",
"19 1782 188 166 2025-08-08 23:03:00 6899 \n",
"20 993 119 571 2025-10-08 18:31:00 5308 \n",
"21 1258 41 475 2025-10-08 04:12:00 4167 \n",
"22 1969 163 425 2025-08-08 23:17:00 3863 \n",
"23 1096 164 731 2025-11-08 15:33:00 2696 \n",
"24 91 0 0 2025-12-08 13:32:00 191 "
],
"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>name</th>\n",
" <th>totalvisits</th>\n",
" <th>captures</th>\n",
" <th>totalheldduration</th>\n",
" <th>maxheldduration</th>\n",
" <th>mapx</th>\n",
" <th>mapy</th>\n",
" <th>first_visit</th>\n",
" <th>score</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Site Sign</td>\n",
" <td>15</td>\n",
" <td>21</td>\n",
" <td>61707</td>\n",
" <td>46380</td>\n",
" <td>207</td>\n",
" <td>874</td>\n",
" <td>2025-08-08 22:12:00</td>\n",
" <td>63688</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Maker Days Eindhoven</td>\n",
" <td>13</td>\n",
" <td>10</td>\n",
" <td>61044</td>\n",
" <td>44313</td>\n",
" <td>115</td>\n",
" <td>749</td>\n",
" <td>2025-08-08 22:28:00</td>\n",
" <td>62440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Pixelbar</td>\n",
" <td>18</td>\n",
" <td>17</td>\n",
" <td>51151</td>\n",
" <td>36261</td>\n",
" <td>379</td>\n",
" <td>602</td>\n",
" <td>2025-09-08 00:42:00</td>\n",
" <td>52601</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Cold North</td>\n",
" <td>17</td>\n",
" <td>20</td>\n",
" <td>49590</td>\n",
" <td>22971</td>\n",
" <td>305</td>\n",
" <td>402</td>\n",
" <td>2025-08-08 21:56:00</td>\n",
" <td>50757</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Karaoke Bar</td>\n",
" <td>19</td>\n",
" <td>16</td>\n",
" <td>44169</td>\n",
" <td>23180</td>\n",
" <td>292</td>\n",
" <td>446</td>\n",
" <td>2025-08-08 21:55:00</td>\n",
" <td>45272</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>CoderDojo Belgium</td>\n",
" <td>15</td>\n",
" <td>13</td>\n",
" <td>42973</td>\n",
" <td>23237</td>\n",
" <td>34</td>\n",
" <td>523</td>\n",
" <td>2025-08-08 21:39:00</td>\n",
" <td>44374</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Entrance Arch</td>\n",
" <td>19</td>\n",
" <td>18</td>\n",
" <td>40416</td>\n",
" <td>28498</td>\n",
" <td>240</td>\n",
" <td>916</td>\n",
" <td>2025-08-08 22:10:00</td>\n",
" <td>41486</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Main Bar</td>\n",
" <td>42</td>\n",
" <td>67</td>\n",
" <td>33999</td>\n",
" <td>16913</td>\n",
" <td>190</td>\n",
" <td>570</td>\n",
" <td>2025-08-08 20:22:00</td>\n",
" <td>36884</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Badge Tent</td>\n",
" <td>21</td>\n",
" <td>21</td>\n",
" <td>31452</td>\n",
" <td>18329</td>\n",
" <td>328</td>\n",
" <td>607</td>\n",
" <td>2025-08-08 20:23:00</td>\n",
" <td>32599</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Bridge over troubled waters</td>\n",
" <td>28</td>\n",
" <td>28</td>\n",
" <td>27990</td>\n",
" <td>18829</td>\n",
" <td>251</td>\n",
" <td>553</td>\n",
" <td>2025-09-08 02:28:00</td>\n",
" <td>29550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>BornHack</td>\n",
" <td>8</td>\n",
" <td>5</td>\n",
" <td>16419</td>\n",
" <td>7753</td>\n",
" <td>82</td>\n",
" <td>337</td>\n",
" <td>2025-10-08 19:51:00</td>\n",
" <td>17711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Info Desk</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>13685</td>\n",
" <td>3304</td>\n",
" <td>216</td>\n",
" <td>505</td>\n",
" <td>2025-08-08 20:14:00</td>\n",
" <td>17026</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>PolyGen Home Base</td>\n",
" <td>18</td>\n",
" <td>17</td>\n",
" <td>12688</td>\n",
" <td>5316</td>\n",
" <td>322</td>\n",
" <td>591</td>\n",
" <td>2025-09-08 17:52:00</td>\n",
" <td>14376</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Milliways</td>\n",
" <td>23</td>\n",
" <td>47</td>\n",
" <td>9763</td>\n",
" <td>3386</td>\n",
" <td>95</td>\n",
" <td>498</td>\n",
" <td>2025-09-08 17:07:00</td>\n",
" <td>11003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Party Bar</td>\n",
" <td>12</td>\n",
" <td>11</td>\n",
" <td>9251</td>\n",
" <td>7694</td>\n",
" <td>67</td>\n",
" <td>289</td>\n",
" <td>2025-08-08 22:54:00</td>\n",
" <td>13340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Heaven</td>\n",
" <td>15</td>\n",
" <td>9</td>\n",
" <td>8980</td>\n",
" <td>3756</td>\n",
" <td>183</td>\n",
" <td>227</td>\n",
" <td>2025-08-08 21:46:00</td>\n",
" <td>10057</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Chaos Mauldasch</td>\n",
" <td>21</td>\n",
" <td>30</td>\n",
" <td>7426</td>\n",
" <td>1394</td>\n",
" <td>164</td>\n",
" <td>635</td>\n",
" <td>2025-08-08 22:37:00</td>\n",
" <td>8564</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Adyen</td>\n",
" <td>24</td>\n",
" <td>22</td>\n",
" <td>7007</td>\n",
" <td>3483</td>\n",
" <td>120</td>\n",
" <td>637</td>\n",
" <td>2025-08-08 22:34:00</td>\n",
" <td>8281</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Tilde Industries</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>6215</td>\n",
" <td>3365</td>\n",
" <td>361</td>\n",
" <td>468</td>\n",
" <td>2025-11-08 17:42:00</td>\n",
" <td>6515</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Geraffel</td>\n",
" <td>9</td>\n",
" <td>6</td>\n",
" <td>5286</td>\n",
" <td>1782</td>\n",
" <td>188</td>\n",
" <td>166</td>\n",
" <td>2025-08-08 23:03:00</td>\n",
" <td>6899</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Food Hacking Base</td>\n",
" <td>16</td>\n",
" <td>13</td>\n",
" <td>4427</td>\n",
" <td>993</td>\n",
" <td>119</td>\n",
" <td>571</td>\n",
" <td>2025-10-08 18:31:00</td>\n",
" <td>5308</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Rose Island Italian Embassy</td>\n",
" <td>9</td>\n",
" <td>7</td>\n",
" <td>3667</td>\n",
" <td>1258</td>\n",
" <td>41</td>\n",
" <td>475</td>\n",
" <td>2025-10-08 04:12:00</td>\n",
" <td>4167</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>FALSE</td>\n",
" <td>7</td>\n",
" <td>5</td>\n",
" <td>2798</td>\n",
" <td>1969</td>\n",
" <td>163</td>\n",
" <td>425</td>\n",
" <td>2025-08-08 23:17:00</td>\n",
" <td>3863</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Matrix</td>\n",
" <td>7</td>\n",
" <td>6</td>\n",
" <td>2251</td>\n",
" <td>1096</td>\n",
" <td>164</td>\n",
" <td>731</td>\n",
" <td>2025-11-08 15:33:00</td>\n",
" <td>2696</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>0E</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2025-12-08 13:32:00</td>\n",
" <td>191</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 4
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:07.670668Z",
"start_time": "2025-08-19T21:11:07.658321Z"
}
},
"cell_type": "code",
"source": [
"boosts = scorelog[scorelog['sourcename'] == 'Output Boost'][['name', 'score']].groupby('name')\n",
"\n",
"total_boosts = boosts.sum()\n",
"total_boosts['totalboostduration'] = total_boosts['score'].apply(lambda x: 10 * x)\n",
"total_boosts.rename(columns={'score': 'totalboostscore'}, inplace=True)\n",
"summary = pandas.merge(summary, total_boosts, on='name')\n",
"del total_boosts\n",
"\n",
"max_boosts = boosts.max()\n",
"max_boosts['maxboostduration'] = max_boosts['score'].apply(lambda x: 10 * x)\n",
"max_boosts.rename(columns={'score': 'maxboostscore'}, inplace=True)\n",
"summary = pandas.merge(summary, max_boosts, on='name')\n",
"del max_boosts\n",
"\n",
"del boosts\n",
"summary"
],
"id": "9f15abc665d134d7",
"outputs": [
{
"data": {
"text/plain": [
" name totalvisits captures totalheldduration \\\n",
"0 Site Sign 15 21 61707 \n",
"1 Maker Days Eindhoven 13 10 61044 \n",
"2 Cold North 17 20 49590 \n",
"3 Karaoke Bar 19 16 44169 \n",
"4 CoderDojo Belgium 15 13 42973 \n",
"5 Entrance Arch 19 18 40416 \n",
"6 Main Bar 42 67 33999 \n",
"7 Badge Tent 21 21 31452 \n",
"8 Bridge over troubled waters 28 28 27990 \n",
"9 BornHack 8 5 16419 \n",
"10 Info Desk 19 23 13685 \n",
"11 PolyGen Home Base 18 17 12688 \n",
"12 Milliways 23 47 9763 \n",
"13 Party Bar 12 11 9251 \n",
"14 Heaven 15 9 8980 \n",
"15 Chaos Mauldasch 21 30 7426 \n",
"16 Adyen 24 22 7007 \n",
"17 Geraffel 9 6 5286 \n",
"18 Food Hacking Base 16 13 4427 \n",
"19 FALSE 7 5 2798 \n",
"20 Matrix 7 6 2251 \n",
"\n",
" maxheldduration mapx mapy first_visit score totalboostscore \\\n",
"0 46380 207 874 2025-08-08 22:12:00 63688 681 \n",
"1 44313 115 749 2025-08-08 22:28:00 62440 696 \n",
"2 22971 305 402 2025-08-08 21:56:00 50757 267 \n",
"3 23180 292 446 2025-08-08 21:55:00 45272 103 \n",
"4 23237 34 523 2025-08-08 21:39:00 44374 101 \n",
"5 28498 240 916 2025-08-08 22:10:00 41486 70 \n",
"6 16913 190 570 2025-08-08 20:22:00 36884 735 \n",
"7 18329 328 607 2025-08-08 20:23:00 32599 47 \n",
"8 18829 251 553 2025-09-08 02:28:00 29550 110 \n",
"9 7753 82 337 2025-10-08 19:51:00 17711 842 \n",
"10 3304 216 505 2025-08-08 20:14:00 17026 2341 \n",
"11 5316 322 591 2025-09-08 17:52:00 14376 738 \n",
"12 3386 95 498 2025-09-08 17:07:00 11003 40 \n",
"13 7694 67 289 2025-08-08 22:54:00 13340 3439 \n",
"14 3756 183 227 2025-08-08 21:46:00 10057 277 \n",
"15 1394 164 635 2025-08-08 22:37:00 8564 38 \n",
"16 3483 120 637 2025-08-08 22:34:00 8281 24 \n",
"17 1782 188 166 2025-08-08 23:03:00 6899 1113 \n",
"18 993 119 571 2025-10-08 18:31:00 5308 31 \n",
"19 1969 163 425 2025-08-08 23:17:00 3863 665 \n",
"20 1096 164 731 2025-11-08 15:33:00 2696 45 \n",
"\n",
" totalboostduration maxboostscore maxboostduration \n",
"0 6810 199 1990 \n",
"1 6960 284 2840 \n",
"2 2670 142 1420 \n",
"3 1030 47 470 \n",
"4 1010 101 1010 \n",
"5 700 70 700 \n",
"6 7350 537 5370 \n",
"7 470 28 280 \n",
"8 1100 76 760 \n",
"9 8420 324 3240 \n",
"10 23410 2262 22620 \n",
"11 7380 190 1900 \n",
"12 400 35 350 \n",
"13 34390 3350 33500 \n",
"14 2770 125 1250 \n",
"15 380 38 380 \n",
"16 240 15 150 \n",
"17 11130 902 9020 \n",
"18 310 28 280 \n",
"19 6650 651 6510 \n",
"20 450 45 450 "
],
"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>name</th>\n",
" <th>totalvisits</th>\n",
" <th>captures</th>\n",
" <th>totalheldduration</th>\n",
" <th>maxheldduration</th>\n",
" <th>mapx</th>\n",
" <th>mapy</th>\n",
" <th>first_visit</th>\n",
" <th>score</th>\n",
" <th>totalboostscore</th>\n",
" <th>totalboostduration</th>\n",
" <th>maxboostscore</th>\n",
" <th>maxboostduration</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Site Sign</td>\n",
" <td>15</td>\n",
" <td>21</td>\n",
" <td>61707</td>\n",
" <td>46380</td>\n",
" <td>207</td>\n",
" <td>874</td>\n",
" <td>2025-08-08 22:12:00</td>\n",
" <td>63688</td>\n",
" <td>681</td>\n",
" <td>6810</td>\n",
" <td>199</td>\n",
" <td>1990</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Maker Days Eindhoven</td>\n",
" <td>13</td>\n",
" <td>10</td>\n",
" <td>61044</td>\n",
" <td>44313</td>\n",
" <td>115</td>\n",
" <td>749</td>\n",
" <td>2025-08-08 22:28:00</td>\n",
" <td>62440</td>\n",
" <td>696</td>\n",
" <td>6960</td>\n",
" <td>284</td>\n",
" <td>2840</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Cold North</td>\n",
" <td>17</td>\n",
" <td>20</td>\n",
" <td>49590</td>\n",
" <td>22971</td>\n",
" <td>305</td>\n",
" <td>402</td>\n",
" <td>2025-08-08 21:56:00</td>\n",
" <td>50757</td>\n",
" <td>267</td>\n",
" <td>2670</td>\n",
" <td>142</td>\n",
" <td>1420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Karaoke Bar</td>\n",
" <td>19</td>\n",
" <td>16</td>\n",
" <td>44169</td>\n",
" <td>23180</td>\n",
" <td>292</td>\n",
" <td>446</td>\n",
" <td>2025-08-08 21:55:00</td>\n",
" <td>45272</td>\n",
" <td>103</td>\n",
" <td>1030</td>\n",
" <td>47</td>\n",
" <td>470</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>CoderDojo Belgium</td>\n",
" <td>15</td>\n",
" <td>13</td>\n",
" <td>42973</td>\n",
" <td>23237</td>\n",
" <td>34</td>\n",
" <td>523</td>\n",
" <td>2025-08-08 21:39:00</td>\n",
" <td>44374</td>\n",
" <td>101</td>\n",
" <td>1010</td>\n",
" <td>101</td>\n",
" <td>1010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Entrance Arch</td>\n",
" <td>19</td>\n",
" <td>18</td>\n",
" <td>40416</td>\n",
" <td>28498</td>\n",
" <td>240</td>\n",
" <td>916</td>\n",
" <td>2025-08-08 22:10:00</td>\n",
" <td>41486</td>\n",
" <td>70</td>\n",
" <td>700</td>\n",
" <td>70</td>\n",
" <td>700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Main Bar</td>\n",
" <td>42</td>\n",
" <td>67</td>\n",
" <td>33999</td>\n",
" <td>16913</td>\n",
" <td>190</td>\n",
" <td>570</td>\n",
" <td>2025-08-08 20:22:00</td>\n",
" <td>36884</td>\n",
" <td>735</td>\n",
" <td>7350</td>\n",
" <td>537</td>\n",
" <td>5370</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Badge Tent</td>\n",
" <td>21</td>\n",
" <td>21</td>\n",
" <td>31452</td>\n",
" <td>18329</td>\n",
" <td>328</td>\n",
" <td>607</td>\n",
" <td>2025-08-08 20:23:00</td>\n",
" <td>32599</td>\n",
" <td>47</td>\n",
" <td>470</td>\n",
" <td>28</td>\n",
" <td>280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Bridge over troubled waters</td>\n",
" <td>28</td>\n",
" <td>28</td>\n",
" <td>27990</td>\n",
" <td>18829</td>\n",
" <td>251</td>\n",
" <td>553</td>\n",
" <td>2025-09-08 02:28:00</td>\n",
" <td>29550</td>\n",
" <td>110</td>\n",
" <td>1100</td>\n",
" <td>76</td>\n",
" <td>760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>BornHack</td>\n",
" <td>8</td>\n",
" <td>5</td>\n",
" <td>16419</td>\n",
" <td>7753</td>\n",
" <td>82</td>\n",
" <td>337</td>\n",
" <td>2025-10-08 19:51:00</td>\n",
" <td>17711</td>\n",
" <td>842</td>\n",
" <td>8420</td>\n",
" <td>324</td>\n",
" <td>3240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Info Desk</td>\n",
" <td>19</td>\n",
" <td>23</td>\n",
" <td>13685</td>\n",
" <td>3304</td>\n",
" <td>216</td>\n",
" <td>505</td>\n",
" <td>2025-08-08 20:14:00</td>\n",
" <td>17026</td>\n",
" <td>2341</td>\n",
" <td>23410</td>\n",
" <td>2262</td>\n",
" <td>22620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>PolyGen Home Base</td>\n",
" <td>18</td>\n",
" <td>17</td>\n",
" <td>12688</td>\n",
" <td>5316</td>\n",
" <td>322</td>\n",
" <td>591</td>\n",
" <td>2025-09-08 17:52:00</td>\n",
" <td>14376</td>\n",
" <td>738</td>\n",
" <td>7380</td>\n",
" <td>190</td>\n",
" <td>1900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Milliways</td>\n",
" <td>23</td>\n",
" <td>47</td>\n",
" <td>9763</td>\n",
" <td>3386</td>\n",
" <td>95</td>\n",
" <td>498</td>\n",
" <td>2025-09-08 17:07:00</td>\n",
" <td>11003</td>\n",
" <td>40</td>\n",
" <td>400</td>\n",
" <td>35</td>\n",
" <td>350</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Party Bar</td>\n",
" <td>12</td>\n",
" <td>11</td>\n",
" <td>9251</td>\n",
" <td>7694</td>\n",
" <td>67</td>\n",
" <td>289</td>\n",
" <td>2025-08-08 22:54:00</td>\n",
" <td>13340</td>\n",
" <td>3439</td>\n",
" <td>34390</td>\n",
" <td>3350</td>\n",
" <td>33500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Heaven</td>\n",
" <td>15</td>\n",
" <td>9</td>\n",
" <td>8980</td>\n",
" <td>3756</td>\n",
" <td>183</td>\n",
" <td>227</td>\n",
" <td>2025-08-08 21:46:00</td>\n",
" <td>10057</td>\n",
" <td>277</td>\n",
" <td>2770</td>\n",
" <td>125</td>\n",
" <td>1250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Chaos Mauldasch</td>\n",
" <td>21</td>\n",
" <td>30</td>\n",
" <td>7426</td>\n",
" <td>1394</td>\n",
" <td>164</td>\n",
" <td>635</td>\n",
" <td>2025-08-08 22:37:00</td>\n",
" <td>8564</td>\n",
" <td>38</td>\n",
" <td>380</td>\n",
" <td>38</td>\n",
" <td>380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Adyen</td>\n",
" <td>24</td>\n",
" <td>22</td>\n",
" <td>7007</td>\n",
" <td>3483</td>\n",
" <td>120</td>\n",
" <td>637</td>\n",
" <td>2025-08-08 22:34:00</td>\n",
" <td>8281</td>\n",
" <td>24</td>\n",
" <td>240</td>\n",
" <td>15</td>\n",
" <td>150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Geraffel</td>\n",
" <td>9</td>\n",
" <td>6</td>\n",
" <td>5286</td>\n",
" <td>1782</td>\n",
" <td>188</td>\n",
" <td>166</td>\n",
" <td>2025-08-08 23:03:00</td>\n",
" <td>6899</td>\n",
" <td>1113</td>\n",
" <td>11130</td>\n",
" <td>902</td>\n",
" <td>9020</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Food Hacking Base</td>\n",
" <td>16</td>\n",
" <td>13</td>\n",
" <td>4427</td>\n",
" <td>993</td>\n",
" <td>119</td>\n",
" <td>571</td>\n",
" <td>2025-10-08 18:31:00</td>\n",
" <td>5308</td>\n",
" <td>31</td>\n",
" <td>310</td>\n",
" <td>28</td>\n",
" <td>280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>FALSE</td>\n",
" <td>7</td>\n",
" <td>5</td>\n",
" <td>2798</td>\n",
" <td>1969</td>\n",
" <td>163</td>\n",
" <td>425</td>\n",
" <td>2025-08-08 23:17:00</td>\n",
" <td>3863</td>\n",
" <td>665</td>\n",
" <td>6650</td>\n",
" <td>651</td>\n",
" <td>6510</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Matrix</td>\n",
" <td>7</td>\n",
" <td>6</td>\n",
" <td>2251</td>\n",
" <td>1096</td>\n",
" <td>164</td>\n",
" <td>731</td>\n",
" <td>2025-11-08 15:33:00</td>\n",
" <td>2696</td>\n",
" <td>45</td>\n",
" <td>450</td>\n",
" <td>45</td>\n",
" <td>450</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 5
},
{
"cell_type": "code",
"id": "583c3529-d482-4891-84fa-880920f631b6",
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:07.874878Z",
"start_time": "2025-08-19T21:11:07.779114Z"
}
},
"source": [
"plt.scatter(summary['mapx'], summary['mapy'])\n",
"plt.title('Map positions of reactors')\n",
"plt.show()"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGzCAYAAAAFROyYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAARQZJREFUeJzt3X1cVHXe//H3gALeMEOgMJA3kbkqYZaUOq3dSoKRWyvWpWmReeVvDdvVyi33Ks1u1rK2NtvSvemhbWZttpWrV2KkaetKat5s3pRrLokGA6Uxgxqg8P394cWsIyiMInOA1/PxOI9Hc853Zj7nO4Pz7pzz/R6bMcYIAADAQkKCXQAAAMDJCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAfK699lpde+21DWp711136YILLjin9TSF3bt3a+jQoXI4HLLZbHr//feDXRIAEVDQSi1YsEA2m002m01r166ttd0Yo65du8pms+mmm24KQoXWUFhYqMcee0xbt24NdinnTFZWlrZt26annnpKr7/+ui6//PJgl9QgreGzQevWJtgFAMEUERGhRYsWafDgwX7r16xZo/379ys8PDxIlQXHhx9+6Pe4sLBQM2fO1AUXXKBLL73Ub9sf//hHVVdXN2F1je+HH35QXl6e/ud//keTJk0KdjkBOd1nA7QEHEFBq3bjjTdq8eLFOnbsmN/6RYsWKSUlRU6nM0iVBUdYWJjCwsIa1LZt27bNPsB9++23kqSoqKgzen55eXmzD2knO3z4cLBLACQRUNDKjR49WgcOHFBubq5vXWVlpd555x3dfvvtdT7nueee05VXXqmYmBi1a9dOKSkpeuedd2q1s9lsmjRpkt544w316tVLERERSklJ0SeffFJvXatXr5bNZtNf/vIX/epXv5LT6VSHDh30k5/8RPv27avVfvHixUpJSVG7du3UqVMnjR07Vt98841fG7fbrXHjxqlLly4KDw9XfHy8br75Zn399de+Nideg7J69WpdccUVkqRx48b5ToktWLBAUt3XoBw+fFgPPPCAunbtqvDwcPXq1UvPPfecTr5pek3fvP/++0pOTlZ4eLguvvhi5eTk+LUrKyvT5MmTdcEFFyg8PFyxsbG64YYbtHnz5nr7cMuWLRo2bJjsdrs6duyoIUOG6NNPP/Vtf+yxx9S9e3dJ0tSpU2Wz2U57TU3NZ/LWW2/pkUce0fnnn6/27dvL6/VKktavX6/09HQ5HA61b99e11xzjf7xj3/4vcbevXt17733qlevXmrXrp1iYmJ06623+n0GNUpLSzVlyhTfvnfp0kV33nmnvvvuu3o/G6lh34m77rpLHTt21J49e3TjjTcqMjJSY8aMkXT82pzMzEw5nU5FRESoS5cuGjVqlDweT719DzQGTvGgVbvgggvkcrn05ptvatiwYZKk5cuXy+PxaNSoUZozZ06t57z44ov6yU9+ojFjxqiyslJvvfWWbr31Vi1btkwZGRl+bdesWaO//OUv+vnPf67w8HC98sorSk9P14YNG5ScnFxvfU899ZRsNpseeughlZSU6Le//a1SU1O1detWtWvXTtLx62nGjRunK664QrNmzVJxcbFefPFF/eMf/9CWLVt8RwcyMzO1Y8cO3XfffbrgggtUUlKi3NxcFRQU1PnD3KdPHz3++OOaPn26JkyYoKuuukqSdOWVV9ZZqzFGP/nJT/Txxx9r/PjxuvTSS7VixQpNnTpV33zzjV544QW/9mvXrtW7776re++9V5GRkZozZ44yMzNVUFCgmJgYSdLPfvYzvfPOO5o0aZKSkpJ04MABrV27Vl988YX69+9/yn7bsWOHrrrqKtntdv3yl79U27Zt9fvf/17XXnut1qxZo4EDB2rEiBGKiorSlClTNHr0aN14443q2LFjvZ/JE088obCwMD344IOqqKhQWFiYVq1apWHDhiklJUUzZsxQSEiI5s+fr+uvv15///vfNWDAAEnSxo0btW7dOo0aNUpdunTR119/rblz5+raa6/Vzp071b59e0nSoUOHdNVVV+mLL77Q3Xffrf79++u7777T3/72N+3fv7/ez6ah3wlJOnbsmNLS0jR48GA999xzat++vSorK5WWlqaKigrdd999cjqd+uabb7Rs2TKVlpbK4XDU20/AWTNAKzR//nwjyWzcuNH87ne/M5GRkebIkSPGGGNuvfVWc9111xljjOnevbvJyMjwe25NuxqVlZUmOTnZXH/99X7rJRlJ5rPPPvOt27t3r4mIiDA//elPT1vfxx9/bCSZ888/33i9Xt/6t99+20gyL774ou+9Y2NjTXJysvnhhx987ZYtW2YkmenTpxtjjPn++++NJPPss8+e9n2vueYac8011/geb9y40Ugy8+fPr9U2KyvLdO/e3ff4/fffN5LMk08+6ddu5MiRxmazma+++sq3TpIJCwvzW/fPf/7TSDIvvfSSb53D4TDZ2dmnrbkut9xyiwkLCzN79uzxrSssLDSRkZHm6quv9q3Lz89vUL8Y85/P5MILL/T7DlRXV5uePXuatLQ0U11d7Vt/5MgRk5iYaG644Qa/dSfLy8szksyf//xn37rp06cbSebdd9+t1b7mPU712TT0O2HM8c9Qknn44Yf9XmPLli1Gklm8eHF93QKcM5ziQat322236YcfftCyZctUVlamZcuWnfL0jiTfkQtJ+v777+XxeHTVVVfVedrB5XIpJSXF97hbt266+eabtWLFClVVVdVb25133qnIyEjf45EjRyo+Pl4ffPCBJOmzzz5TSUmJ7r33XkVERPjaZWRkqHfv3vrf//1fX81hYWFavXq1vv/++3rf90x88MEHCg0N1c9//nO/9Q888ICMMVq+fLnf+tTUVPXo0cP3+JJLLpHdbte///1v37qoqCitX79ehYWFDa6jqqpKH374oW655RZdeOGFvvXx8fG6/fbbtXbtWt9pmTORlZXl9x3YunWrdu/erdtvv10HDhzQd999p++++06HDx/WkCFD9Mknn/iuUznxeUePHtWBAwd00UUXKSoqyu/789e//lX9+vXTT3/601rvb7PZTltfQ78TJ5o4caLf45ojJCtWrNCRI0dO+37AuUJAQavXuXNnpaamatGiRXr33XdVVVWlkSNHnrL9smXLNGjQIEVERCg6OlqdO3fW3Llz6zw337Nnz1rrfvSjH+nIkSO+CzRP5+Tn22w2XXTRRb5rFvbu3StJ6tWrV63n9u7d27c9PDxczzzzjJYvX664uDhdffXVmj17ttxud701NNTevXuVkJDgF6ik46eKTqy1Rrdu3Wq9xnnnnecXoGbPnq3t27era9euGjBggB577DG/AFOXb7/9VkeOHKmzT/r06aPq6uo6r+NpqMTERL/Hu3fvlnQ8uHTu3Nlv+dOf/qSKigrfd+OHH37Q9OnTfdfodOrUSZ07d1Zpaanf92fPnj0NOgVYl4Z+J2q0adNGXbp0qbWP999/v/70pz+pU6dOSktL08svv8z1J2hSBBRA0u23367ly5dr3rx5GjZs2ClHdfz973/XT37yE0VEROiVV17RBx98oNzcXN1+++21LgS1msmTJ+tf//qXZs2apYiICD366KPq06ePtmzZEpR6QkND61x/Yj/edttt+ve//62XXnpJCQkJevbZZ3XxxRfXOhrTlE48CiLJd3Tk2WefVW5ubp1LzbUt9913n5566inddtttevvtt/Xhhx8qNzdXMTExQRsNFB4erpCQ2j8Fv/nNb/T555/rV7/6lX744Qf9/Oc/18UXX6z9+/cHoUq0RgQUQNJPf/pThYSE6NNPPz3t6Z2//vWvioiI0IoVK3T33Xdr2LBhSk1NPWX7mv+7PtG//vUvtW/fXp07d663rpOfb4zRV1995buotWYUyq5du2o9d9euXb7tNXr06KEHHnhAH374obZv367Kykr95je/OeX713c64UTdu3dXYWGhysrK/NZ/+eWXfrUGKj4+Xvfee6/ef/995efnKyYmRk899dQp23fu3Fnt27evs0++/PJLhYSEqGvXrmdUS11qTlPZ7XalpqbWubRt21aS9M477ygrK0u/+c1vNHLkSN1www0aPHiwSktLa73m9u3bT/u+p/psAv1OnE7fvn31yCOP6JNPPtHf//53ffPNN5o3b16Dnw+cDQIKIKljx46aO3euHnvsMQ0fPvyU7UJDQ2Wz2fyuH/n6669POT16Xl6e37UF+/bt05IlSzR06NBTHkE40Z///Ge/H/x33nlHRUVFvhFHl19+uWJjYzVv3jxVVFT42i1fvlxffPGFb1TRkSNHVF5e7vfaPXr0UGRkpN/zTtahQwdJqvUDWpcbb7xRVVVV+t3vfue3/oUXXpDNZvPV3FBVVVW1TinExsYqISHhtDWHhoZq6NChWrJkid/w3eLiYt+kfHa7PaBaTiclJUU9evTQc889p0OHDtXafuKpvNDQ0FpH2l566aVa1yNlZmbqn//8p957771ar1fz/FN9Ng39TpyO1+utNTdQ3759FRISctq+BxoTw4yB/5OVlVVvm4yMDD3//PNKT0/X7bffrpKSEr388su66KKL9Pnnn9dqn5ycrLS0NL9hxpI0c+bMBtUUHR2twYMHa9y4cSouLtZvf/tbXXTRRbrnnnskHZ8s7ZlnntG4ceN0zTXXaPTo0b4hpRdccIGmTJki6fhRmyFDhui2225TUlKS2rRpo/fee0/FxcUaNWrUKd+/R48eioqK0rx58xQZGakOHTpo4MCBta7DkKThw4fruuuu0//8z//o66+/Vr9+/fThhx9qyZIlmjx5st8FsQ1RVlamLl26aOTIkerXr586duyojz76SBs3bjztUR9JevLJJ5Wbm6vBgwfr3nvvVZs2bfT73/9eFRUVmj17dkB11CckJER/+tOfNGzYMF188cUaN26czj//fH3zzTf6+OOPZbfbtXTpUknSTTfdpNdff10Oh0NJSUnKy8vTRx995BtWXWPq1Kl65513dOutt+ruu+9WSkqKDh48qL/97W+aN2+e+vXrd9rPpiHfidNZtWqVJk2apFtvvVU/+tGPdOzYMb3++usKDQ1VZmZmo/YfcErBHEIEBMuJw4xPp65hxq+++qrp2bOnCQ8PN7179zbz5883M2bMMCf/OUky2dnZZuHChb72l112mfn444/rra9mSOubb75ppk2bZmJjY027du1MRkaG2bt3b632f/nLX8xll11mwsPDTXR0tBkzZozZv3+/b/t3331nsrOzTe/evU2HDh2Mw+EwAwcONG+//bbf65w8zNgYY5YsWWKSkpJMmzZt/Ia1njzM2BhjysrKzJQpU0xCQoJp27at6dmzp3n22Wf9ht+e2Dcn6969u8nKyjLGGFNRUWGmTp1q+vXrZyIjI02HDh1Mv379zCuvvFJv/xljzObNm01aWprp2LGjad++vbnuuuvMunXr/NqcyTDjUw293bJlixkxYoSJiYkx4eHhpnv37ua2224zK1eu9LX5/vvvzbhx40ynTp1Mx44dTVpamvnyyy/99rvGgQMHzKRJk8z5559vwsLCTJcuXUxWVpb57rvvfG1O9dkYU/93wpjjn2GHDh1q7cu///1vc/fdd5sePXqYiIgIEx0dba677jrz0Ucf1dtPQGOxGWPxK/uAZspmsyk7O7vWKY+GWL16ta677jotXrz4tCOKAKCl4hoUAABgOQQUAABgOQQUAABgOVyDAgAALIcjKAAAwHIIKAAAwHKa5URt1dXVKiwsVGRkZEBTcQMAgOAxxqisrEwJCQl13gPqRM0yoBQWFjbqvTQAAEDT2bdvX627aJ+sWQaUmtu579u3r1HvqQEAAM4dr9errl27+n7HT6dZBpSa0zp2u52AAgBAM9OQyzO4SBYAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFhOs5yo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XW5urux2u5KSkppmR5pQfX1Wl61bt0qS3/esNfVZXaqrq1VRUcF37GwF+yrdluiBBx4wq1evNvn5+eYf//iHSU1NNZ06dTIlJSXGGGN+9rOfmW7duplVq1aZzz77zLhcLuNyuYJcddMqKyszW7ZsMVu2bDGSzPPPP2+2bNli9u7da4wx5umnnzZRUVFmyZIl5vPPPzc333yzSUxMND/88IPvNdLT081ll11m1q9fb9auXWt69uxpRo8eHaxdOudO12dlZWXmwQcfNHl5eSY/P9989NFHpn///qZnz56mvLzc9xqtqc8mTpxoHA6HWb16tSkqKvItR44c8bWp72/x2LFjJjk52QwdOtRs3brV5OTkmM6dO5tp06YFY5fOufr67KuvvjKPP/64+eyzz0x+fr5ZsmSJufDCC83VV1/te43W1mcPP/ywWbNmjcnPzzeff/65efjhh43NZjMffvihMYbv2NkgoJwD//Vf/2Xi4+NNWFiYOf/8881//dd/ma+++sq3/YcffjD33nuvOe+880z79u3NT3/6U1NUVBTEipvexx9/bCTVWrKysowxx4caP/rooyYuLs6Eh4ebIUOGmF27dvm9xoEDB8zo0aNNx44djd1uN+PGjTNlZWVB2Jumcbo+O3LkiBk6dKjp3Lmzadu2renevbu55557/IYuGtO6+qyuvpJk5s+f72vTkL/Fr7/+2gwbNsy0a9fOdOrUyTzwwAPm6NGjTbw3TaO+PisoKDBXX321iY6ONuHh4eaiiy4yU6dONR6Px+91WlOf3X333aZ79+4mLCzMdO7c2QwZMsQXTozhO3Y2bMYY03THawAAAOrHNSgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMByCCgAAMBy/j/DQcMmz7HH4AAAAABJRU5ErkJggg=="
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 6
},
{
"cell_type": "code",
"id": "1b54986e-4f48-4208-96ad-61203e74c38c",
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:07.986493Z",
"start_time": "2025-08-19T21:11:07.931939Z"
}
},
"source": [
"plt.hist2d(scorelog['mapx'], scorelog['mapy'], density=False, bins=50)\n",
"plt.show()"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 7
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:08.084634Z",
"start_time": "2025-08-19T21:11:08.080288Z"
}
},
"cell_type": "code",
"source": [
"# one entry per second per point captured\n",
"#\n",
"#@dataclass\n",
"#class ScoreSecond:\n",
"# name: str\n",
"# sourcename: str\n",
"# when: pandas.Timestamp\n",
"# score: float\n",
"# once: bool\n",
"# mapx: int\n",
"# mapy: int\n",
"#\n",
"#\n",
"#def row_to_scoreseconds(row, score_per):\n",
"# seconds = floor(row.score / score_per)\n",
"# assert row.score % score_per < 0.1\n",
"# when = floor(row.when.timestamp())\n",
"# for elapsed in range(0, seconds):\n",
"# timestamp = pandas.Timestamp(when - elapsed)\n",
"# yield ScoreSecond(name=row.name, sourcename=row.sourcename, mapx=row.mapx, mapy=row.mapy, when=timestamp, score=score_per, once=False)\n",
"#\n",
"#def gen_scoreseconds():\n",
"# for row in scorelog.itertuples():\n",
"# if row.sourcename == \"Capture\":\n",
"# yield from row_to_scoreseconds(row, 1.0)\n",
"# elif row.sourcename == \"Output Boost\":\n",
"# yield from row_to_scoreseconds(row, 0.1)\n",
"# else: # one-off\n",
"# yield ScoreSecond(name=row.name, sourcename=row.sourcename, mapx=row.mapx, mapy=row.mapy, when=row.when, score=row.score, once=True)\n",
"#\n",
"#scoreseconds = pandas.DataFrame(gen_scoreseconds())\n",
"#scoreseconds\n"
],
"id": "1371456d-5f15-4eb3-bd01-82a2bc60607a",
"outputs": [],
"execution_count": 8
},
{
"cell_type": "code",
"id": "24ead54a-01ce-4ab2-9b4e-ffeeaa7191c9",
"metadata": {
"ExecuteTime": {
"end_time": "2025-08-19T21:11:08.196471Z",
"start_time": "2025-08-19T21:11:08.193913Z"
}
},
"source": [
"#plt.hist2d(scoreseconds['mapx'], scoreseconds['mapy'], density=False, bins=40)\n",
"#plt.show()"
],
"outputs": [],
"execution_count": 9
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}