From 1f1d42fbea422cca4af910a332a733357def74af Mon Sep 17 00:00:00 2001 From: govin08 Date: Fri, 19 Jan 2024 18:04:02 +0900 Subject: [PATCH] last modifications --- .../0109_preprocess/0116_preprocess_8.2.ipynb | 1812 +++++++++---- .../0109_preprocess/0116_preprocess_8.ipynb | 2263 ++++------------- .../0117_make_signals/0117_make_signals.ipynb | 1806 +++++++------ Analysis/0119_test_2/example.add.xml | 24 + Analysis/0119_test_2/example.net.xml | 186 ++ Analysis/0119_test_2/example.rou.xml | 17 + Analysis/0119_test_2/example.sumocfg | 7 + Data/networks/SN_sample.rou.xml | 19 + Data/networks/SN_sample.sumocfg | 14 - Data/networks/SN_sample.xml.rou.xml | 16 - Data/networks/SN_sample_with_a_route.net.xml | 2218 ---------------- Data/networks/example/example.add.xml | 8 + Data/networks/example/example.net.xml | 186 ++ Data/networks/example/example.rou.xml | 17 + Data/tables/0110_view_tables.ipynb | 6 +- .../table_definition_v0.8.4.xlsx | Bin 76799 -> 75834 bytes 16 files changed, 3281 insertions(+), 5318 deletions(-) create mode 100644 Analysis/0119_test_2/example.add.xml create mode 100644 Analysis/0119_test_2/example.net.xml create mode 100644 Analysis/0119_test_2/example.rou.xml create mode 100644 Analysis/0119_test_2/example.sumocfg create mode 100644 Data/networks/SN_sample.rou.xml delete mode 100644 Data/networks/SN_sample.sumocfg delete mode 100644 Data/networks/SN_sample.xml.rou.xml delete mode 100644 Data/networks/SN_sample_with_a_route.net.xml create mode 100644 Data/networks/example/example.add.xml create mode 100644 Data/networks/example/example.net.xml create mode 100644 Data/networks/example/example.rou.xml diff --git a/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb b/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb index fd5dfe53a..42a97ce4a 100644 --- a/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb +++ b/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -24,14 +24,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 17280/17280 [00:13<00:00, 1299.31it/s]\n" + "100%|██████████| 17280/17280 [00:18<00:00, 924.90it/s] \n" ] }, { @@ -161,7 +161,7 @@ "9 177 2 2 7 3" ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -177,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -296,7 +296,7 @@ "5 176 1 B 4" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -317,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -396,210 +396,1192 @@ " 서\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " 5\n", + " 175\n", + " 3\n", + " B\n", + " 1\n", + " 동\n", + " 남\n", " \n", " \n", - " 59\n", - " 210\n", + " 6\n", + " 175\n", + " 4\n", + " A\n", + " 5\n", + " 서\n", + " 북\n", + " \n", + " \n", + " 7\n", + " 175\n", + " 4\n", + " B\n", + " 2\n", + " 서\n", + " 동\n", + " \n", + " \n", + " 8\n", + " 176\n", + " 1\n", + " A\n", + " 8\n", + " 남\n", + " 북\n", + " \n", + " \n", + " 9\n", + " 176\n", + " 1\n", + " B\n", " 4\n", + " 북\n", + " 남\n", + " \n", + " \n", + " 10\n", + " 176\n", + " 2\n", + " A\n", + " 8\n", + " 남\n", + " 북\n", + " \n", + " \n", + " 11\n", + " 176\n", + " 2\n", " B\n", " 3\n", " 남\n", " 서\n", " \n", " \n", - " 60\n", - " 211\n", - " 1\n", + " 12\n", + " 176\n", + " 3\n", " A\n", - " 6\n", - " 동\n", + " 5\n", " 서\n", + " 북\n", " \n", " \n", - " 61\n", - " 211\n", + " 13\n", + " 176\n", + " 3\n", + " B\n", + " 18\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 14\n", + " 177\n", + " 1\n", + " A\n", + " 8\n", + " 남\n", + " 북\n", + " \n", + " \n", + " 15\n", + " 177\n", " 1\n", " B\n", + " 4\n", + " 북\n", + " 남\n", + " \n", + " \n", + " 16\n", + " 177\n", " 2\n", - " 서\n", + " A\n", + " 7\n", + " 북\n", " 동\n", " \n", " \n", - " 62\n", - " 211\n", + " 17\n", + " 177\n", " 2\n", + " B\n", + " 3\n", + " 남\n", + " 서\n", + " \n", + " \n", + " 18\n", + " 177\n", + " 3\n", " A\n", " 17\n", " NaN\n", " NaN\n", " \n", " \n", - " 63\n", - " 211\n", - " 2\n", + " 19\n", + " 177\n", + " 3\n", " B\n", " 18\n", " NaN\n", " NaN\n", " \n", - " \n", - "\n", - "

64 rows × 6 columns

