From afb5f6242bfb24e4744ef0d331ccf0cf77eae5a7 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Tue, 26 Aug 2025 17:11:39 +0200 Subject: [PATCH] wip --- flake.nix | 5 + notebook.ipynb | 705 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 555 insertions(+), 155 deletions(-) diff --git a/flake.nix b/flake.nix index 9387a4d..5d9ea1e 100644 --- a/flake.nix +++ b/flake.nix @@ -37,6 +37,11 @@ pandas pip notebook + jupyterlab-lsp + jupyterlab-git + python-lsp-server + python-lsp-ruff + python-lsp-ruff ]; pythonEnv = pkgs.python3.withPackages pythonPackages; in diff --git a/notebook.ipynb b/notebook.ipynb index c44a15a..1bf7b81 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -8,65 +8,50 @@ "languageId": "plaintext" }, "ExecuteTime": { - "end_time": "2025-08-19T21:11:06.528706Z", - "start_time": "2025-08-19T21:11:06.090989Z" + "end_time": "2025-08-19T23:39:53.836251Z", + "start_time": "2025-08-19T23:39:53.832994Z" } }, "source": [ + "from datetime import datetime\n", + "\n", "import pandas\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from dataclasses import dataclass\n", - "from math import floor" + "import matplotlib.pyplot as plt" ], "outputs": [], - "execution_count": 1 + "execution_count": 25 }, { "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" + "end_time": "2025-08-19T23:40:17.840982Z", + "start_time": "2025-08-19T23:40:17.825194Z" } }, "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 = pandas.read_csv('PolyGenStats-vinzenz-scorelog.csv', sep=',', dtype={'score': int, 'sourcename': str, 'name': str, 'mapx': int, 'mapy': int}, parse_dates=['when'], date_format='%d/%m/%Y %H:%M')\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", + " when score sourcename name mapx mapy\n", + "0 2025-08-08 20:14:00 100 First Visit Info Desk 216 505\n", + "1 2025-08-08 20:19:00 282 Capture Info Desk 216 505\n", + "2 2025-08-08 20:20:00 58 Capture Info Desk 216 505\n", + "3 2025-08-08 20:22:00 100 First Visit Main Bar 190 570\n", + "4 2025-08-08 20:23:00 100 First Visit Badge Tent 328 607\n", + ".. ... ... ... ... ... ...\n", + "896 2025-08-12 13:34:00 91 Capture 0E 0 0\n", + "897 2025-08-12 13:39:00 50 Visit Pixelbar 379 602\n", + "898 2025-08-12 13:42:00 164 Output Boost Site Sign 207 874\n", + "899 2025-08-12 13:50:00 694 Capture Pixelbar 379 602\n", + "900 2025-08-12 14:00:00 284 Output Boost Maker Days Eindhoven 115 749\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]" + "[901 rows x 6 columns]" ], "text/html": [ "
\n", @@ -93,7 +78,6 @@ " name\n", " mapx\n", " mapy\n", - " mapcoord\n", " \n", " \n", " \n", @@ -105,7 +89,6 @@ " Info Desk\n", " 216\n", " 505\n", - " (216, 505)\n", " \n", " \n", " 1\n", @@ -115,7 +98,6 @@ " Info Desk\n", " 216\n", " 505\n", - " (216, 505)\n", " \n", " \n", " 2\n", @@ -125,7 +107,6 @@ " Info Desk\n", " 216\n", " 505\n", - " (216, 505)\n", " \n", " \n", " 3\n", @@ -135,7 +116,6 @@ " Main Bar\n", " 190\n", " 570\n", - " (190, 570)\n", " \n", " \n", " 4\n", @@ -145,7 +125,6 @@ " Badge Tent\n", " 328\n", " 607\n", - " (328, 607)\n", " \n", " \n", " ...\n", @@ -155,78 +134,72 @@ " ...\n", " ...\n", " ...\n", - " ...\n", " \n", " \n", " 896\n", - " 2025-12-08 13:34:00\n", + " 2025-08-12 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", + " 2025-08-12 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", + " 2025-08-12 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", + " 2025-08-12 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", + " 2025-08-12 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", + "

901 rows × 6 columns

\n", "
" ] }, - "execution_count": 2, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 2 + "execution_count": 36 }, { "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" + "end_time": "2025-08-19T23:39:54.083367Z", + "start_time": "2025-08-19T23:39:54.071862Z" } }, "source": [ @@ -523,26 +496,26 @@ "" ] }, - "execution_count": 3, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 3 + "execution_count": 27 }, { "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" + "end_time": "2025-08-19T23:39:54.465235Z", + "start_time": "2025-08-19T23:39:54.440411Z" } }, "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", + "summary.rename(columns={'when': 'first_visit', 'score': 'total_score'}, inplace=True)\n", "\n", "summary" ], @@ -580,29 +553,29 @@ " 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", + "2 36261 379 602 2025-08-09 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", + "9 18829 251 553 2025-08-09 02:28:00 29550 \n", + "10 7753 82 337 2025-08-10 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", + "12 5316 322 591 2025-08-09 17:52:00 14376 \n", + "13 3386 95 498 2025-08-09 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", + "18 3365 361 468 2025-08-11 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", + "20 993 119 571 2025-08-10 18:31:00 5308 \n", + "21 1258 41 475 2025-08-10 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 " + "23 1096 164 731 2025-08-11 15:33:00 2696 \n", + "24 91 0 0 2025-08-12 13:32:00 191 " ], "text/html": [ "
\n", @@ -668,7 +641,7 @@ " 36261\n", " 379\n", " 602\n", - " 2025-09-08 00:42:00\n", + " 2025-08-09 00:42:00\n", " 52601\n", " \n", " \n", @@ -752,7 +725,7 @@ " 18829\n", " 251\n", " 553\n", - " 2025-09-08 02:28:00\n", + " 2025-08-09 02:28:00\n", " 29550\n", " \n", " \n", @@ -764,7 +737,7 @@ " 7753\n", " 82\n", " 337\n", - " 2025-10-08 19:51:00\n", + " 2025-08-10 19:51:00\n", " 17711\n", " \n", " \n", @@ -788,7 +761,7 @@ " 5316\n", " 322\n", " 591\n", - " 2025-09-08 17:52:00\n", + " 2025-08-09 17:52:00\n", " 14376\n", " \n", " \n", @@ -800,7 +773,7 @@ " 3386\n", " 95\n", " 498\n", - " 2025-09-08 17:07:00\n", + " 2025-08-09 17:07:00\n", " 11003\n", " \n", " \n", @@ -860,7 +833,7 @@ " 3365\n", " 361\n", " 468\n", - " 2025-11-08 17:42:00\n", + " 2025-08-11 17:42:00\n", " 6515\n", " \n", " \n", @@ -884,7 +857,7 @@ " 993\n", " 119\n", " 571\n", - " 2025-10-08 18:31:00\n", + " 2025-08-10 18:31:00\n", " 5308\n", " \n", " \n", @@ -896,7 +869,7 @@ " 1258\n", " 41\n", " 475\n", - " 2025-10-08 04:12:00\n", + " 2025-08-10 04:12:00\n", " 4167\n", " \n", " \n", @@ -920,7 +893,7 @@ " 1096\n", " 164\n", " 731\n", - " 2025-11-08 15:33:00\n", + " 2025-08-11 15:33:00\n", " 2696\n", " \n", " \n", @@ -932,7 +905,7 @@ " 91\n", " 0\n", " 0\n", - " 2025-12-08 13:32:00\n", + " 2025-08-12 13:32:00\n", " 191\n", " \n", " \n", @@ -940,21 +913,22 @@ "
" ] }, - "execution_count": 4, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "execution_count": 28 }, { + "cell_type": "code", + "id": "9f15abc665d134d7", "metadata": { "ExecuteTime": { - "end_time": "2025-08-19T21:11:07.670668Z", - "start_time": "2025-08-19T21:11:07.658321Z" + "end_time": "2025-08-19T23:39:55.025235Z", + "start_time": "2025-08-19T23:39:55.004437Z" } }, - "cell_type": "code", "source": [ "boosts = scorelog[scorelog['sourcename'] == 'Output Boost'][['name', 'score']].groupby('name')\n", "\n", @@ -973,7 +947,6 @@ "del boosts\n", "summary" ], - "id": "9f15abc665d134d7", "outputs": [ { "data": { @@ -1010,19 +983,19 @@ "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", + "8 18829 251 553 2025-08-09 02:28:00 29550 110 \n", + "9 7753 82 337 2025-08-10 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", + "11 5316 322 591 2025-08-09 17:52:00 14376 738 \n", + "12 3386 95 498 2025-08-09 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", + "18 993 119 571 2025-08-10 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", + "20 1096 164 731 2025-08-11 15:33:00 2696 45 \n", "\n", " totalboostduration maxboostscore maxboostduration \n", "0 6810 199 1990 \n", @@ -1219,7 +1192,7 @@ " 18829\n", " 251\n", " 553\n", - " 2025-09-08 02:28:00\n", + " 2025-08-09 02:28:00\n", " 29550\n", " 110\n", " 1100\n", @@ -1235,7 +1208,7 @@ " 7753\n", " 82\n", " 337\n", - " 2025-10-08 19:51:00\n", + " 2025-08-10 19:51:00\n", " 17711\n", " 842\n", " 8420\n", @@ -1267,7 +1240,7 @@ " 5316\n", " 322\n", " 591\n", - " 2025-09-08 17:52:00\n", + " 2025-08-09 17:52:00\n", " 14376\n", " 738\n", " 7380\n", @@ -1283,7 +1256,7 @@ " 3386\n", " 95\n", " 498\n", - " 2025-09-08 17:07:00\n", + " 2025-08-09 17:07:00\n", " 11003\n", " 40\n", " 400\n", @@ -1379,7 +1352,7 @@ " 993\n", " 119\n", " 571\n", - " 2025-10-08 18:31:00\n", + " 2025-08-10 18:31:00\n", " 5308\n", " 31\n", " 310\n", @@ -1411,7 +1384,7 @@ " 1096\n", " 164\n", " 731\n", - " 2025-11-08 15:33:00\n", + " 2025-08-11 15:33:00\n", " 2696\n", " 45\n", " 450\n", @@ -1423,20 +1396,20 @@ "" ] }, - "execution_count": 5, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 5 + "execution_count": 29 }, { "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" + "end_time": "2025-08-19T23:39:55.305636Z", + "start_time": "2025-08-19T23:39:55.152953Z" } }, "source": [ @@ -1456,19 +1429,19 @@ "output_type": "display_data" } ], - "execution_count": 6 + "execution_count": 30 }, { "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" + "end_time": "2025-08-19T23:39:55.512773Z", + "start_time": "2025-08-19T23:39:55.405984Z" } }, "source": [ - "plt.hist2d(scorelog['mapx'], scorelog['mapy'], density=False, bins=50)\n", + "plt.hist2d(scorelog['mapx'], scorelog['mapy'], weights=scorelog['score'], density=False, bins=50)\n", "plt.show()" ], "outputs": [ @@ -1477,75 +1450,497 @@ "text/plain": [ "
" ], - "image/png": "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" + "image/png": "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GKPCwkItX75ca9euVVZWVtD+UL4H3G63tmzZEhRra9askcPhCFwat9mJ1qAlmzdvlqSgcyGa1+DbNDU1qba29ow4D75N8xq0JOrPg0h/Sre1li1bZpKTk83ixYvN9u3bzeTJk01aWlrQp5JjyfTp0826devM7t27zbvvvmtyc3NN9+7dTXV1tTHm37fW9erVy6xdu9Zs3LjRuN1u43a7IzzrU3PgwAGzadMms2nTJiPJzJs3z2zatMl89tlnxph/32aclpZmVqxYYT766CNzzTXXtHib8UUXXWTKysrMO++8Y/r27RtVt9cac/x1OHDggLnzzjuNx+Mxu3fvNn//+9/NxRdfbPr27WuOHDkS+DuifR2mTJliUlNTzbp164JunTx8+HBgzIm+B5pvrRw5cqTZvHmzWb16tenRo4e1t1Ye7URrsGvXLnP//febjRs3mt27d5sVK1aYc845x1x++eWBvyPa18AYY2bOnGlKS0vN7t27zUcffWRmzpxp4uLizBtvvGGMif3zwJjjr0EsngdRFyjGGPP444+bXr16maSkJDN06FCzfv36SE8pbK677jqTkZFhkpKSzHe+8x1z3XXXmV27dgX2f/PNN+bWW281Xbp0MR06dDA/+tGPzJdffhnBGZ+6N99800g65jVhwgRjzL9vNZ41a5ZxOp0mOTnZjBgxwlRUVAT9HV9//bW5/vrrTadOnYzD4TA33XSTOXDgQASO5uQdbx0OHz5sRo4caXr06GESExNN7969zaRJk44J9Whfh5aOX5JZtGhRYEwo3wP//Oc/zejRo01KSorp3r27mT59uqmvr2/jozk5J1qDyspKc/nll5uuXbua5ORk06dPHzNjxoyg518YE91rYIwxN998s+ndu7dJSkoyPXr0MCNGjAjEiTGxfx4Yc/w1iMXzIM4YY9rueg0AAMCJRdVnUAAAwJmBQAEAANYhUAAAgHUIFAAAYB0CBQAAWIdAAQAA1iFQAACAdQgUAABgHQIFAABYh0ABAADWIVAAAIB1CBQAAGCd/w+5dDrXCFZMUwAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 7 + "execution_count": 31 }, { + "cell_type": "code", + "id": "1371456d-5f15-4eb3-bd01-82a2bc60607a", "metadata": { "ExecuteTime": { - "end_time": "2025-08-19T21:11:08.084634Z", - "start_time": "2025-08-19T21:11:08.080288Z" + "end_time": "2025-08-19T23:40:03.763273Z", + "start_time": "2025-08-19T23:39:55.581104Z" } }, - "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" + "\n", + "import numpy as np\n", + "from dataclasses import dataclass\n", + "from math import floor\n", + "\n", + "@dataclass\n", + "class ScoreSecond:\n", + " name: str\n", + " sourcename: str\n", + " when: datetime\n", + " score: float\n", + " once: bool\n", + " mapx: int\n", + " mapy: int\n", + "\n", + "def row_to_scoreseconds(row, score_per):\n", + " seconds = int(floor(row.score / score_per))\n", + " assert row.score % score_per < 0.1\n", + " when = int(floor(row.when.timestamp()))\n", + " for elapsed in range(0, seconds):\n", + " timestamp = pandas.Timestamp(when - elapsed, unit='s')\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.sort_values(by=['when'], inplace=True)\n", + "scoreseconds.reset_index(drop=True, inplace=True)\n", + "scoreseconds" ], - "id": "1371456d-5f15-4eb3-bd01-82a2bc60607a", - "outputs": [], - "execution_count": 8 + "outputs": [ + { + "data": { + "text/plain": [ + " name sourcename when score once \\\n", + "0 Info Desk First Visit 2025-08-08 20:14:00 100.0 True \n", + "1 Info Desk Capture 2025-08-08 20:14:19 1.0 False \n", + "2 Info Desk Capture 2025-08-08 20:14:20 1.0 False \n", + "3 Info Desk Capture 2025-08-08 20:14:21 1.0 False \n", + "4 Info Desk Capture 2025-08-08 20:14:22 1.0 False \n", + "... ... ... ... ... ... \n", + "678874 Maker Days Eindhoven Output Boost 2025-08-12 13:59:56 0.1 False \n", + "678875 Maker Days Eindhoven Output Boost 2025-08-12 13:59:57 0.1 False \n", + "678876 Maker Days Eindhoven Output Boost 2025-08-12 13:59:58 0.1 False \n", + "678877 Maker Days Eindhoven Output Boost 2025-08-12 13:59:59 0.1 False \n", + "678878 Maker Days Eindhoven Output Boost 2025-08-12 14:00:00 0.1 False \n", + "\n", + " mapx mapy \n", + "0 216 505 \n", + "1 216 505 \n", + "2 216 505 \n", + "3 216 505 \n", + "4 216 505 \n", + "... ... ... \n", + "678874 115 749 \n", + "678875 115 749 \n", + "678876 115 749 \n", + "678877 115 749 \n", + "678878 115 749 \n", + "\n", + "[678879 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", + "
namesourcenamewhenscoreoncemapxmapy
0Info DeskFirst Visit2025-08-08 20:14:00100.0True216505
1Info DeskCapture2025-08-08 20:14:191.0False216505
2Info DeskCapture2025-08-08 20:14:201.0False216505
3Info DeskCapture2025-08-08 20:14:211.0False216505
4Info DeskCapture2025-08-08 20:14:221.0False216505
........................
678874Maker Days EindhovenOutput Boost2025-08-12 13:59:560.1False115749
678875Maker Days EindhovenOutput Boost2025-08-12 13:59:570.1False115749
678876Maker Days EindhovenOutput Boost2025-08-12 13:59:580.1False115749
678877Maker Days EindhovenOutput Boost2025-08-12 13:59:590.1False115749
678878Maker Days EindhovenOutput Boost2025-08-12 14:00:000.1False115749
\n", + "

678879 rows × 7 columns

\n", + "
" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 32 }, { "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" + "end_time": "2025-08-19T23:40:08.295387Z", + "start_time": "2025-08-19T23:40:04.343690Z" } }, "source": [ - "#plt.hist2d(scoreseconds['mapx'], scoreseconds['mapy'], density=False, bins=40)\n", - "#plt.show()" + "acc_col = pandas.Series([0.0]).repeat(len(scoreseconds)).reset_index(drop=True)\n", + "\n", + "acc = 0.0\n", + "for i, row in enumerate(scoreseconds.itertuples()):\n", + " acc += row.score\n", + " acc_col[i] = acc\n", + "\n", + "scoreseconds['accumulated_score'] = acc_col\n", + "del acc\n", + "del acc_col\n", + "\n", + "scoreseconds" ], - "outputs": [], - "execution_count": 9 + "outputs": [ + { + "data": { + "text/plain": [ + " name sourcename when score once \\\n", + "0 Info Desk First Visit 2025-08-08 20:14:00 100.0 True \n", + "1 Info Desk Capture 2025-08-08 20:14:19 1.0 False \n", + "2 Info Desk Capture 2025-08-08 20:14:20 1.0 False \n", + "3 Info Desk Capture 2025-08-08 20:14:21 1.0 False \n", + "4 Info Desk Capture 2025-08-08 20:14:22 1.0 False \n", + "... ... ... ... ... ... \n", + "678874 Maker Days Eindhoven Output Boost 2025-08-12 13:59:56 0.1 False \n", + "678875 Maker Days Eindhoven Output Boost 2025-08-12 13:59:57 0.1 False \n", + "678876 Maker Days Eindhoven Output Boost 2025-08-12 13:59:58 0.1 False \n", + "678877 Maker Days Eindhoven Output Boost 2025-08-12 13:59:59 0.1 False \n", + "678878 Maker Days Eindhoven Output Boost 2025-08-12 14:00:00 0.1 False \n", + "\n", + " mapx mapy accumulated_score \n", + "0 216 505 100.000000 \n", + "1 216 505 101.000000 \n", + "2 216 505 102.000000 \n", + "3 216 505 103.000000 \n", + "4 216 505 104.000000 \n", + "... ... ... ... \n", + "678874 115 749 589647.599999 \n", + "678875 115 749 589647.699999 \n", + "678876 115 749 589647.799999 \n", + "678877 115 749 589647.899999 \n", + "678878 115 749 589647.999999 \n", + "\n", + "[678879 rows x 8 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namesourcenamewhenscoreoncemapxmapyaccumulated_score
0Info DeskFirst Visit2025-08-08 20:14:00100.0True216505100.000000
1Info DeskCapture2025-08-08 20:14:191.0False216505101.000000
2Info DeskCapture2025-08-08 20:14:201.0False216505102.000000
3Info DeskCapture2025-08-08 20:14:211.0False216505103.000000
4Info DeskCapture2025-08-08 20:14:221.0False216505104.000000
...........................
678874Maker Days EindhovenOutput Boost2025-08-12 13:59:560.1False115749589647.599999
678875Maker Days EindhovenOutput Boost2025-08-12 13:59:570.1False115749589647.699999
678876Maker Days EindhovenOutput Boost2025-08-12 13:59:580.1False115749589647.799999
678877Maker Days EindhovenOutput Boost2025-08-12 13:59:590.1False115749589647.899999
678878Maker Days EindhovenOutput Boost2025-08-12 14:00:000.1False115749589647.999999
\n", + "

678879 rows × 8 columns

\n", + "
" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 33 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-19T23:45:26.737903Z", + "start_time": "2025-08-19T23:45:26.511905Z" + } + }, + "cell_type": "code", + "source": [ + "from matplotlib import dates\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.plot('when', 'accumulated_score', data=scoreseconds, )\n", + "ax.xaxis.set_major_locator(dates.DayLocator(interval=1)) # every day\n", + "ax.xaxis.set_major_formatter(dates.DateFormatter('\\n%d-%m-%Y'))\n", + "plt.title('Accumulated Score')\n", + "plt.show()" + ], + "id": "6e0a9a80c70d3bb0", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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eecdAEBCQkKD/TzwwANISUnB2rVra60rKCiA0WhscAwiW8AtQkQ2bPny5SgqKsI999xT5/r+/fvDz88PixYtwujRozF16lR89913uP/++zF+/HhERkbiwoULWL58OebPn49evXrhkUcewf/93/9hypQpSE1NxaBBg1BSUoJffvkFTz/9NO69917o9Xrcf//9+OCDD6BSqdC+fXusWLHiuswbGTJkCMLCwjBhwgRMnToVTk5O+OKLL+Dn54fMzMx6Hzts2DD88MMPGDFiBBISEpCRkYH58+eja9euKC4uVurc3NzQtWtXLFmyBDfddBN8fHzQvXt3dO/eHfPmzcPAgQPRo0cPPPHEE2jXrh1ycnKQkpKCU6dO4ffffwcAvPTSS/jqq69w55134tlnn1UOnw8PD8eePXsafJ333nsvIiIicPfdd6N9+/bKe/7zzz+jX79+uPvuuwEAgwcPxsMPP4z3338fR44cwZ133gmz2Yxff/0VgwcPxuTJk9GrVy+MGzcOn376KQoKCnDrrbciNTUVCxcuxPDhw5VJ9fWZOnUqli9fjmHDhuHRRx9FZGQkSkpKsHfvXnz33Xc4ceIEfH19GxyHqMWz4hFrRHSN7r77bnF1dZWSkpIr1jz66KPi4uIieXl5IiJy/vx5mTx5sgQHB4tGo5GQkBAZN26csl5E5OLFi/LKK69IRESEuLi4SGBgoNx3331y7NgxpebcuXMyatQocXd3F29vb5k4caLs27evzsPnPTw8avV16623Srdu3WotDw8Pl4SEBItlaWlpEhMTIxqNRsLCwuSdd95p1OHzZrNZ3nzzTQkPDxetVit9+vSRFStWyLhx4yQ8PNziObZs2SKRkZGi0WhqHUp/7NgxeeSRRyQwMFBcXFwkODhYhg0bJt99953FGHv27JFbb71VXF1dJTg4WP7+978rh8U3dPj8t99+Kw8++KC0b99e3NzcxNXVVbp27SqvvPKKFBYWWtQajUZ5++23pXPnzqLRaMTPz0+GDh0qaWlpSk1lZaW8/vrrymcYGhoq06dPtzgNwJXe72pFRUUyffp06dChg2g0GvH19ZWbb75Z/vnPf0pFRUW9r4fIVqhEamwzJiIiInIgnCNEREREDotBiIiIiBwWgxARERE5LAYhIiIiclgMQkREROSweB6hepjNZpw5cwatWrW6potNEhER0Y0j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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 42 } ], "metadata": {