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",
+ " when | \n",
+ " score | \n",
+ " sourcename | \n",
+ " name | \n",
+ " mapx | \n",
+ " mapy | \n",
+ " mapcoord | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 2025-08-08 20:14:00 | \n",
+ " 100 | \n",
+ " First Visit | \n",
+ " Info Desk | \n",
+ " 216 | \n",
+ " 505 | \n",
+ " (216, 505) | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2025-08-08 20:19:00 | \n",
+ " 282 | \n",
+ " Capture | \n",
+ " Info Desk | \n",
+ " 216 | \n",
+ " 505 | \n",
+ " (216, 505) | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 2025-08-08 20:20:00 | \n",
+ " 58 | \n",
+ " Capture | \n",
+ " Info Desk | \n",
+ " 216 | \n",
+ " 505 | \n",
+ " (216, 505) | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 2025-08-08 20:22:00 | \n",
+ " 100 | \n",
+ " First Visit | \n",
+ " Main Bar | \n",
+ " 190 | \n",
+ " 570 | \n",
+ " (190, 570) | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 2025-08-08 20:23:00 | \n",
+ " 100 | \n",
+ " First Visit | \n",
+ " Badge Tent | \n",
+ " 328 | \n",
+ " 607 | \n",
+ " (328, 607) | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 896 | \n",
+ " 2025-12-08 13:34:00 | \n",
+ " 91 | \n",
+ " Capture | \n",
+ " 0E | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " (0, 0) | \n",
+ "
\n",
+ " \n",
+ " 897 | \n",
+ " 2025-12-08 13:39:00 | \n",
+ " 50 | \n",
+ " Visit | \n",
+ " Pixelbar | \n",
+ " 379 | \n",
+ " 602 | \n",
+ " (379, 602) | \n",
+ "
\n",
+ " \n",
+ " 898 | \n",
+ " 2025-12-08 13:42:00 | \n",
+ " 164 | \n",
+ " Output Boost | \n",
+ " Site Sign | \n",
+ " 207 | \n",
+ " 874 | \n",
+ " (207, 874) | \n",
+ "
\n",
+ " \n",
+ " 899 | \n",
+ " 2025-12-08 13:50:00 | \n",
+ " 694 | \n",
+ " Capture | \n",
+ " Pixelbar | \n",
+ " 379 | \n",
+ " 602 | \n",
+ " (379, 602) | \n",
+ "
\n",
+ " \n",
+ " 900 | \n",
+ " 2025-12-08 14:00:00 | \n",
+ " 284 | \n",
+ " Output Boost | \n",
+ " Maker Days Eindhoven | \n",
+ " 115 | \n",
+ " 749 | \n",
+ " (115, 749) | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " name | \n",
+ " totalvisits | \n",
+ " captures | \n",
+ " totalheldduration | \n",
+ " maxheldduration | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Site Sign | \n",
+ " 15 | \n",
+ " 21 | \n",
+ " 61707 | \n",
+ " 46380 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Maker Days Eindhoven | \n",
+ " 13 | \n",
+ " 10 | \n",
+ " 61044 | \n",
+ " 44313 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Pixelbar | \n",
+ " 18 | \n",
+ " 17 | \n",
+ " 51151 | \n",
+ " 36261 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Cold North | \n",
+ " 17 | \n",
+ " 20 | \n",
+ " 49590 | \n",
+ " 22971 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Karaoke Bar | \n",
+ " 19 | \n",
+ " 16 | \n",
+ " 44169 | \n",
+ " 23180 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " CoderDojo Belgium | \n",
+ " 15 | \n",
+ " 13 | \n",
+ " 42973 | \n",
+ " 23237 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " Entrance Arch | \n",
+ " 19 | \n",
+ " 18 | \n",
+ " 40416 | \n",
+ " 28498 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Main Bar | \n",
+ " 42 | \n",
+ " 67 | \n",
+ " 33999 | \n",
+ " 16913 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " Badge Tent | \n",
+ " 21 | \n",
+ " 21 | \n",
+ " 31452 | \n",
+ " 18329 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Bridge over troubled waters | \n",
+ " 28 | \n",
+ " 28 | \n",
+ " 27990 | \n",
+ " 18829 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " BornHack | \n",
+ " 8 | \n",
+ " 5 | \n",
+ " 16419 | \n",
+ " 7753 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Info Desk | \n",
+ " 19 | \n",
+ " 23 | \n",
+ " 13685 | \n",
+ " 3304 | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " PolyGen Home Base | \n",
+ " 18 | \n",
+ " 17 | \n",
+ " 12688 | \n",
+ " 5316 | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Milliways | \n",
+ " 23 | \n",
+ " 47 | \n",
+ " 9763 | \n",
+ " 3386 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Party Bar | \n",
+ " 12 | \n",
+ " 11 | \n",
+ " 9251 | \n",
+ " 7694 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Heaven | \n",
+ " 15 | \n",
+ " 9 | \n",
+ " 8980 | \n",
+ " 3756 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Chaos Mauldasch | \n",
+ " 21 | \n",
+ " 30 | \n",
+ " 7426 | \n",
+ " 1394 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Adyen | \n",
+ " 24 | \n",
+ " 22 | \n",
+ " 7007 | \n",
+ " 3483 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " Tilde Industries | \n",
+ " 5 | \n",
+ " 4 | \n",
+ " 6215 | \n",
+ " 3365 | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " Geraffel | \n",
+ " 9 | \n",
+ " 6 | \n",
+ " 5286 | \n",
+ " 1782 | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Food Hacking Base | \n",
+ " 16 | \n",
+ " 13 | \n",
+ " 4427 | \n",
+ " 993 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " Rose Island Italian Embassy | \n",
+ " 9 | \n",
+ " 7 | \n",
+ " 3667 | \n",
+ " 1258 | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " FALSE | \n",
+ " 7 | \n",
+ " 5 | \n",
+ " 2798 | \n",
+ " 1969 | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Matrix | \n",
+ " 7 | \n",
+ " 6 | \n",
+ " 2251 | \n",
+ " 1096 | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " 0E | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 91 | \n",
+ " 91 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " name | \n",
+ " totalvisits | \n",
+ " captures | \n",
+ " totalheldduration | \n",
+ " maxheldduration | \n",
+ " mapx | \n",
+ " mapy | \n",
+ " first_visit | \n",
+ " score | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Site Sign | \n",
+ " 15 | \n",
+ " 21 | \n",
+ " 61707 | \n",
+ " 46380 | \n",
+ " 207 | \n",
+ " 874 | \n",
+ " 2025-08-08 22:12:00 | \n",
+ " 63688 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Maker Days Eindhoven | \n",
+ " 13 | \n",
+ " 10 | \n",
+ " 61044 | \n",
+ " 44313 | \n",
+ " 115 | \n",
+ " 749 | \n",
+ " 2025-08-08 22:28:00 | \n",
+ " 62440 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Pixelbar | \n",
+ " 18 | \n",
+ " 17 | \n",
+ " 51151 | \n",
+ " 36261 | \n",
+ " 379 | \n",
+ " 602 | \n",
+ " 2025-09-08 00:42:00 | \n",
+ " 52601 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Cold North | \n",
+ " 17 | \n",
+ " 20 | \n",
+ " 49590 | \n",
+ " 22971 | \n",
+ " 305 | \n",
+ " 402 | \n",
+ " 2025-08-08 21:56:00 | \n",
+ " 50757 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Karaoke Bar | \n",
+ " 19 | \n",
+ " 16 | \n",
+ " 44169 | \n",
+ " 23180 | \n",
+ " 292 | \n",
+ " 446 | \n",
+ " 2025-08-08 21:55:00 | \n",
+ " 45272 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " CoderDojo Belgium | \n",
+ " 15 | \n",
+ " 13 | \n",
+ " 42973 | \n",
+ " 23237 | \n",
+ " 34 | \n",
+ " 523 | \n",
+ " 2025-08-08 21:39:00 | \n",
+ " 44374 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " Entrance Arch | \n",
+ " 19 | \n",
+ " 18 | \n",
+ " 40416 | \n",
+ " 28498 | \n",
+ " 240 | \n",
+ " 916 | \n",
+ " 2025-08-08 22:10:00 | \n",
+ " 41486 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Main Bar | \n",
+ " 42 | \n",
+ " 67 | \n",
+ " 33999 | \n",
+ " 16913 | \n",
+ " 190 | \n",
+ " 570 | \n",
+ " 2025-08-08 20:22:00 | \n",
+ " 36884 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " Badge Tent | \n",
+ " 21 | \n",
+ " 21 | \n",
+ " 31452 | \n",
+ " 18329 | \n",
+ " 328 | \n",
+ " 607 | \n",
+ " 2025-08-08 20:23:00 | \n",
+ " 32599 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Bridge over troubled waters | \n",
+ " 28 | \n",
+ " 28 | \n",
+ " 27990 | \n",
+ " 18829 | \n",
+ " 251 | \n",
+ " 553 | \n",
+ " 2025-09-08 02:28:00 | \n",
+ " 29550 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " BornHack | \n",
+ " 8 | \n",
+ " 5 | \n",
+ " 16419 | \n",
+ " 7753 | \n",
+ " 82 | \n",
+ " 337 | \n",
+ " 2025-10-08 19:51:00 | \n",
+ " 17711 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Info Desk | \n",
+ " 19 | \n",
+ " 23 | \n",
+ " 13685 | \n",
+ " 3304 | \n",
+ " 216 | \n",
+ " 505 | \n",
+ " 2025-08-08 20:14:00 | \n",
+ " 17026 | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " PolyGen Home Base | \n",
+ " 18 | \n",
+ " 17 | \n",
+ " 12688 | \n",
+ " 5316 | \n",
+ " 322 | \n",
+ " 591 | \n",
+ " 2025-09-08 17:52:00 | \n",
+ " 14376 | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Milliways | \n",
+ " 23 | \n",
+ " 47 | \n",
+ " 9763 | \n",
+ " 3386 | \n",
+ " 95 | \n",
+ " 498 | \n",
+ " 2025-09-08 17:07:00 | \n",
+ " 11003 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Party Bar | \n",
+ " 12 | \n",
+ " 11 | \n",
+ " 9251 | \n",
+ " 7694 | \n",
+ " 67 | \n",
+ " 289 | \n",
+ " 2025-08-08 22:54:00 | \n",
+ " 13340 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Heaven | \n",
+ " 15 | \n",
+ " 9 | \n",
+ " 8980 | \n",
+ " 3756 | \n",
+ " 183 | \n",
+ " 227 | \n",
+ " 2025-08-08 21:46:00 | \n",
+ " 10057 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Chaos Mauldasch | \n",
+ " 21 | \n",
+ " 30 | \n",
+ " 7426 | \n",
+ " 1394 | \n",
+ " 164 | \n",
+ " 635 | \n",
+ " 2025-08-08 22:37:00 | \n",
+ " 8564 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Adyen | \n",
+ " 24 | \n",
+ " 22 | \n",
+ " 7007 | \n",
+ " 3483 | \n",
+ " 120 | \n",
+ " 637 | \n",
+ " 2025-08-08 22:34:00 | \n",
+ " 8281 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " Tilde Industries | \n",
+ " 5 | \n",
+ " 4 | \n",
+ " 6215 | \n",
+ " 3365 | \n",
+ " 361 | \n",
+ " 468 | \n",
+ " 2025-11-08 17:42:00 | \n",
+ " 6515 | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " Geraffel | \n",
+ " 9 | \n",
+ " 6 | \n",
+ " 5286 | \n",
+ " 1782 | \n",
+ " 188 | \n",
+ " 166 | \n",
+ " 2025-08-08 23:03:00 | \n",
+ " 6899 | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Food Hacking Base | \n",
+ " 16 | \n",
+ " 13 | \n",
+ " 4427 | \n",
+ " 993 | \n",
+ " 119 | \n",
+ " 571 | \n",
+ " 2025-10-08 18:31:00 | \n",
+ " 5308 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " Rose Island Italian Embassy | \n",
+ " 9 | \n",
+ " 7 | \n",
+ " 3667 | \n",
+ " 1258 | \n",
+ " 41 | \n",
+ " 475 | \n",
+ " 2025-10-08 04:12:00 | \n",
+ " 4167 | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " FALSE | \n",
+ " 7 | \n",
+ " 5 | \n",
+ " 2798 | \n",
+ " 1969 | \n",
+ " 163 | \n",
+ " 425 | \n",
+ " 2025-08-08 23:17:00 | \n",
+ " 3863 | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Matrix | \n",
+ " 7 | \n",
+ " 6 | \n",
+ " 2251 | \n",
+ " 1096 | \n",
+ " 164 | \n",
+ " 731 | \n",
+ " 2025-11-08 15:33:00 | \n",
+ " 2696 | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " 0E | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 91 | \n",
+ " 91 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 2025-12-08 13:32:00 | \n",
+ " 191 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " name | \n",
+ " totalvisits | \n",
+ " captures | \n",
+ " totalheldduration | \n",
+ " maxheldduration | \n",
+ " mapx | \n",
+ " mapy | \n",
+ " first_visit | \n",
+ " score | \n",
+ " totalboostscore | \n",
+ " totalboostduration | \n",
+ " maxboostscore | \n",
+ " maxboostduration | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Site Sign | \n",
+ " 15 | \n",
+ " 21 | \n",
+ " 61707 | \n",
+ " 46380 | \n",
+ " 207 | \n",
+ " 874 | \n",
+ " 2025-08-08 22:12:00 | \n",
+ " 63688 | \n",
+ " 681 | \n",
+ " 6810 | \n",
+ " 199 | \n",
+ " 1990 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Maker Days Eindhoven | \n",
+ " 13 | \n",
+ " 10 | \n",
+ " 61044 | \n",
+ " 44313 | \n",
+ " 115 | \n",
+ " 749 | \n",
+ " 2025-08-08 22:28:00 | \n",
+ " 62440 | \n",
+ " 696 | \n",
+ " 6960 | \n",
+ " 284 | \n",
+ " 2840 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Cold North | \n",
+ " 17 | \n",
+ " 20 | \n",
+ " 49590 | \n",
+ " 22971 | \n",
+ " 305 | \n",
+ " 402 | \n",
+ " 2025-08-08 21:56:00 | \n",
+ " 50757 | \n",
+ " 267 | \n",
+ " 2670 | \n",
+ " 142 | \n",
+ " 1420 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Karaoke Bar | \n",
+ " 19 | \n",
+ " 16 | \n",
+ " 44169 | \n",
+ " 23180 | \n",
+ " 292 | \n",
+ " 446 | \n",
+ " 2025-08-08 21:55:00 | \n",
+ " 45272 | \n",
+ " 103 | \n",
+ " 1030 | \n",
+ " 47 | \n",
+ " 470 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " CoderDojo Belgium | \n",
+ " 15 | \n",
+ " 13 | \n",
+ " 42973 | \n",
+ " 23237 | \n",
+ " 34 | \n",
+ " 523 | \n",
+ " 2025-08-08 21:39:00 | \n",
+ " 44374 | \n",
+ " 101 | \n",
+ " 1010 | \n",
+ " 101 | \n",
+ " 1010 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " Entrance Arch | \n",
+ " 19 | \n",
+ " 18 | \n",
+ " 40416 | \n",
+ " 28498 | \n",
+ " 240 | \n",
+ " 916 | \n",
+ " 2025-08-08 22:10:00 | \n",
+ " 41486 | \n",
+ " 70 | \n",
+ " 700 | \n",
+ " 70 | \n",
+ " 700 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " Main Bar | \n",
+ " 42 | \n",
+ " 67 | \n",
+ " 33999 | \n",
+ " 16913 | \n",
+ " 190 | \n",
+ " 570 | \n",
+ " 2025-08-08 20:22:00 | \n",
+ " 36884 | \n",
+ " 735 | \n",
+ " 7350 | \n",
+ " 537 | \n",
+ " 5370 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Badge Tent | \n",
+ " 21 | \n",
+ " 21 | \n",
+ " 31452 | \n",
+ " 18329 | \n",
+ " 328 | \n",
+ " 607 | \n",
+ " 2025-08-08 20:23:00 | \n",
+ " 32599 | \n",
+ " 47 | \n",
+ " 470 | \n",
+ " 28 | \n",
+ " 280 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " Bridge over troubled waters | \n",
+ " 28 | \n",
+ " 28 | \n",
+ " 27990 | \n",
+ " 18829 | \n",
+ " 251 | \n",
+ " 553 | \n",
+ " 2025-09-08 02:28:00 | \n",
+ " 29550 | \n",
+ " 110 | \n",
+ " 1100 | \n",
+ " 76 | \n",
+ " 760 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " BornHack | \n",
+ " 8 | \n",
+ " 5 | \n",
+ " 16419 | \n",
+ " 7753 | \n",
+ " 82 | \n",
+ " 337 | \n",
+ " 2025-10-08 19:51:00 | \n",
+ " 17711 | \n",
+ " 842 | \n",
+ " 8420 | \n",
+ " 324 | \n",
+ " 3240 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " Info Desk | \n",
+ " 19 | \n",
+ " 23 | \n",
+ " 13685 | \n",
+ " 3304 | \n",
+ " 216 | \n",
+ " 505 | \n",
+ " 2025-08-08 20:14:00 | \n",
+ " 17026 | \n",
+ " 2341 | \n",
+ " 23410 | \n",
+ " 2262 | \n",
+ " 22620 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " PolyGen Home Base | \n",
+ " 18 | \n",
+ " 17 | \n",
+ " 12688 | \n",
+ " 5316 | \n",
+ " 322 | \n",
+ " 591 | \n",
+ " 2025-09-08 17:52:00 | \n",
+ " 14376 | \n",
+ " 738 | \n",
+ " 7380 | \n",
+ " 190 | \n",
+ " 1900 | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " Milliways | \n",
+ " 23 | \n",
+ " 47 | \n",
+ " 9763 | \n",
+ " 3386 | \n",
+ " 95 | \n",
+ " 498 | \n",
+ " 2025-09-08 17:07:00 | \n",
+ " 11003 | \n",
+ " 40 | \n",
+ " 400 | \n",
+ " 35 | \n",
+ " 350 | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Party Bar | \n",
+ " 12 | \n",
+ " 11 | \n",
+ " 9251 | \n",
+ " 7694 | \n",
+ " 67 | \n",
+ " 289 | \n",
+ " 2025-08-08 22:54:00 | \n",
+ " 13340 | \n",
+ " 3439 | \n",
+ " 34390 | \n",
+ " 3350 | \n",
+ " 33500 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Heaven | \n",
+ " 15 | \n",
+ " 9 | \n",
+ " 8980 | \n",
+ " 3756 | \n",
+ " 183 | \n",
+ " 227 | \n",
+ " 2025-08-08 21:46:00 | \n",
+ " 10057 | \n",
+ " 277 | \n",
+ " 2770 | \n",
+ " 125 | \n",
+ " 1250 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Chaos Mauldasch | \n",
+ " 21 | \n",
+ " 30 | \n",
+ " 7426 | \n",
+ " 1394 | \n",
+ " 164 | \n",
+ " 635 | \n",
+ " 2025-08-08 22:37:00 | \n",
+ " 8564 | \n",
+ " 38 | \n",
+ " 380 | \n",
+ " 38 | \n",
+ " 380 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Adyen | \n",
+ " 24 | \n",
+ " 22 | \n",
+ " 7007 | \n",
+ " 3483 | \n",
+ " 120 | \n",
+ " 637 | \n",
+ " 2025-08-08 22:34:00 | \n",
+ " 8281 | \n",
+ " 24 | \n",
+ " 240 | \n",
+ " 15 | \n",
+ " 150 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Geraffel | \n",
+ " 9 | \n",
+ " 6 | \n",
+ " 5286 | \n",
+ " 1782 | \n",
+ " 188 | \n",
+ " 166 | \n",
+ " 2025-08-08 23:03:00 | \n",
+ " 6899 | \n",
+ " 1113 | \n",
+ " 11130 | \n",
+ " 902 | \n",
+ " 9020 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " Food Hacking Base | \n",
+ " 16 | \n",
+ " 13 | \n",
+ " 4427 | \n",
+ " 993 | \n",
+ " 119 | \n",
+ " 571 | \n",
+ " 2025-10-08 18:31:00 | \n",
+ " 5308 | \n",
+ " 31 | \n",
+ " 310 | \n",
+ " 28 | \n",
+ " 280 | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " FALSE | \n",
+ " 7 | \n",
+ " 5 | \n",
+ " 2798 | \n",
+ " 1969 | \n",
+ " 163 | \n",
+ " 425 | \n",
+ " 2025-08-08 23:17:00 | \n",
+ " 3863 | \n",
+ " 665 | \n",
+ " 6650 | \n",
+ " 651 | \n",
+ " 6510 | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Matrix | \n",
+ " 7 | \n",
+ " 6 | \n",
+ " 2251 | \n",
+ " 1096 | \n",
+ " 164 | \n",
+ " 731 | \n",
+ " 2025-11-08 15:33:00 | \n",
+ " 2696 | \n",
+ " 45 | \n",
+ " 450 | \n",
+ " 45 | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ "
\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": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGdCAYAAAA44ojeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIldJREFUeJzt3XtwVOXh//FPQi6EyyYEyG5SAaNSMXIRQcOCtU7JEBCtVNqKTR1UBiomVgRRYgWKtyhtqcUqVKvA/ESpdkSUCpUGiRdChAjKzQiWGhQ3QWk2XCTX5/eH35zpQoQNkOyzy/s1szPmnCfJc545kfec7DmJMsYYAQAAWCQ61BMAAAA4FoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoxoZ7AqWhsbNS+ffvUuXNnRUVFhXo6AAAgCMYYHTx4UGlpaYqOPvE1krAMlH379qlHjx6hngYAADgFe/fu1TnnnHPCMWEZKJ07d5YkXaGrFaPYEM8GAE7PgVszgxqX/FxJK88EaF31qtO7esP5d/xEwjJQmn6tE6NYxUQRKADCW7u49kGN4/93CHv/99f/gnl7Bm+SBQAA1iFQAACAdQgUAABgHQIFAABYJyzfJAsAkaTrX9aHegqAdbiCAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrcJsxgIhXMWVoUOPcj3O7L2ALrqAAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA7PQQEQ8Xi+CRB+uIICAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDotCpSGhgbNnDlT6enpSkhI0Pnnn68HH3xQxhhnjDFGs2bNUmpqqhISEpSVlaVdu3YFfJ0DBw4oJydHLpdLSUlJmjBhgg4dOnRmjggAAIS9FgXKY489pgULFujPf/6zdu7cqccee0xz587VE0884YyZO3eu5s+fr4ULF6qkpEQdO3ZUdna2jh496ozJycnR9u3btWbNGq1cuVJvv/22Jk2adOaOCgAAhLUo87+XP07immuukdvt1rPPPutsGzt2rBISEvT888/LGKO0tDRNmzZNd999tyTJ7/fL7XZr8eLFGjdunHbu3KmMjAxt3LhRgwcPliStXr1aV199tT7//HOlpaWddB7V1dVKTEzUVbpOMVGxLT1mAAAQAvWmTuu0Qn6/Xy6X64RjW3QFZejQoSosLNQnn3wiSfrwww/17rvvatSoUZKkPXv2yOfzKSsry/mcxMREZWZmqri4WJJUXFyspKQkJ04kKSsrS9HR0SopKWn2+9bU1Ki6ujrgBQAAIldMSwbPmDFD1dXV6tOnj9q1a6eGhgY9/PDDysnJkST5fD5JktvtDvg8t9vt7PP5fEpJSQmcREyMkpOTnTHHKigo0Jw5c1oyVQAAEMZadAXlpZde0tKlS/XCCy/ogw8+0JIlS/T73/9eS5Ysaa35SZLy8/Pl9/ud1969e1v1+wEAgNBq0RWU6dOna8aMGRo3bpwkqV+/fvrss89UUFCg8ePHy+PxSJIqKiqUmprqfF5FRYUuueQSSZLH41FlZWXA162vr9eBAweczz9WfHy84uPjWzJVAAAQxlp0BeXIkSOKjg78lHbt2qmxsVGSlJ6eLo/Ho8LCQmd/dXW1SkpK5PV6JUler1dVVVUqLS11xqxdu1aNjY3KzMw85QMBAACRo0VXUK699lo9/PDD6tmzpy6++GJt3rxZ8+bN06233ipJioqK0pQpU/TQQw+pd+/eSk9P18yZM5WWlqYxY8ZIki666CKNHDlSEydO1MKFC1VXV6e8vDyNGzcuqDt4AABA5GtRoDzxxBOaOXOmbr/9dlVWViotLU2/+tWvNGvWLGfMPffco8OHD2vSpEmqqqrSFVdcodWrV6t9+/bOmKVLlyovL0/Dhw9XdHS0xo4dq/nz55+5owIAAGGtRc9BsQXPQQEAIPy02nNQAAAA2gKBAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsE5MqCcA2KLm2suDGhf/+vutPBMAAFdQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiH56AA/+dser5Ju4u/H9S4hu2ftPJMAKB5XEEBAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHW4zRg4C3H7MADbcQUFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFgnJtQTAGyxd/bQoMb1mLO+lWfS+j57KLhj7XV/+B8rgPDEFRQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIfbjIH/Ewm3DweL24eBtvHltOBu6U/9Az+Tx+IKCgAAsA6BAgAArEOgAAAA6xAoAADAOi0OlC+++EK//OUv1bVrVyUkJKhfv37atGmTs98Yo1mzZik1NVUJCQnKysrSrl27Ar7GgQMHlJOTI5fLpaSkJE2YMEGHDh06/aMBAAARoUWB8t///lfDhg1TbGysVq1apR07dugPf/iDunTp4oyZO3eu5s+fr4ULF6qkpEQdO3ZUdna2jh496ozJycnR9u3btWbNGq1cuVJvv/22Jk2adOaOCgAAhLUoY4wJdvCMGTP03nvv6Z133ml2vzFGaWlpmjZtmu6++25Jkt/vl9vt1uLFizVu3Djt3LlTGRkZ2rhxowYPHixJWr16ta6++mp9/vnnSktLO+k8qqurlZiYqKt0nWKiYoOdPgAAZ0Tlr4O7fThl/tlz+/B/b/WedExD7VFt+X+/kd/vl8vlOuHYFl1Bee211zR48GD97Gc/U0pKigYOHKhnnnnG2b9nzx75fD5lZWU52xITE5WZmani4mJJUnFxsZKSkpw4kaSsrCxFR0erpKSk2e9bU1Oj6urqgBcAAIhcLQqUf//731qwYIF69+6tf/7zn5o8ebJ+/etfa8mSJZIkn88nSXK73QGf53a7nX0+n08pKSkB+2NiYpScnOyMOVZBQYESExOdV48ePVoybQAAEGZaFCiNjY269NJL9cgjj2jgwIGaNGmSJk6cqIULF7bW/CRJ+fn58vv9zmvv3r2t+v0AAEBotShQUlNTlZGREbDtoosuUnl5uSTJ4/FIkioqKgLGVFRUOPs8Ho8qKysD9tfX1+vAgQPOmGPFx8fL5XIFvAAAQORqUaAMGzZMZWVlAds++eQT9erVS5KUnp4uj8ejwsJCZ391dbVKSkrk9X775hmv16uqqiqVlpY6Y9auXavGxkZlZmae8oEAAIDI0aI/FnjXXXdp6NCheuSRR/Tzn/9c77//vp5++mk9/fTTkqSoqChNmTJFDz30kHr37q309HTNnDlTaWlpGjNmjKRvr7iMHDnS+dVQXV2d8vLyNG7cuKDu4AEAAJGvRYFy2WWXafny5crPz9cDDzyg9PR0Pf7448rJyXHG3HPPPTp8+LAmTZqkqqoqXXHFFVq9erXat2/vjFm6dKny8vI0fPhwRUdHa+zYsZo/f/6ZOyoAABDWWvQcFFvwHBS0hkM3DAlqXKe/bWjlmeCf+z4Malx22oBWngmAM6ne1GmdVpz556AAAAC0BQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFinRc9BASIZtw/bg9uHT92uJ4K7Xb73HZzvsBtXUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh+egAEAE4fkmiBRcQQEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdbjNuJUc/mlwf/K849+5JRAAgGNxBQUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1uE241bC7cOn7otXLg5q3Peu397KM8HZZt89Q4MalzZ3fSvPBABXUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh+egwDo83wShwvNNAHtwBQUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1uE24xCLHpAR1LjGD3e08kwAAGeTmHO+F9S4+s+/aOWZNI8rKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDrcZhxi3DwPA8b7+1dCgxnX9C3+B+lSF6vbhYHEFBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1eA4KcBZqd/H3gxrXsP2TVp4J0DyebwKuoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOtxmDJyFuH0YgO24ggIAAKxDoAAAAOsQKAAAwDoECgAAsM5pBcqjjz6qqKgoTZkyxdl29OhR5ebmqmvXrurUqZPGjh2rioqKgM8rLy/X6NGj1aFDB6WkpGj69Omqr68/nakAAIAIcsqBsnHjRv3lL39R//79A7bfddddev311/Xyyy+rqKhI+/bt0/XXX+/sb2ho0OjRo1VbW6v169dryZIlWrx4sWbNmnXqRwEAACLKKQXKoUOHlJOTo2eeeUZdunRxtvv9fj377LOaN2+efvSjH2nQoEFatGiR1q9frw0bNkiS3nzzTe3YsUPPP/+8LrnkEo0aNUoPPvignnzySdXW1p6ZowIAAGHtlJ6Dkpubq9GjRysrK0sPPfSQs720tFR1dXXKyspytvXp00c9e/ZUcXGxhgwZouLiYvXr109ut9sZk52drcmTJ2v79u0aOHDgcd+vpqZGNTU1zsfV1dWnMm0AwFmq8tdDgxqXMn99K88EwWpxoCxbtkwffPCBNm7ceNw+n8+nuLg4JSUlBWx3u93y+XzOmP+Nk6b9TfuaU1BQoDlz5rR0qgAAIEy16Fc8e/fu1Z133qmlS5eqffv2rTWn4+Tn58vv9zuvvXv3ttn3BgAAba9FgVJaWqrKykpdeumliomJUUxMjIqKijR//nzFxMTI7XartrZWVVVVAZ9XUVEhj8cjSfJ4PMfd1dP0cdOYY8XHx8vlcgW8AABA5GpRoAwfPlxbt27Vli1bnNfgwYOVk5Pj/HdsbKwKCwudzykrK1N5ebm8Xq8kyev1auvWraqsrHTGrFmzRi6XSxkZGWfosAAAQDhr0XtQOnfurL59+wZs69ixo7p27epsnzBhgqZOnark5GS5XC7dcccd8nq9GjJkiCRpxIgRysjI0E033aS5c+fK5/Pp/vvvV25uruLj48/QYQEAgHB2xv+a8R//+EdFR0dr7NixqqmpUXZ2tp566ilnf7t27bRy5UpNnjxZXq9XHTt21Pjx4/XAAw+c6akAAIAwFWWMMaGeREtVV1crMTFRV+k6xUTFhno6AAAgCPWmTuu0Qn6//6TvJ+Vv8QAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoxoZ4Awl/0gIygxjV+uKOVZwIAiBRcQQEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdbjNGKeN24cBAGcaV1AAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGCdmFBPAG2vduRlQY2LW72xlWcCAEDzuIICAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOtwm/FZiNuHAQC24woKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsExPqCQA4exy9LjOoce1XlLTyTADYjisoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKzDc1AAtBmebwIgWFxBAQAA1iFQAACAdVoUKAUFBbrsssvUuXNnpaSkaMyYMSorKwsYc/ToUeXm5qpr167q1KmTxo4dq4qKioAx5eXlGj16tDp06KCUlBRNnz5d9fX1p380AAAgIrQoUIqKipSbm6sNGzZozZo1qqur04gRI3T48GFnzF133aXXX39dL7/8soqKirRv3z5df/31zv6GhgaNHj1atbW1Wr9+vZYsWaLFixdr1qxZZ+6oAABAWIsyxphT/eT9+/crJSVFRUVFuvLKK+X3+9W9e3e98MIL+ulPfypJ+vjjj3XRRRepuLhYQ4YM0apVq3TNNddo3759crvdkqSFCxfq3nvv1f79+xUXF3fS71tdXa3ExERdpesUExV7qtMHAABtqN7UaZ1WyO/3y+VynXDsab0Hxe/3S5KSk5MlSaWlpaqrq1NWVpYzpk+fPurZs6eKi4slScXFxerXr58TJ5KUnZ2t6upqbd++/XSmAwAAIsQp32bc2NioKVOmaNiwYerbt68kyefzKS4uTklJSQFj3W63fD6fM+Z/46Rpf9O+5tTU1Kimpsb5uLq6+lSnDQAAwsApX0HJzc3Vtm3btGzZsjM5n2YVFBQoMTHRefXo0aPVvycAAAidUwqUvLw8rVy5Um+99ZbOOeccZ7vH41Ftba2qqqoCxldUVMjj8Thjjr2rp+njpjHHys/Pl9/vd1579+49lWkDAIAw0aJAMcYoLy9Py5cv19q1a5Wenh6wf9CgQYqNjVVhYaGzraysTOXl5fJ6vZIkr9errVu3qrKy0hmzZs0auVwuZWRkNPt94+Pj5XK5Al4AACByteg9KLm5uXrhhRe0YsUKde7c2XnPSGJiohISEpSYmKgJEyZo6tSpSk5Olsvl0h133CGv16shQ4ZIkkaMGKGMjAzddNNNmjt3rnw+n+6//37l5uYqPj7+zB8hAAAIOy26zTgqKqrZ7YsWLdLNN98s6dsHtU2bNk0vvviiampqlJ2draeeeirg1zefffaZJk+erHXr1qljx44aP368Hn30UcXEBNdL3GYMAED4acltxqf1HJRQIVAAAAg/LQkU/poxgDYTdXm/oMaZ97e28kwA2I4/FggAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOjwHBUCb4fkmAILFFRQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYJybUEzgd0XFxio6KPeGYxtraNpoNAAA4U7iCAgAArEOgAAAA64Q0UJ588kmde+65at++vTIzM/X++++HcjoAAMASIQuUv/3tb5o6dapmz56tDz74QAMGDFB2drYqKytDNSUAAGCJkAXKvHnzNHHiRN1yyy3KyMjQwoUL1aFDBz333HOhmhIAALBESO7iqa2tVWlpqfLz851t0dHRysrKUnFx8XHja2pqVFNT43zs9/slSfWm7qTfqzGIMQAAoPXV69t/k40xJx0bkkD56quv1NDQILfbHbDd7Xbr448/Pm58QUGB5syZc9z2t+teba0pAgCAVnLw4EElJiaecExYPAclPz9fU6dOdT6uqqpSr169VF5eftIDjGTV1dXq0aOH9u7dK5fLFerphARrwBo0YR1Ygyasg71rYIzRwYMHlZaWdtKxIQmUbt26qV27dqqoqAjYXlFRIY/Hc9z4+Ph4xcfHH7c9MTHRqoUPFZfLddavA2vAGjRhHViDJqyDnWsQ7IWFkLxJNi4uToMGDVJhYaGzrbGxUYWFhfJ6vaGYEgAAsEjIfsUzdepUjR8/XoMHD9bll1+uxx9/XIcPH9Ytt9wSqikBAABLhCxQbrjhBu3fv1+zZs2Sz+fTJZdcotWrVx/3xtnmxMfHa/bs2c3+2udswjqwBhJr0IR1YA2asA6RsQZRJph7fQAAANoQf4sHAABYh0ABAADWIVAAAIB1CBQAAGCdsAyUJ598Uueee67at2+vzMxMvf/++6GeUqv57W9/q6ioqIBXnz59nP1Hjx5Vbm6uunbtqk6dOmns2LHHPQAv3Lz99tu69tprlZaWpqioKL366qsB+40xmjVrllJTU5WQkKCsrCzt2rUrYMyBAweUk5Mjl8ulpKQkTZgwQYcOHWrDozh9J1uHm2+++bhzY+TIkQFjwn0dCgoKdNlll6lz585KSUnRmDFjVFZWFjAmmJ+B8vJyjR49Wh06dFBKSoqmT5+u+vr6tjyUUxbMGlx11VXHnQu33XZbwJhwXgNJWrBggfr37+88eMzr9WrVqlXO/kg/D6STr0HEnQcmzCxbtszExcWZ5557zmzfvt1MnDjRJCUlmYqKilBPrVXMnj3bXHzxxebLL790Xvv373f233bbbaZHjx6msLDQbNq0yQwZMsQMHTo0hDM+fW+88Yb5zW9+Y1555RUjySxfvjxg/6OPPmoSExPNq6++aj788EPz4x//2KSnp5tvvvnGGTNy5EgzYMAAs2HDBvPOO++YCy64wNx4441tfCSn52TrMH78eDNy5MiAc+PAgQMBY8J9HbKzs82iRYvMtm3bzJYtW8zVV19tevbsaQ4dOuSMOdnPQH19venbt6/JysoymzdvNm+88Ybp1q2byc/PD8UhtVgwa/DDH/7QTJw4MeBc8Pv9zv5wXwNjjHnttdfMP/7xD/PJJ5+YsrIyc99995nY2Fizbds2Y0zknwfGnHwNIu08CLtAufzyy01ubq7zcUNDg0lLSzMFBQUhnFXrmT17thkwYECz+6qqqkxsbKx5+eWXnW07d+40kkxxcXEbzbB1HfsPc2Njo/F4POZ3v/uds62qqsrEx8ebF1980RhjzI4dO4wks3HjRmfMqlWrTFRUlPniiy/abO5n0ncFynXXXfednxOJ61BZWWkkmaKiImNMcD8Db7zxhomOjjY+n88Zs2DBAuNyuUxNTU3bHsAZcOwaGPPtP0x33nnnd35OpK1Bky5dupi//vWvZ+V50KRpDYyJvPMgrH7FU1tbq9LSUmVlZTnboqOjlZWVpeLi4hDOrHXt2rVLaWlpOu+885STk6Py8nJJUmlpqerq6gLWo0+fPurZs2fErseePXvk8/kCjjkxMVGZmZnOMRcXFyspKUmDBw92xmRlZSk6OlolJSVtPufWtG7dOqWkpOjCCy/U5MmT9fXXXzv7InEd/H6/JCk5OVlScD8DxcXF6tevX8BDILOzs1VdXa3t27e34ezPjGPXoMnSpUvVrVs39e3bV/n5+Tpy5IizL9LWoKGhQcuWLdPhw4fl9XrPyvPg2DVoEknnQVj8NeMmX331lRoaGo572qzb7dbHH38colm1rszMTC1evFgXXnihvvzyS82ZM0c/+MEPtG3bNvl8PsXFxSkpKSngc9xut3w+X2gm3Mqajqu5c6Bpn8/nU0pKSsD+mJgYJScnR9S6jBw5Utdff73S09P16aef6r777tOoUaNUXFysdu3aRdw6NDY2asqUKRo2bJj69u0rSUH9DPh8vmbPl6Z94aS5NZCkX/ziF+rVq5fS0tL00Ucf6d5771VZWZleeeUVSZGzBlu3bpXX69XRo0fVqVMnLV++XBkZGdqyZctZcx581xpIkXcehFWgnI1GjRrl/Hf//v2VmZmpXr166aWXXlJCQkIIZ4ZQGzdunPPf/fr1U//+/XX++edr3bp1Gj58eAhn1jpyc3O1bds2vfvuu6GeSsh81xpMmjTJ+e9+/fopNTVVw4cP16effqrzzz+/rafZai688EJt2bJFfr9ff//73zV+/HgVFRWFelpt6rvWICMjI+LOg7D6FU+3bt3Url27496ZXVFRIY/HE6JZta2kpCR9//vf1+7du+XxeFRbW6uqqqqAMZG8Hk3HdaJzwOPxqLKyMmB/fX29Dhw4ELHrIknnnXeeunXrpt27d0uKrHXIy8vTypUr9dZbb+mcc85xtgfzM+DxeJo9X5r2hYvvWoPmZGZmSlLAuRAJaxAXF6cLLrhAgwYNUkFBgQYMGKA//elPZ9V58F1r0JxwPw/CKlDi4uI0aNAgFRYWOtsaGxtVWFgY8Du4SHbo0CF9+umnSk1N1aBBgxQbGxuwHmVlZSovL4/Y9UhPT5fH4wk45urqapWUlDjH7PV6VVVVpdLSUmfM2rVr1djY6PzARqLPP/9cX3/9tVJTUyVFxjoYY5SXl6fly5dr7dq1Sk9PD9gfzM+A1+vV1q1bA2JtzZo1crlczqVxm51sDZqzZcsWSQo4F8J5Db5LY2Ojampqzorz4Ls0rUFzwv48CPW7dFtq2bJlJj4+3ixevNjs2LHDTJo0ySQlJQW8KzmSTJs2zaxbt87s2bPHvPfeeyYrK8t069bNVFZWGmO+vbWuZ8+eZu3atWbTpk3G6/Uar9cb4lmfnoMHD5rNmzebzZs3G0lm3rx5ZvPmzeazzz4zxnx7m3FSUpJZsWKF+eijj8x1113X7G3GAwcONCUlJebdd981vXv3Dqvba4058TocPHjQ3H333aa4uNjs2bPH/Otf/zKXXnqp6d27tzl69KjzNcJ9HSZPnmwSExPNunXrAm6dPHLkiDPmZD8DTbdWjhgxwmzZssWsXr3adO/e3dpbK491sjXYvXu3eeCBB8ymTZvMnj17zIoVK8x5551nrrzySudrhPsaGGPMjBkzTFFRkdmzZ4/56KOPzIwZM0xUVJR58803jTGRfx4Yc+I1iMTzIOwCxRhjnnjiCdOzZ08TFxdnLr/8crNhw4ZQT6nV3HDDDSY1NdXExcWZ733ve+aGG24wu3fvdvZ/88035vbbbzddunQxHTp0MD/5yU/Ml19+GcIZn7633nrLSDruNX78eGPMt7caz5w507jdbhMfH2+GDx9uysrKAr7G119/bW688UbTqVMn43K5zC233GIOHjwYgqM5dSdahyNHjpgRI0aY7t27m9jYWNOrVy8zceLE40I93NehueOXZBYtWuSMCeZn4D//+Y8ZNWqUSUhIMN26dTPTpk0zdXV1bXw0p+Zka1BeXm6uvPJKk5ycbOLj480FF1xgpk+fHvD8C2PCew2MMebWW281vXr1MnFxcaZ79+5m+PDhTpwYE/nngTEnXoNIPA+ijDGm7a7XAAAAnFxYvQcFAACcHQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGAdAgUAAFiHQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1vn/YlYpYkh5uMEAAAAASUVORK5CYII="
+ },
+ "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
+}