\n", - "" - ], - "text/plain": [ - " inter_no phase_no ring_type move_no inc_dir out_dir\n", - "0 175 1 A 8 남 북\n", - "1 175 1 B 4 북 남\n", - "2 175 2 A 7 북 동\n", - "3 175 2 B 3 남 서\n", - "4 175 3 A 6 동 서\n", - ".. ... ... ... ... ... ...\n", - "59 210 4 B 3 남 서\n", - "60 211 1 A 6 동 서\n", - "61 211 1 B 2 서 동\n", - "62 211 2 A 17 NaN NaN\n", - "63 211 2 B 18 NaN NaN\n", - "\n", - "[64 rows x 6 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# [nema 이동류목록] 불러오기 및 병합\n", - "nema = pd.read_csv('../../Data/tables/nema.csv', encoding='cp949')\n", - "match3 = pd.merge(match2, nema, how='left', on='move_no').drop_duplicates()\n", - "match3" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angle
201774A5
211774B1
221781A8
231781B4
241782A7
251782B3
261783A5
271783B2
281784A6
291784B1
302011A8
312011B3
322012A5
332012B2
342013A6
352013B2
362014A6
372014B1
382015A7
392015B4
402021A6
412021B2
422022A17NaNNaN
432022B18NaNNaN
442061A8
452061B4
462062A17NaNNaN
472062B18NaNNaN
482063A8
492063B4
502064A17NaNNaN
512064B18NaNNaN
522101A6
532101B18NaNNaN
542102A5
552102B2
562103A7
572103B4
582104A8
592104B3
\n", + "
" + ], + "text/plain": [ + " inter_no phase_no ring_type move_no inc_dir out_dir\n", + "0 175 1 A 8 남 북\n", + "1 175 1 B 4 북 남\n", + "2 175 2 A 7 북 동\n", + "3 175 2 B 3 남 서\n", + "4 175 3 A 6 동 서\n", + "5 175 3 B 1 동 남\n", + "6 175 4 A 5 서 북\n", + "7 175 4 B 2 서 동\n", + "8 176 1 A 8 남 북\n", + "9 176 1 B 4 북 남\n", + "10 176 2 A 8 남 북\n", + "11 176 2 B 3 남 서\n", + "12 176 3 A 5 서 북\n", + "13 176 3 B 18 NaN NaN\n", + "14 177 1 A 8 남 북\n", + "15 177 1 B 4 북 남\n", + "16 177 2 A 7 북 동\n", + "17 177 2 B 3 남 서\n", + "18 177 3 A 17 NaN NaN\n", + "19 177 3 B 18 NaN NaN\n", + "20 177 4 A 5 서 북\n", + "21 177 4 B 1 동 남\n", + "22 178 1 A 8 남 북\n", + "23 178 1 B 4 북 남\n", + "24 178 2 A 7 북 동\n", + "25 178 2 B 3 남 서\n", + "26 178 3 A 5 서 북\n", + "27 178 3 B 2 서 동\n", + "28 178 4 A 6 동 서\n", + "29 178 4 B 1 동 남\n", + "30 201 1 A 8 남 북\n", + "31 201 1 B 3 남 서\n", + "32 201 2 A 5 서 북\n", + "33 201 2 B 2 서 동\n", + "34 201 3 A 6 동 서\n", + "35 201 3 B 2 서 동\n", + "36 201 4 A 6 동 서\n", + "37 201 4 B 1 동 남\n", + "38 201 5 A 7 북 동\n", + "39 201 5 B 4 북 남\n", + "40 202 1 A 6 동 서\n", + "41 202 1 B 2 서 동\n", + "42 202 2 A 17 NaN NaN\n", + "43 202 2 B 18 NaN NaN\n", + "44 206 1 A 8 남 북\n", + "45 206 1 B 4 북 남\n", + "46 206 2 A 17 NaN NaN\n", + "47 206 2 B 18 NaN NaN\n", + "48 206 3 A 8 남 북\n", + "49 206 3 B 4 북 남\n", + "50 206 4 A 17 NaN NaN\n", + "51 206 4 B 18 NaN NaN\n", + "52 210 1 A 6 동 서\n", + "53 210 1 B 18 NaN NaN\n", + "54 210 2 A 5 서 북\n", + "55 210 2 B 2 서 동\n", + "56 210 3 A 7 북 동\n", + "57 210 3 B 4 북 남\n", + "58 210 4 A 8 남 북\n", + "59 210 4 B 3 남 서" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# [nema 이동류목록] 불러오기 및 병합\n", + "nema = pd.read_csv('../../Data/tables/nema.csv', encoding='cp949')\n", + "match3 = pd.merge(match2, nema, how='left', on='move_no').drop_duplicates()\n", + "match3" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -609,10 +1591,32 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -620,30 +1624,51 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angle
01751A8179004
11751B4003176
21752A7001095
31752B3179270
41753A6090270
51753B1090180
61754A5268000
71754B2270090
81761A8180000
91761B4359180
101762A8180000
111762B3180270
121763A5270356
131763B18NaNNaNNaNNaN
141771A8180000
151771B4001176
161772A7000090
171772B3179270
181773A17NaNNaNNaNNaN
191773B18NaNNaNNaNNaN
201774A5268000
211774B1090180
221781A8180000
231781B4000180
241782A7000090
251782B3180270
261783A5270000
271783B2270090
281784A6090270
291784B1090180
302011A8180000
312011B3180270
322012A5270000
332012B2270090
342013A6090270
352013B2270090
362014A6090270
372014B1090180
382015A7000090
392015B4000180
402021A6090270
412021B2270090
0175422022A17NaNNaNNaNNaN
432022B18NaNNaNNaNNaN
442061A8179004180000
1175452061B4003176000180
2175462062A700109517NaNNaNNaNNaN
3175472062B18NaNNaNNaNNaN
482063A8179270180000
4175492063A6090270B4000180
...........................502064A17NaNNaNNaNNaN
59210512064B318027018NaNNaNNaNNaN
60211522101A6270
61211532101B18NaNNaNNaNNaN
542102A5268000
552102B2090
622112562103A17NaNNaNNaNNaN7359090
632112572103B18NaNNaNNaNNaN4000180
582104A8180000
592104B3180270
\n", - "

64 rows × 8 columns

\n", "
" ], "text/plain": [ @@ -653,17 +1678,64 @@ "2 175 2 A 7 북 동 001 095\n", "3 175 2 B 3 남 서 179 270\n", "4 175 3 A 6 동 서 090 270\n", - ".. ... ... ... ... ... ... ... ...\n", - "59 210 4 B 3 남 서 180 270\n", - "60 211 1 A 6 동 서 090 270\n", - "61 211 1 B 2 서 동 270 090\n", - "62 211 2 A 17 NaN NaN NaN NaN\n", - "63 211 2 B 18 NaN NaN NaN NaN\n", - "\n", - "[64 rows x 8 columns]" + "5 175 3 B 1 동 남 090 180\n", + "6 175 4 A 5 서 북 268 000\n", + "7 175 4 B 2 서 동 270 090\n", + "8 176 1 A 8 남 북 180 000\n", + "9 176 1 B 4 북 남 359 180\n", + "10 176 2 A 8 남 북 180 000\n", + "11 176 2 B 3 남 서 180 270\n", + "12 176 3 A 5 서 북 270 356\n", + "13 176 3 B 18 NaN NaN NaN NaN\n", + "14 177 1 A 8 남 북 180 000\n", + "15 177 1 B 4 북 남 001 176\n", + "16 177 2 A 7 북 동 000 090\n", + "17 177 2 B 3 남 서 179 270\n", + "18 177 3 A 17 NaN NaN NaN NaN\n", + "19 177 3 B 18 NaN NaN NaN NaN\n", + "20 177 4 A 5 서 북 268 000\n", + "21 177 4 B 1 동 남 090 180\n", + "22 178 1 A 8 남 북 180 000\n", + "23 178 1 B 4 북 남 000 180\n", + "24 178 2 A 7 북 동 000 090\n", + "25 178 2 B 3 남 서 180 270\n", + "26 178 3 A 5 서 북 270 000\n", + "27 178 3 B 2 서 동 270 090\n", + "28 178 4 A 6 동 서 090 270\n", + "29 178 4 B 1 동 남 090 180\n", + "30 201 1 A 8 남 북 180 000\n", + "31 201 1 B 3 남 서 180 270\n", + "32 201 2 A 5 서 북 270 000\n", + "33 201 2 B 2 서 동 270 090\n", + "34 201 3 A 6 동 서 090 270\n", + "35 201 3 B 2 서 동 270 090\n", + "36 201 4 A 6 동 서 090 270\n", + "37 201 4 B 1 동 남 090 180\n", + "38 201 5 A 7 북 동 000 090\n", + "39 201 5 B 4 북 남 000 180\n", + "40 202 1 A 6 동 서 090 270\n", + "41 202 1 B 2 서 동 270 090\n", + "42 202 2 A 17 NaN NaN NaN NaN\n", + "43 202 2 B 18 NaN NaN NaN NaN\n", + "44 206 1 A 8 남 북 180 000\n", + "45 206 1 B 4 북 남 000 180\n", + "46 206 2 A 17 NaN NaN NaN NaN\n", + "47 206 2 B 18 NaN NaN NaN NaN\n", + "48 206 3 A 8 남 북 180 000\n", + "49 206 3 B 4 북 남 000 180\n", + "50 206 4 A 17 NaN NaN NaN NaN\n", + "51 206 4 B 18 NaN NaN NaN NaN\n", + "52 210 1 A 6 동 서 090 270\n", + "53 210 1 B 18 NaN NaN NaN NaN\n", + "54 210 2 A 5 서 북 268 000\n", + "55 210 2 B 2 서 동 270 090\n", + "56 210 3 A 7 북 동 359 090\n", + "57 210 3 B 4 북 남 000 180\n", + "58 210 4 A 8 남 북 180 000\n", + "59 210 4 B 3 남 서 180 270" ] }, - "execution_count": 7, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -693,7 +1765,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -757,7 +1829,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -1651,46 +2723,6 @@ " 571511538_01\n", " i6\n", " \n", - " \n", - " 86\n", - " 211\n", - " 2\n", - " 서\n", - " 동\n", - " 571542116_02.96\n", - " 571542116_02.164\n", - " c30\n", - " \n", - " \n", - " 87\n", - " 211\n", - " 6\n", - " 동\n", - " 서\n", - " 571542116_01\n", - " -571542116_02.96\n", - " c30\n", - " \n", - " \n", - " 88\n", - " 211\n", - " 17\n", - " None\n", - " None\n", - " None\n", - " None\n", - " c30\n", - " \n", - " \n", - " 89\n", - " 211\n", - " 18\n", - " None\n", - " None\n", - " None\n", - " None\n", - " c30\n", - " \n", " \n", "\n", "" @@ -1783,10 +2815,6 @@ "83 210 21 서 남 571500535_02.18 571500585_01 \n", "84 210 21 남 동 571500585_02 571542115_01 \n", "85 210 21 동 북 -571542115_01 571511538_01 \n", - "86 211 2 서 동 571542116_02.96 571542116_02.164 \n", - "87 211 6 동 서 571542116_01 -571542116_02.96 \n", - "88 211 17 None None None None \n", - "89 211 18 None None None None \n", "\n", " node_id \n", "0 i0 \n", @@ -1874,11 +2902,7 @@ "82 i6 \n", "83 i6 \n", "84 i6 \n", - "85 i6 \n", - "86 c30 \n", - "87 c30 \n", - "88 c30 \n", - "89 c30 " + "85 i6 " ] }, "metadata": {}, @@ -1961,21 +2985,21 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/17280 [00:00 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(m, \u001b[38;5;28mlen\u001b[39m(time2movement[\u001b[43mfmins\u001b[49m[\u001b[38;5;241m287\u001b[39m]]))\n", + "\u001b[1;31mNameError\u001b[0m: name 'fmins' is not defined" ] } ], @@ -2346,7 +3088,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2635,7 +3377,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3059,7 +3801,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3163,7 +3905,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3183,7 +3925,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3260,7 +4002,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3660,7 +4402,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3695,7 +4437,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -5731,7 +6473,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -5978,7 +6720,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -6071,7 +6813,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -14748,7 +15490,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -15083,7 +15825,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -15103,7 +15845,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -15359,7 +16101,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -15368,7 +16110,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -15724,7 +16466,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [ { diff --git a/Analysis/0109_preprocess/0116_preprocess_8.ipynb b/Analysis/0109_preprocess/0116_preprocess_8.ipynb index c1c0aa392..22ffbc062 100644 --- a/Analysis/0109_preprocess/0116_preprocess_8.ipynb +++ b/Analysis/0109_preprocess/0116_preprocess_8.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 324, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -24,21 +24,14 @@ }, { "cell_type": "code", - "execution_count": 325, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 17/17280 [00:00<01:44, 165.78it/s]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 17280/17280 [01:02<00:00, 277.24it/s]\n" + "100%|██████████| 17280/17280 [00:14<00:00, 1222.96it/s]\n" ] }, { @@ -168,7 +161,7 @@ "9 177 2 2 7 3" ] }, - "execution_count": 325, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -184,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 326, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -303,7 +296,7 @@ "5 176 1 B 4" ] }, - "execution_count": 326, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -324,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 327, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -965,7 +958,7 @@ "59 210 4 B 3 남 서" ] }, - "execution_count": 327, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -979,7 +972,7 @@ }, { "cell_type": "code", - "execution_count": 328, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -1742,7 +1735,7 @@ "59 210 4 B 3 남 서 180 270" ] }, - "execution_count": 328, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -1772,7 +1765,7 @@ }, { "cell_type": "code", - "execution_count": 329, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -1948,7 +1941,7 @@ "1 571510153_02 571545870_01 i0 " ] }, - "execution_count": 329, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -2015,7 +2008,7 @@ }, { "cell_type": "code", - "execution_count": 394, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -3602,7 +3595,7 @@ }, { "cell_type": "code", - "execution_count": 398, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -3829,7 +3822,7 @@ "[116 rows x 11 columns]" ] }, - "execution_count": 398, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -3840,7 +3833,7 @@ }, { "cell_type": "code", - "execution_count": 414, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -3877,7 +3870,7 @@ " \n", " 0\n", " 175\n", - " 1.0\n", + " 1\n", " 동\n", " 남\n", " 571545870_02\n", @@ -3887,7 +3880,7 @@ " \n", " 1\n", " 175\n", - " 2.0\n", + " 2\n", " 서\n", " 동\n", " 571510153_02\n", @@ -3897,7 +3890,7 @@ " \n", " 2\n", " 175\n", - " 3.0\n", + " 3\n", " 남\n", " 서\n", " -571542797_02\n", @@ -3907,7 +3900,7 @@ " \n", " 3\n", " 175\n", - " 4.0\n", + " 4\n", " 북\n", " 남\n", " -571500487_01\n", @@ -3917,7 +3910,7 @@ " \n", " 4\n", " 175\n", - " 5.0\n", + " 5\n", " 서\n", " 북\n", " 571510153_02\n", @@ -3937,7 +3930,7 @@ " \n", " 69\n", " 210\n", - " 8.0\n", + " 8\n", " 남\n", " 북\n", " 571500585_02\n", @@ -3947,7 +3940,7 @@ " \n", " 70\n", " 210\n", - " 21.0\n", + " 21\n", " 북\n", " 서\n", " 571511538_02.121\n", @@ -3957,7 +3950,7 @@ " \n", " 71\n", " 210\n", - " 21.0\n", + " 21\n", " 서\n", " 남\n", " 571500535_02.18\n", @@ -3967,7 +3960,7 @@ " \n", " 72\n", " 210\n", - " 21.0\n", + " 21\n", " 남\n", " 동\n", " 571500585_02\n", @@ -3977,7 +3970,7 @@ " \n", " 73\n", " 210\n", - " 21.0\n", + " 21\n", " 동\n", " 북\n", " -571542115_01\n", @@ -3991,17 +3984,17 @@ ], "text/plain": [ " inter_no move_no inc_dir out_dir inc_edge out_edge node_id\n", - "0 175 1.0 동 남 571545870_02 571542797_02 i0\n", - "1 175 2.0 서 동 571510153_02 571545870_01 i0\n", - "2 175 3.0 남 서 -571542797_02 571510153_01 i0\n", - "3 175 4.0 북 남 -571500487_01 571542797_02 i0\n", - "4 175 5.0 서 북 571510153_02 571500487_01 i0\n", + "0 175 1 동 남 571545870_02 571542797_02 i0\n", + "1 175 2 서 동 571510153_02 571545870_01 i0\n", + "2 175 3 남 서 -571542797_02 571510153_01 i0\n", + "3 175 4 북 남 -571500487_01 571542797_02 i0\n", + "4 175 5 서 북 571510153_02 571500487_01 i0\n", ".. ... ... ... ... ... ... ...\n", - "69 210 8.0 남 북 571500585_02 571511538_01 i6\n", - "70 210 21.0 북 서 571511538_02.121 571500535_01 i6\n", - "71 210 21.0 서 남 571500535_02.18 571500585_01 i6\n", - "72 210 21.0 남 동 571500585_02 571542115_01 i6\n", - "73 210 21.0 동 북 -571542115_01 571511538_01 i6\n", + "69 210 8 남 북 571500585_02 571511538_01 i6\n", + "70 210 21 북 서 571511538_02.121 571500535_01 i6\n", + "71 210 21 서 남 571500535_02.18 571500585_01 i6\n", + "72 210 21 남 동 571500585_02 571542115_01 i6\n", + "73 210 21 동 북 -571542115_01 571511538_01 i6\n", "\n", "[74 rows x 7 columns]" ] @@ -4078,6 +4071,7 @@ "matching.append(match7[match7.node_id.isin(child_ids)])\n", "matching = pd.concat(matching)\n", "matching = matching.dropna().sort_values(by=['inter_no', 'node_id', 'move_no']).reset_index(drop=True)\n", + "matching['move_no'] = matching['move_no'].astype(int)\n", "display(matching)" ] }, @@ -4090,16 +4084,83 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 11, "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "1704380565\n" + "100%|██████████| 17280/17280 [02:16<00:00, 126.94it/s]\n" ] - }, + } + ], + "source": [ + "# 5초 단위로 이동류번호 저장 및 신호이력에서 유닉스시각 가져와서 표시, 한시간동안의 데이터만 보관\n", + "midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", + "next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n", + "fsecs = range(midnight, next_day, 5) # fsecs : unix time by Five SECondS\n", + "fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", + "# time2move = dict(zip(fsecs,moves)) # move : 어느 순간의 이동류정보\n", + "history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n", + "\n", + "time2movement = {} # movement : 어느 순간의, 그 순간으로부터 한시간 동안의 (교차로번호 + 현시별이동류번호 + 시작시간)\n", + "# - 아래 절차를 5초마다 반복\n", + "for fsec in tqdm(fsecs): # fsec : unix time by Five SECond\n", + " # 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n", + " # move = time2move[fsec]\n", + " move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\n", + " # 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로변호, 종료유닉스타임)만 수집 : B\n", + " recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", + " if not recent_histories:\n", + " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", + " else:\n", + " rhistory = pd.concat(recent_histories)\n", + " recent_unix = rhistory[['inter_no', 'end_unix']]\n", + " # 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", + " move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", + " move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", + " move = move.drop_duplicates()\n", + " # 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n", + " move = move.rename(columns = {'end_unix':'start_unix'})\n", + " # 5. 이동류 이력정보 READ\n", + " # - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n", + " try:\n", + " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", + " pass\n", + " else: \n", + " movement = pd.DataFrame()\n", + " except NameError: # movement가 존재하지 않는 경우 생성\n", + " movement = pd.DataFrame()\n", + " # 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n", + " movement = pd.concat([movement, move])\n", + " # 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거)\n", + " movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix'])\n", + " # 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - 3600을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관)\n", + " movement = movement[movement.start_unix > fsec - 3600]\n", + " movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", + "\n", + " time2movement[fsec] = movement\n", + " movement.to_csv(f'../../Data/tables/movements/movements_{fsec}.csv')\n", + "\n", + "# 각 movement들의 길이 시각화\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(fsecs, [len(time2movement[fsec]) for fsec in fsecs])\n", + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# C. 5분 간격으로 신호이력 수집 및 통합테이블 생성" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ { "data": { "text/html": [ @@ -4122,1686 +4183,123 @@ " \n", " \n", " inter_no\n", - " phas_A\n", - " phas_B\n", - " move_A\n", - " move_B\n", - " start_unix\n", + " end_unix\n", + " dura_A1\n", + " dura_A2\n", + " dura_A3\n", + " dura_A4\n", + " dura_A5\n", + " dura_A6\n", + " dura_A7\n", + " dura_A8\n", + " dura_B1\n", + " dura_B2\n", + " dura_B3\n", + " dura_B4\n", + " dura_B5\n", + " dura_B6\n", + " dura_B7\n", + " dura_B8\n", + " cycle\n", + " offset\n", " \n", " \n", " \n", " \n", " 0\n", - " 175\n", - " 1\n", - " 1\n", - " 8\n", - " 4\n", - " 1704380560\n", + " 206\n", + " 1704380520\n", + " 33\n", + " 35\n", + " 26\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 33\n", + " 35\n", + " 26\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 120\n", + " 10\n", " \n", " \n", " 1\n", - " 176\n", - " 1\n", - " 1\n", - " 8\n", - " 4\n", - " 1704380550\n", - " \n", - " \n", - " 2\n", - " 177\n", - " 1\n", - " 1\n", - " 8\n", - " 4\n", - " 1704380550\n", - " \n", - " \n", - " 3\n", " 178\n", - " 1\n", - " 1\n", - " 8\n", - " 4\n", " 1704380540\n", + " 38\n", + " 39\n", + " 40\n", + " 23\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 38\n", + " 39\n", + " 40\n", + " 23\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 140\n", + " 50\n", " \n", " \n", - " 4\n", + " 2\n", " 201\n", - " 2\n", - " 2\n", - " 5\n", - " 2\n", " 1704380540\n", + " 24\n", + " 24\n", + " 17\n", + " 58\n", + " 17\n", + " 0\n", + " 0\n", + " 0\n", + " 24\n", + " 24\n", + " 17\n", + " 58\n", + " 17\n", + " 0\n", + " 0\n", + " 0\n", + " 140\n", + " 133\n", " \n", " \n", - " 5\n", + " 3\n", " 202\n", - " 1\n", - " 1\n", - " 6\n", - " 2\n", - " 1704380541\n", - " \n", - " \n", - " 6\n", - " 206\n", - " 2\n", - " 2\n", - " 17\n", - " 18\n", - " 1704380520\n", + " 1704380540\n", + " 39\n", + " 101\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 39\n", + " 101\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 140\n", + " 103\n", " \n", " \n", - " 7\n", - " 210\n", - " 1\n", - " 1\n", - " 6\n", - " 18\n", - " 1704380550\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 175 1 1 8 4 1704380560\n", - "1 176 1 1 8 4 1704380550\n", - "2 177 1 1 8 4 1704380550\n", - "3 178 1 1 8 4 1704380540\n", - "4 201 2 2 5 2 1704380540\n", - "5 202 1 1 6 2 1704380541\n", - "6 206 2 2 17 18 1704380520\n", - "7 210 1 1 6 18 1704380550" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
02062217181704380520
117811841704380540
220122521704380540
320211621704380541
417611841704380550
517711841704380550
6210116181704380550
717511841704380560
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 206 2 2 17 18 1704380520\n", - "1 178 1 1 8 4 1704380540\n", - "2 201 2 2 5 2 1704380540\n", - "3 202 1 1 6 2 1704380541\n", - "4 176 1 1 8 4 1704380550\n", - "5 177 1 1 8 4 1704380550\n", - "6 210 1 1 6 18 1704380550\n", - "7 175 1 1 8 4 1704380560" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1704380570\n" - ] - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017511841704380560
117611841704380550
217711841704380550
317811841704380540
420122521704380540
520211621704380541
62062217181704380520
7210116181704380550
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 175 1 1 8 4 1704380560\n", - "1 176 1 1 8 4 1704380550\n", - "2 177 1 1 8 4 1704380550\n", - "3 178 1 1 8 4 1704380540\n", - "4 201 2 2 5 2 1704380540\n", - "5 202 1 1 6 2 1704380541\n", - "6 206 2 2 17 18 1704380520\n", - "7 210 1 1 6 18 1704380550" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
02062217181704380520
117811841704380540
220122521704380540
320211621704380541
417611841704380550
517711841704380550
6210116181704380550
717511841704380560
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 206 2 2 17 18 1704380520\n", - "1 178 1 1 8 4 1704380540\n", - "2 201 2 2 5 2 1704380540\n", - "3 202 1 1 6 2 1704380541\n", - "4 176 1 1 8 4 1704380550\n", - "5 177 1 1 8 4 1704380550\n", - "6 210 1 1 6 18 1704380550\n", - "7 175 1 1 8 4 1704380560" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1704380575\n" - ] - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017511841704380560
117611841704380550
217711841704380550
317811841704380540
420122521704380540
520211621704380541
62062217181704380520
721012621704380550
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 175 1 1 8 4 1704380560\n", - "1 176 1 1 8 4 1704380550\n", - "2 177 1 1 8 4 1704380550\n", - "3 178 1 1 8 4 1704380540\n", - "4 201 2 2 5 2 1704380540\n", - "5 202 1 1 6 2 1704380541\n", - "6 206 2 2 17 18 1704380520\n", - "7 210 1 2 6 2 1704380550" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
02062217181704380520
12062217181704380520
217811841704380540
317811841704380540
420122521704380540
520122521704380540
620211621704380541
720211621704380541
817611841704380550
917611841704380550
1017711841704380550
1117711841704380550
12210116181704380550
13210116181704380550
1417511841704380560
1517511841704380560
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 206 2 2 17 18 1704380520\n", - "1 206 2 2 17 18 1704380520\n", - "2 178 1 1 8 4 1704380540\n", - "3 178 1 1 8 4 1704380540\n", - "4 201 2 2 5 2 1704380540\n", - "5 201 2 2 5 2 1704380540\n", - "6 202 1 1 6 2 1704380541\n", - "7 202 1 1 6 2 1704380541\n", - "8 176 1 1 8 4 1704380550\n", - "9 176 1 1 8 4 1704380550\n", - "10 177 1 1 8 4 1704380550\n", - "11 177 1 1 8 4 1704380550\n", - "12 210 1 1 6 18 1704380550\n", - "13 210 1 1 6 18 1704380550\n", - "14 175 1 1 8 4 1704380560\n", - "15 175 1 1 8 4 1704380560" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1704380580\n" - ] - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017511841704380560
117611841704380550
217711841704380550
317822731704380540
420122521704380540
52022217181704380541
62062217181704380520
721012621704380550
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 175 1 1 8 4 1704380560\n", - "1 176 1 1 8 4 1704380550\n", - "2 177 1 1 8 4 1704380550\n", - "3 178 2 2 7 3 1704380540\n", - "4 201 2 2 5 2 1704380540\n", - "5 202 2 2 17 18 1704380541\n", - "6 206 2 2 17 18 1704380520\n", - "7 210 1 2 6 2 1704380550" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "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", - "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
02062217181704380520
12062217181704380520
22062217181704380520
317811841704380540
417811841704380540
517811841704380540
620122521704380540
720122521704380540
820122521704380540
920211621704380541
1020211621704380541
1120211621704380541
1217611841704380550
1317611841704380550
1417611841704380550
1517711841704380550
1617711841704380550
1717711841704380550
18210116181704380550
19210116181704380550
2021012621704380550
2117511841704380560
2217511841704380560
2317511841704380560
\n", - "
" - ], - "text/plain": [ - " inter_no phas_A phas_B move_A move_B start_unix\n", - "0 206 2 2 17 18 1704380520\n", - "1 206 2 2 17 18 1704380520\n", - "2 206 2 2 17 18 1704380520\n", - "3 178 1 1 8 4 1704380540\n", - "4 178 1 1 8 4 1704380540\n", - "5 178 1 1 8 4 1704380540\n", - "6 201 2 2 5 2 1704380540\n", - "7 201 2 2 5 2 1704380540\n", - "8 201 2 2 5 2 1704380540\n", - "9 202 1 1 6 2 1704380541\n", - "10 202 1 1 6 2 1704380541\n", - "11 202 1 1 6 2 1704380541\n", - "12 176 1 1 8 4 1704380550\n", - "13 176 1 1 8 4 1704380550\n", - "14 176 1 1 8 4 1704380550\n", - "15 177 1 1 8 4 1704380550\n", - "16 177 1 1 8 4 1704380550\n", - "17 177 1 1 8 4 1704380550\n", - "18 210 1 1 6 18 1704380550\n", - "19 210 1 1 6 18 1704380550\n", - "20 210 1 2 6 2 1704380550\n", - "21 175 1 1 8 4 1704380560\n", - "22 175 1 1 8 4 1704380560\n", - "23 175 1 1 8 4 1704380560" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "del movement\n", - "fsec = fsecs[33]\n", - "print(fsec)\n", - "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\n", - "recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", - "if not recent_histories:\n", - " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", - "else:\n", - " rhistory = pd.concat(recent_histories)\n", - "recent_unix = rhistory[['inter_no', 'end_unix']]\n", - "move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", - "move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", - "move = move.drop_duplicates()\n", - "move = move.rename(columns = {'end_unix':'start_unix'})\n", - "display(move)\n", - "try:\n", - " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", - " pass\n", - " else: \n", - " movement = pd.DataFrame()\n", - "except NameError: # movement가 존재하지 않는 경우 생성\n", - " movement = pd.DataFrame()\n", - "movement = pd.concat([movement, move])\n", - "movement = movement[movement.start_unix > fsec - 3600]\n", - "movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", - "display(movement)\n", - "\n", - "fsec = fsecs[34]\n", - "print(fsec)\n", - "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\n", - "recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", - "if not recent_histories:\n", - " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", - "else:\n", - " rhistory = pd.concat(recent_histories)\n", - "recent_unix = rhistory[['inter_no', 'end_unix']]\n", - "move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", - "move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", - "move = move.drop_duplicates()\n", - "move = move.rename(columns = {'end_unix':'start_unix'})\n", - "display(move)\n", - "try:\n", - " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", - " pass\n", - " else: \n", - " movement = pd.DataFrame()\n", - "except NameError: # movement가 존재하지 않는 경우 생성\n", - " movement = pd.DataFrame()\n", - "display(movement)\n", - "movement = pd.concat([movement, move])\n", - "movement = movement[movement.start_unix > fsec - 3600]\n", - "movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", - "\n", - "fsec = fsecs[35]\n", - "print(fsec)\n", - "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\n", - "recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", - "if not recent_histories:\n", - " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", - "else:\n", - " rhistory = pd.concat(recent_histories)\n", - "recent_unix = rhistory[['inter_no', 'end_unix']]\n", - "move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", - "move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", - "move = move.drop_duplicates()\n", - "move = move.rename(columns = {'end_unix':'start_unix'})\n", - "display(move)\n", - "try:\n", - " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", - " pass\n", - " else: \n", - " movement = pd.DataFrame()\n", - "except NameError: # movement가 존재하지 않는 경우 생성\n", - " movement = pd.DataFrame()\n", - "display(movement)\n", - "movement = pd.concat([movement, move])\n", - "movement = movement[movement.start_unix > fsec - 3600]\n", - "movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", - "\n", - "fsec = fsecs[36]\n", - "print(fsec)\n", - "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\n", - "recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", - "if not recent_histories:\n", - " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", - "else:\n", - " rhistory = pd.concat(recent_histories)\n", - "recent_unix = rhistory[['inter_no', 'end_unix']]\n", - "move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", - "move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", - "move = move.drop_duplicates()\n", - "move = move.rename(columns = {'end_unix':'start_unix'})\n", - "display(move)\n", - "try:\n", - " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", - " pass\n", - " else: \n", - " movement = pd.DataFrame()\n", - "except NameError: # movement가 존재하지 않는 경우 생성\n", - " movement = pd.DataFrame()\n", - "display(movement)\n", - "movement = pd.concat([movement, move])\n", - "movement = movement[movement.start_unix > fsec - 3600]\n", - "movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 415, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 0%| | 0/17280 [00:00 fsec - 3600]\n", - " movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", - "\n", - " time2movement[fsec] = movement\n", - " movement.to_csv(f'../../Data/tables/movements/movements_{fsec}.csv')\n", - "\n", - "# 각 movement들의 길이 시각화\n", - "import matplotlib.pyplot as plt\n", - "plt.plot(fsecs, [len(time2movement[fsec]) for fsec in fsecs])\n", - "plt.close()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# C. 5분 간격으로 신호이력 수집 및 통합테이블 생성" - ] - }, - { - "cell_type": "code", - "execution_count": 416, - "metadata": {}, - "outputs": [ - { - "data": { - "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", - "
inter_nostart_hourstart_minuteddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
017500373925302900016057
117570404229263300017040
217590434533223700018028
31751830464837184100019018
41760037734000000150131
\n", - "
" - ], - "text/plain": [ - " inter_no start_hour start_minute ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 \\\n", - "0 175 0 0 37 39 25 30 29 \n", - "1 175 7 0 40 42 29 26 33 \n", - "2 175 9 0 43 45 33 22 37 \n", - "3 175 18 30 46 48 37 18 41 \n", - "4 176 0 0 37 73 40 0 0 \n", - "\n", - " ddur_6 ddur_7 ddur_8 cycle offset \n", - "0 0 0 0 160 57 \n", - "1 0 0 0 170 40 \n", - "2 0 0 0 180 28 \n", - "3 0 0 0 190 18 \n", - "4 0 0 0 150 131 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "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", @@ -5854,17 +4352,17 @@ } ], "source": [ - "pland = pd.read_csv('../../Data/tables/pland.csv', index_col=0)\n", + "# pland = pd.read_csv('../../Data/tables/pland.csv', index_col=0)\n", "plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n", "history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n", - "display(pland.head())\n", + "# display(pland.head())\n", "display(history.head())\n", "# plan은 A, B가 통합된 형식으로 history는 분리된 형식으로 표시되었음." ] }, { "cell_type": "code", - "execution_count": 417, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -5930,7 +4428,7 @@ "3 18 30 1704447000" ] }, - "execution_count": 417, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -5968,42 +4466,7 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2024-01-05 14:29:20\n", - "2024-01-05 15:29:19\n" - ] - } - ], - "source": [ - "# inter_no = 175, m = 30 : 조정 (수축)\n", - "# inter_no = 175, m = 70 : 삭제 + 조정(수축)\n", - "# inter_no = 175, m = 90 : 결측(전이) + 삭제 + 조정(수축)\n", - "# inter_no = 175, m = 140 : 삭제 + 조정(수축)\n", - "# inter_no = 176, m = 50 : 조정(수축)\n", - "# inter_no = 176, m = 155 : 삭제(마지막 행에서 삭제)\n", - "# inter_no = 176, m = 160 : 조정(수축) + 삭제 + 조정(수축)\n", - "# inter_no = 176, m = 190 : 결측\n", - "# inter_no = 176, m = 220 : 삭제\n", - "# inter_no = 176, m = 270 : 삭제\n", - "# inter_no = 176, m = 275 : 삭제\n", - "# inter_no = 177, m = 40 : 조정(수축)\n", - "# inter_no = 178, m = 70 : 삭제\n", - "# inter_no = 178, m = 100 : 조정(확장) + 삭제\n", - "# inter_no = 178, m = 270 : 결측 + 조정(확장)\n", - "\n", - "print(datetime.fromtimestamp(1704432560))\n", - "print(datetime.fromtimestamp(1704436159))" - ] - }, - { - "cell_type": "code", - "execution_count": 419, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -6015,17 +4478,17 @@ " output : rhistory\n", " - recent history\n", " - 현재시각(present_time) 이전 1시간 동안의 신호이력에 대하여 결측치 및 이상치를 처리한 결과\n", - " - 교차로번호(inter_no), 종료유닉스(end_unix), 현시시간(ddur_j), 주기(cycle), 옵셋(offset)\n", + " - 교차로번호(inter_no), 종료유닉스(end_unix), 현시시간(dur_Aj, dur_Bj), 주기(cycle), 옵셋(offset)\n", " '''\n", " fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", " present_time = fmins[m] # 현재시점\n", " print(datetime.fromtimestamp(present_time))\n", "\n", - " Rhists = []\n", + " Rhists = [] # Recent history (1시간 이내)\n", " for inter_no in history.inter_no.unique():\n", " # - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n", " # 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 1시간 이내인(Rhist) 데이터 수집\n", - " rhistory = history.copy() # recent history (3시간 이내)\n", + " rhistory = history.copy() # recent history (3시간 이내 : 1시간 이내의 이력에 대한 전처리를 위해 3시간 이내 데이터가 필요함)\n", " rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 10800)]\n", " hours = np.array(range(midnight, next_day + 1, 3600))\n", " rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n", @@ -6045,12 +4508,11 @@ " idx = (start_seconds <= curr_unix).sum() - 1\n", " start_hour = timetable.iloc[idx].start_hour\n", " start_minute = timetable.iloc[idx].start_minute\n", - " prow = pland[(pland.inter_no==inter_no) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)] # planned row\n", + " prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n", " prow = prow.drop(['start_hour', 'start_minute'], axis=1)\n", " prow['end_unix'] = curr_unix\n", " cycle = prow.iloc[0].cycle\n", " new_rows.append(prow)\n", - "\n", " rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n", " rhist = rhist.reset_index(drop=True)\n", "\n", @@ -6069,9 +4531,9 @@ " base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n", " # D_n : 시간차이\n", " D_n = curr_unix - base_unix\n", - " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n", + " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", " # S_n : 현시시간합\n", - " S_n = ddurations.values.sum()\n", + " S_n = ddurations.values.sum() // 2\n", " Rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n", " n = 1\n", " while n < len(Rhist):\n", @@ -6085,8 +4547,8 @@ " # D_n : 시간차이\n", " D_n = curr_unix - base_unix\n", " # S_n : 현시시간합\n", - " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n", - " S_n = ddurations.values.sum()\n", + " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", + " S_n = ddurations.values.sum() // 2\n", " # 비율이 0.5보다 작거나 같으면 해당 행을 삭제\n", " if (abs(D_n - S_n) > 10) & (R_n <= 0.5):\n", " # print(\"lt\", inter_no, curr_unix, round(R_n,2), D_n, S_n)\n", @@ -6104,16 +4566,16 @@ " # D_n : 시간차이\n", " D_n = curr_unix - base_unix\n", " # S_n : 현시시간합\n", - " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n", - " S_n = ddurations.values.sum()\n", + " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", + " S_n = ddurations.values.sum() // 2\n", " # 비율이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n", " if (abs(D_n - S_n) > 10) & (R_n > 0.5):\n", " start_seconds = np.array(timetable.start_seconds)\n", " idx = (start_seconds <= curr_unix).sum() - 1\n", " start_hour = timetable.iloc[idx].start_hour\n", " start_minute = timetable.iloc[idx].start_minute\n", - " prow = pland[(pland.inter_no==inter_no) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n", - " adjusted_dur = prow[['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] * R_n\n", + " prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n", + " adjusted_dur = prow[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n", " # 조정된 현시시간을 정수로 바꿈\n", " int_parts = adjusted_dur.apply(lambda x: int(x))\n", " frac_parts = adjusted_dur - int_parts\n", @@ -6123,8 +4585,8 @@ " max_frac_index = frac_parts.idxmax()\n", " int_parts[max_frac_index] += 1\n", " frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n", - " Rhist.loc[n, ['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] = int_parts.values\n", - " Rhist.loc[n, 'cycle'] = int_parts.sum()\n", + " Rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n", + " Rhist.loc[n, 'cycle'] = int_parts.sum() // 2\n", " # print(\"gt\", inter_no, curr_unix, round(R_n,2), D_n, S_n)\n", " n += 1\n", " Rhist = Rhist.drop(columns=['offset', 'D_n', 'S_n'])\n", @@ -6136,7 +4598,7 @@ }, { "cell_type": "code", - "execution_count": 420, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -6152,7 +4614,7 @@ " # 이전 유닉스 존재, abs >=10 => 현시시간 합의 차\n", " inter_no = row.inter_no\n", " end_unix = row.end_unix\n", - " elapsed_time = row[[f'ddur_{j}' for j in range(1, 9)]].sum()\n", + " elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합\n", " start_unix = end_unix - elapsed_time\n", " pre_rows = history[:i] # previous rows\n", " if inter_no in pre_rows.inter_no.unique(): # 이전 유닉스 존재\n", @@ -6166,30 +4628,35 @@ " rhistory['start_unix'] = rhistory['start_unix'].astype(int)\n", " # # with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n", " # # display(rhistory)\n", - " rhistory = rhistory[['inter_no', 'start_unix'] + [f'ddur_{j}' for j in range(1, 9)] + ['cycle']]\n", + " rhistory = rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n", + "\n", " # 계층화된 형태로 변환\n", " hrhistory = [] # hierarchied recent history\n", " for i, row in rhistory.iterrows():\n", - " inter_no = row.inter_no #\n", - " start_unix = row.start_unix #\n", + " inter_no = row.inter_no\n", + " start_unix = row.start_unix\n", + "\n", " ind = (timetable['start_seconds'] <= row.start_unix).sum() - 1\n", " start_hour = timetable.iloc[ind].start_hour\n", " start_minute = timetable.iloc[ind].start_minute\n", " isplit = isplits[(inter_no, start_hour, start_minute)]\n", - " new_rows = []\n", - " for j in isplit.keys():\n", - " phas_A, phas_B = isplit[j]\n", - " duration = row[f'ddur_{j}']\n", - " new_rows.append(pd.DataFrame({'inter_no':[inter_no], 'start_unix':[start_unix],\n", - " 'phas_A':[phas_A],'phas_B':[phas_B],'duration':[duration]}))\n", - " new_rows = pd.concat(new_rows)\n", + " phas_As = [isplit[j][0] for j in isplit.keys()]\n", + " phas_Bs = [isplit[j][1] for j in isplit.keys()]\n", + " durs_A = row[[f'dura_A{j}' for j in range(1,9)]]\n", + " durs_B = row[[f'dura_B{j}' for j in range(1,9)]]\n", + " cums_A = durs_A.cumsum()\n", + " cums_B = durs_B.cumsum()\n", + " cycle = durs_A.sum()\n", + " cums = np.unique(np.concatenate((cums_A,cums_B)))\n", + " durations = np.concatenate(([cums[0]], np.diff(cums)))\n", + " new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations),\n", + " 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations})\n", " hrhistory.append(new_rows)\n", " hrhistory = pd.concat(hrhistory)\n", " hrhistory = hrhistory.sort_values(by = ['start_unix', 'inter_no', 'phas_A', 'phas_B']).reset_index(drop=True)\n", "\n", " # 5초단위로 수집한 이동류정보(time2movement[present_time])와 최근 1시간 신호이력(hrhistory)을 병합\n", - " movedur = pd.merge(time2movement[present_time], hrhistory, how='inner', on=['inter_no', 'start_unix', 'phas_A', 'phas_B'])\n", - " # movements and durations\n", + " movedur = pd.merge(time2movement[present_time], hrhistory, how='inner', on=['inter_no', 'start_unix', 'phas_A', 'phas_B']) # movements and durations\n", " movedur = movedur.sort_values(by=['start_unix', 'inter_no', 'phas_A','phas_B'])\n", " movedur = movedur[['inter_no', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration']]\n", " # 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n", @@ -6198,19 +4665,247 @@ " start_unix = row.start_unix\n", " move_A = row.move_A\n", " move_B = row.move_B\n", - " match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n", - " match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n", - " inc_edge_A = match_A.inc_edge\n", - " inc_edge_B = match_B.inc_edge\n", - " out_edge_A = match_A.out_edge\n", - " out_edge_B = match_B.out_edge\n", + " if move_A in [17, 18]:\n", + " inc_edge_A = np.nan\n", + " out_edge_A = np.nan\n", + " elif move_B in [17, 18]:\n", + " inc_edge_B = np.nan\n", + " out_edge_B = np.nan\n", + " else:\n", + " match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n", + " match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n", + " inc_edge_A = match_A.inc_edge\n", + " inc_edge_B = match_B.inc_edge\n", + " out_edge_A = match_A.out_edge\n", + " out_edge_B = match_B.out_edge\n", " movedur.loc[i, ['inc_edge_A', 'inc_edge_B', 'out_edge_A', 'out_edge_B']] = [inc_edge_A, inc_edge_B, out_edge_A, out_edge_B]\n", " # 이동류 컬럼 제거\n", - " # movedur = movedur.drop(['move_A', 'move_B'], axis=1)\n", + " movedur = movedur.drop(['move_A', 'move_B'], axis=1)\n", "\n", " histid = movedur.copy() # history with edge ids (incoming and outgoing edge ids)\n", " return histid" ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2024-01-05 02:30:00\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "
inter_noend_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleoffset
0206170438052033352626000033352626000012010
1178170438054038394023000038394023000014050
2201170438054024241758170002424175817000140133
320217043805403910100000039101000000140103
4177417717043805503620
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nostart_unixphas_Aphas_Bdurationinc_edge_Ainc_edge_Bout_edge_Aout_edge_B
017517043858401137-571542797_02-571500487_01571500487_01571542797_02
117517043858402239-571500487_01-571542797_02571545870_01571510153_01
217517043858403325571545870_02571545870_02571510153_01571542797_02
317517043858403430571545870_02571510153_02571510153_01571545870_01
417517043858404429571510153_02571510153_02571500487_01571545870_01
..............................
58221017043892401124NaNNaNNaNNaN
58321017043892401219-571542115_01571500535_02.18571500535_01571542115_01
58421017043892402229571500535_02.18571500535_02.18571511538_01571542115_01
58521017043892403356571511538_02.121571511538_02.121571542115_01571500585_01
58621017043892404422571500585_02571500585_02571511538_01571500535_01
\n", + "

