diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5e992d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.ipynb_checkpoints/ diff --git a/PolyGenStats-vinzenz-summary.csv b/PolyGenStats-vinzenz-summary.csv new file mode 100644 index 0000000..20fb962 --- /dev/null +++ b/PolyGenStats-vinzenz-summary.csv @@ -0,0 +1,26 @@ +name,totalvisits,captures,totalheldduration,maxheldduration +Site Sign,15,21,61707,46380 +Maker Days Eindhoven,13,10,61044,44313 +Pixelbar,18,17,51151,36261 +Cold North,17,20,49590,22971 +Karaoke Bar,19,16,44169,23180 +CoderDojo Belgium,15,13,42973,23237 +Entrance Arch,19,18,40416,28498 +Main Bar,42,67,33999,16913 +Badge Tent,21,21,31452,18329 +Bridge over troubled waters,28,28,27990,18829 +BornHack,8,5,16419,7753 +Info Desk,19,23,13685,3304 +PolyGen Home Base,18,17,12688,5316 +Milliways,23,47,9763,3386 +Party Bar,12,11,9251,7694 +Heaven,15,9,8980,3756 +Chaos Mauldasch,21,30,7426,1394 +Adyen,24,22,7007,3483 +Tilde Industries,5,4,6215,3365 +Geraffel,9,6,5286,1782 +Food Hacking Base,16,13,4427,993 +Rose Island Italian Embassy,9,7,3667,1258 +FALSE,7,5,2798,1969 +Matrix,7,6,2251,1096 +0E,1,1,91,91 diff --git a/flake.nix b/flake.nix index 3c9faad..9387a4d 100644 --- a/flake.nix +++ b/flake.nix @@ -34,6 +34,9 @@ jupyterlab matplotlib numpy + pandas + pip + notebook ]; pythonEnv = pkgs.python3.withPackages pythonPackages; in diff --git a/notebook.ipynb b/notebook.ipynb new file mode 100644 index 0000000..c44a15a --- /dev/null +++ b/notebook.ipynb @@ -0,0 +1,1572 @@ +{ + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
whenscoresourcenamenamemapxmapymapcoord
02025-08-08 20:14:00100First VisitInfo Desk216505(216, 505)
12025-08-08 20:19:00282CaptureInfo Desk216505(216, 505)
22025-08-08 20:20:0058CaptureInfo Desk216505(216, 505)
32025-08-08 20:22:00100First VisitMain Bar190570(190, 570)
42025-08-08 20:23:00100First VisitBadge Tent328607(328, 607)
........................
8962025-12-08 13:34:0091Capture0E00(0, 0)
8972025-12-08 13:39:0050VisitPixelbar379602(379, 602)
8982025-12-08 13:42:00164Output BoostSite Sign207874(207, 874)
8992025-12-08 13:50:00694CapturePixelbar379602(379, 602)
9002025-12-08 14:00:00284Output BoostMaker Days Eindhoven115749(115, 749)
\n", + "

901 rows × 7 columns

\n", + "
" + ] + }, + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nametotalvisitscapturestotalhelddurationmaxheldduration
0Site Sign15216170746380
1Maker Days Eindhoven13106104444313
2Pixelbar18175115136261
3Cold North17204959022971
4Karaoke Bar19164416923180
5CoderDojo Belgium15134297323237
6Entrance Arch19184041628498
7Main Bar42673399916913
8Badge Tent21213145218329
9Bridge over troubled waters28282799018829
10BornHack85164197753
11Info Desk1923136853304
12PolyGen Home Base1817126885316
13Milliways234797633386
14Party Bar121192517694
15Heaven15989803756
16Chaos Mauldasch213074261394
17Adyen242270073483
18Tilde Industries5462153365
19Geraffel9652861782
20Food Hacking Base16134427993
21Rose Island Italian Embassy9736671258
22FALSE7527981969
23Matrix7622511096
240E119191
\n", + "
" + ] + }, + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nametotalvisitscapturestotalhelddurationmaxhelddurationmapxmapyfirst_visitscore
0Site Sign152161707463802078742025-08-08 22:12:0063688
1Maker Days Eindhoven131061044443131157492025-08-08 22:28:0062440
2Pixelbar181751151362613796022025-09-08 00:42:0052601
3Cold North172049590229713054022025-08-08 21:56:0050757
4Karaoke Bar191644169231802924462025-08-08 21:55:0045272
5CoderDojo Belgium15134297323237345232025-08-08 21:39:0044374
6Entrance Arch191840416284982409162025-08-08 22:10:0041486
7Main Bar426733999169131905702025-08-08 20:22:0036884
8Badge Tent212131452183293286072025-08-08 20:23:0032599
9Bridge over troubled waters282827990188292515532025-09-08 02:28:0029550
10BornHack85164197753823372025-10-08 19:51:0017711
11Info Desk19231368533042165052025-08-08 20:14:0017026
12PolyGen Home Base18171268853163225912025-09-08 17:52:0014376
13Milliways234797633386954982025-09-08 17:07:0011003
14Party Bar121192517694672892025-08-08 22:54:0013340
15Heaven159898037561832272025-08-08 21:46:0010057
16Chaos Mauldasch2130742613941646352025-08-08 22:37:008564
17Adyen2422700734831206372025-08-08 22:34:008281
18Tilde Industries54621533653614682025-11-08 17:42:006515
19Geraffel96528617821881662025-08-08 23:03:006899
20Food Hacking Base161344279931195712025-10-08 18:31:005308
21Rose Island Italian Embassy9736671258414752025-10-08 04:12:004167
22FALSE75279819691634252025-08-08 23:17:003863
23Matrix76225110961647312025-11-08 15:33:002696
240E119191002025-12-08 13:32:00191
\n", + "
" + ] + }, + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nametotalvisitscapturestotalhelddurationmaxhelddurationmapxmapyfirst_visitscoretotalboostscoretotalboostdurationmaxboostscoremaxboostduration
0Site Sign152161707463802078742025-08-08 22:12:006368868168101991990
1Maker Days Eindhoven131061044443131157492025-08-08 22:28:006244069669602842840
2Cold North172049590229713054022025-08-08 21:56:005075726726701421420
3Karaoke Bar191644169231802924462025-08-08 21:55:0045272103103047470
4CoderDojo Belgium15134297323237345232025-08-08 21:39:004437410110101011010
5Entrance Arch191840416284982409162025-08-08 22:10:00414867070070700
6Main Bar426733999169131905702025-08-08 20:22:003688473573505375370
7Badge Tent212131452183293286072025-08-08 20:23:00325994747028280
8Bridge over troubled waters282827990188292515532025-09-08 02:28:0029550110110076760
9BornHack85164197753823372025-10-08 19:51:001771184284203243240
10Info Desk19231368533042165052025-08-08 20:14:0017026234123410226222620
11PolyGen Home Base18171268853163225912025-09-08 17:52:001437673873801901900
12Milliways234797633386954982025-09-08 17:07:00110034040035350
13Party Bar121192517694672892025-08-08 22:54:0013340343934390335033500
14Heaven159898037561832272025-08-08 21:46:001005727727701251250
15Chaos Mauldasch2130742613941646352025-08-08 22:37:0085643838038380
16Adyen2422700734831206372025-08-08 22:34:0082812424015150
17Geraffel96528617821881662025-08-08 23:03:0068991113111309029020
18Food Hacking Base161344279931195712025-10-08 18:31:0053083131028280
19FALSE75279819691634252025-08-08 23:17:00386366566506516510
20Matrix76225110961647312025-11-08 15:33:0026964545045450
\n", + "
" + ] + }, + "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": [ + "
" + ], + "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": [ + "
" + ], + "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 +}