587 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " inter_no start_unix phas_A phas_B duration inc_edge_A \\\n", + "0 175 1704385840 1 1 37 -571542797_02 \n", + "1 175 1704385840 2 2 39 -571500487_01 \n", + "2 175 1704385840 3 3 25 571545870_02 \n", + "3 175 1704385840 3 4 30 571545870_02 \n", + "4 175 1704385840 4 4 29 571510153_02 \n", + ".. ... ... ... ... ... ... \n", + "582 210 1704389240 1 1 24 NaN \n", + "583 210 1704389240 1 2 19 -571542115_01 \n", + "584 210 1704389240 2 2 29 571500535_02.18 \n", + "585 210 1704389240 3 3 56 571511538_02.121 \n", + "586 210 1704389240 4 4 22 571500585_02 \n", + "\n", + " inc_edge_B out_edge_A out_edge_B \n", + "0 -571500487_01 571500487_01 571542797_02 \n", + "1 -571542797_02 571545870_01 571510153_01 \n", + "2 571545870_02 571510153_01 571542797_02 \n", + "3 571510153_02 571510153_01 571545870_01 \n", + "4 571510153_02 571500487_01 571545870_01 \n", + ".. ... ... ... \n", + "582 NaN NaN NaN \n", + "583 571500535_02.18 571500535_01 571542115_01 \n", + "584 571500535_02.18 571511538_01 571542115_01 \n", + "585 571511538_02.121 571542115_01 571500585_01 \n", + "586 571500585_02 571511538_01 571500535_01 \n", + "\n", + "[587 rows x 9 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "make_histid(30)" + ] } ], "metadata": { diff --git a/Analysis/0117_make_signals/0117_make_signals.ipynb b/Analysis/0117_make_signals/0117_make_signals.ipynb index 2bc8b6a70..da224c492 100644 --- a/Analysis/0117_make_signals/0117_make_signals.ipynb +++ b/Analysis/0117_make_signals/0117_make_signals.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -17,14 +17,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1704406800\n" + "1704410400\n" ] }, { @@ -64,73 +64,73 @@ " \n", " \n", " 0\n", - " i9\n", - " 1704403210\n", + " i1\n", + " 1704406840\n", " 1\n", " 1\n", - " 39\n", - " 571510152_02\n", - " 571510152_01\n", - " -571510152_01\n", - " 571510152_01.65\n", - " 6\n", - " 2\n", + " 37\n", + " -571542810_01\n", + " 571542797_02.99\n", + " -571542797_02.99\n", + " 571542810_01\n", + " 8\n", + " 4\n", " \n", " \n", " 1\n", - " i9\n", - " 1704403210\n", + " i1\n", + " 1704406840\n", " 2\n", " 2\n", - " 101\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 17\n", - " 18\n", + " 93\n", + " -571542810_01\n", + " -571542810_01\n", + " -571542797_02.99\n", + " 571543469_01\n", + " 8\n", + " 3\n", " \n", " \n", " 2\n", - " i6\n", - " 1704403210\n", - " 1\n", - " 1\n", - " 24\n", - " -571542115_01\n", + " i1\n", + " 1704406840\n", + " 3\n", + " 3\n", + " 40\n", + " 571543469_02\n", " NaN\n", - " 571500535_01\n", + " -571542797_02.99\n", " NaN\n", - " 6\n", + " 5\n", " 18\n", " \n", " \n", " 3\n", - " i6\n", - " 1704403210\n", + " i9\n", + " 1704406850\n", " 1\n", - " 2\n", - " 19\n", - " -571542115_01\n", - " 571500535_02.18\n", - " 571500535_01\n", - " 571542115_01\n", + " 1\n", + " 46\n", + " 571510152_02\n", + " 571510152_01\n", + " -571510152_01\n", + " 571510152_01.65\n", " 6\n", " 2\n", " \n", " \n", " 4\n", - " i6\n", - " 1704403210\n", - " 2\n", + " i9\n", + " 1704406850\n", " 2\n", - " 29\n", - " 571500535_02.18\n", - " 571500535_02.18\n", - " 571511538_01\n", - " 571542115_01\n", - " 5\n", " 2\n", + " 114\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 17\n", + " 18\n", " \n", " \n", " ...\n", @@ -147,68 +147,54 @@ " ...\n", " \n", " \n", - " 417\n", - " i8\n", - " 1704406590\n", - " 5\n", - " 5\n", - " 18\n", - " 571500583_01\n", - " 571500583_01\n", - " 571500617_01\n", - " 571500569_01\n", - " 7\n", + " 477\n", + " i6\n", + " 1704410200\n", " 4\n", + " 4\n", + " 23\n", + " 571500585_02\n", + " 571500585_02\n", + " 571511538_01\n", + " 571500535_01\n", + " 8\n", + " 3\n", " \n", " \n", - " 418\n", - " i7\n", - " 1704406630\n", + " 478\n", + " i2\n", + " 1704410220\n", " 1\n", " 1\n", - " 44\n", - " -571511538_02\n", - " 571542073_01\n", - " 571542073_02\n", - " 571511538_02\n", + " 40\n", + " -571542809_01\n", + " 571542811_02\n", + " 571542811_01\n", + " 571542809_01\n", " 8\n", " 4\n", " \n", " \n", - " 419\n", - " i7\n", - " 1704406630\n", + " 479\n", + " i2\n", + " 1704410220\n", " 2\n", " 2\n", - " 44\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 17\n", - " 18\n", + " 25\n", + " 571542811_02\n", + " -571542809_01\n", + " 571542107_01\n", + " 571542809_01\n", + " 7\n", + " 3\n", " \n", " \n", - " 420\n", - " i7\n", - " 1704406630\n", + " 480\n", + " i2\n", + " 1704410220\n", " 3\n", " 3\n", - " 26\n", - " -571511538_02\n", - " 571542073_01\n", - " 571542073_02\n", - " 571511538_02\n", - " 8\n", - " 4\n", - " \n", - " \n", - " 421\n", - " i7\n", - " 1704406630\n", - " 4\n", - " 4\n", - " 26\n", + " 71\n", " NaN\n", " NaN\n", " NaN\n", @@ -216,42 +202,56 @@ " 17\n", " 18\n", " \n", + " \n", + " 481\n", + " i2\n", + " 1704410220\n", + " 4\n", + " 4\n", + " 34\n", + " -571542809_01\n", + " 571542107_02\n", + " 571542811_01\n", + " 571542809_01\n", + " 5\n", + " 1\n", + " \n", " \n", "\n", - "

422 rows × 11 columns

\n", + "

482 rows × 11 columns

\n", "" ], "text/plain": [ - " node_id start_unix phas_A phas_B duration inc_edge_A \\\n", - "0 i9 1704403210 1 1 39 571510152_02 \n", - "1 i9 1704403210 2 2 101 NaN \n", - "2 i6 1704403210 1 1 24 -571542115_01 \n", - "3 i6 1704403210 1 2 19 -571542115_01 \n", - "4 i6 1704403210 2 2 29 571500535_02.18 \n", - ".. ... ... ... ... ... ... \n", - "417 i8 1704406590 5 5 18 571500583_01 \n", - "418 i7 1704406630 1 1 44 -571511538_02 \n", - "419 i7 1704406630 2 2 44 NaN \n", - "420 i7 1704406630 3 3 26 -571511538_02 \n", - "421 i7 1704406630 4 4 26 NaN \n", + " node_id start_unix phas_A phas_B duration inc_edge_A \\\n", + "0 i1 1704406840 1 1 37 -571542810_01 \n", + "1 i1 1704406840 2 2 93 -571542810_01 \n", + "2 i1 1704406840 3 3 40 571543469_02 \n", + "3 i9 1704406850 1 1 46 571510152_02 \n", + "4 i9 1704406850 2 2 114 NaN \n", + ".. ... ... ... ... ... ... \n", + "477 i6 1704410200 4 4 23 571500585_02 \n", + "478 i2 1704410220 1 1 40 -571542809_01 \n", + "479 i2 1704410220 2 2 25 571542811_02 \n", + "480 i2 1704410220 3 3 71 NaN \n", + "481 i2 1704410220 4 4 34 -571542809_01 \n", "\n", - " inc_edge_B out_edge_A out_edge_B move_A move_B \n", - "0 571510152_01 -571510152_01 571510152_01.65 6 2 \n", - "1 NaN NaN NaN 17 18 \n", - "2 NaN 571500535_01 NaN 6 18 \n", - "3 571500535_02.18 571500535_01 571542115_01 6 2 \n", - "4 571500535_02.18 571511538_01 571542115_01 5 2 \n", - ".. ... ... ... ... ... \n", - "417 571500583_01 571500617_01 571500569_01 7 4 \n", - "418 571542073_01 571542073_02 571511538_02 8 4 \n", - "419 NaN NaN NaN 17 18 \n", - "420 571542073_01 571542073_02 571511538_02 8 4 \n", - "421 NaN NaN NaN 17 18 \n", + " inc_edge_B out_edge_A out_edge_B move_A move_B \n", + "0 571542797_02.99 -571542797_02.99 571542810_01 8 4 \n", + "1 -571542810_01 -571542797_02.99 571543469_01 8 3 \n", + "2 NaN -571542797_02.99 NaN 5 18 \n", + "3 571510152_01 -571510152_01 571510152_01.65 6 2 \n", + "4 NaN NaN NaN 17 18 \n", + ".. ... ... ... ... ... \n", + "477 571500585_02 571511538_01 571500535_01 8 3 \n", + "478 571542811_02 571542811_01 571542809_01 8 4 \n", + "479 -571542809_01 571542107_01 571542809_01 7 3 \n", + "480 NaN NaN NaN 17 18 \n", + "481 571542107_02 571542811_01 571542809_01 5 1 \n", "\n", - "[422 rows x 11 columns]" + "[482 rows x 11 columns]" ] }, - "execution_count": 13, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -260,7 +260,7 @@ "midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", "next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n", "fmins = range(midnight, next_day, 300)\n", - "m = 88 # m ranges from 26 to 287\n", + "m = 100 # m ranges from 26 to 287\n", "print(fmins[m])\n", "net = sumolib.net.readNet('../../Data/networks/SN_sample.net.xml')\n", "inter_node = pd.read_csv('../../data/tables/inter_node.csv', index_col=0)\n", @@ -276,7 +276,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -298,7 +298,141 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i0 grrrgrrrgrrrrrgrr\n", + "i1 grrrrrrgrr\n", + "i2 rrggrrr\n", + "i3 grrrrgrrrrgrrrrgrrrr\n", + "i6 grrrgrrrrgrrgrrr\n", + "i7 rrrggrr\n", + "i8 grrrrrrrgrrrgrrr\n", + "i9 rrrr\n" + ] + } + ], + "source": [ + "node2init = {}\n", + "for node in nodes:\n", + " node_id = node.getID()\n", + " conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n", + " conns = [c for c in conns if c[0] >= 0]\n", + " conns = sorted(conns, key=lambda x: x[0])\n", + " state = []\n", + " for i, ci in conns:\n", + " if ci.getTLLinkIndex() < 0:\n", + " continue\n", + " are_foes = False\n", + " for j, cj in conns:\n", + " if ci.getTo() == cj.getTo():\n", + " continue\n", + " if node.areFoes(i, j):\n", + " are_foes = True\n", + " break\n", + " state.append('r' if are_foes else 'g')\n", + " node2init[node_id] = state\n", + "\n", + "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n", + "for _, row in sigtable.iterrows():\n", + " node_id = row['node_id']\n", + " inc_edge_A = row.inc_edge_A\n", + " inc_edge_B = row.inc_edge_B\n", + " out_edge_A = row.out_edge_A\n", + " out_edge_B = row.out_edge_B\n", + " move_A = row['move_A']\n", + " move_B = row['move_B']\n", + "\n", + " if pd.isna(inc_edge_A) or pd.isna(out_edge_A):\n", + " continue\n", + " else:\n", + " inc_edge_A = net.getEdge(inc_edge_A)\n", + " out_edge_A = net.getEdge(out_edge_A)\n", + " for conn in inc_edge_A.getConnections(out_edge_A):\n", + " index = conn.getTLLinkIndex()\n", + " if index >= 0:\n", + " node2init[node_id][index] = 'r'\n", + "\n", + " if pd.isna(inc_edge_B) or pd.isna(out_edge_B):\n", + " continue\n", + " else:\n", + " inc_edge_B = net.getEdge(inc_edge_B)\n", + " out_edge_B = net.getEdge(out_edge_B)\n", + " for conn in inc_edge_B.getConnections(out_edge_B):\n", + " index = conn.getTLLinkIndex()\n", + " if index >= 0:\n", + " node2init[node_id][index] = 'r'\n", + "for node_id in node_ids:\n", + " print(node_id, \"\".join(node2init[node_id]))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n", + "['G', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n", + "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n" + ] + } + ], + "source": [ + "print(node2init['i6'])\n", + "state = copy.deepcopy(node2init)['i6']\n", + "state[0] = 'G'\n", + "print(state)\n", + "print(node2init['i6'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 1., 7., 11., 12., 6., 7., 3., 1., 2., 3.]),\n", + " array([ 0. , 12.2, 24.4, 36.6, 48.8, 61. , 73.2, 85.4, 97.6,\n", + " 109.8, 122. ]),\n", + " )" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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q1/9Kn3ta19Ld911V4qItGzZsm77e7Im733ve9PJJ5+cHnnkkfS73/0uvfWtb02XXHJJ5r9J73q9ddq5c2dqbm5Od955Z3riiSfS6tWr0+TJk9Opp57a7TH6yjoNiPiYPHlyamlpKd3v7OxMDQ0NqbW1tYJT9S07duxIEZEeeuihlNLL/5APO+yw9POf/7x0zF/+8pcUEWn16tWVGrNidu3alY4//vh0//33p3e/+92l+LBOL5s7d24644wzXnN/V1dXGj16dPrud79b2rZz585UKBTS7bffnmPEPmH69OnpU5/6VLdtH/jAB9KMGTNSStYppbTfk2pP1uTPf/5zioi0bt260jG//vWvU1VVVXruueeyzZ7TgSLt1dauXZsiIj3zzDMppb61Tof8yy4vvfRSbNiwIZqbm0vbBg0aFM3NzbF69eoKTta3tLe3R0TEiBEjIiJiw4YNsW/fvm7rNn78+Bg7duyAXLeWlpaYPn16t/WIsE6vuPvuu2PSpElx8cUXx6hRo+KUU06JG264obR/69at0dbW1m2d6urqYsqUKQNqnU4//fRYsWJFPPnkkxER8dhjj8WqVavi3HPPjQjrdCA9WZPVq1fH8OHDY9KkSaVjmpubY9CgQbFmzZrsM/cV7e3tUVVVVfq+tL60ThX/Vtve9o9//CM6Ozv3++2q9fX18cQTT1Roqr6lq6srZs+eHdOmTYsJEyZERERbW1vU1NTs9yV/9fX10dbWVoEpK+eOO+6IjRs3xrp16/bbZ51e9vTTT8fSpUtjzpw58dWvfjXWrVsXl112WdTU1MTMmTNLa3Gg/w8H0jrNmzcvisVijB8/PgYPHhydnZ2xaNGimDFjRkSEdTqAnqxJW1tbjBo1qtv+6urqGDFixIBdtxdffDHmzp0bl1xySenL5frSOh3y8cEba2lpiccffzxWrVpV6VH6nG3btsXll18e999/fwwZMqTS4/RZXV1dMWnSpPjWt74VERGnnHJKPP7443HdddfFzJkzKzxd3/Gzn/0sbr311rjtttvipJNOik2bNsXs2bOjoaHBOlE2+/btiw9/+MORUoqlS5dWepwDOuRfdjn66KNj8ODB+336YPv27TF69OgKTdV3XHrppXHPPffEypUr45hjjiltHz16dLz00kuxc+fObscPtHXbsGFD7NixI97xjndEdXV1VFdXx0MPPRQ/+MEPorq6Ourr661TRIwZMyZOPPHEbttOOOGEePbZZyMiSmsx0P8//MpXvhLz5s2Lj370ozFx4sT4+Mc/Hl/+8pejtbU1IqzTgfRkTUaPHh07duzotv8///lPvPDCCwNu3V4Jj2eeeSbuv//+0lWPiL61Tod8fNTU1MSpp54aK1asKG3r6uqKFStWxNSpUys4WWWllOLSSy+NZcuWxQMPPBBNTU3d9p966qlx2GGHdVu3zZs3x7PPPjug1u3ss8+OP/7xj7Fp06bSbdKkSTFjxozSf1uniGnTpu33Ue0nn3wyjj322IiIaGpqitGjR3dbp2KxGGvWrBlQ67R3794YNKj7j93BgwdHV1dXRFinA+nJmkydOjV27twZGzZsKB3zwAMPRFdXV0yZMiX7zJXySnhs2bIlfvvb38bIkSO77e9T65T17a0Vcscdd6RCoZBuvvnm9Oc//zl99rOfTcOHD09tbW2VHq1ivvCFL6S6urr04IMPpr/97W+l2969e0vHfP7zn09jx45NDzzwQFq/fn2aOnVqmjp1agWn7hv++9MuKVmnlF5+V311dXVatGhR2rJlS7r11lvT4Ycfnn7605+Wjlm8eHEaPnx4+sUvfpH+8Ic/pAsvvPCQ/wjpq82cOTO9+c1vLn3U9q677kpHH310uuKKK0rHDMR12rVrV3r00UfTo48+miIiXXPNNenRRx8tfUqjJ2vy3ve+N51yyilpzZo1adWqVen4448/5D5q+3rr9NJLL6ULLrggHXPMMWnTpk3dfq53dHSUHqOvrNOAiI+UUvrhD3+Yxo4dm2pqatLkyZPTI488UumRKioiDni76aabSsf8+9//Tl/84hfTUUcdlQ4//PD0/ve/P/3tb3+r3NB9xKvjwzq97Je//GWaMGFCKhQKafz48en666/vtr+rqystWLAg1dfXp0KhkM4+++y0efPmCk1bGcViMV1++eVp7NixaciQIektb3lL+trXvtbtyWEgrtPKlSsP+PNo5syZKaWerck///nPdMkll6Qjjzwy1dbWplmzZqVdu3ZV4G/Te15vnbZu3fqaP9dXrlxZeoy+sk5VKf3Xr9YDAOhlh/x7PgCAvkV8AABZiQ8AICvxAQBkJT4AgKzEBwCQlfgAALISHwBAVuIDAMhKfAAAWYkPACAr8QEAZPV/qgnE9bhoJQwAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n", + "durs = plan[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].values.flatten()\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "plt.hist(np.unique(durs))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -324,266 +458,169 @@ " \n", " node_id\n", " start_unix\n", - " phas_A\n", - " phas_B\n", + " phase_sumo\n", " duration\n", - " inc_edge_A\n", - " inc_edge_B\n", - " out_edge_A\n", - " out_edge_B\n", - " move_A\n", - " move_B\n", + " state\n", + " start_dt\n", " \n", " \n", " \n", " \n", - " 0\n", - " i9\n", - " 1704403210\n", - " 1\n", + " 399\n", + " i7\n", + " 1704410130\n", + " 0\n", + " 44\n", + " GGrggGG\n", + " 2024-01-05 08:15:30\n", + " \n", + " \n", + " 400\n", + " i7\n", + " 1704410130\n", " 1\n", - " 39\n", - " 571510152_02\n", - " 571510152_01\n", - " -571510152_01\n", - " 571510152_01.65\n", - " 6\n", - " 2\n", + " 26\n", + " GGrggGG\n", + " 2024-01-05 08:15:30\n", " \n", " \n", - " 1\n", - " i9\n", - " 1704403210\n", - " 2\n", - " 2\n", - " 101\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 17\n", - " 18\n", - " \n", - " \n", - " 2\n", - " i6\n", - " 1704403210\n", - " 1\n", - " 1\n", - " 24\n", - " -571542115_01\n", - " NaN\n", - " 571500535_01\n", - " NaN\n", - " 6\n", - " 18\n", + " 401\n", + " i0\n", + " 1704410170\n", + " 0\n", + " 40\n", + " gGGrgrrrgGGGGrgrr\n", + " 2024-01-05 08:16:10\n", " \n", " \n", - " 3\n", - " i6\n", - " 1704403210\n", + " 402\n", + " i0\n", + " 1704410170\n", " 1\n", - " 2\n", - " 19\n", - " -571542115_01\n", - " 571500535_02.18\n", - " 571500535_01\n", - " 571542115_01\n", - " 6\n", - " 2\n", + " 42\n", + " grrGgrrrgrrrrGgrr\n", + " 2024-01-05 08:16:10\n", " \n", " \n", - " 4\n", - " i6\n", - " 1704403210\n", - " 2\n", + " 403\n", + " i0\n", + " 1704410170\n", " 2\n", " 29\n", - " 571500535_02.18\n", - " 571500535_02.18\n", - " 571511538_01\n", - " 571542115_01\n", - " 5\n", - " 2\n", + " grrrgGGGgrrrrrgrr\n", + " 2024-01-05 08:16:10\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " 404\n", + " i0\n", + " 1704410170\n", + " 3\n", + " 26\n", + " grrrgGGrgrrrrrgGr\n", + " 2024-01-05 08:16:10\n", " \n", " \n", - " 417\n", - " i8\n", - " 1704406590\n", - " 5\n", - " 5\n", - " 18\n", - " 571500583_01\n", - " 571500583_01\n", - " 571500617_01\n", - " 571500569_01\n", - " 7\n", + " 405\n", + " i0\n", + " 1704410170\n", " 4\n", + " 33\n", + " grrrgrrrgrrrrrgGG\n", + " 2024-01-05 08:16:10\n", " \n", " \n", - " 418\n", - " i7\n", - " 1704406630\n", - " 1\n", + " 406\n", + " i6\n", + " 1704410200\n", + " 0\n", + " 24\n", + " grrrgGGGrgrrgrrr\n", + " 2024-01-05 08:16:40\n", + " \n", + " \n", + " 407\n", + " i6\n", + " 1704410200\n", " 1\n", - " 44\n", - " -571511538_02\n", - " 571542073_01\n", - " 571542073_02\n", - " 571511538_02\n", - " 8\n", - " 4\n", + " 19\n", + " grrrgGGGrgrrgGGr\n", + " 2024-01-05 08:16:40\n", " \n", " \n", - " 419\n", - " i7\n", - " 1704406630\n", - " 2\n", + " 408\n", + " i6\n", + " 1704410200\n", " 2\n", - " 44\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 17\n", - " 18\n", + " 39\n", + " grrrgrrrrgrrgGGG\n", + " 2024-01-05 08:16:40\n", " \n", " \n", - " 420\n", - " i7\n", - " 1704406630\n", - " 3\n", + " 409\n", + " i6\n", + " 1704410200\n", " 3\n", - " 26\n", - " -571511538_02\n", - " 571542073_01\n", - " 571542073_02\n", - " 571511538_02\n", - " 8\n", - " 4\n", + " 65\n", + " gGGGgrrrrgrrgrrr\n", + " 2024-01-05 08:16:40\n", " \n", " \n", - " 421\n", - " i7\n", - " 1704406630\n", - " 4\n", + " 410\n", + " i6\n", + " 1704410200\n", " 4\n", - " 26\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 17\n", - " 18\n", + " 23\n", + " grrrgrrrrgGGgrrr\n", + " 2024-01-05 08:16:40\n", " \n", " \n", "\n", - "

422 rows × 11 columns

\n", "" ], "text/plain": [ - " node_id start_unix phas_A phas_B duration inc_edge_A \\\n", - "0 i9 1704403210 1 1 39 571510152_02 \n", - "1 i9 1704403210 2 2 101 NaN \n", - "2 i6 1704403210 1 1 24 -571542115_01 \n", - "3 i6 1704403210 1 2 19 -571542115_01 \n", - "4 i6 1704403210 2 2 29 571500535_02.18 \n", - ".. ... ... ... ... ... ... \n", - "417 i8 1704406590 5 5 18 571500583_01 \n", - "418 i7 1704406630 1 1 44 -571511538_02 \n", - "419 i7 1704406630 2 2 44 NaN \n", - "420 i7 1704406630 3 3 26 -571511538_02 \n", - "421 i7 1704406630 4 4 26 NaN \n", - "\n", - " inc_edge_B out_edge_A out_edge_B move_A move_B \n", - "0 571510152_01 -571510152_01 571510152_01.65 6 2 \n", - "1 NaN NaN NaN 17 18 \n", - "2 NaN 571500535_01 NaN 6 18 \n", - "3 571500535_02.18 571500535_01 571542115_01 6 2 \n", - "4 571500535_02.18 571511538_01 571542115_01 5 2 \n", - ".. ... ... ... ... ... \n", - "417 571500583_01 571500617_01 571500569_01 7 4 \n", - "418 571542073_01 571542073_02 571511538_02 8 4 \n", - "419 NaN NaN NaN 17 18 \n", - "420 571542073_01 571542073_02 571511538_02 8 4 \n", - "421 NaN NaN NaN 17 18 \n", + " node_id start_unix phase_sumo duration state \\\n", + "399 i7 1704410130 0 44 GGrggGG \n", + "400 i7 1704410130 1 26 GGrggGG \n", + "401 i0 1704410170 0 40 gGGrgrrrgGGGGrgrr \n", + "402 i0 1704410170 1 42 grrGgrrrgrrrrGgrr \n", + "403 i0 1704410170 2 29 grrrgGGGgrrrrrgrr \n", + "404 i0 1704410170 3 26 grrrgGGrgrrrrrgGr \n", + "405 i0 1704410170 4 33 grrrgrrrgrrrrrgGG \n", + "406 i6 1704410200 0 24 grrrgGGGrgrrgrrr \n", + "407 i6 1704410200 1 19 grrrgGGGrgrrgGGr \n", + "408 i6 1704410200 2 39 grrrgrrrrgrrgGGG \n", + "409 i6 1704410200 3 65 gGGGgrrrrgrrgrrr \n", + "410 i6 1704410200 4 23 grrrgrrrrgGGgrrr \n", "\n", - "[422 rows x 11 columns]" + " start_dt \n", + "399 2024-01-05 08:15:30 \n", + "400 2024-01-05 08:15:30 \n", + "401 2024-01-05 08:16:10 \n", + "402 2024-01-05 08:16:10 \n", + "403 2024-01-05 08:16:10 \n", + "404 2024-01-05 08:16:10 \n", + "405 2024-01-05 08:16:10 \n", + "406 2024-01-05 08:16:40 \n", + "407 2024-01-05 08:16:40 \n", + "408 2024-01-05 08:16:40 \n", + "409 2024-01-05 08:16:40 \n", + "410 2024-01-05 08:16:40 " ] }, - "execution_count": 15, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sigtable" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "i0 grrrgrrrgrrrrrgrr\n", - "i1 grrrrrrgrr\n", - "i2 rrggrrr\n", - "i3 grrrrgrrrrgrrrrgrrrr\n", - "i6 grrrgrrrrgrrgrrr\n", - "i7 rrrggrr\n", - "i8 grrrrrrrgrrrgrrr\n", - "i9 rrrr\n" - ] + "output_type": "display_data" } ], "source": [ - "node2init = {}\n", - "for node in nodes:\n", - " node_id = node.getID()\n", - " conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n", - " conns = [c for c in conns if c[0] >= 0]\n", - " conns = sorted(conns, key=lambda x: x[0])\n", - " state = []\n", - " for i, ci in conns:\n", - " if ci.getTLLinkIndex() < 0:\n", - " continue\n", - " are_foes = False\n", - " for j, cj in conns:\n", - " if ci.getTo() == cj.getTo():\n", - " continue\n", - " if node.areFoes(i, j):\n", - " are_foes = True\n", - " break\n", - " state.append('r' if are_foes else 'g')\n", - " node2init[node_id] = state\n", - "\n", - "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n", - "for _, row in sigtable.iterrows():\n", - " node_id = row['node_id']\n", + "sigtable = histid.copy()\n", + "sigtable['init_state'] = sigtable['node_id'].map(node2init)\n", + "for i, row in sigtable.iterrows():\n", + " node_id = row.node_id\n", " inc_edge_A = row.inc_edge_A\n", " inc_edge_B = row.inc_edge_B\n", " out_edge_A = row.out_edge_A\n", " out_edge_B = row.out_edge_B\n", - " move_A = row['move_A']\n", - " move_B = row['move_B']\n", + " state = copy.deepcopy(node2init)[node_id]\n", "\n", " if pd.isna(inc_edge_A) or pd.isna(out_edge_A):\n", " continue\n", @@ -593,7 +630,8 @@ " for conn in inc_edge_A.getConnections(out_edge_A):\n", " index = conn.getTLLinkIndex()\n", " if index >= 0:\n", - " node2init[node_id][index] = 'r'\n", + " state[index] = 'G'\n", + " sigtable.at[i, 'state'] = ''.join(state)\n", "\n", " if pd.isna(inc_edge_B) or pd.isna(out_edge_B):\n", " continue\n", @@ -603,401 +641,722 @@ " for conn in inc_edge_B.getConnections(out_edge_B):\n", " index = conn.getTLLinkIndex()\n", " if index >= 0:\n", - " node2init[node_id][index] = 'r'\n", - "for node_id in node_ids:\n", - " print(node_id, \"\".join(node2init[node_id]))" + " state[index] = 'G'\n", + " sigtable.at[i, 'state'] = ''.join(state)\n", + "sigtable = sigtable.dropna(subset='state')\n", + "sigtable = sigtable.reset_index(drop=True)\n", + "sigtable['phase_sumo'] = sigtable.groupby(['node_id', 'start_unix']).cumcount()\n", + "sigtable = sigtable[['node_id', 'start_unix', 'phase_sumo', 'duration', 'state']]\n", + "sigtable = sigtable.sort_values(by=['start_unix', 'node_id'])\n", + "sigtable_dt = sigtable.copy()[sigtable.start_unix >= fmins[m]-360]\n", + "sigtable_dt['start_dt'] = sigtable_dt['start_unix'].apply(lambda x:datetime.fromtimestamp(x))\n", + "sigtable_dt = sigtable_dt[sigtable_dt.node_id!='i9']\n", + "sigtable_dt = sigtable_dt[sigtable_dt.node_id!='i2']\n", + "display(sigtable_dt)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n", - "['G', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n", - "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n" + "3380\n", + "2024-01-05 08:15:00\n", + "2024-01-05 08:20:00\n", + "2024-01-05 08:17:00\n", + "2024-01-05 07:20:40\n" ] } ], "source": [ - "print(node2init['i6'])\n", - "state = copy.deepcopy(node2init)['i6']\n", - "state[0] = 'G'\n", - "print(state)\n", - "print(node2init['i6'])" + "print(sigtable.start_unix.max() - sigtable.start_unix.min())\n", + "print(datetime.fromtimestamp(fmins[m - 1]))\n", + "print(datetime.fromtimestamp(fmins[m]))\n", + "print(datetime.fromtimestamp(sigtable.start_unix.max()))\n", + "print(datetime.fromtimestamp(sigtable.start_unix.min()))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "sigtable1 = sigtable.copy()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['i0', 'i1', 'i2', 'i3', 'i6', 'i7', 'i8', 'i9']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(sigtable.node_id.unique())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "strings = ['\\n']\n", + "for key, group in sigtable.groupby(['start_unix', 'node_id']):\n", + " start_unix = key[0]\n", + " node_id = key[1]\n", + " strings.append(f' \\n')\n", + " for i, row in group.iterrows():\n", + " duration = row.duration\n", + " state = row.state\n", + " strings.append(f' \\n')\n", + " strings.append(' \\n')\n" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2024-01-05 07:20:00\n" - ] - }, - { - "data": { - "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", - "
node_idstart_unixphase_sumodurationstate
1i61704403210024grrrgGGGrgrrgrrr
2i61704403210119grrrgGGGrgrrgGGr
3i61704403210229grrrgrrrrgrrgGGG
4i61704403210356gGGGgrrrrgrrgrrr
5i61704403210422grrrgrrrrgGGgrrr
0i91704403210039GGGG
6i31704403220038gGGGrgrrrrgGGGrgrrrr
7i31704403220139grrrGgrrrrgrrrGgrrrr
8i31704403220240grrrrgrrrrgrrrrgGGGG
9i31704403220323grrrrgGGGGgrrrrgrrrr
10i21704403230036GGggGGG
11i21704403230120rrggrrr
12i21704403230226rrggGGG
13i11704403250037gGGGGGrgrr
14i11704403250173grrGGGGgrr
15i11704403250240grrrrrrgGG
16i01704403270037gGGrgrrrgGGGGrgrr
17i01704403270139grrGgrrrgrrrrGgrr
18i01704403270225grrrgGGGgrrrrrgrr
19i01704403270330grrrgGGrgrrrrrgGr
20i01704403270429grrrgrrrgrrrrrgGG
21i71704403320033GGrggGG
22i71704403320126GGrggGG
23i91704403350039GGGG
24i31704403360038gGGGrgrrrrgGGGrgrrrr
25i31704403360139grrrGgrrrrgrrrGgrrrr
26i31704403360240grrrrgrrrrgrrrrgGGGG
27i31704403360323grrrrgGGGGgrrrrgrrrr
28i61704403360024grrrgGGGrgrrgrrr
29i61704403360119grrrgGGGrgrrgGGr
\n", - "
" - ], - "text/plain": [ - " node_id start_unix phase_sumo duration state\n", - "1 i6 1704403210 0 24 grrrgGGGrgrrgrrr\n", - "2 i6 1704403210 1 19 grrrgGGGrgrrgGGr\n", - "3 i6 1704403210 2 29 grrrgrrrrgrrgGGG\n", - "4 i6 1704403210 3 56 gGGGgrrrrgrrgrrr\n", - "5 i6 1704403210 4 22 grrrgrrrrgGGgrrr\n", - "0 i9 1704403210 0 39 GGGG\n", - "6 i3 1704403220 0 38 gGGGrgrrrrgGGGrgrrrr\n", - "7 i3 1704403220 1 39 grrrGgrrrrgrrrGgrrrr\n", - "8 i3 1704403220 2 40 grrrrgrrrrgrrrrgGGGG\n", - "9 i3 1704403220 3 23 grrrrgGGGGgrrrrgrrrr\n", - "10 i2 1704403230 0 36 GGggGGG\n", - "11 i2 1704403230 1 20 rrggrrr\n", - "12 i2 1704403230 2 26 rrggGGG\n", - "13 i1 1704403250 0 37 gGGGGGrgrr\n", - "14 i1 1704403250 1 73 grrGGGGgrr\n", - "15 i1 1704403250 2 40 grrrrrrgGG\n", - "16 i0 1704403270 0 37 gGGrgrrrgGGGGrgrr\n", - "17 i0 1704403270 1 39 grrGgrrrgrrrrGgrr\n", - "18 i0 1704403270 2 25 grrrgGGGgrrrrrgrr\n", - "19 i0 1704403270 3 30 grrrgGGrgrrrrrgGr\n", - "20 i0 1704403270 4 29 grrrgrrrgrrrrrgGG\n", - "21 i7 1704403320 0 33 GGrggGG\n", - "22 i7 1704403320 1 26 GGrggGG\n", - "23 i9 1704403350 0 39 GGGG\n", - "24 i3 1704403360 0 38 gGGGrgrrrrgGGGrgrrrr\n", - "25 i3 1704403360 1 39 grrrGgrrrrgrrrGgrrrr\n", - "26 i3 1704403360 2 40 grrrrgrrrrgrrrrgGGGG\n", - "27 i3 1704403360 3 23 grrrrgGGGGgrrrrgrrrr\n", - "28 i6 1704403360 0 24 grrrgGGGrgrrgrrr\n", - "29 i6 1704403360 1 19 grrrgGGGrgrrgGGr" - ] - }, - "metadata": {}, - "output_type": "display_data" + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ] } ], "source": [ - "sigtable = histid.copy()\n", - "sigtable['init_state'] = sigtable['node_id'].map(node2init)\n", - "for i, row in sigtable.iterrows():\n", - " node_id = row.node_id\n", - " inc_edge_A = row.inc_edge_A\n", - " inc_edge_B = row.inc_edge_B\n", - " out_edge_A = row.out_edge_A\n", - " out_edge_B = row.out_edge_B\n", - " state = copy.deepcopy(node2init)[node_id]\n", - "\n", - " if pd.isna(inc_edge_A) or pd.isna(out_edge_A):\n", - " continue\n", - " else:\n", - " inc_edge_A = net.getEdge(inc_edge_A)\n", - " out_edge_A = net.getEdge(out_edge_A)\n", - " for conn in inc_edge_A.getConnections(out_edge_A):\n", - " index = conn.getTLLinkIndex()\n", - " if index >= 0:\n", - " state[index] = 'G'\n", - " sigtable.at[i, 'state'] = ''.join(state)\n", - "\n", - " if pd.isna(inc_edge_B) or pd.isna(out_edge_B):\n", - " continue\n", - " else:\n", - " inc_edge_B = net.getEdge(inc_edge_B)\n", - " out_edge_B = net.getEdge(out_edge_B)\n", - " for conn in inc_edge_B.getConnections(out_edge_B):\n", - " index = conn.getTLLinkIndex()\n", - " if index >= 0:\n", - " state[index] = 'G'\n", - " sigtable.at[i, 'state'] = ''.join(state)\n", - "sigtable = sigtable.dropna(subset='state')\n", - "sigtable = sigtable.reset_index(drop=True)\n", - "sigtable['phase_sumo'] = sigtable.groupby(['node_id', 'start_unix']).cumcount()\n", - "sigtable = sigtable[['node_id', 'start_unix', 'phase_sumo', 'duration', 'state']]\n", - "sigtable = sigtable.sort_values(by=['start_unix', 'node_id'])\n", - "print(datetime.fromtimestamp(fmins[m]))\n", - "display(sigtable[:30])" + "strings = ['\\n']\n", + "for key, group in sigtable.groupby(['start_unix', 'node_id']):\n", + " start_unix = key[0]\n", + " node_id = key[1]\n", + " strings.append(f' \\n')\n", + " for i, row in group.iterrows():\n", + " duration = row.duration\n", + " state = row.state\n", + " strings.append(f' \\n')\n", + " strings.append(' \\n')\n", + "strings.append('')\n", + "strings = ''.join(strings)\n", + "# 저장\n", + "path_output = '../../Data/networks/SN_sample.tll.xml'\n", + "with open(path_output, 'w') as f:\n", + " f.write(strings)\n", + "print(strings)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1621,55 +1980,6 @@ " f.write(strings)\n", "print(strings)" ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: 'one_cycle.csv'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[9], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m 2\u001b[0m path \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mone_cycle.csv\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m----> 3\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# 적당히 지정하세요\u001b[39;00m\n\u001b[0;32m 6\u001b[0m node_id \u001b[38;5;241m=\u001b[39m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnode_id\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:912\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m 899\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m 900\u001b[0m dialect,\n\u001b[0;32m 901\u001b[0m delimiter,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 908\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[0;32m 909\u001b[0m )\n\u001b[0;32m 910\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m--> 912\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:577\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m 574\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[0;32m 576\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 577\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 579\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[0;32m 580\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n", - "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:1407\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m 1404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 1406\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 1407\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:1661\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m 1659\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[0;32m 1660\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1662\u001b[0m \u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1663\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1664\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1665\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1666\u001b[0m \u001b[43m \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1667\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1668\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1669\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1670\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1671\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1672\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n", - "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\common.py:859\u001b[0m, in \u001b[0;36mget_handle\u001b[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[0;32m 854\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m 855\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[0;32m 856\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[0;32m 857\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[0;32m 858\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[1;32m--> 859\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[0;32m 860\u001b[0m \u001b[43m \u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 861\u001b[0m \u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 862\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 863\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 864\u001b[0m \u001b[43m \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 865\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 866\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 867\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[0;32m 868\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n", - "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'one_cycle.csv'" - ] - } - ], - "source": [ - "import pandas as pd\n", - "path = 'one_cycle.csv'\n", - "df = pd.read_csv(path)\n", - "\n", - "# 적당히 지정하세요\n", - "node_id = df['node_id'][0]\n", - "offset = 999\n", - "\n", - "# xml양식대로 작성\n", - "strings = ['\\n']\n", - "strings.append(f' \\n')\n", - "for i, row in df.iterrows():\n", - " dur = row['dura']\n", - " state = row['signal']\n", - " strings.append(f' \\n')\n", - "strings.append(' \\n')\n", - "strings.append('')\n", - "strings = ''.join(strings)\n", - "print(strings)\n", - "\n", - "# 저장\n", - "path_output = 'example.tll.xml'\n", - "with open(path_output, 'w') as f:\n", - " f.write(strings)" - ] } ], "metadata": { diff --git a/Analysis/0119_test_2/example.add.xml b/Analysis/0119_test_2/example.add.xml new file mode 100644 index 000000000..974bac024 --- /dev/null +++ b/Analysis/0119_test_2/example.add.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Analysis/0119_test_2/example.net.xml b/Analysis/0119_test_2/example.net.xml new file mode 100644 index 000000000..5db7310f1 --- /dev/null +++ b/Analysis/0119_test_2/example.net.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Analysis/0119_test_2/example.rou.xml b/Analysis/0119_test_2/example.rou.xml new file mode 100644 index 000000000..56b8f3985 --- /dev/null +++ b/Analysis/0119_test_2/example.rou.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Analysis/0119_test_2/example.sumocfg b/Analysis/0119_test_2/example.sumocfg new file mode 100644 index 000000000..b317b170b --- /dev/null +++ b/Analysis/0119_test_2/example.sumocfg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Data/networks/SN_sample.rou.xml b/Data/networks/SN_sample.rou.xml new file mode 100644 index 000000000..279eb08b5 --- /dev/null +++ b/Data/networks/SN_sample.rou.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Data/networks/SN_sample.sumocfg b/Data/networks/SN_sample.sumocfg deleted file mode 100644 index 036d77192..000000000 --- a/Data/networks/SN_sample.sumocfg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - diff --git a/Data/networks/SN_sample.xml.rou.xml b/Data/networks/SN_sample.xml.rou.xml deleted file mode 100644 index 33813e9a5..000000000 --- a/Data/networks/SN_sample.xml.rou.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Data/networks/SN_sample_with_a_route.net.xml b/Data/networks/SN_sample_with_a_route.net.xml deleted file mode 100644 index ed6bd1e4d..000000000 --- a/Data/networks/SN_sample_with_a_route.net.xml +++ /dev/null @@ -1,2218 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Data/networks/example/example.add.xml b/Data/networks/example/example.add.xml new file mode 100644 index 000000000..375348ebd --- /dev/null +++ b/Data/networks/example/example.add.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Data/networks/example/example.net.xml b/Data/networks/example/example.net.xml new file mode 100644 index 000000000..5db7310f1 --- /dev/null +++ b/Data/networks/example/example.net.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Data/networks/example/example.rou.xml b/Data/networks/example/example.rou.xml new file mode 100644 index 000000000..56b8f3985 --- /dev/null +++ b/Data/networks/example/example.rou.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Data/tables/0110_view_tables.ipynb b/Data/tables/0110_view_tables.ipynb index e8411f15e..2c041b4ae 100644 --- a/Data/tables/0110_view_tables.ipynb +++ b/Data/tables/0110_view_tables.ipynb @@ -35,14 +35,14 @@ }, { "attachments": { - "image.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuoAAACXCAYAAABDRH6QAAAgAElEQVR4nO3dz4vjVro38K9emru8kPWFJA1SEaq9SUI2MjQ3Fzq8cnGhsnEvsnATGokwMFYvaiCJAw3jJDC1aDlwCRLNEC+yaG+mYCjpkoY3Q4O9CclsNEWwBZ3kH8if4HchuUqSj2T5t2V/P1CLblvSsWxLz3nOc44l3/fHICIiIiKinXILAP79P/5t2+2gHfLqK0f47ffhtptBG8T3fH5lPGdlbDMR0aF69ZUj/J9tN4KIiIiIiKYxUCciIiIi2kEM1ImIiIiIdtD+B+rPP8Or73Xxyza2ffRikS2JiIgoxy9f38f7X/+67WYQrV2JA/Vf8df3jvDqK9N/Hz+fvfUvX99feNvvH4mPu3BQT0LfPzrihZiI6KC8wMevfIbv0/9dNHH2sov3RffnxJ9g/0Q7qsSB+mv48Lshfvs9/vcUH+A+3rs3e+vXP3qW2vY5Hr9T/Ohvf/E8uX3vPvDD57g7uRDUny3+0vbCC3ycujjuW9A96bCJOne/fH1/b0ZUlunUHhLheUp9BoSfi+efZX8/XnbxfhRUCBMEUeAy936J9tXtBv72ezo2iP399Cne3nYbieZQ3kBd2Gt+CPT+jHe31aZ3PsWLeOB+oMKA5X+g/JS8QD7BU/z15bZbt1pvP7iPn88PYCTlwdOpTjHqC4wiLVNOto79rFriPD3H4389zG/nyy7erz/DB70h/vbRa1MPf//V58AXD6+vaVMJgu8aeH2B/RIRUTmUN1BP9ZpffPEm8OApvryXyjxlZLans1/38PgHIJEJPvis+AKef4a7nxyh+/szfHg7+dDrH/156v9K7+gh/njnczw6uKzlXXz5+3M8xue4uycjB6v3Gj60P8XbP7j4f8IO6gt8/NbneKM3xJfCUcAX+O6bN/Hf/3feQHvWfomIqCzKG6jHfP/oCHf/VsOLJ3cBAO8+SZWkZJnKEg7x5b27+HLRrPjBl778ir+eP8MHBUc1pjpLuQFfOCchXW6RHPKfPCc+f+F+mMVPjMAk6xMntfCJ9syRrX33j58CnzydUfOYnlMRb8Ni7b5+/a+kttmY1/Dh2X3gm+dTr0X0Or9/FH0vJt+T1PtWtH5UtJ/vHwk+P9dZ93D/Rd7jlZ/P27fxhvCBF/j4lYf4+Yvn2cH08+f49sEf5uzcFtgv0c57hkZ6xPwg76lEZQ/UoxrMBp5mDwGvyY+f3Ju+iBx66cvLf+DvP7wJRZ791F++vh9l3lNlAivIzn5b/xNgT0ZagMfGfbz/VoA/RsfqPniGRuo4P35yD4/wl5u2YI4s+e0GnnwxxFc5z//l66fXbcpqw7zt/uXr+2EH9fozd4THb214ktS9e/gAQ7x8Oft1vvsk+l5MvidRx7rIuYkT7efd2n3gXy8Tgff37jO8/f5/Xl8Xku/xEN07n+NuLFhfy/l8+RI/4wi3E8H2S/z1vYf49sHTnLKUqNNbuzvPwQrsl6gM7sfuDcvcU8UJHrwjY98Gd2l/lTZQ/+Xr+3i1PsTjn25u+HP75qFgktzsLFoiY1+kXvSgpIMSkRewPwEe/xTPvEdlAt/8z9JZzLe/+Mt1FvL1j/6AD374J96IZfnfraWzwAASwc1r+K/338SPf/tH4az66x/9AW988qfMtqfLfkSB5Xztjs6hHfvM3XuIx+88w3dbnORZ5HWuYpsp9+7hg0SJiaBsJBXAvvvkaWybdZzPsAQlXmMOAPjmczz+4U08/mPOdevlP/B3fAojlRVPJwgSE0WL7Jfo0AUBftx2G4jmcGvbDVjU6x89w28fFXjivT/jN8EQcKHtM7alJUVZxvfSAf3t/8R/v/M5RgGwTLrjDTmdTUxl+WUZbyNIPOPto+Q2r8tHcx71Lr7sPcerX73Ahxkdx3AU4Z83//HOp4u3++VL/Ix/4tu3jvA4tdXbwa/AvQ1lVF++xM8AlNh/zXqdIotsk3QX7z14iK/+91d8+NFr12Ujv8U+R+n3GHgNyjv/DD9vWNH5/OYhXv0mtu0Xz6ez2w+eoouHaLz1GW7/Li4T+/6rz4H3n091/IX7m2O/RATgzm0m1ag0Shuo3whrMr/Ne8o7n+KFMNu9zLZAOKw2mYQa9yYe//QMvz3Jb/neuX0bb+BzfPf8z3j3EDs49x7i8fmf8NeXd/FfiQeiz9mDp/jt9yiIf/4ZXj1f9oD30d12QBYE+PGdGp7cBhZ7nas7N+/W7qNx/g/88lEDL91n+KD25xlb/IpR4ru7gvP54GmhEb53nzzH43/dQ+M9WXB9iUYDfpq/s5W/X6KyeIbGK4Ka9Lk78AJMwFHJlLb05UZs8qfob2Zdm6AWrtC2L/DxK/fw9/efC7b9A0ZvHeL6xXdhfPEmvp21XOHt23gjVtd8rUCN+89B8py+HP4z45nb8Bo+tGv4+1fpSY3P8S3uoxsL4H4JhssdKuscbtQLfFx/hg/OooBwkde5ynNz7x4++CHAS7zAd98U+D2Fly/x8+R3FzZ+Pl/Dh99Fq+akJ7UuNIm0wH6JSiHnns7OJx2gPQjUp39YZyMzxZ8/x7fvfIonwmHou/iyd3+uGud98fpHfwmDBMHKHd8/mtT/34XxBVIT9X7FX43P8WNmgBLVjcdXV3n+GRrfiJ67Rbcb+CMe4tHfYv8ny3g7HgS+7OLRJ8t2MO7ivQf/nJrs+P2jDU0mfdnF++nVRYq+zh8CXMfDy5yb+H4AhOfkGb579BzfPrg3lRn/8ZN7sUllk8/b5HnbOJ+v4cPvnuKDH+JLXC4yibTIfon2nSgWCEe8v63zF0qpvPag9AWYlJpsdI3ue/fwQf0hHn39n4Ka0TDT+PYX0zWm+y/8xdgPoxV54j7oDfHl9WTJZ3iB+7gbe87bXzzHbzmrVbz+0TN0h0c3Q6IPnuLFF0PcXTI5vWrvPnmK7155iB/vRP9xu4EnX7i4O6l/fudTvOjdx90lS1/efTJEF0eJIeIPekN8udxuxVK115ORqEQwXOR13nuIx+/cC9v84Cl+e7LguZnaT7Q0a+0+GvVwidC0t794CuX8CK/Wo/9Ilals9Hxeu4svf/oUP7/1EK/+61O8sIG/41M8WXpoPrVfZiJp74WZ+PV+X4k2T/J9f/zv//Fv227HEgrUmWcG8uutUS/rj/u8+soRfvt9x6JfWqu9ec9fdqMlLeO15uH39O/v50zEXMA6ztn3j47w1dFq2xm3N+8zHbxfvr6PR/gLlyKlvfbqK0f7kFFfphe9bA88yh4vvD0RrdIv/+vixwd/KOmKJ2Ft/R9/Z+BBNMvrHz3D32Y/jaj09iBQJyICbtbnL+s64nfx5e9lbTsREa3DHkwmJaJD9/2jI7z6ykP8HPvRKCIiorJjRp2ISu/dJ8Oc3y1giRoREZUTM+pERERERDuIgToRERER0Q6SfN8fVyqVbbeDiIiIiIhibgHAeDzedjtoh0iSxM/EgeF7Pr8ynrMytpmI6FBJksTSFyIiIiKiXcRAnYiIiIhoBzFQJyIiIiLaQfsRqHsGpGoHQfr/gw6qkgFvl9pERERERFTA9gN1z4AkSTP+quisPOL1YMw8rjjIDzpVVNMNWrhT4MHYVmeCiIiIiHbW9gN1zcZ4PM75c6ELNvOMWEBdc4CBCSUWZBszI18N9gLHXU6ATjXdGajBgYNawU7CofIMCdLsN5XWaPKdE70NQaeaeH88Q5ruzMb3E3tu0KnO/s4GHVSl5D4n28X/0scUPSc+0pW4jmTsYx2E7UqdgPQ5jRq8sTYSEdH2bT9QX5Bmx4JqVwdUC6NYoG1r226hiIxmP69zEP+zsZMvoUxYfrRyqq7Db6/hnKpq7n69cxMD0QO6e/OdGVmAqUwH/PHnjMcY95uQMx93URHtYx0Sxx3B8mv5n9egg2rNge6O0W/KWc8iIqI9UtpAfXmzSl9qcHK2HphK8vmKiUE8M17L2zojo8ZMWSbNHmO8m72vw3J8hlbFRGPVn9NKHXX0cCnabdBB27dgzRrikpto6YA/XKZtGs4sFc7FpkdvZDS7FtRBxjmAB0MxUXF3NQlBRETrsD+B+uAKo7k30uEumNVWrVHyuSMLanx/blZUEZa/KL16YgRgklWr9xRmgQWySisSHZ50SUO8JEpQajE9/yF8bwxvUqKUPzdiVhvExyt/CY92ZgHm+YpLs45wUgfM8+m9Bpc9oH6Co5UeL9voSpi7Xz/5COLfiPZgSDX41ohBOhHRgdmZQN0z4jWq802w9C4cAA7ESbCbLPduxEcjXA10uOnhdwBhaYwLfaFOx+EZmAoa6N6UDuAm06vZqZKoKMIJOtVkJ8mtwFSSnzW/fQ50xxiP+5hVYZDXhuvjmZVYhzAqcdiND+Ni5Ca6lo/2irPqcrMF3WmnOkcezs0KWkVKPTwDNUcv9twsQQdtR4V1toWIOBjCRwVHieYP0anW4Oguy12IiA7QzgTq+dI3r5jo5uy6OhxhjetNlns6GyWaxFmsFEVc+lKEgmPVQU2YNQ/Cm7J6DKXQvg5cIniRcVJXMehd5oxGeDg3Aasb6yRpZ7DUVCevfjYzQC/Whuh4o/jITFTiMBWQlovcbKFiNlb8GjSc6gP0LuMdnTYc/TR7voZTS0wq113BKFj8OaIRjfjjDaBboIO2emFpC6yzZPsdE+ZgSx0HIiLaut0P1IMh/MwHPRiTm7Nmw62YUApnKtOrvrjQBaUwoiyW3OwvMQE0nFA6qvcSq9SEfwp69dH0ZDcSUo+T3Rn5SFw4cC0YwscAppI85+YgWddcyewVztkGYYYUgHyCujrAVamHTTTYbkVYqrLUXhNlNQEue8gPUlMTMo/bgkA8PZk03WOfPD6yoA5MrPglZUt0IMLSlqnrje7C1QdToz5ERHQYdj9Ql5voiwLgoINqqm5TswusnLAjboL9ZAeBw9vrJp6XwPO+AO0Mli8eGVCOVQxyeiLpDs41+QT1yQiHdw4TdZwUfmsmoxUXiwW1chN9V4dT21BQnOpAZH0GNXsEK3MUjoiI9tnuB+pCAToNE5jKQMlo9qfrhNfWhuqu1L1TIfIRKvCx1KIgqzhecIneQEVWrFoeMprdOnqCFLR8VAH8obC8a+jnjVrIaLZ0OG0DRtuB3trw6FJUCrXq+vvl3FzXFAbrREQHZYuBenJ5xJoDOLWiPwIUlo+IM1B5j00fd/YPDy3440OanSph2dBxKSkxMTesgU6XEXjGus6zhjMLqeOFncyB3tpCHfQayE20UEOjl/p/7RT6YLoUzTMUmLCQW3KtncGCA2eg43Su0uzJuc2paZ8p7CgMVr6qzbImE83nKe8jIqKy22KgPuuXQdf1I0CHdtwDFmVHa7EJhJo9hqsnO0YXp+s7z3Kzj5Hlx44XzUPYo3X2NNtFZZCeSq3BnqxwE++Qwy0wByOclKumJ1aKJOq8M85tejLpjGU3rz83OxcQa7BHFlSnHOV9RES0PMn3/fGdO3e23Y71CDqoKldorSXgDdCphhMR8+gl/IESSZIwHo+33QzaIL7n8yvjOStjm4mIDpUkSXseqNNCeDOfCH9oRvQbs2XsgOXhez6/Mp6zMraZiOhQSZKEW9tuBNHuCsuV7G03g4iIiA5SSVd9ISIiIiLabwzUiYiIiIh2EAN1IiIiIqIdxECdiIiIiGgH3QLCWaVEcfxMHB6+5/Mr4zkrY5uJiA7VLQBcrosSuITb4eF7Pr8ynrMytpmI6FBJksTSFyIiIiKiXcRAnYiIiIhoBzFQJyIiIiLaQfsfqHsGpGoHQfr/gw6qkgFvW20ytnJkIiIiIiqJ3Q7UPQOSJM34q6IzFYUvfWAYM48rDvI9I+P5os4CEREREVGG3Q7UNRvj8Tjnz4Uu2CwRLNccYGBCiQXNs5PZGuwFjjuhWqPk81092Yaas/g52TOeIXF0YSeFndXct0Y4WhWgU83umIo6stXMnvZ0hzn+3KBTzfzseEbWflfZPiIiovXa7UB9QZqdCpJVC6NY4GxrW2hUvA1uXphPM2WVM9EKaTizVDjt7PPsXThQ6yeQ4/8ZXKIHFeqgh8usDXU30emtmMpUhyDoVCFJbRyPkp3kLs6XG0FbUfuIiIg2YS8D9eXNKn2pgTnx1dDsMcZb6TnRLPJJPTugDTpoOzpaTTn535c9oN5FSx+glxkJx0UdgotYJOwZUMwK3HEfqd1DbtpT/zePlbSPiIhoQw4jUB9cYTT3Rjrc3PIXG3OFlyx9EUqXL0xKFsKM6nR9v2ekypli2ya2ScxdCMsdDC8qe5gxr2FWG+L7FM9ZSB8vdsygg2rOPIfs17AFcjMzoA0uexjop6nvgIdzE6ifyNBOdQx6l4VGPUZXg/ie0Wk70N05v1+FrKJ9REREm1OKQN0z4rWyHow5VmvxLhwADsQJMQe1wnXrxQ1MJZmBrzksfZnDwFTQQDfqEI1gwUQjilg1O1XOFGXjg04VSq8eO8cVmEryc+K3z4HuGGNBpnaeNoTHm+wr/HN1B7XUh8ipNa6fM7IAs1FFVblCK2ObIq9h07RTHQPzPNWGAJe9AfTTVCjtXcBR6ziRAWin0Acmzmc1Puig7aiwzqJ9BZfoDVQcKyt7CattHxER0QaVIlDPV8FRVtDlGag5OlxXz6i1vcmaT1df3ATxWX+iSWaJ+vj4X7+JJUbsD4vuon8dScs4qaszsp9hptTqxs6xdgZLTXXQ6mfFyyZmtCFdgqGd6oA/TLRRtbrXz5GbLeiDASqxTLF2qgPORRQEF3wNmyZqg3cOExbSsWuyZl1D+PIEjXdqN9+jBtCd6jjlfKfz9hX7Ew1ara59REREm1HuQD0Yws980INRi4bQNRtuxYRSOG2eXvXFhS4ohenz7r0WaiqdKh9V8jcIhvAxgKnEgzUF5gDwhzehc6Vw9FesDYkyFUFkOH28VKZYOYY652vYvLCTEu/oiieRhpnn+snN/yY7IjGTyZojC2qRrHaexMTP+AhH6nnbah8REdESyh2oy030RbXiQQdVqQbfGl1nyjV7BMuvbXC1kHQNc6zuWLE5gXLlxHMK1tOZCicbK1et5OpCS9vkayguHA2IJpXmTCIdpDsatbDsrJ1VaC830Xd1OLVYeY98hEpmqdriVtY+IiKiDSp3oC4UoNMwAWuUCnBkNPvTtcbr4cGQFPTqI0G2r4UrhWszr5R8hAp8bCzx7F3AgQ431tkKhtljO4Vs+jXMRcNpNKlUPIk0rFmf+v2A8Rgja0bZUlRacxMsz14Wcn6rbB8REdHm7GignlweseYATi2+NKKofnyS9ZLR7GdlIfMemz5ucjnGrJp1QbbNu4CjWugKj6PBdouvOEEZEiv5hIFkeuKlZ6wpE6ocQ40H1UEHDXPZlUE2/BrmFK6Sco5z0STS4BK9wXSWHZixxGP4DDRbyQmrcrMLCyYUwXfLMxZYCWfF7SMiItqUHQ3UZ/0y6AqWS1zncaMVJcSZ+7B2fqrGl4qLspy12PKMmh2tohLrRF2crmOJPwByE10LN2UUDaC7gtKXjb6GeWlnsODAEU0iPTcFWfZItMSjmVfoPXk/r+eQhB3qsYupzvHF6fwTO1ffPiIios2QfN8f37lzZ9vt2LygEy2Vt65AKECnGk4GTFJhjXZ7FQlJkjAej7fdDNogvufzK+M5K2ObiYgOlSRJBxyoU6b9v5l7MDJ+XVZ3RUt17r/9f89Xr4znrIxtJiI6VJIk4da2G0G0eWGJk73tZhARERHl2NEadSIiIiKiw8ZAnYiIiIhoBzFQJyIiIiLaQQzUiYiIiIh20C0gnFVKFMfPxOHhez6/Mp6zMraZiOhQ3QLA5boogUu4HR6+5/Mr4zkrY5uJiA6VJEksfSEiIiIi2kUM1ImIiIiIdhADdSIiIiKiHbQfgbpnQKp2EKT/P+igKhnwttCkoFOFZGzjyERE+yHoVFHtTF3Z590LOlUJhofse0WRbRe9nyx5H1r8HHgwtnJcIlql7QfqngFJkmb8VbH664UHY+ZxRRe58MIten6xuDx7++u/uW4ktGmeIfEGRntsmQCv4La51/1Fjh0LqBfYLqstM/eX9zpmXsez70Gzri9Bp5q8P3aM4ucv99yv415LRMvYfqCu2RiPxzl/LnTBZp4Ru7jUHGBgQpkraNZgL3BcQEazL3quimOl+MvW3Zxj95uQi+9qr3mGxJGJHTH5zonejvQIUl5nJv2eToKO3Lc56KCaCmCSwYo4wBE9Jx5AJa4jBYOkvRcM4cPHcKEk7gUcOLiY9ZWNX/ddHVAtjK6vgTa0Rdq9kOh67uqA7k61x57VkLzXMfM6Lr4HueIbT7LVzX7yPnViz7hvZbR5ZEGFDvf6+H00efMh2inbD9QXpNnjnAt9gQvsKnkXcNQ6ThAGE5IkQTEHG2wAJcw9vE1FqboOv72Gc6uqufv1zk0Iv1GT4CoKOmAq0wF//DmiACrxuIuKaB8HJLjsYYABepdzvstBB9WaA13X4dSKZ8WDoQ8MrjCau6V54tlqBft9Oa7gaPKBDobw1WPMkTMioh1X2kB9ebNKX2pwCu0nQKftQK2fQJab6Ec3/JGlrrn9h0GzxxhvtNdFuY7P0KqYaKw661ypo44ehLFh0EHbt2DNShXKTbR0wF8oFTyh4cxS4cxMCe+poINGr47ReIR6r1G4DMIzJEhKD/XRGLZtYzw6RlsqMhoW4LI3AOCg3QmQLkVZPOERz1aPUOhy7A/L17n3LuDopzcjEKMrcYc2y7zPJ6KN259AfaGMTHzIT/Q3ewg26DRgVlz0OV64FlklFYmShnQpQ7wUSlBiMV2LOalvnQQJ89dpTpVYpAKUWe0uE+3MAszzFU/SPsJJHTDPBbNCLntA/QRHKz1ettHVgYYuQQdV5QqtfhMyZDT7LVwpOd+FWK3zxWmqbGKStDi9yC1H9AwFZsWNRkMa6ATJ0sKNJjyie8iiGf5wu4zOppA4WVQrliEK93DhQD+9uUsFQx+oHBUunQyGPlCkVImItmZnAnXPiF/I55vM5F04yL7YOKjNNdmzOM+QoPTqGE0yvrEbF0tf1mdgKmige5Mtw02GV7NTpVDRexN0quF7dV0uVYGpJD9jfvsc6M5fpxl0qlDMSqzTN4Ll16aC9bx2l4rcRNfyowzoKnfbgu60U4Ghh3OzglaRN8QzUHP0Ys/NEnTQdlRYZ4c1ihN0qpCUK7QSyQkN9rgLNDLq9mO1zpmDXpnPCYPUmm+F10+5ib5bgaksd512aotNTA2GPlTVx4UHjK4AVU3W6Ds1CZKSUX4VvZ5zE1DVrJKhrPuQCms0nSQqlPjxDNR8Czcf1XB0Ih6459//wuer6gGPIBGVwM4E6vliNXhp0c3ZdXU4whrXm6z59M3k5iKW9SeeWBbdZOAm611jN6VZmaDpG8qyqx4cED0+giHjpK5i0LvMyU6HN1GrG3+vzmCpqc5d/WyBiVTRvkfxAEdGs2tBTQedc7d7d8nNFipm8dKIYjSc6slAJ+i0k0P7aU4tMalcdwWjYPHniMox4o83gO4hTaiLkgthB3Jy7uKJkjDD3UVjpckOz6jB0QXXz5EFv7bIyiOiSf5FJ6YGuOxV0Oq3gLaBC7+Ceh24iqXUdXcy8TJjD502HLWObjdrtCnvPrQID0bNgd6Knb/gEr2BjkScnndc7xwmLHT7og4yEe2K3Q/UgyH8zAeji5VrQ9NsuBUTSuE7SXrGvQtdUAqTzmyEpQttHI8WrZ1O31BEx93kqgflo6aW15GPKvkbBEP4GMBU4p2hcIJZvJ65ktkbnLVvQUdSPkFdHSRu9nO3e6dpsN2KsFRlqb0mymoCXPaQn91OTAQd4bgtCMTTk0nT39vJ4yML6sDEil/SbouSC7MyuJNVRm5OXZHlbbMTEJlzT+Qm+rGOktzsL1dW6BmQqpc46ecEyMElejiGAg1ndR9O5RTNkzr8olnmoIPGJBEgN9HSHdTWOhvZgyHVADf5mrxzE7DOCt47PBg1P0peRN/lRjlL8Yj23e4H6nITfVHgGnRQlWrwrdH1xUqzo5KDNdb+hjesyY0kaw3eKi5P+pwEuVPE8xE4t2AJ2hksX5yJU45VDK6yq3zTnZZr8gnqk5EO7xwm6jgp/BZNRjIuFhuRkpvou/OtWHK4spa3FSc8MhMQwc1KWfONahYzVW+u2VOr/kzmQMgIy16sMy38HGZ8tpM8GIqJinvTuZjch9a3zGd47hO3l6CDduGyrzDQ963uzcjR3IkuItqU3Q/UhQJ0GiZgjVKBloxmf0O1v0EHVUlBrz6aviGN6ugpXI95Z8hHqCy6LvSi+w4u0RvMt7Z++choduvoCVLQ8lElYxWNAOF8t6yAQkazpcNpGzDaqaH9TYhKolZdf095sif1LzWZNMp0q2pehvtmDkTQqaKGVhS8ymi2KjDPL/MOgE41mSwKyWj23YKlYemRPvF6//kmnYViI7GeEbY5naTQ7DFcrLODQUSL2GKgnhw6rTnxuu0aHGH9eLJuUpwNzXts+rjJ5RizatanM2zBZQ8DPWO1lygzl8worua4VFBi1Yaw9jk9edQzVnF+NZxZSO077EgO9Nb+1zrLTbRQQ6OX+n/tFPpgOkPnGQpMxCfACWhnsODAmaq3nWVy3nNq2mcKOwqDla9qs4v2+JoUdFCNMt39fl6GW4MdZfrlZmoUVLMxtk9yDpJ3r9Fgz5zrMONH9wr/8J0gw573bDv7/pj3GBFtxxYD9Vm/DLroxKDNHFc+qUN1Mi7+0Q9/JIf3t/V6D1CUFa3FJg5q9hiungw+Lk5Xc37lZh8jy4/tOxppOZDSJ812URmk18PQYE9Wv4l3yNMTsIXCibZqkXrbxETRjPOenkw6a/nNyedn78sA9vOaFK5gY6JyXcMdjrTWe0p5OhpERBO+74/31sgaq9DH7voOMLZUjIH0nzq2Rms76NoB2HYTaMP4ns+vjOds/W12x/o819yRNVanrp/JP7XoxXSyLz3n6PxqbocAABCXSURBVEWek9xgbKkY6+548fvJkvehkaUWPwcJc74XKzsuEa0KgLHk+/74zp07m+8h0M6SJAnh5+NQhZOtRL87orurWl5tt/A9n18Zz1kZ20xEdKgkScKtbTeCaPdENZ/bbgYREREdtJKu+kJEREREtN8YqBMRERER7SAG6kREREREO4iBOhERERHRDroFhLNKieL4mTg8fM/nV8ZzVsY2ExEdqlsAuFwXJXAJt8PD93x+ZTxnZWwzEdGhkiSJpS9ERERERLuIgToRERER0Q5ioE5EREREtIP2I1D3DEjVDoL0/wcdVCUD3i61iYiICgk6VVQ7y15FA3SqEgwPC1yXY9suej9Z8j60+DnwYGzluES0StsP1D0DkiTN+Kti9dcLD8bM4+Zc5IIOqkWfm9wQneqM4zLALwXPkHgjoz20TIBXcNvc6/4ix44F1Atsl9WWmfvLex0zr+PZ96BZ15WgU03eHztG8fOXe+7Xca8lomVsP1DXbIzH45w/F7pgM8+IXVxqDjAwocxzgYUGe4HjRgeHpPRQH8We7wK1OW4wuptz7H4TcsH9HArPkCDNfxemFZp850RvQ9CpJt6fvE5M+r2cBB25b2/UMY7vMxmsiAMc0XPiAVTiOlIwSNp7wRA+fAwXSuJewIGDi1lf1fh139UB1cLo+hpoQ1uk3QuR0exHbdDdqfbYsxqS9zpmXsfF9yA388YTa3Wzn7xPndiz71uiNo8sqNDhXh+/jyZvPkQ7ZfuB+oI0e5xzoS9wgV2Cd+FAtbrJC5pmw9UdtA/9Jr9Ldq38aNfaswBV1+G31/AaVDV3v965iYHogUlwFQUdMJXpgD/+HFEAlXjcRUW0jwMSXPYwwAC9yznf5aCDas2BrutwasWTFsHQBwZXGM3d0jzxbLUCU/jh2RcVHE0+0MEQvnoMZavtIaJVKm2gvrxZpS81ONtuIl3T7DHG6+x9UTHHZ2hVTDRW3SGt1FFHD8LYMOig7VuwZqUK5SZaOuAvlAqe0HBmqXBmpoT3VNBBo1fHaDxCvdcoXAbhGdL1KKNt2xiPjtGWioyCBbjsDQBMkhzJUhRl4Qg7nq0ewVILbOIPy9eJ9i7g6Kc3IxCjK3GHNsu8zyeijdufQH2hjEx8yE/0Jx6C1U51DMzUTcwzUHNU1E84brgOWaUVidKGdElDvCRKUGoxXZM5qXOdBAvz1mum611vsop57Skb7cwCzPMVT9I+wkkdMM+n9xpc9oD6CY5Werxso6sDDV2CDqrKFVr9JmTIaPZbuFJyvgOxWueL01TZhNxEfzzG+PQitxzRMxSYFTcaDWmgE0SlKNE1eFQowl6R6B6yaIY/3C6jsykkThbV5sgQeRcO9NObu1Qw9IHKUeHSyWDoA0VKlYhoa3YmUPeM+IV8vslM3oWD7IuNg1rhuvWCNBvjUR09JV4nD7is79uogamgge5N1gw3mV7NTpVERdn4oFOF0qvflEm5FZhK8rPmt8+B7vz1mkFnst2k1tRBLfrQZbWnlOQmupa/8jIvudmC7rRTgaGHc7OCVpE3wjNQc/Riz80SdNB2VFhnJX5/FhB0qpCUK7QSyQkN9rgLNDLq9mO1zpkf58znhEFqzbcwsrUwsHcrMJXlrtNObbGJqcHQh6r6uPCA0RWgqskafacmQVIyyq+i13NuAqqaVTKUdR9SYY2mk0T9op9338LNRzUcnYgH7vn3v/D5qnrAI0hEJbAzgXq+WA1eWnRzdl0djrDG9SZrPn0zubmIZf1lTiybZIwWnAA1fUNZdtWDA6S7sRuajJO6ikHvMmf4OryZWt1YjbJ2BktNdfLqZwt1uOSmndhOO9XLOZxegNxsoZIeVVqahlM9GegEnXZyaD/NqSUmleuu4HsYf45oNCP+eAPoHlKHO8qKhx3eybmLJ0rCDHcXjZUmOzyjBkd3k/MFNBvjkQW/tsjKI8lM/HzX5QCXvQpa/RbQNnDhV1CvA1exlLruTiZeZuyh04aj1tHtZo025d2HFuHBqDnQW7HzF1yiN9CRiNPzjuudw4SFbl/UQSaiXbH7gXowhJ/5YHSxcm1omg23YkIpfCdJz7h3oQtKYZKZjQJLK85clit9QxEdd5OrHpSXepycMiUfVfI3CIbwMYAZHwmJJprF65ormb3C2RJlNfOMYZeOBtutCEtVltproqwmwGUP+dntxETQEY7bgkA8PZk0HbFMHh9ZUAcmVvySdluU8Z6VwZ2sMnJz6oosb5udgMiccyI30Y91lORmv1h2OYtnQKpe4qSfEyAHl+jhGAo0nNV9OJVTNE/q8ItmmYMOGpMEgNxEKzaSth4ejHAIN/GavHMTsM4K3js8GDU/SlpE3+VGuSe6E+2r3Q/U5Sb6osA16KAq1eBbo+uLlWaPYPm1Na6sMZ21GVkqVGvE5RVLQzwvYalgAMAkcFGuWsnViPaZdgbLF2filGMVg6vsKt90J+uafIL6ZITDO4eJOopP+5DR7FpQnYvFRqTkJvrufCuWHK6s5W3FCY/MBMTU71GsdrnMqXpzzZ66Pk/mQMgIy16sMy38HGZ8tpM8GIqJinvTuZjch9a3zGd47hMdj6CDduGyrzDQ9+Mrl82d6CKiTdn9QF0oQKdhAtYoFWDJaPaTtcpE1+QjVBZdH3oW7wIOdLh2amLXXpPR7NbRE6Sg5aNKRtlPgHC+W1ZAIaPZ0uG0DRjt1ND+JkSlUFxmdZOyJ/UvNZk0ynSral6G+2YORNCpooZWFLzKaLYqMM8v8w6ATjWZLArJaPbdgqVh6RG+oiOzydcQdhaKjcR6RtjmdHJCs8dwsc4OBhEtYouBenLotObE67ZrcIT148m6SXEWNO+x6eMml2PMqllfRYZtW8c9cInVG8Ia6PTkUc9YwXlWjqHGOwFBBw3R0nIrXy96y+QmWqih0Uv9v3YKfTCdofMMBSbiE+AEtDNYcOBM1dvOEnbgB3k17TOFHYXByle12UV7fE0KOqhGme5+Py/DrcGOMv1ys58sx9FsjO2TnIPk3Ws02DPnOsz40b3CI7OCDHves+3s+2PeY0S0HVsM1Gf9MuiiE4N4XIpE2dFabAKhZkerscSCj4vTFZxnuYmuhZvsWAPopktfBO3ZB5rtojJId0o02OOoFC3eIYdbIAAJJwarReptExNFFfTqo+na5/Rk0lnLbk7epz16j8T285oUrmBjonJdwx2OtNZ7Snk6GkREkVvbbgBREXKzj3Hs35o9ng4YNBvjqSHoMZpTTxtjbAuPgmZ/LHpAKN0GudnHOHWwIu0pC+E5Dx8JM3pT/1/s9abf28n/9WccX3S+hfvOeY5mj6eOXfb3qXwc1KTsideqVXA3URZ9oLsYj9Of1Og9jWria7pb7iVSiehgSL7vj+/cubPtdtAOkSQJ43HxgHV/hZOuRCGE7q5qmbXdwPd8fmU8Z2VsMxHRoZIkiRl1omxZmWIiIiKi9Svpqi9ERERERPuNgToRERER0Q5ioE5EREREtIMYqBMRERER7aBbQDirlCiOn4nDw/d8fmU8Z2VsMxHRoboFgMt1UQKXcDs8fM/nV8ZzVsY2ExEdKkmSWPpCRERERLSLGKgTEREREe0gBupERERERDuIgfqiPANStYNg2+0gIiIior2044G6B0OSIOX9ZQbLATrVxbYNOlVUO0H6P1GVDHgLvYZFtiMiIiKiQ7bjgboGezzGOOvP1XO2ldHs52w7sqCuvL2izkENDhzUpjoKDN6pXDwj/Owagg9u0KlCij3gGdJ0Zze+n9hzg041c7+xJ6EqJfc52S7+lz6m6DnxDvrkNeXtg4iIaFt2PFBfxoyMumJisPJjzugcJP5saCs/PtF6qboOv72Gki9Vzd2vd57xfdXdROcbpjId8MefMx5j3G9CznzcRUW0DyIioi3Y40AdAFRYo5xgOX3DjhmYiiCwj2XGa07ukYWZPGbrqOyOz9CqmGis+nNcqaOOHi7FtWho+xasvAE0AJCbaOmAP1ymbRrOLBXOBSN1IiLavj0P1Acwlbw69Sqy4g3VGglKZXS4M8tuwky+0qtjNNU5GKHeUzgJtYBER6faQZCYvBueY8ObjJrcvI9THaREanSyneBY1/8ZPqfaCabbUKDdk5KPWdvmt3O3aWcWYJ6vuHTrCCd1wDyf3mtw2QPqJzha6fGyja5WP9ZGRES0iD0O1IuUofTRzEqpL2yEq4EOV5itl9Hsu9AHVxit+rB7JOhUoZiVm05RF2gIRjD89jnQvXkfp7Ybj2D5tYWC4IGpoIHu9WfFrZhQCgbryW1HsJDMQK+ynVshN9G1fLRXnFWXmy3oTjvVefZwblbQKvJF9QzUHL3Yc7MEHbQdFdYZC9OIiGj7yh+oV45SAXGBlWIKTOwUl74UoeBYdVATBnUBOtUaHPUYyqKvd+95ODcBaxSr4Zeb6FqCqb/1s1hHS7AdZDS7FtSp4K8A3UU/FvBptgt9kFGakbutjJO6ikHvMvo8rLidWyI3W6iYjRW3V8OpPkDvMt6pacPRT7Pnczi1m+9ozYHuCuZ+xJ8jGr2IP94AumvpwBMREc2v/IH6lKyVYlzo8dKVnImdcrO/xATQMJM/qvegTHUIFPTqo9za+IMXDOGjgqPUCZKPKlNPrcSflLEd5BPU1QGu5hzCUI/TXSkFxwX3k9420fYVt3N7NNhuRViqstReE2U1AS57yM9uJyaCjnDcFgTi6cmktiZ+fGRBHZhY8UsiIiJaWKkD9WDo5z2KTjW7Bh1BB9U11orfBPvJDkKfqbqSGoGlyynaGSxfPAqgHKsY5PQ6pjtCEfkEddXBhQfAO4eJOk4Kf2UmIxMXi9XPy030XR1OjUunEhHRbih1oA7k3PCnaLDnWhJRPPGQNsFHeuEO7yJ/lR3IR6gItkNwid5ARfxjkl4VpNDkwWAIHzpOly1dnqOdu09Gs1tHT5CClo8qgD8Uln8N/dRoSHqfLR1O24DRdqC3Njz6pJ3BUp2V198TEREtYkcD9WJ15oo5iNWSi7JgOau+LLuOumanSliy2pz1g0f80SMhuYmWPoDZiI12eAZmrIaJcFk9wFTi5zRAp2FioLeimuOoXjy+YknGvgeJtbQn+8mplS6sSDtLRG6ihRoavdT/a6fQByaUVE/XMxSYsJA7V1M7gwUHzmDejtEq3qewozBY+ao2RERE89vRQH3GL5IWrh/PWUd95b9Muqo2k2aHK6Vc1/hfnM74FdqQ3OxjZPmxTlE0JyBWkyw3+3D1WMfp4hQjwURV1XLDeudoP2bFna5tXlCRdpaJZruoDNLdXg32ZDWbWOe0BrfAHI2wQ6VaZ7O/H4mJohnnMT2ZNGdZ1rDpYVa9xuE0IiLaMsn3/fGdO3e23Y41CNCpKjDz0uaqhVFm0FBgewC6O0ZJ46tMkiRhPB5vuxkJQacK5aq1gWA2fN979dFBzSfYxfd815XxnJWxzUREh0qSpF3NqK9CgXXUczN7RdZh378gfVeNrgZzzEdYp+yyLCZgiYiIaJVubbsBRGmeYQD2TVlQ0Kmi5uhwx7uQ4Q5LnOxtN4OIiIj23h5n1KmsNPsUF4lJwxW4rOcnIiKiA7PHNeq0KNaxHh6+5/Mr4zkrY5uJiA7VnteoExERERGVFwN1IiIiIqIddAsIU+tEcfxMHB6+5/Mr4zkrY5uJiA7V/wfzhoyRCzlB4gAAAABJRU5ErkJggg==" + "image-2.png": { + "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ - "![image.png](attachment:image.png)" + "![image-2.png](attachment:image-2.png)" ] }, { diff --git a/Documents/1127_table_definition/table_definition_v0.8.4.xlsx b/Documents/1127_table_definition/table_definition_v0.8.4.xlsx index 6c503e1a98831c6c960ce308b4f5edee05b9b0e0..0d2b5dae2064732d4e2c2299f5c44a4f3c49cc0e 100644 GIT binary patch delta 33300 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 <)9y4dK+< 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 delta 34242 zcmagFV|-;z(=R-+ZEMH2ZQB#unbPw$7- zt5>h;s`^(|S7ZHF*Btc6Ds&SL9Kxp~9coPIPoJt%N#XE;Mh*uu*nzC~qVV0{V!2+L z0sBlKW>2Vb%x32Wi9V&WuiR2(SGL%K;Sm`N?Gp6&6cM-vYfdHxbc)5_8{ha79!2jH z9r;x>Vsq=i$`)k%&*u4`Y}H=Mwg{!pAk^CGdswxWk7LsBa}*DEFar6av1KzD662t4 zti-!+VX6;-vVzw=EyB#}>vsAD@}JbSjQEcN_N(o2DgmR*I{Xwc7x4-i7O0v$I<*K? zeAOBfJ_XfX73=nib`-4WLf;T%_zCB;?k78DxXoWkMn|g`Dkc~|ko2~Pj%K1BRK`+?1?u*}&MqAf+oZZem zL|Y%)QWznq(x|$!I5VV{BkKw&(b3B5UiG!+feexA3ZS{CO?9uyw=(vmS6 zI7L1IDcXOl5q!J+mC*!k_C!Ei*Ozxc5gLY?`K7!5nDD~bAatNy@>X7%AY=eCP`r+9 ze{HaG8REEFtEG*7yyp2xyrx8dPK!}HISp^oVKnD z11k_z`-kS3s~UzkEF?zh)nvMsF{np9#OoPNA``D3UdMDPSG}+oCB9*1IT!JTSnEZS z=y&(o(p5X;<-8+q}&k$FQE>&TgR3DNqPr6w^LQ?Ss8I4hheKO0z9}eCFq;R0ufi7BwVANK`H4 zx4F-}pFT00Kzzdgl-WcHfs@*U0ta+($z{Wi>{Z0xZ*XZle77Sb z*$3!AaJu@fw|?}vE1_O4(IaK#yd2&3!(0BjV(t+u$qG{_{Wo5}>YUZqJFo79hepms zof95tu*ZbzKSmY`q^^) zTTUTT|B3K?_Gs9o3e%IX4Hqe@;2jKJ=G{A`fZ+G1X_bn^)bm?QgRz7z^@oNImaw*O z?Z<>(pK6(evLmPU8BxS`0np_JvupZX{I4^wR6^tVciOe1ztU0bKJNglw5WB&wew(B zunU(qX0&rc^Y7S^f(TQ$0hrex=%n%1cbpO^HhU@os2L+$7VkKKKTRH)acyHmzu>fO zW_*!T4c=V;?2Q~!B^iZy;$?}EbT@eIky6+Om9MyEZm=HTge~OOM>NB2izqQS^Xm(n zR564^LE4`pUI?<&dmsZp!jujMQIsYt3Bo8z|4caB)cqup+HJhx{KjW0-dtNZ-m@&b z4bAJ^5ix^uu!DjJbV@?o*sE$8l=IpdK-CryjQ4-7iXakjcgBBoR{xH6FSzAzdVhwO zq3kV>KmPvcNLIiSJiBhTwK>ZCa@1GeQu=h#EfV0VQdP9}dcXs0ay6}E*@gLrQR0Vf zpQk6e$N8LRD=7}~bg^9YQR!=*@Y+8T!-Fk*FcQOyZ7huSWebb{^Y35&$8bhcbH%@d zS?pJ6RZl4gU?XO+Wx`Qnzpd>`7_c@5tx16&O25Xy6aCYRCxw;=!z^sTq8>9G1rf~= z8eF%j$DGauPGb>?uNB$GC6GI+T}(R}JB2ohf8pW*mwRFVw5f^Z;^l$wKBib$Jaj@$ zF$hH1B5OlnE`{{*xvG?Cj^<$5a6Ig0Vf(iK)^%sYQ34+Q%>F}v_HVC$N&{1@E|(k8 zPoF-0eEeI~1+KdRsboQyjbp!{0OoruG~>w75Rki()arm6n#DBb*+CBz2fJ^*y{O@` zk+1wSQ(6>-LjnS%(ZBh=cFJ16{~i6=8~A$n-YyD!{c{3*y8{M2t+JX#ngl%^e7rp* zi3UA$JZ&EBPND%nG~c_PZys(Z(Rx2t$$;;7qIf^w4}PiwcQeV}z1iL`AA8?6KemCd z2ahfv==;M-rL4X0e_y}mjejjFJa^?18e1>a{y-x{nR zx#{t^s4P{+peT?eGQ#WNeF2B^7@8;jyA=(0s{5lG*`+;szD#3+smXQ{L)q)9kKt4B z*;uz?W1+xgY6?aPQUqU(vbd9xK;J99WS^_9v1Bk|-3fd)1_$k7NHPqCqJ&Pk5aw-} z9Nz4>*bzj)p92%p-cdI&K9(R!)0|J)R1>?*2fJJdTeZ_|wNGnvX9hPz z-t!nkcKl5GF_e?qg3ta;qYj{Cpq<3U6kkVYXg2#77S^qM1S2-hg(Byhyks~D+;AoY zeT>^Gx$Mw_Q0sU_&OC2vKsWrOUg9GQ#bUV6^?p|>-|n{ITmvZH8^M>{QhW@Qj6;zW zi+>F}{WSHRSJ?M|X^lg@utxp8<9D<{H!Kur;Y{%Qn9Y=jKy{3R?IMCg-^XvX*QAp- zJJgmr=^T;meHL7Lgxs^R1&f(kSoEAmpPe#4gt8{2c z89bYe8+J)FWM+H=j#l$icFB=Nb$=1hHl~xeju$=jj+~-1a`ByID)bgm-*U$c&?>{z zlffvF-BjctGA|MbJT-ryu1J!um6L4PIHJ^wmMOsirgSgeY3t4*a{S;Dft z{Jnbrd_ zFNRJB9?M&LF}Ea9CyNIwuCQX=o3Uyp^*MN(U{q{PaZHt^Sl+#!Ufb zQzfYB-F2e-94L{)P|d!CLEukbJ`9md zy=ZMNEU<*b=XP0hom8^|&e!rI&jw`XXf6%ZW>+i)hdURbVpdKL^{sP#admW4~!@H(8Y&5F`^wcgDF$?0RL z(^6j0N8k9@F&ri%)8C|NznkHIdqG{_&Q|~-sHuqU!R~XpRZeuZ5@lfA-v-j8ljd5T z){HTI6s2TKI3tEn&r$C0V&l8IBG%EjO}XJHzXD~OqJ`)yeG#=l7^D;q((%8e?^MP@ z>S)lUaxBr-pA%7d9XqV5nj?*U%+Rj|!+A;U$F2tK?S+O+ZIxSUCMtAvV)gZ@$Ho!; zyo!efQKwudgC(0MM71r;AqHghsa4|YFvlklQ`%PMCJ_0rC+Lre#}q6htSK2obsRg) zR)87B6NG;H5fGEtpmZ4~)+wt93X7Icxs2A-X-wPuJbgH7(|M7mhG6rQ75_DqmNd9l z7xou%;MYNk(Msm#K1ith#|i0G5OKKN=&k01C@tTRwO8h9DdMYxG6}h=el7K_IgYJ; zX0MGLY9F|b&Y!@s~i9->IeZ>f+14AWVdpb*zVjjpREaf!{EMx}sj#^g7hr-b{D zg8%BrZ@TsP%9>c7g`Z;D$f>RIWv^R0;Lo4~=TFaT=AWrw4Y`FVk*P45{57e$ zWsD$E!PmqtWGPFwC7gz9Z`6potN%!pR)#tw`7ca0wqKa)Y`;qKGJxppK?Ty()DsRkpodf332pr0diAE;~BlAs>wp={TPw+(I?Cvt6-m zi@P=Bi)a3f0N}T2Qg{B?K{0lWk<%q#&IVn)a6*pHrc=>33;2^{spB*3BA+5>d^QIb z=1Co-NtJqB)AfjST3C`Z@)(goopHa?WhyHiaJph8Ho)Igu~ec{roW_MzjIAD9-RXo z2S6;X7fkCpr!~K|@mAiRl9B7u5tGpCUN5`9hanpR`fRNw530>j7j~H_?%Pnxj~PP* z<%hwGTtIP7>uH?koMXr7UDz-Q`{Qt6T>o;gR8B=e0wKTh&(NxZw51X|g|({e^>Vd4 zUh(pq>R6{GzqPT84I-1}G{1sGLLh?X@G46Jp0Yb^OfgQI372wYXSbKCIm+8zQ@2&J zjNj|#%p&x37Ps!0y?`9q_5hE6v9e;U&vR zKIu#RjGuXsfPya}uPPRo#mZ-j+B3_OBSinMh@4LHLmVd1BpBI@sLlf^g5A6aWt*)4 zFy&$gD&@cSgFWZjMK(*>Xyfgvp_g71Ke!>?*X4FtxEP(Mm~O4uC&Zt zNq6Ya?HBT5{)1 zG!qUVZhz0g!6B*2DN$E}0x$BwI4ac{7~5&)PTA=fW`%MV7*$H4r)8kQflYX%w7m

ocL@Ib>%2YeCZhg~@Tv^&mpj0WX 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