diff --git a/.gitignore b/.gitignore index 44ce6dd9c..1499b991c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ Data/tables/move/* Intermediates/histid/* -Intermediates/movement/* \ No newline at end of file +Intermediates/movement/* +Analysis/0215_augmentation/* \ No newline at end of file diff --git a/Analysis/0221_three_points/flow_3points.csv b/Analysis/0221_three_points/flow_3points.csv new file mode 100644 index 000000000..eb26fe748 --- /dev/null +++ b/Analysis/0221_three_points/flow_3points.csv @@ -0,0 +1,61 @@ +inter_no,phase_no,ring_type,flow_lat_1,flow_lon_1,flow_lat_2,flow_lon_2,flow_lat_3,flow_lon_3 +175,1,A,37.36825,127.11491,37.36857,127.1149,37.36869,127.11491 +175,1,B,37.3689,127.11467,37.36857,127.11465,37.36845,127.11466 +175,2,A,37.36889,127.11491,37.36857,127.1149,37.36856,127.11505 +175,2,B,37.36824,127.11466,37.36857,127.11465,37.36857,127.11451 +175,3,A,37.36867,127.11519,37.36867,127.11478,37.36867,127.11463 +175,3,B,37.36847,127.11518,37.36847,127.11478,37.36835,127.11478 +175,4,A,37.36866,127.11437,37.36867,127.11478,37.36878,127.11478 +175,4,B,37.36847,127.11437,37.36847,127.11478,37.36847,127.11493 +176,1,A,37.36691,127.11493,37.36724,127.11493,37.36735,127.11493 +176,1,B,37.36756,127.11467,37.36723,127.11468,37.36712,127.11468 +176,2,A,37.36691,127.11493,37.36724,127.11493,37.36735,127.11493 +176,2,B,37.36691,127.11468,37.36724,127.11468,37.36724,127.11453 +176,3,A,37.36734,127.1144,37.36734,127.11481,37.36745,127.1148 +177,1,A,37.36587,127.11492,37.36619,127.11492,37.36631,127.11492 +177,1,B,37.36652,127.11468,37.36619,127.11467,37.36608,127.11468 +177,2,A,37.36652,127.11492,37.36619,127.11492,37.36619,127.11507 +177,2,B,37.36587,127.11468,37.36619,127.11467,37.36619,127.11453 +177,3,A,19.69448,117.9926,19.69448,117.9926,19.69448,117.9926 +177,4,A,37.36628,127.11439,37.36629,127.1148,37.36641,127.1148 +177,4,B,37.36609,127.1152,37.36609,127.1148,37.36598,127.1148 +178,1,A,37.36313,127.11493,37.36346,127.11493,37.36358,127.11493 +178,1,B,37.36378,127.11468,37.36346,127.11468,37.36334,127.11468 +178,2,A,37.36378,127.11493,37.36346,127.11493,37.36346,127.11507 +178,2,B,37.36313,127.11468,37.36346,127.11468,37.36346,127.11453 +178,3,A,37.36356,127.1144,37.36356,127.1148,37.36367,127.1148 +178,3,B,37.36336,127.11439,37.36336,127.1148,37.36336,127.11495 +178,4,A,37.36356,127.11521,37.36356,127.1148,37.36356,127.11465 +178,4,B,37.36336,127.11521,37.36336,127.1148,37.36324,127.1148 +201,1,A,37.36822,127.10996,37.36854,127.10996,37.36866,127.10996 +201,1,B,37.36822,127.10971,37.36854,127.10971,37.36854,127.10957 +201,2,A,37.36864,127.10943,37.36864,127.10984,37.36876,127.10984 +201,2,B,37.36844,127.10943,37.36844,127.10984,37.36844,127.10999 +201,3,A,37.36864,127.11025,37.36864,127.10984,37.36864,127.10969 +201,3,B,37.36844,127.10943,37.36844,127.10984,37.36844,127.10999 +201,4,A,37.36864,127.11025,37.36864,127.10984,37.36864,127.10969 +201,4,B,37.36844,127.11025,37.36844,127.10984,37.36832,127.10984 +201,5,A,37.36887,127.10996,37.36854,127.10996,37.36854,127.11011 +201,5,B,37.36886,127.10971,37.36854,127.10971,37.36842,127.10971 +202,1,A,37.36865,127.11282,37.36865,127.11241,37.36865,127.11227 +202,1,B,37.36845,127.11201,37.36845,127.11241,37.36845,127.11256 +202,2,A,19.69448,117.9926,19.69448,117.9926,19.69448,117.9926 +206,1,A,37.36451,127.10994,37.36483,127.10994,37.36495,127.10994 +206,1,B,37.36516,127.10969,37.36484,127.10969,37.36472,127.10969 +206,2,A,19.69448,117.9926,19.69448,117.9926,19.69448,117.9926 +206,3,A,37.36451,127.10994,37.36483,127.10994,37.36495,127.10994 +206,3,B,37.36516,127.10969,37.36484,127.10969,37.36472,127.10969 +206,4,A,19.69448,117.9926,19.69448,117.9926,19.69448,117.9926 +210,1,A,37.36357,127.11023,37.36357,127.10982,37.36357,127.10968 +210,2,A,37.36356,127.10941,37.36357,127.10982,37.36369,127.10982 +210,2,B,37.36337,127.10942,37.36337,127.10982,37.36337,127.10997 +210,3,A,37.3638,127.10994,37.36347,127.10995,37.36347,127.11009 +210,3,B,37.3638,127.1097,37.36347,127.1097,37.36336,127.1097 +210,4,A,37.36315,127.10995,37.36347,127.10995,37.36359,127.10995 +210,4,B,37.36315,127.1097,37.36347,127.1097,37.36347,127.10955 +211,1,A,37.36356,127.11277,37.36356,127.11237,37.36356,127.11222 +211,1,B,37.36336,127.11196,37.36336,127.11237,37.36336,127.11252 +211,2,A,19.69448,117.9926,19.69448,117.9926,19.69448,117.9926 +212,1,A,37.36357,127.11347,37.36357,127.11306,37.36357,127.11291 +212,1,B,37.36336,127.11266,37.36337,127.11306,37.36337,127.11321 +212,2,A,19.69448,117.9926,19.69448,117.9926,19.69448,117.9926 diff --git a/Analysis/0221_three_points/three_points.ipynb b/Analysis/0221_three_points/three_points.ipynb new file mode 100644 index 000000000..9ae79a609 --- /dev/null +++ b/Analysis/0221_three_points/three_points.ipynb @@ -0,0 +1,1515 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_angle_code(lat1, lng1, lat2, lng2, lat3, lng3):\n", + " # 모든 좌표가 동일한 경우 NaN 반환\n", + " if ((lat1 == lat2) and (lng1 == lng2)) or ((lat2 == lat3) and (lng2 == lng3)):\n", + " return np.nan\n", + " # 위도와 경도를 라디안으로 변환\n", + " lat1, lng1, lat2, lng2, lat3, lng3 = map(np.radians, [lat1, lng1, lat2, lng2, lat3, lng3])\n", + " # 진입방위각 계산\n", + " dlng_entry = lng1 - lng2\n", + " x_entry = np.sin(dlng_entry) * np.cos(lat1)\n", + " y_entry = np.cos(lat2) * np.sin(lat1) - (np.sin(lat2) * np.cos(lat1) * np.cos(dlng_entry))\n", + " entry_bearing = np.arctan2(x_entry, y_entry)\n", + " entry_bearing = np.degrees(entry_bearing)\n", + " entry_bearing = round((entry_bearing + 360) % 360)\n", + " # 진출방위각 계산\n", + " dlng_exit = lng3 - lng2\n", + " x_exit = np.sin(dlng_exit) * np.cos(lat3)\n", + " y_exit = np.cos(lat2) * np.sin(lat3) - (np.sin(lat2) * np.cos(lat3) * np.cos(dlng_exit))\n", + " exit_bearing = np.arctan2(x_exit, y_exit)\n", + " exit_bearing = np.degrees(exit_bearing)\n", + " exit_bearing = round((exit_bearing + 360) % 360)\n", + " # angle_code 생성\n", + " angle_code = f\"{entry_bearing:03}{exit_bearing:03}\"\n", + " return angle_code\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'331047'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calculate_angle_code(37.5665, 126.9780, 37.5515, 126.9885, 37.5666, 127.0089)" + ] + }, + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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_typeflow_lat_1flow_lon_1flow_lat_2flow_lon_2flow_lat_3flow_lon_3
01751A37.36825127.1149137.36857127.1149037.36869127.11491
11751B37.36890127.1146737.36857127.1146537.36845127.11466
21752A37.36889127.1149137.36857127.1149037.36856127.11505
31752B37.36824127.1146637.36857127.1146537.36857127.11451
41753A37.36867127.1151937.36867127.1147837.36867127.11463
51753B37.36847127.1151837.36847127.1147837.36835127.11478
61754A37.36866127.1143737.36867127.1147837.36878127.11478
71754B37.36847127.1143737.36847127.1147837.36847127.11493
81761A37.36691127.1149337.36724127.1149337.36735127.11493
91761B37.36756127.1146737.36723127.1146837.36712127.11468
101762A37.36691127.1149337.36724127.1149337.36735127.11493
111762B37.36691127.1146837.36724127.1146837.36724127.11453
121763A37.36734127.1144037.36734127.1148137.36745127.11480
131771A37.36587127.1149237.36619127.1149237.36631127.11492
141771B37.36652127.1146837.36619127.1146737.36608127.11468
151772A37.36652127.1149237.36619127.1149237.36619127.11507
161772B37.36587127.1146837.36619127.1146737.36619127.11453
171773A19.69448117.9926019.69448117.9926019.69448117.99260
181774A37.36628127.1143937.36629127.1148037.36641127.11480
191774B37.36609127.1152037.36609127.1148037.36598127.11480
201781A37.36313127.1149337.36346127.1149337.36358127.11493
211781B37.36378127.1146837.36346127.1146837.36334127.11468
221782A37.36378127.1149337.36346127.1149337.36346127.11507
231782B37.36313127.1146837.36346127.1146837.36346127.11453
241783A37.36356127.1144037.36356127.1148037.36367127.11480
251783B37.36336127.1143937.36336127.1148037.36336127.11495
261784A37.36356127.1152137.36356127.1148037.36356127.11465
271784B37.36336127.1152137.36336127.1148037.36324127.11480
282011A37.36822127.1099637.36854127.1099637.36866127.10996
292011B37.36822127.1097137.36854127.1097137.36854127.10957
302012A37.36864127.1094337.36864127.1098437.36876127.10984
312012B37.36844127.1094337.36844127.1098437.36844127.10999
322013A37.36864127.1102537.36864127.1098437.36864127.10969
332013B37.36844127.1094337.36844127.1098437.36844127.10999
342014A37.36864127.1102537.36864127.1098437.36864127.10969
352014B37.36844127.1102537.36844127.1098437.36832127.10984
362015A37.36887127.1099637.36854127.1099637.36854127.11011
372015B37.36886127.1097137.36854127.1097137.36842127.10971
382021A37.36865127.1128237.36865127.1124137.36865127.11227
392021B37.36845127.1120137.36845127.1124137.36845127.11256
402022A19.69448117.9926019.69448117.9926019.69448117.99260
412061A37.36451127.1099437.36483127.1099437.36495127.10994
422061B37.36516127.1096937.36484127.1096937.36472127.10969
432062A19.69448117.9926019.69448117.9926019.69448117.99260
442063A37.36451127.1099437.36483127.1099437.36495127.10994
452063B37.36516127.1096937.36484127.1096937.36472127.10969
462064A19.69448117.9926019.69448117.9926019.69448117.99260
472101A37.36357127.1102337.36357127.1098237.36357127.10968
482102A37.36356127.1094137.36357127.1098237.36369127.10982
492102B37.36337127.1094237.36337127.1098237.36337127.10997
502103A37.36380127.1099437.36347127.1099537.36347127.11009
512103B37.36380127.1097037.36347127.1097037.36336127.10970
522104A37.36315127.1099537.36347127.1099537.36359127.10995
532104B37.36315127.1097037.36347127.1097037.36347127.10955
542111A37.36356127.1127737.36356127.1123737.36356127.11222
552111B37.36336127.1119637.36336127.1123737.36336127.11252
562112A19.69448117.9926019.69448117.9926019.69448117.99260
572121A37.36357127.1134737.36357127.1130637.36357127.11291
582121B37.36336127.1126637.36337127.1130637.36337127.11321
592122A19.69448117.9926019.69448117.9926019.69448117.99260
\n", + "
" + ], + "text/plain": [ + " inter_no phase_no ring_type flow_lat_1 flow_lon_1 flow_lat_2 \\\n", + "0 175 1 A 37.36825 127.11491 37.36857 \n", + "1 175 1 B 37.36890 127.11467 37.36857 \n", + "2 175 2 A 37.36889 127.11491 37.36857 \n", + "3 175 2 B 37.36824 127.11466 37.36857 \n", + "4 175 3 A 37.36867 127.11519 37.36867 \n", + "5 175 3 B 37.36847 127.11518 37.36847 \n", + "6 175 4 A 37.36866 127.11437 37.36867 \n", + "7 175 4 B 37.36847 127.11437 37.36847 \n", + "8 176 1 A 37.36691 127.11493 37.36724 \n", + "9 176 1 B 37.36756 127.11467 37.36723 \n", + "10 176 2 A 37.36691 127.11493 37.36724 \n", + "11 176 2 B 37.36691 127.11468 37.36724 \n", + "12 176 3 A 37.36734 127.11440 37.36734 \n", + "13 177 1 A 37.36587 127.11492 37.36619 \n", + "14 177 1 B 37.36652 127.11468 37.36619 \n", + "15 177 2 A 37.36652 127.11492 37.36619 \n", + "16 177 2 B 37.36587 127.11468 37.36619 \n", + "17 177 3 A 19.69448 117.99260 19.69448 \n", + "18 177 4 A 37.36628 127.11439 37.36629 \n", + "19 177 4 B 37.36609 127.11520 37.36609 \n", + "20 178 1 A 37.36313 127.11493 37.36346 \n", + "21 178 1 B 37.36378 127.11468 37.36346 \n", + "22 178 2 A 37.36378 127.11493 37.36346 \n", + "23 178 2 B 37.36313 127.11468 37.36346 \n", + "24 178 3 A 37.36356 127.11440 37.36356 \n", + "25 178 3 B 37.36336 127.11439 37.36336 \n", + "26 178 4 A 37.36356 127.11521 37.36356 \n", + "27 178 4 B 37.36336 127.11521 37.36336 \n", + "28 201 1 A 37.36822 127.10996 37.36854 \n", + "29 201 1 B 37.36822 127.10971 37.36854 \n", + "30 201 2 A 37.36864 127.10943 37.36864 \n", + "31 201 2 B 37.36844 127.10943 37.36844 \n", + "32 201 3 A 37.36864 127.11025 37.36864 \n", + "33 201 3 B 37.36844 127.10943 37.36844 \n", + "34 201 4 A 37.36864 127.11025 37.36864 \n", + "35 201 4 B 37.36844 127.11025 37.36844 \n", + "36 201 5 A 37.36887 127.10996 37.36854 \n", + "37 201 5 B 37.36886 127.10971 37.36854 \n", + "38 202 1 A 37.36865 127.11282 37.36865 \n", + "39 202 1 B 37.36845 127.11201 37.36845 \n", + "40 202 2 A 19.69448 117.99260 19.69448 \n", + "41 206 1 A 37.36451 127.10994 37.36483 \n", + "42 206 1 B 37.36516 127.10969 37.36484 \n", + "43 206 2 A 19.69448 117.99260 19.69448 \n", + "44 206 3 A 37.36451 127.10994 37.36483 \n", + "45 206 3 B 37.36516 127.10969 37.36484 \n", + "46 206 4 A 19.69448 117.99260 19.69448 \n", + "47 210 1 A 37.36357 127.11023 37.36357 \n", + "48 210 2 A 37.36356 127.10941 37.36357 \n", + "49 210 2 B 37.36337 127.10942 37.36337 \n", + "50 210 3 A 37.36380 127.10994 37.36347 \n", + "51 210 3 B 37.36380 127.10970 37.36347 \n", + "52 210 4 A 37.36315 127.10995 37.36347 \n", + "53 210 4 B 37.36315 127.10970 37.36347 \n", + "54 211 1 A 37.36356 127.11277 37.36356 \n", + "55 211 1 B 37.36336 127.11196 37.36336 \n", + "56 211 2 A 19.69448 117.99260 19.69448 \n", + "57 212 1 A 37.36357 127.11347 37.36357 \n", + "58 212 1 B 37.36336 127.11266 37.36337 \n", + "59 212 2 A 19.69448 117.99260 19.69448 \n", + "\n", + " flow_lon_2 flow_lat_3 flow_lon_3 \n", + "0 127.11490 37.36869 127.11491 \n", + "1 127.11465 37.36845 127.11466 \n", + "2 127.11490 37.36856 127.11505 \n", + "3 127.11465 37.36857 127.11451 \n", + "4 127.11478 37.36867 127.11463 \n", + "5 127.11478 37.36835 127.11478 \n", + "6 127.11478 37.36878 127.11478 \n", + "7 127.11478 37.36847 127.11493 \n", + "8 127.11493 37.36735 127.11493 \n", + "9 127.11468 37.36712 127.11468 \n", + "10 127.11493 37.36735 127.11493 \n", + "11 127.11468 37.36724 127.11453 \n", + "12 127.11481 37.36745 127.11480 \n", + "13 127.11492 37.36631 127.11492 \n", + "14 127.11467 37.36608 127.11468 \n", + "15 127.11492 37.36619 127.11507 \n", + "16 127.11467 37.36619 127.11453 \n", + "17 117.99260 19.69448 117.99260 \n", + "18 127.11480 37.36641 127.11480 \n", + "19 127.11480 37.36598 127.11480 \n", + "20 127.11493 37.36358 127.11493 \n", + "21 127.11468 37.36334 127.11468 \n", + "22 127.11493 37.36346 127.11507 \n", + "23 127.11468 37.36346 127.11453 \n", + "24 127.11480 37.36367 127.11480 \n", + "25 127.11480 37.36336 127.11495 \n", + "26 127.11480 37.36356 127.11465 \n", + "27 127.11480 37.36324 127.11480 \n", + "28 127.10996 37.36866 127.10996 \n", + "29 127.10971 37.36854 127.10957 \n", + "30 127.10984 37.36876 127.10984 \n", + "31 127.10984 37.36844 127.10999 \n", + "32 127.10984 37.36864 127.10969 \n", + "33 127.10984 37.36844 127.10999 \n", + "34 127.10984 37.36864 127.10969 \n", + "35 127.10984 37.36832 127.10984 \n", + "36 127.10996 37.36854 127.11011 \n", + "37 127.10971 37.36842 127.10971 \n", + "38 127.11241 37.36865 127.11227 \n", + "39 127.11241 37.36845 127.11256 \n", + "40 117.99260 19.69448 117.99260 \n", + "41 127.10994 37.36495 127.10994 \n", + "42 127.10969 37.36472 127.10969 \n", + "43 117.99260 19.69448 117.99260 \n", + "44 127.10994 37.36495 127.10994 \n", + "45 127.10969 37.36472 127.10969 \n", + "46 117.99260 19.69448 117.99260 \n", + "47 127.10982 37.36357 127.10968 \n", + "48 127.10982 37.36369 127.10982 \n", + "49 127.10982 37.36337 127.10997 \n", + "50 127.10995 37.36347 127.11009 \n", + "51 127.10970 37.36336 127.10970 \n", + "52 127.10995 37.36359 127.10995 \n", + "53 127.10970 37.36347 127.10955 \n", + "54 127.11237 37.36356 127.11222 \n", + "55 127.11237 37.36336 127.11252 \n", + "56 117.99260 19.69448 117.99260 \n", + "57 127.11306 37.36357 127.11291 \n", + "58 127.11306 37.36337 127.11321 \n", + "59 117.99260 19.69448 117.99260 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tp = pd.read_csv('flow_3points.csv') # three points\n", + "tp" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "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", + "
inter_nophase_noring_typeangle_code
01751A179004
11751B003176
21752A001095
31752B179270
41753A090270
51753B090180
61754A268000
71754B270090
81761A180000
91761B359180
101762A180000
111762B180270
121763A270356
131771A180000
141771B001176
151772A000090
161772B179270
171773ANaN
181774A268000
191774B090180
201781A180000
211781B000180
221782A000090
231782B180270
241783A270000
251783B270090
261784A090270
271784B090180
282011A180000
292011B180270
302012A270000
312012B270090
322013A090270
332013B270090
342014A090270
352014B090180
362015A000090
372015B000180
382021A090270
392021B270090
402022ANaN
412061A180000
422061B000180
432062ANaN
442063A180000
452063B000180
462064ANaN
472101A090270
482102A268000
492102B270090
502103A359090
512103B000180
522104A180000
532104B180270
542111A090270
552111B270090
562112ANaN
572121A090270
582121B268090
592122ANaN
\n", + "
" + ], + "text/plain": [ + " inter_no phase_no ring_type angle_code\n", + "0 175 1 A 179004\n", + "1 175 1 B 003176\n", + "2 175 2 A 001095\n", + "3 175 2 B 179270\n", + "4 175 3 A 090270\n", + "5 175 3 B 090180\n", + "6 175 4 A 268000\n", + "7 175 4 B 270090\n", + "8 176 1 A 180000\n", + "9 176 1 B 359180\n", + "10 176 2 A 180000\n", + "11 176 2 B 180270\n", + "12 176 3 A 270356\n", + "13 177 1 A 180000\n", + "14 177 1 B 001176\n", + "15 177 2 A 000090\n", + "16 177 2 B 179270\n", + "17 177 3 A NaN\n", + "18 177 4 A 268000\n", + "19 177 4 B 090180\n", + "20 178 1 A 180000\n", + "21 178 1 B 000180\n", + "22 178 2 A 000090\n", + "23 178 2 B 180270\n", + "24 178 3 A 270000\n", + "25 178 3 B 270090\n", + "26 178 4 A 090270\n", + "27 178 4 B 090180\n", + "28 201 1 A 180000\n", + "29 201 1 B 180270\n", + "30 201 2 A 270000\n", + "31 201 2 B 270090\n", + "32 201 3 A 090270\n", + "33 201 3 B 270090\n", + "34 201 4 A 090270\n", + "35 201 4 B 090180\n", + "36 201 5 A 000090\n", + "37 201 5 B 000180\n", + "38 202 1 A 090270\n", + "39 202 1 B 270090\n", + "40 202 2 A NaN\n", + "41 206 1 A 180000\n", + "42 206 1 B 000180\n", + "43 206 2 A NaN\n", + "44 206 3 A 180000\n", + "45 206 3 B 000180\n", + "46 206 4 A NaN\n", + "47 210 1 A 090270\n", + "48 210 2 A 268000\n", + "49 210 2 B 270090\n", + "50 210 3 A 359090\n", + "51 210 3 B 000180\n", + "52 210 4 A 180000\n", + "53 210 4 B 180270\n", + "54 211 1 A 090270\n", + "55 211 1 B 270090\n", + "56 211 2 A NaN\n", + "57 212 1 A 090270\n", + "58 212 1 B 268090\n", + "59 212 2 A NaN" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tp['angle_code'] = tp.apply(lambda row: calculate_angle_code(row['flow_lat_1'], row['flow_lon_1'], row['flow_lat_2'], row['flow_lon_2'], row['flow_lat_3'], row['flow_lon_3']), axis=1)\n", + "tp[['inter_no', 'phase_no', 'ring_type', 'angle_code']]\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "sts", + "language": "python", + "name": "sts" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Analysis/0307_red_yellow/0307_red_yellow.ipynb b/Analysis/0307_red_yellow/0307_red_yellow.ipynb new file mode 100644 index 000000000..4ae002d96 --- /dev/null +++ b/Analysis/0307_red_yellow/0307_red_yellow.ipynb @@ -0,0 +1,7186 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.listdir('../../scripts')\n", + "import sys\n", + "sys.path.append('../../Scripts')" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "from generate_signals import SignalGenerator" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [], + "source": [ + "from preprocess_daily import DailyPreprocessor" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. 데이터를 준비합니다.\n", + "1-1. 네트워크가 로드되었습니다.\n", + "1-2. 테이블들이 로드되었습니다.\n", + "2. 신호이력 테이블을 변환합니다.\n", + "3. 이동류정보 테이블을 변환합니다.\n", + "4. 통합 테이블을 생성합니다.\n" + ] + } + ], + "source": [ + "self = SignalGenerator()\n", + "self.prepare_data()\n", + "self.process_history()\n", + "self.process_movement()\n", + "self.make_histids()\n", + "self.set_timepoints()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "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", + "
Unnamed: 0inter_noend_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7...dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleoffset
77175170438056037395529000...37392559000016057
1515175170438072137395529000...37392559000016057
2424175170438088037395529000...37392559000016057
3333175170438104037395529000...37392559000016057
4141175170438119937395529000...37392559000016057
..................................................................
38863886175170446288046485541000...46483759000019018
38933893175170446307046485541000...46483759000019018
39003900175170446326146485541000...46483759000019018
39073907175170446345046485541000...46483759000019018
39143914175170446364046485541000...46483759000019018
\n", + "

478 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 inter_no end_unix dura_A1 dura_A2 dura_A3 dura_A4 \\\n", + "7 7 175 1704380560 37 39 55 29 \n", + "15 15 175 1704380721 37 39 55 29 \n", + "24 24 175 1704380880 37 39 55 29 \n", + "33 33 175 1704381040 37 39 55 29 \n", + "41 41 175 1704381199 37 39 55 29 \n", + "... ... ... ... ... ... ... ... \n", + "3886 3886 175 1704462880 46 48 55 41 \n", + "3893 3893 175 1704463070 46 48 55 41 \n", + "3900 3900 175 1704463261 46 48 55 41 \n", + "3907 3907 175 1704463450 46 48 55 41 \n", + "3914 3914 175 1704463640 46 48 55 41 \n", + "\n", + " dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n", + "7 0 0 0 ... 37 39 25 59 \n", + "15 0 0 0 ... 37 39 25 59 \n", + "24 0 0 0 ... 37 39 25 59 \n", + "33 0 0 0 ... 37 39 25 59 \n", + "41 0 0 0 ... 37 39 25 59 \n", + "... ... ... ... ... ... ... ... ... \n", + "3886 0 0 0 ... 46 48 37 59 \n", + "3893 0 0 0 ... 46 48 37 59 \n", + "3900 0 0 0 ... 46 48 37 59 \n", + "3907 0 0 0 ... 46 48 37 59 \n", + "3914 0 0 0 ... 46 48 37 59 \n", + "\n", + " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n", + "7 0 0 0 0 160 57 \n", + "15 0 0 0 0 160 57 \n", + "24 0 0 0 0 160 57 \n", + "33 0 0 0 0 160 57 \n", + "41 0 0 0 0 160 57 \n", + "... ... ... ... ... ... ... \n", + "3886 0 0 0 0 190 18 \n", + "3893 0 0 0 0 190 18 \n", + "3900 0 0 0 0 190 18 \n", + "3907 0 0 0 0 190 18 \n", + "3914 0 0 0 0 190 18 \n", + "\n", + "[478 rows x 21 columns]" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inter_no = 175\n", + "Node_id = 'i0'\n", + "self.history.query('inter_no==@inter_no') # 1-2 원본파일" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "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", + "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycle
18161751704414509434555370000434533590000180
18241751704414690434555370000434533590000180
18321751704414871434555370000434533590000180
18401751704415050434555370000434533590000180
18491751704415230434555370000434533590000180
18571751704415410434555370000434533590000180
18651751704415589434555370000434533590000180
18741751704415770434555370000434533590000180
18821751704415950434555370000434533590000180
18931751704416178434555370000434533590000180
01751704416820434555370000434533590000180
\n", + "
" + ], + "text/plain": [ + " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", + "1816 175 1704414509 43 45 55 37 0 \n", + "1824 175 1704414690 43 45 55 37 0 \n", + "1832 175 1704414871 43 45 55 37 0 \n", + "1840 175 1704415050 43 45 55 37 0 \n", + "1849 175 1704415230 43 45 55 37 0 \n", + "1857 175 1704415410 43 45 55 37 0 \n", + "1865 175 1704415589 43 45 55 37 0 \n", + "1874 175 1704415770 43 45 55 37 0 \n", + "1882 175 1704415950 43 45 55 37 0 \n", + "1893 175 1704416178 43 45 55 37 0 \n", + "0 175 1704416820 43 45 55 37 0 \n", + "\n", + " dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n", + "1816 0 0 0 43 45 33 59 0 \n", + "1824 0 0 0 43 45 33 59 0 \n", + "1832 0 0 0 43 45 33 59 0 \n", + "1840 0 0 0 43 45 33 59 0 \n", + "1849 0 0 0 43 45 33 59 0 \n", + "1857 0 0 0 43 45 33 59 0 \n", + "1865 0 0 0 43 45 33 59 0 \n", + "1874 0 0 0 43 45 33 59 0 \n", + "1882 0 0 0 43 45 33 59 0 \n", + "1893 0 0 0 43 45 33 59 0 \n", + "0 0 0 0 43 45 33 59 0 \n", + "\n", + " dura_B6 dura_B7 dura_B8 cycle \n", + "1816 0 0 0 180 \n", + "1824 0 0 0 180 \n", + "1832 0 0 0 180 \n", + "1840 0 0 0 180 \n", + "1849 0 0 0 180 \n", + "1857 0 0 0 180 \n", + "1865 0 0 0 180 \n", + "1874 0 0 0 180 \n", + "1882 0 0 0 180 \n", + "1893 0 0 0 180 \n", + "0 0 0 0 180 " + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.rhistory.query('inter_no==@inter_no') # 2-1 현재시점 기준 30분 전부터의 이력" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "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", + "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_B1dura_B2dura_B3dura_B4...red_A4red_B4red_A5red_B5red_A6red_B6red_A7red_B7red_A8red_B8
617517044155894345553743453359...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
717517044157704345553743453359...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
817517044159504345553743453359...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
917517044161785457704754574275...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1017517044163584345553743453359...1.01.01.01.01.01.01.01.01.01.0
1117517044165384345553743453359...1.01.01.01.01.01.01.01.01.01.0
1217517044167184345553743453359...1.01.01.01.01.01.01.01.01.01.0
1317517044168202426312124261933...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "

8 rows × 43 columns

\n", + "
" + ], + "text/plain": [ + " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_B1 \\\n", + "6 175 1704415589 43 45 55 37 43 \n", + "7 175 1704415770 43 45 55 37 43 \n", + "8 175 1704415950 43 45 55 37 43 \n", + "9 175 1704416178 54 57 70 47 54 \n", + "10 175 1704416358 43 45 55 37 43 \n", + "11 175 1704416538 43 45 55 37 43 \n", + "12 175 1704416718 43 45 55 37 43 \n", + "13 175 1704416820 24 26 31 21 24 \n", + "\n", + " dura_B2 dura_B3 dura_B4 ... red_A4 red_B4 red_A5 red_B5 red_A6 \\\n", + "6 45 33 59 ... NaN NaN NaN NaN NaN \n", + "7 45 33 59 ... NaN NaN NaN NaN NaN \n", + "8 45 33 59 ... NaN NaN NaN NaN NaN \n", + "9 57 42 75 ... NaN NaN NaN NaN NaN \n", + "10 45 33 59 ... 1.0 1.0 1.0 1.0 1.0 \n", + "11 45 33 59 ... 1.0 1.0 1.0 1.0 1.0 \n", + "12 45 33 59 ... 1.0 1.0 1.0 1.0 1.0 \n", + "13 26 19 33 ... NaN NaN NaN NaN NaN \n", + "\n", + " red_B6 red_A7 red_B7 red_A8 red_B8 \n", + "6 NaN NaN NaN NaN NaN \n", + "7 NaN NaN NaN NaN NaN \n", + "8 NaN NaN NaN NaN NaN \n", + "9 NaN NaN NaN NaN NaN \n", + "10 1.0 1.0 1.0 1.0 1.0 \n", + "11 1.0 1.0 1.0 1.0 1.0 \n", + "12 1.0 1.0 1.0 1.0 1.0 \n", + "13 NaN NaN NaN NaN NaN \n", + "\n", + "[8 rows x 43 columns]" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "######\n", + "self.rhists.query('inter_no==@inter_no')\\\n", + " .drop(['dura_A5', 'dura_A6', 'dura_A7', 'dura_A8', # 2-2 참값판단 프로세스\n", + " 'dura_B5', 'dura_B6', 'dura_B7', 'dura_B8',\n", + " 'D_n', 'S_n', 'Unnamed: 0'], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "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", + "
inter_nostart_unixphas_Aphas_Bduration
18417517044155891143
18517517044155892245
18617517044155893333
18717517044155893422
18817517044155894437
18917517044157701143
19017517044157702245
19117517044157703333
19217517044157703422
19317517044157704437
19417517044159501143
19517517044159502245
19617517044159503333
19717517044159503422
19817517044159504437
\n", + "
" + ], + "text/plain": [ + " inter_no start_unix phas_A phas_B duration\n", + "184 175 1704415589 1 1 43\n", + "185 175 1704415589 2 2 45\n", + "186 175 1704415589 3 3 33\n", + "187 175 1704415589 3 4 22\n", + "188 175 1704415589 4 4 37\n", + "189 175 1704415770 1 1 43\n", + "190 175 1704415770 2 2 45\n", + "191 175 1704415770 3 3 33\n", + "192 175 1704415770 3 4 22\n", + "193 175 1704415770 4 4 37\n", + "194 175 1704415950 1 1 43\n", + "195 175 1704415950 2 2 45\n", + "196 175 1704415950 3 3 33\n", + "197 175 1704415950 3 4 22\n", + "198 175 1704415950 4 4 37" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "######\n", + "self.hrhists.reset_index(drop=True).query('inter_no==@inter_no')[:15] # 2-3 계층화" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "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", + "
inter_nostart_unixphas_Aphas_Bmove_Amove_Bdurationnode_idstate
1851751704415950118443i0gGGrgrrrgGGGGrgrr
1861751704415950227345i0grrGgrrrgrrrrGgrr
1871751704415950336133i0grrrgGGGgrrrrrgrr
1881751704415950346222i0grrrgGGrgrrrrrgGr
1891751704415950445237i0grrrgrrrgrrrrrgGG
1901751704416178118454i0gGGrgrrrgGGGGrgrr
1911751704416178227357i0grrGgrrrgrrrrGgrr
1921751704416178336142i0grrrgGGGgrrrrrgrr
1931751704416178346228i0grrrgGGrgrrrrrgGr
1941751704416178445247i0grrrgrrrgrrrrrgGG
1951751704416358118443i0gGGrgrrrgGGGGrgrr
1961751704416358227345i0grrGgrrrgrrrrGgrr
1971751704416358336133i0grrrgGGGgrrrrrgrr
1981751704416358346222i0grrrgGGrgrrrrrgGr
1991751704416358445237i0grrrgrrrgrrrrrgGG
\n", + "
" + ], + "text/plain": [ + " inter_no start_unix phas_A phas_B move_A move_B duration node_id \\\n", + "185 175 1704415950 1 1 8 4 43 i0 \n", + "186 175 1704415950 2 2 7 3 45 i0 \n", + "187 175 1704415950 3 3 6 1 33 i0 \n", + "188 175 1704415950 3 4 6 2 22 i0 \n", + "189 175 1704415950 4 4 5 2 37 i0 \n", + "190 175 1704416178 1 1 8 4 54 i0 \n", + "191 175 1704416178 2 2 7 3 57 i0 \n", + "192 175 1704416178 3 3 6 1 42 i0 \n", + "193 175 1704416178 3 4 6 2 28 i0 \n", + "194 175 1704416178 4 4 5 2 47 i0 \n", + "195 175 1704416358 1 1 8 4 43 i0 \n", + "196 175 1704416358 2 2 7 3 45 i0 \n", + "197 175 1704416358 3 3 6 1 33 i0 \n", + "198 175 1704416358 3 4 6 2 22 i0 \n", + "199 175 1704416358 4 4 5 2 37 i0 \n", + "\n", + " state \n", + "185 gGGrgrrrgGGGGrgrr \n", + "186 grrGgrrrgrrrrGgrr \n", + "187 grrrgGGGgrrrrrgrr \n", + "188 grrrgGGrgrrrrrgGr \n", + "189 grrrgrrrgrrrrrgGG \n", + "190 gGGrgrrrgGGGGrgrr \n", + "191 grrGgrrrgrrrrGgrr \n", + "192 grrrgGGGgrrrrrgrr \n", + "193 grrrgGGrgrrrrrgGr \n", + "194 grrrgrrrgrrrrrgGG \n", + "195 gGGrgrrrgGGGGrgrr \n", + "196 grrGgrrrgrrrrGgrr \n", + "197 grrrgGGGgrrrrrgrr \n", + "198 grrrgGGrgrrrrrgGr \n", + "199 grrrgrrrgrrrrrgGG " + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.histid.query('node_id==@Node_id')[:15] # 4-2 state 붙임" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate
44175i01704415950118443gGGrgrrrgGGGGrgrr
45175i01704415950227345grrGgrrrgrrrrGgrr
46175i01704415950336133grrrgGGGgrrrrrgrr
47175i01704415950346222grrrgGGrgrrrrrgGr
48175i01704415950445237grrrgrrrgrrrrrgGG
118175i01704416178118454gGGrgrrrgGGGGrgrr
119175i01704416178227357grrGgrrrgrrrrGgrr
120175i01704416178336142grrrgGGGgrrrrrgrr
121175i01704416178346228grrrgGGrgrrrrrgGr
122175i01704416178445247grrrgrrrgrrrrrgGG
200175i01704416358118443gGGrgrrrgGGGGrgrr
201175i01704416358227345grrGgrrrgrrrrGgrr
202175i01704416358336133grrrgGGGgrrrrrgrr
203175i01704416358346222grrrgGGrgrrrrrgGr
204175i01704416358445237grrrgrrrgrrrrrgGG
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "44 175 i0 1704415950 1 1 8 4 43 \n", + "45 175 i0 1704415950 2 2 7 3 45 \n", + "46 175 i0 1704415950 3 3 6 1 33 \n", + "47 175 i0 1704415950 3 4 6 2 22 \n", + "48 175 i0 1704415950 4 4 5 2 37 \n", + "118 175 i0 1704416178 1 1 8 4 54 \n", + "119 175 i0 1704416178 2 2 7 3 57 \n", + "120 175 i0 1704416178 3 3 6 1 42 \n", + "121 175 i0 1704416178 3 4 6 2 28 \n", + "122 175 i0 1704416178 4 4 5 2 47 \n", + "200 175 i0 1704416358 1 1 8 4 43 \n", + "201 175 i0 1704416358 2 2 7 3 45 \n", + "202 175 i0 1704416358 3 3 6 1 33 \n", + "203 175 i0 1704416358 3 4 6 2 22 \n", + "204 175 i0 1704416358 4 4 5 2 37 \n", + "\n", + " state \n", + "44 gGGrgrrrgGGGGrgrr \n", + "45 grrGgrrrgrrrrGgrr \n", + "46 grrrgGGGgrrrrrgrr \n", + "47 grrrgGGrgrrrrrgGr \n", + "48 grrrgrrrgrrrrrgGG \n", + "118 gGGrgrrrgGGGGrgrr \n", + "119 grrGgrrrgrrrrGgrr \n", + "120 grrrgGGGgrrrrrgrr \n", + "121 grrrgGGrgrrrrrgGr \n", + "122 grrrgrrrgrrrrrgGG \n", + "200 gGGrgrrrgGGGGrgrr \n", + "201 grrGgrrrgrrrrGgrr \n", + "202 grrrgGGGgrrrrrgrr \n", + "203 grrrgGGrgrrrrrgGr \n", + "204 grrrgrrrgrrrrrgGG " + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.histids.query('node_id==@Node_id')[:15] # 4-3 부교차로 정보 추가" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstatephase_sumo
16175i01704415950118443gGGrgrrrgGGGGrgrr0
17175i01704415950227345grrGgrrrgrrrrGgrr1
18175i01704415950336133grrrgGGGgrrrrrgrr2
19175i01704415950346222grrrgGGrgrrrrrgGr3
20175i01704415950445237grrrgrrrgrrrrrgGG4
21175i01704416178118454gGGrgrrrgGGGGrgrr0
22175i01704416178227357grrGgrrrgrrrrGgrr1
23175i01704416178336142grrrgGGGgrrrrrgrr2
24175i01704416178346228grrrgGGrgrrrrrgGr3
25175i01704416178445247grrrgrrrgrrrrrgGG4
26175i01704416358118443gGGrgrrrgGGGGrgrr0
27175i01704416358227345grrGgrrrgrrrrGgrr1
28175i01704416358336133grrrgGGGgrrrrrgrr2
29175i01704416358346222grrrgGGrgrrrrrgGr3
30175i01704416358445237grrrgrrrgrrrrrgGG4
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "16 175 i0 1704415950 1 1 8 4 43 \n", + "17 175 i0 1704415950 2 2 7 3 45 \n", + "18 175 i0 1704415950 3 3 6 1 33 \n", + "19 175 i0 1704415950 3 4 6 2 22 \n", + "20 175 i0 1704415950 4 4 5 2 37 \n", + "21 175 i0 1704416178 1 1 8 4 54 \n", + "22 175 i0 1704416178 2 2 7 3 57 \n", + "23 175 i0 1704416178 3 3 6 1 42 \n", + "24 175 i0 1704416178 3 4 6 2 28 \n", + "25 175 i0 1704416178 4 4 5 2 47 \n", + "26 175 i0 1704416358 1 1 8 4 43 \n", + "27 175 i0 1704416358 2 2 7 3 45 \n", + "28 175 i0 1704416358 3 3 6 1 33 \n", + "29 175 i0 1704416358 3 4 6 2 22 \n", + "30 175 i0 1704416358 4 4 5 2 37 \n", + "\n", + " state phase_sumo \n", + "16 gGGrgrrrgGGGGrgrr 0 \n", + "17 grrGgrrrgrrrrGgrr 1 \n", + "18 grrrgGGGgrrrrrgrr 2 \n", + "19 grrrgGGrgrrrrrgGr 3 \n", + "20 grrrgrrrgrrrrrgGG 4 \n", + "21 gGGrgrrrgGGGGrgrr 0 \n", + "22 grrGgrrrgrrrrGgrr 1 \n", + "23 grrrgGGGgrrrrrgrr 2 \n", + "24 grrrgGGrgrrrrrgGr 3 \n", + "25 grrrgrrrgrrrrrgGG 4 \n", + "26 gGGrgrrrgGGGGrgrr 0 \n", + "27 grrGgrrrgrrrrGgrr 1 \n", + "28 grrrgGGGgrrrrrgrr 2 \n", + "29 grrrgGGrgrrrrrgGr 3 \n", + "30 grrrgrrrgrrrrrgGG 4 " + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "######\n", + "self.sigtable.query('node_id==@Node_id')[:15] # 5-1 시작, 종료시점 설정" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "# self.SIGTABLE.query('node_id==@Node_id')[:15] # 5-2 적색 황색신호 부여" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "# dp = DailyPreprocessor()\n", + "# dp.load_data()\n", + "# dp.get_intermediates()" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [], + "source": [ + "# 4-2. histid\n", + "self.histid = self.movedur.copy()\n", + "self.histid['node_id'] = self.histid['inter_no'].map(self.inter2node)\n", + "histid_start = self.present_time - 600\n", + "self.histid = self.histid[self.histid.start_unix > histid_start]\n", + "\n", + "mapping_dict = self.matching.set_index(['node_id', 'move_no'])['state'].to_dict()\n", + "\n", + "for i, row in self.histid.iterrows():\n", + " node_id = row.node_id\n", + " move_A = row.move_A\n", + " move_B = row.move_B\n", + " \n", + " # A링의 state 지정\n", + " if (node_id, move_A) in mapping_dict:\n", + " state_A = mapping_dict[(node_id, move_A)]\n", + " else:\n", + " state_A = ''.join(self.node2init[node_id])\n", + " self.histid.at[i, 'state_A'] = state_A\n", + "\n", + " # B링의 state 지정\n", + " if (node_id, move_B) in mapping_dict:\n", + " state_B = mapping_dict[(node_id, move_B)]\n", + " else:\n", + " state_B = ''.join(self.node2init[node_id])\n", + " self.histid.at[i, 'state_B'] = state_B " + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate_Astate_B
44175i01704415950118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
45175i01704415950227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
46175i01704415950336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
47175i01704415950346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
48175i01704415950445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
118175i01704416178118454grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
119175i01704416178227357grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
120175i01704416178336142grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
121175i01704416178346228grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
122175i01704416178445247grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
200175i01704416358118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
201175i01704416358227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
202175i01704416358336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
203175i01704416358346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
204175i01704416358445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
262175i01704416538118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
263175i01704416538227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
264175i01704416538336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
265175i01704416538346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
266175i01704416538445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
324175i01704416718118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
325175i01704416718227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
326175i01704416718336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
327175i01704416718346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
328175i01704416718445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
362175i01704416820118424grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
363175i01704416820227326grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
364175i01704416820336119grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
365175i01704416820346212grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
366175i01704416820445221grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "44 175 i0 1704415950 1 1 8 4 43 \n", + "45 175 i0 1704415950 2 2 7 3 45 \n", + "46 175 i0 1704415950 3 3 6 1 33 \n", + "47 175 i0 1704415950 3 4 6 2 22 \n", + "48 175 i0 1704415950 4 4 5 2 37 \n", + "118 175 i0 1704416178 1 1 8 4 54 \n", + "119 175 i0 1704416178 2 2 7 3 57 \n", + "120 175 i0 1704416178 3 3 6 1 42 \n", + "121 175 i0 1704416178 3 4 6 2 28 \n", + "122 175 i0 1704416178 4 4 5 2 47 \n", + "200 175 i0 1704416358 1 1 8 4 43 \n", + "201 175 i0 1704416358 2 2 7 3 45 \n", + "202 175 i0 1704416358 3 3 6 1 33 \n", + "203 175 i0 1704416358 3 4 6 2 22 \n", + "204 175 i0 1704416358 4 4 5 2 37 \n", + "262 175 i0 1704416538 1 1 8 4 43 \n", + "263 175 i0 1704416538 2 2 7 3 45 \n", + "264 175 i0 1704416538 3 3 6 1 33 \n", + "265 175 i0 1704416538 3 4 6 2 22 \n", + "266 175 i0 1704416538 4 4 5 2 37 \n", + "324 175 i0 1704416718 1 1 8 4 43 \n", + "325 175 i0 1704416718 2 2 7 3 45 \n", + "326 175 i0 1704416718 3 3 6 1 33 \n", + "327 175 i0 1704416718 3 4 6 2 22 \n", + "328 175 i0 1704416718 4 4 5 2 37 \n", + "362 175 i0 1704416820 1 1 8 4 24 \n", + "363 175 i0 1704416820 2 2 7 3 26 \n", + "364 175 i0 1704416820 3 3 6 1 19 \n", + "365 175 i0 1704416820 3 4 6 2 12 \n", + "366 175 i0 1704416820 4 4 5 2 21 \n", + "\n", + " state_A state_B \n", + "44 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "45 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "46 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "47 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "48 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "118 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "119 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "120 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "121 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "122 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "200 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "201 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "202 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "203 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "204 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "262 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "263 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "264 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "265 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "266 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "324 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "325 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "326 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "327 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "328 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "362 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "363 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "364 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "365 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "366 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr " + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 4-3. histids\n", + "new_histids = []\n", + "for parent_id in self.parent_ids:\n", + " for child_id in self.pa2ch[parent_id]:\n", + " new_histid = self.histid.copy()[self.histid.node_id==parent_id].drop(columns=['state_A', 'state_B'])\n", + " # new_histid[['inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']] = np.nan\n", + " for i, row in new_histid.iterrows():\n", + " phas_A = row.phas_A\n", + " phas_B = row.phas_B\n", + " new_match = self.match6[self.match6.node_id==child_id]\n", + " Arow = new_match[(new_match.phase_no==phas_A) & (new_match.ring_type=='A')]\n", + "\n", + " # A링의 state 지정\n", + " state_A = Arow.iloc[0].state\n", + " new_histid.at[i, 'state_A'] = state_A\n", + "\n", + " # B링의 state 지정\n", + " Brow = new_match[(new_match.phase_no==phas_B) & (new_match.ring_type=='B')]\n", + " state_B = Brow.iloc[0].state\n", + " new_histid.at[i, 'state_B'] = state_B\n", + "\n", + " new_histid.at[i, 'node_id'] = child_id\n", + " new_histids.append(new_histid)\n", + "import pandas as pd\n", + "new_histids = pd.concat(new_histids)\n", + "self.histids = pd.concat([self.histid.copy(), new_histids])\n", + "self.histids = self.histids.sort_values(by=['start_unix', 'node_id', 'phas_A', 'phas_B']).reset_index(drop=True)\n", + "self.histids = self.histids[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration', 'state_A', 'state_B']]\n", + "self.histids.query('node_id==@Node_id')" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "self.set_timepoints()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "df = self.sigtable.query('node_id==@Node_id')" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate_Astate_Bphase_sumo
16175i01704415950118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr0
17175i01704415950227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr1
18175i01704415950336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr2
19175i01704415950346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr3
20175i01704415950445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr4
21175i01704416178118454grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr0
22175i01704416178227357grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr1
23175i01704416178336142grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr2
24175i01704416178346228grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr3
25175i01704416178445247grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr4
26175i01704416358118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr0
27175i01704416358227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr1
28175i01704416358336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr2
29175i01704416358346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr3
30175i01704416358445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr4
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "16 175 i0 1704415950 1 1 8 4 43 \n", + "17 175 i0 1704415950 2 2 7 3 45 \n", + "18 175 i0 1704415950 3 3 6 1 33 \n", + "19 175 i0 1704415950 3 4 6 2 22 \n", + "20 175 i0 1704415950 4 4 5 2 37 \n", + "21 175 i0 1704416178 1 1 8 4 54 \n", + "22 175 i0 1704416178 2 2 7 3 57 \n", + "23 175 i0 1704416178 3 3 6 1 42 \n", + "24 175 i0 1704416178 3 4 6 2 28 \n", + "25 175 i0 1704416178 4 4 5 2 47 \n", + "26 175 i0 1704416358 1 1 8 4 43 \n", + "27 175 i0 1704416358 2 2 7 3 45 \n", + "28 175 i0 1704416358 3 3 6 1 33 \n", + "29 175 i0 1704416358 3 4 6 2 22 \n", + "30 175 i0 1704416358 4 4 5 2 37 \n", + "\n", + " state_A state_B phase_sumo \n", + "16 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 0 \n", + "17 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 1 \n", + "18 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 2 \n", + "19 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 3 \n", + "20 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 \n", + "21 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 0 \n", + "22 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 1 \n", + "23 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 2 \n", + "24 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 3 \n", + "25 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 \n", + "26 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 0 \n", + "27 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 1 \n", + "28 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 2 \n", + "29 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 3 \n", + "30 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 " + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate_Astate_Bphase_sumo
16175i01704415950118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr0
17175i01704415950227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr1
18175i01704415950336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr2
19175i01704415950346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr3
20175i01704415950445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr4
21175i01704416178118454grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr0
22175i01704416178227357grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr1
23175i01704416178336142grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr2
24175i01704416178346228grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr3
25175i01704416178445247grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr4
26175i01704416358118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr0
27175i01704416358227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr1
28175i01704416358336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr2
29175i01704416358346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr3
30175i01704416358445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr4
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "16 175 i0 1704415950 1 1 8 4 43 \n", + "17 175 i0 1704415950 2 2 7 3 45 \n", + "18 175 i0 1704415950 3 3 6 1 33 \n", + "19 175 i0 1704415950 3 4 6 2 22 \n", + "20 175 i0 1704415950 4 4 5 2 37 \n", + "21 175 i0 1704416178 1 1 8 4 54 \n", + "22 175 i0 1704416178 2 2 7 3 57 \n", + "23 175 i0 1704416178 3 3 6 1 42 \n", + "24 175 i0 1704416178 3 4 6 2 28 \n", + "25 175 i0 1704416178 4 4 5 2 47 \n", + "26 175 i0 1704416358 1 1 8 4 43 \n", + "27 175 i0 1704416358 2 2 7 3 45 \n", + "28 175 i0 1704416358 3 3 6 1 33 \n", + "29 175 i0 1704416358 3 4 6 2 22 \n", + "30 175 i0 1704416358 4 4 5 2 37 \n", + "\n", + " state_A state_B phase_sumo \n", + "16 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 0 \n", + "17 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 1 \n", + "18 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 2 \n", + "19 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 3 \n", + "20 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 \n", + "21 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 0 \n", + "22 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 1 \n", + "23 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 2 \n", + "24 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 3 \n", + "25 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 \n", + "26 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 0 \n", + "27 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 1 \n", + "28 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 2 \n", + "29 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 3 \n", + "30 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 " + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = self.sigtable.query('node_id==@Node_id')\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bdurationstate_Astate_Bphase_sumored_Ared_Byellow_Ayellow_B
16175i017044159501143grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr01144
17175i017044159502245grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr11144
18175i017044159503333grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr21144
19175i017044159503422grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr31144
20175i017044159504437grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr41144
21175i017044161781154grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr01144
22175i017044161782257grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr11144
23175i017044161783342grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr21144
24175i017044161783428grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr31144
25175i017044161784447grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr41144
26175i017044163581143grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr01144
27175i017044163582245grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr11144
28175i017044163583333grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr21144
29175i017044163583422grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr31144
30175i017044163584437grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr41144
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B duration state_A \\\n", + "16 175 i0 1704415950 1 1 43 grrrgrrrgGGGGrgrr \n", + "17 175 i0 1704415950 2 2 45 grrGgrrrgrrrrrgrr \n", + "18 175 i0 1704415950 3 3 33 grrrgGGrgrrrrrgrr \n", + "19 175 i0 1704415950 3 4 22 grrrgGGrgrrrrrgrr \n", + "20 175 i0 1704415950 4 4 37 grrrgrrrgrrrrrgrG \n", + "21 175 i0 1704416178 1 1 54 grrrgrrrgGGGGrgrr \n", + "22 175 i0 1704416178 2 2 57 grrGgrrrgrrrrrgrr \n", + "23 175 i0 1704416178 3 3 42 grrrgGGrgrrrrrgrr \n", + "24 175 i0 1704416178 3 4 28 grrrgGGrgrrrrrgrr \n", + "25 175 i0 1704416178 4 4 47 grrrgrrrgrrrrrgrG \n", + "26 175 i0 1704416358 1 1 43 grrrgrrrgGGGGrgrr \n", + "27 175 i0 1704416358 2 2 45 grrGgrrrgrrrrrgrr \n", + "28 175 i0 1704416358 3 3 33 grrrgGGrgrrrrrgrr \n", + "29 175 i0 1704416358 3 4 22 grrrgGGrgrrrrrgrr \n", + "30 175 i0 1704416358 4 4 37 grrrgrrrgrrrrrgrG \n", + "\n", + " state_B phase_sumo red_A red_B yellow_A yellow_B \n", + "16 gGGrgrrrgrrrrrgrr 0 1 1 4 4 \n", + "17 grrrgrrrgrrrrGgrr 1 1 1 4 4 \n", + "18 grrrgrrGgrrrrrgrr 2 1 1 4 4 \n", + "19 grrrgrrrgrrrrrgGr 3 1 1 4 4 \n", + "20 grrrgrrrgrrrrrgGr 4 1 1 4 4 \n", + "21 gGGrgrrrgrrrrrgrr 0 1 1 4 4 \n", + "22 grrrgrrrgrrrrGgrr 1 1 1 4 4 \n", + "23 grrrgrrGgrrrrrgrr 2 1 1 4 4 \n", + "24 grrrgrrrgrrrrrgGr 3 1 1 4 4 \n", + "25 grrrgrrrgrrrrrgGr 4 1 1 4 4 \n", + "26 gGGrgrrrgrrrrrgrr 0 1 1 4 4 \n", + "27 grrrgrrrgrrrrGgrr 1 1 1 4 4 \n", + "28 grrrgrrGgrrrrrgrr 2 1 1 4 4 \n", + "29 grrrgrrrgrrrrrgGr 3 1 1 4 4 \n", + "30 grrrgrrrgrrrrrgGr 4 1 1 4 4 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i, row in df.iterrows():\n", + " inter_no = row.inter_no\n", + " phas_A = row.phas_A\n", + " phas_B = row.phas_B\n", + " start_unix = row.start_unix\n", + " prow = self.load_prow(inter_no, start_unix)[1].iloc[0]\n", + " red_A = prow[f'red_A{phas_A}']\n", + " yellow_A = prow[f'yellow_A{phas_A}']\n", + " red_B = prow[f'red_B{phas_B}']\n", + " yellow_B = prow[f'yellow_B{phas_B}']\n", + " df.loc[i, ['red_A', 'red_B', 'yellow_A', 'yellow_B']] = red_A, red_B, yellow_A, yellow_B\n", + "df = df.astype({'red_A': int, 'red_B': int, 'yellow_A': int, 'yellow_B': int,\n", + " 'phas_A':str, 'phas_B':str})\n", + "df = df.drop(['move_A','move_B'], axis=1)\n", + "display(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "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", + "
phas_Adurationstate_Ared_Ayellow_A
0143grrrgrrrgGGGGrgrr14
1245grrGgrrrgrrrrrgrr14
2333grrrgGGrgrrrrrgrr14
3322grrrgGGrgrrrrrgrr14
4437grrrgrrrgrrrrrgrG14
5154grrrgrrrgGGGGrgrr14
6257grrGgrrrgrrrrrgrr14
7342grrrgGGrgrrrrrgrr14
8328grrrgGGrgrrrrrgrr14
9447grrrgrrrgrrrrrgrG14
10143grrrgrrrgGGGGrgrr14
11245grrGgrrrgrrrrrgrr14
12333grrrgGGrgrrrrrgrr14
13322grrrgGGrgrrrrrgrr14
14437grrrgrrrgrrrrrgrG14
\n", + "
" + ], + "text/plain": [ + " phas_A duration state_A red_A yellow_A\n", + "0 1 43 grrrgrrrgGGGGrgrr 1 4\n", + "1 2 45 grrGgrrrgrrrrrgrr 1 4\n", + "2 3 33 grrrgGGrgrrrrrgrr 1 4\n", + "3 3 22 grrrgGGrgrrrrrgrr 1 4\n", + "4 4 37 grrrgrrrgrrrrrgrG 1 4\n", + "5 1 54 grrrgrrrgGGGGrgrr 1 4\n", + "6 2 57 grrGgrrrgrrrrrgrr 1 4\n", + "7 3 42 grrrgGGrgrrrrrgrr 1 4\n", + "8 3 28 grrrgGGrgrrrrrgrr 1 4\n", + "9 4 47 grrrgrrrgrrrrrgrG 1 4\n", + "10 1 43 grrrgrrrgGGGGrgrr 1 4\n", + "11 2 45 grrGgrrrgrrrrrgrr 1 4\n", + "12 3 33 grrrgGGrgrrrrrgrr 1 4\n", + "13 3 22 grrrgGGrgrrrrrgrr 1 4\n", + "14 4 37 grrrgrrrgrrrrrgrG 1 4" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_A = df[['phas_A', 'duration', 'state_A', 'red_A', 'yellow_A']]\n", + "df_B = df[['phas_B', 'duration', 'state_B', 'red_B', 'yellow_B']]\n", + "df_A = df_A.reset_index(drop=True)\n", + "df_A" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'aa'" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "state_y = ''\n", + "state_y += 'a'\n", + "state_y += 'a'\n", + "state_y" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "grrrgrrrgGGGGrgrr\n", + "grrrgrrrgrrrrrgrr\n", + "grrrgrrrgyyyyrgrr\n", + "grrGgrrrgrrrrrgrr\n", + "grrrgrrrgrrrrrgrr\n", + "grrygrrrgrrrrrgrr\n", + "grrrgGGrgrrrrrgrr\n" + ] + } + ], + "source": [ + "pre_state = 'grrrgrrrgGGGGrgrr'\n", + "cur_state = 'grrGgrrrgrrrrrgrr'\n", + "nex_state = 'grrrgGGrgrrrrrgrr'\n", + "\n", + "def get_red(pre_state:str, cur_state:str):\n", + " assert len(pre_state) == len(cur_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n", + " state_r = ''\n", + " for c, n in zip(pre_state, cur_state):\n", + " if c == n:\n", + " state_r += c\n", + " elif (c == 'r') and (n == 'G'):\n", + " state_r += 'r'\n", + " elif (c == 'G') and (n == 'r'):\n", + " state_r += 'r'\n", + " else:\n", + " raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n", + " return state_r\n", + "\n", + "def get_yellow(cur_state:str, nex_state:str):\n", + " assert len(cur_state) == len(nex_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n", + " state_y = ''\n", + " for c, n in zip(cur_state, nex_state):\n", + " if c == n:\n", + " state_y += c\n", + " elif (c == 'r') and (n == 'G'):\n", + " state_y += 'r'\n", + " elif (c == 'G') and (n == 'r'):\n", + " state_y += 'y'\n", + " else:\n", + " raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n", + " return state_y\n", + "print(pre_state)\n", + "print(get_red(pre_state, cur_state))\n", + "print(get_yellow(pre_state, cur_state))\n", + "print(cur_state)\n", + "print(get_red(cur_state, nex_state))\n", + "print(get_yellow(cur_state, nex_state))\n", + "print(nex_state)" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [], + "source": [ + "df_A = df_A.reset_index(drop=True)\n", + "df_B = df_B.reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "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", + "
phas_Adurationstate_Ared_Ayellow_A
0143grrrgrrrgGGGGrgrr14
1245grrGgrrrgrrrrrgrr14
2333grrrgGGrgrrrrrgrr14
3322grrrgGGrgrrrrrgrr14
4437grrrgrrrgrrrrrgrG14
5154grrrgrrrgGGGGrgrr14
6257grrGgrrrgrrrrrgrr14
7342grrrgGGrgrrrrrgrr14
8328grrrgGGrgrrrrrgrr14
9447grrrgrrrgrrrrrgrG14
10143grrrgrrrgGGGGrgrr14
11245grrGgrrrgrrrrrgrr14
12333grrrgGGrgrrrrrgrr14
13322grrrgGGrgrrrrrgrr14
14437grrrgrrrgrrrrrgrG14
\n", + "
" + ], + "text/plain": [ + " phas_A duration state_A red_A yellow_A\n", + "0 1 43 grrrgrrrgGGGGrgrr 1 4\n", + "1 2 45 grrGgrrrgrrrrrgrr 1 4\n", + "2 3 33 grrrgGGrgrrrrrgrr 1 4\n", + "3 3 22 grrrgGGrgrrrrrgrr 1 4\n", + "4 4 37 grrrgrrrgrrrrrgrG 1 4\n", + "5 1 54 grrrgrrrgGGGGrgrr 1 4\n", + "6 2 57 grrGgrrrgrrrrrgrr 1 4\n", + "7 3 42 grrrgGGrgrrrrrgrr 1 4\n", + "8 3 28 grrrgGGrgrrrrrgrr 1 4\n", + "9 4 47 grrrgrrrgrrrrrgrG 1 4\n", + "10 1 43 grrrgrrrgGGGGrgrr 1 4\n", + "11 2 45 grrGgrrrgrrrrrgrr 1 4\n", + "12 3 33 grrrgGGrgrrrrrgrr 1 4\n", + "13 3 22 grrrgGGrgrrrrrgrr 1 4\n", + "14 4 37 grrrgrrrgrrrrrgrG 1 4" + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_A" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "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", + "
durationdurationdurationdurationphas_Aphas_Bred_Ared_Bstate_Astate_Byellow_Ayellow_B
0434343431111grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr44
1454545452211grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr44
2333333333311grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr44
3222222223411grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr44
4373737374411grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr44
5545454541111grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr44
6575757572211grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr44
7424242423311grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr44
8282828283411grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr44
9474747474411grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr44
10434343431111grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr44
11454545452211grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr44
12333333333311grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr44
13222222223411grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr44
14373737374411grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr44
\n", + "
" + ], + "text/plain": [ + " duration duration duration duration phas_A phas_B red_A red_B \\\n", + "0 43 43 43 43 1 1 1 1 \n", + "1 45 45 45 45 2 2 1 1 \n", + "2 33 33 33 33 3 3 1 1 \n", + "3 22 22 22 22 3 4 1 1 \n", + "4 37 37 37 37 4 4 1 1 \n", + "5 54 54 54 54 1 1 1 1 \n", + "6 57 57 57 57 2 2 1 1 \n", + "7 42 42 42 42 3 3 1 1 \n", + "8 28 28 28 28 3 4 1 1 \n", + "9 47 47 47 47 4 4 1 1 \n", + "10 43 43 43 43 1 1 1 1 \n", + "11 45 45 45 45 2 2 1 1 \n", + "12 33 33 33 33 3 3 1 1 \n", + "13 22 22 22 22 3 4 1 1 \n", + "14 37 37 37 37 4 4 1 1 \n", + "\n", + " state_A state_B yellow_A yellow_B \n", + "0 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 4 4 \n", + "1 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 4 4 \n", + "2 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 4 4 \n", + "3 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 4 4 \n", + "4 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 4 \n", + "5 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 4 4 \n", + "6 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 4 4 \n", + "7 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 4 4 \n", + "8 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 4 4 \n", + "9 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 4 \n", + "10 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 4 4 \n", + "11 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 4 4 \n", + "12 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 4 4 \n", + "13 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 4 4 \n", + "14 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 4 4 " + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.concat([df_A, df_B], axis=1)\n", + "df[sorted(df.columns)]" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "phas_A 3\n", + "duration 22\n", + "state_A grrrgGGrgrrrrrgrr\n", + "red_A 1\n", + "yellow_A 4\n", + "Name: 13, dtype: object" + ] + }, + "execution_count": 218, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pre" + ] + }, + { + "cell_type": "code", + "execution_count": 258, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "now = time.time()\n", + "def cumulate(df, alph):\n", + " df = df.reset_index(drop=True)\n", + "\n", + " DF = []\n", + " pre = pd.Series({f'phas_{alph}':None})\n", + "\n", + " start_time = 0\n", + " elapsed = 0\n", + " for i, cur in df.iterrows():\n", + " \n", + " # pre, nex\n", + " if i != 0:\n", + " pre = df.iloc[i-1]\n", + " \n", + " if i != len(df) - 1:\n", + " nex = df.iloc[i+1]\n", + " \n", + " # duration\n", + " if cur[f'phas_{alph}'] == nex[f'phas_{alph}']:\n", + " continue\n", + " if cur[f'phas_{alph}'] == pre[f'phas_{alph}']:\n", + " duration = cur.duration + pre.duration\n", + " else:\n", + " duration = cur.duration\n", + " start_times = []\n", + " states = []\n", + " phases = []\n", + "\n", + " # red\n", + " if i != 0:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " states.append(get_red(pre[f'state_{alph}'], cur[f'state_{alph}']))\n", + " phases.append(f'{cur[f\"phas_{alph}\"]}r')\n", + "\n", + " elapsed = cur[f'red_{alph}']\n", + "\n", + " # green\n", + " if i == 0:\n", + " start_time = 0\n", + " else:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " states.append(cur[f'state_{alph}'])\n", + " phases.append(f'{cur[f\"phas_{alph}\"]}g')\n", + " if i == 0:\n", + " elapsed = duration - cur[f'yellow_{alph}']\n", + " else:\n", + " elapsed = duration - cur[f'yellow_{alph}'] - cur[f'red_{alph}']\n", + "\n", + " # yellow\n", + " if i != len(df) - 1:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " states.append(get_yellow(cur[f'state_{alph}'], nex[f'state_{alph}']))\n", + " phases.append(f'{cur[f\"phas_{alph}\"]}y')\n", + " elapsed = cur[f'yellow_{alph}']\n", + " df_ = pd.DataFrame({'start_time':start_times, f'phas_{alph}':phases, f'state_{alph}':states})\n", + " DF.append(df_)\n", + " DF = pd.concat(DF).reset_index(drop=True)\n", + " return DF\n", + "df_a = cumulate(df_A, 'A')\n", + "df_b = cumulate(df_B, 'B')" + ] + }, + { + "cell_type": "code", + "execution_count": 262, + "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", + "
start_timephas_Astate_A
001ggrrrgrrrgGGGGrgrr
1391ygrrrgrrrgyyyyrgrr
2432rgrrrgrrrgrrrrrgrr
3442ggrrGgrrrgrrrrrgrr
4842ygrrygrrrgrrrrrgrr
5883rgrrrgGGrgrrrrrgrr
6893ggrrrgGGrgrrrrrgrr
71393ygrrrgyyrgrrrrrgrr
81434rgrrrgrrrgrrrrrgrr
91444ggrrrgrrrgrrrrrgrG
101764ygrrrgrrrgrrrrrgry
111801rgrrrgrrrgrrrrrgrr
121811ggrrrgrrrgGGGGrgrr
132301ygrrrgrrrgyyyyrgrr
142342rgrrrgrrrgrrrrrgrr
152352ggrrGgrrrgrrrrrgrr
162872ygrrygrrrgrrrrrgrr
172913rgrrrgGGrgrrrrrgrr
182923ggrrrgGGrgrrrrrgrr
193573ygrrrgyyrgrrrrrgrr
203614rgrrrgrrrgrrrrrgrr
213624ggrrrgrrrgrrrrrgrG
224044ygrrrgrrrgrrrrrgry
234081rgrrrgrrrgrrrrrgrr
244091ggrrrgrrrgGGGGrgrr
254471ygrrrgrrrgyyyyrgrr
264512rgrrrgrrrgrrrrrgrr
274522ggrrGgrrrgrrrrrgrr
284922ygrrygrrrgrrrrrgrr
294963rgrrrgGGrgrrrrrgrr
304973ggrrrgGGrgrrrrrgrr
315473ygrrrgyyrgrrrrrgrr
\n", + "
" + ], + "text/plain": [ + " start_time phas_A state_A\n", + "0 0 1g grrrgrrrgGGGGrgrr\n", + "1 39 1y grrrgrrrgyyyyrgrr\n", + "2 43 2r grrrgrrrgrrrrrgrr\n", + "3 44 2g grrGgrrrgrrrrrgrr\n", + "4 84 2y grrygrrrgrrrrrgrr\n", + "5 88 3r grrrgGGrgrrrrrgrr\n", + "6 89 3g grrrgGGrgrrrrrgrr\n", + "7 139 3y grrrgyyrgrrrrrgrr\n", + "8 143 4r grrrgrrrgrrrrrgrr\n", + "9 144 4g grrrgrrrgrrrrrgrG\n", + "10 176 4y grrrgrrrgrrrrrgry\n", + "11 180 1r grrrgrrrgrrrrrgrr\n", + "12 181 1g grrrgrrrgGGGGrgrr\n", + "13 230 1y grrrgrrrgyyyyrgrr\n", + "14 234 2r grrrgrrrgrrrrrgrr\n", + "15 235 2g grrGgrrrgrrrrrgrr\n", + "16 287 2y grrygrrrgrrrrrgrr\n", + "17 291 3r grrrgGGrgrrrrrgrr\n", + "18 292 3g grrrgGGrgrrrrrgrr\n", + "19 357 3y grrrgyyrgrrrrrgrr\n", + "20 361 4r grrrgrrrgrrrrrgrr\n", + "21 362 4g grrrgrrrgrrrrrgrG\n", + "22 404 4y grrrgrrrgrrrrrgry\n", + "23 408 1r grrrgrrrgrrrrrgrr\n", + "24 409 1g grrrgrrrgGGGGrgrr\n", + "25 447 1y grrrgrrrgyyyyrgrr\n", + "26 451 2r grrrgrrrgrrrrrgrr\n", + "27 452 2g grrGgrrrgrrrrrgrr\n", + "28 492 2y grrygrrrgrrrrrgrr\n", + "29 496 3r grrrgGGrgrrrrrgrr\n", + "30 497 3g grrrgGGrgrrrrrgrr\n", + "31 547 3y grrrgyyrgrrrrrgrr" + ] + }, + "execution_count": 262, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_a" + ] + }, + { + "cell_type": "code", + "execution_count": 263, + "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", + "
start_timephas_Bstate_B
001ggGGrgrrrgrrrrrgrr
1391ygyyrgrrrgrrrrrgrr
2432rgrrrgrrrgrrrrrgrr
3442ggrrrgrrrgrrrrGgrr
4842ygrrrgrrrgrrrrygrr
5883rgrrrgrrrgrrrrrgrr
6893ggrrrgrrGgrrrrrgrr
71173ygrrrgrrygrrrrrgrr
81214rgrrrgrrrgrrrrrgGr
91224ggrrrgrrrgrrrrrgGr
101764ygrrrgrrrgrrrrrgyr
111801rgrrrgrrrgrrrrrgrr
121811ggGGrgrrrgrrrrrgrr
132301ygyyrgrrrgrrrrrgrr
142342rgrrrgrrrgrrrrrgrr
152352ggrrrgrrrgrrrrGgrr
162872ygrrrgrrrgrrrrygrr
172913rgrrrgrrrgrrrrrgrr
182923ggrrrgrrGgrrrrrgrr
193293ygrrrgrrygrrrrrgrr
203334rgrrrgrrrgrrrrrgGr
213344ggrrrgrrrgrrrrrgGr
224044ygrrrgrrrgrrrrrgyr
234081rgrrrgrrrgrrrrrgrr
244091ggGGrgrrrgrrrrrgrr
254471ygyyrgrrrgrrrrrgrr
264512rgrrrgrrrgrrrrrgrr
274522ggrrrgrrrgrrrrGgrr
284922ygrrrgrrrgrrrrygrr
294963rgrrrgrrrgrrrrrgrr
304973ggrrrgrrGgrrrrrgrr
315253ygrrrgrrygrrrrrgrr
\n", + "
" + ], + "text/plain": [ + " start_time phas_B state_B\n", + "0 0 1g gGGrgrrrgrrrrrgrr\n", + "1 39 1y gyyrgrrrgrrrrrgrr\n", + "2 43 2r grrrgrrrgrrrrrgrr\n", + "3 44 2g grrrgrrrgrrrrGgrr\n", + "4 84 2y grrrgrrrgrrrrygrr\n", + "5 88 3r grrrgrrrgrrrrrgrr\n", + "6 89 3g grrrgrrGgrrrrrgrr\n", + "7 117 3y grrrgrrygrrrrrgrr\n", + "8 121 4r grrrgrrrgrrrrrgGr\n", + "9 122 4g grrrgrrrgrrrrrgGr\n", + "10 176 4y grrrgrrrgrrrrrgyr\n", + "11 180 1r grrrgrrrgrrrrrgrr\n", + "12 181 1g gGGrgrrrgrrrrrgrr\n", + "13 230 1y gyyrgrrrgrrrrrgrr\n", + "14 234 2r grrrgrrrgrrrrrgrr\n", + "15 235 2g grrrgrrrgrrrrGgrr\n", + "16 287 2y grrrgrrrgrrrrygrr\n", + "17 291 3r grrrgrrrgrrrrrgrr\n", + "18 292 3g grrrgrrGgrrrrrgrr\n", + "19 329 3y grrrgrrygrrrrrgrr\n", + "20 333 4r grrrgrrrgrrrrrgGr\n", + "21 334 4g grrrgrrrgrrrrrgGr\n", + "22 404 4y grrrgrrrgrrrrrgyr\n", + "23 408 1r grrrgrrrgrrrrrgrr\n", + "24 409 1g gGGrgrrrgrrrrrgrr\n", + "25 447 1y gyyrgrrrgrrrrrgrr\n", + "26 451 2r grrrgrrrgrrrrrgrr\n", + "27 452 2g grrrgrrrgrrrrGgrr\n", + "28 492 2y grrrgrrrgrrrrygrr\n", + "29 496 3r grrrgrrrgrrrrrgrr\n", + "30 497 3g grrrgrrGgrrrrrgrr\n", + "31 525 3y grrrgrrygrrrrrgrr" + ] + }, + "execution_count": 263, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_b" + ] + }, + { + "cell_type": "code", + "execution_count": 302, + "metadata": {}, + "outputs": [], + "source": [ + "pairs = set()\n", + "pairs.add(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 304, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{('G', 'r'), ('g', 'g'), ('r', 'G'), ('r', 'r'), ('r', 'y'), ('y', 'r')}" + ] + }, + "execution_count": 304, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pairs = set()\n", + "for A, B in zip(df['state_A'], df['state_B']):\n", + " for a, b in zip(A, B):\n", + " pairs.add((a,b))\n", + "pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 311, + "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", + "
start_timephasestate_Astate_Bdurationstate
001g_1ggrrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr39gGGrgrrrgGGGGrgrr
1391y_1ygrrrgrrrgyyyyrgrrgyyrgrrrgrrrrrgrr4gyyrgrrrgyyyyrgrr
2432r_2rgrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgrrrgrrrrrgrr
3442g_2ggrrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr40grrGgrrrgrrrrGgrr
4842y_2ygrrygrrrgrrrrrgrrgrrrgrrrgrrrrygrr4grrygrrrgrrrrygrr
5883r_3rgrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgGGrgrrrrrgrr
6893g_3ggrrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr28grrrgGGGgrrrrrgrr
71173g_3ygrrrgGGrgrrrrrgrrgrrrgrrygrrrrrgrr4grrrgGGygrrrrrgrr
81213g_4rgrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr1grrrgGGrgrrrrrgGr
91223g_4ggrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr17grrrgGGrgrrrrrgGr
101393y_4ggrrrgyyrgrrrrrgrrgrrrgrrrgrrrrrgGr4grrrgyyrgrrrrrgGr
111434r_4ggrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgGr1grrrgrrrgrrrrrgGr
121444g_4ggrrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr32grrrgrrrgrrrrrgGG
131764y_4ygrrrgrrrgrrrrrgrygrrrgrrrgrrrrrgyr4grrrgrrrgrrrrrgyy
141801r_1rgrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgrrrgrrrrrgrr
151811g_1ggrrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr49gGGrgrrrgGGGGrgrr
162301y_1ygrrrgrrrgyyyyrgrrgyyrgrrrgrrrrrgrr4gyyrgrrrgyyyyrgrr
172342r_2rgrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgrrrgrrrrrgrr
182352g_2ggrrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr52grrGgrrrgrrrrGgrr
192872y_2ygrrygrrrgrrrrrgrrgrrrgrrrgrrrrygrr4grrygrrrgrrrrygrr
202913r_3rgrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgGGrgrrrrrgrr
212923g_3ggrrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr37grrrgGGGgrrrrrgrr
223293g_3ygrrrgGGrgrrrrrgrrgrrrgrrygrrrrrgrr4grrrgGGygrrrrrgrr
233333g_4rgrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr1grrrgGGrgrrrrrgGr
243343g_4ggrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr23grrrgGGrgrrrrrgGr
253573y_4ggrrrgyyrgrrrrrgrrgrrrgrrrgrrrrrgGr4grrrgyyrgrrrrrgGr
263614r_4ggrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgGr1grrrgrrrgrrrrrgGr
273624g_4ggrrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr42grrrgrrrgrrrrrgGG
284044y_4ygrrrgrrrgrrrrrgrygrrrgrrrgrrrrrgyr4grrrgrrrgrrrrrgyy
294081r_1rgrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgrrrgrrrrrgrr
304091g_1ggrrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr38gGGrgrrrgGGGGrgrr
314471y_1ygrrrgrrrgyyyyrgrrgyyrgrrrgrrrrrgrr4gyyrgrrrgyyyyrgrr
324512r_2rgrrrgrrrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgrrrgrrrrrgrr
334522g_2ggrrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr40grrGgrrrgrrrrGgrr
344922y_2ygrrygrrrgrrrrrgrrgrrrgrrrgrrrrygrr4grrygrrrgrrrrygrr
354963r_3rgrrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgrr1grrrgGGrgrrrrrgrr
364973g_3ggrrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr28grrrgGGGgrrrrrgrr
375253g_3ygrrrgGGrgrrrrrgrrgrrrgrrygrrrrrgrr22grrrgGGygrrrrrgrr
\n", + "
" + ], + "text/plain": [ + " start_time phase state_A state_B duration \\\n", + "0 0 1g_1g grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 39 \n", + "1 39 1y_1y grrrgrrrgyyyyrgrr gyyrgrrrgrrrrrgrr 4 \n", + "2 43 2r_2r grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "3 44 2g_2g grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 40 \n", + "4 84 2y_2y grrygrrrgrrrrrgrr grrrgrrrgrrrrygrr 4 \n", + "5 88 3r_3r grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "6 89 3g_3g grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 28 \n", + "7 117 3g_3y grrrgGGrgrrrrrgrr grrrgrrygrrrrrgrr 4 \n", + "8 121 3g_4r grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 1 \n", + "9 122 3g_4g grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 17 \n", + "10 139 3y_4g grrrgyyrgrrrrrgrr grrrgrrrgrrrrrgGr 4 \n", + "11 143 4r_4g grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgGr 1 \n", + "12 144 4g_4g grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 32 \n", + "13 176 4y_4y grrrgrrrgrrrrrgry grrrgrrrgrrrrrgyr 4 \n", + "14 180 1r_1r grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "15 181 1g_1g grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 49 \n", + "16 230 1y_1y grrrgrrrgyyyyrgrr gyyrgrrrgrrrrrgrr 4 \n", + "17 234 2r_2r grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "18 235 2g_2g grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 52 \n", + "19 287 2y_2y grrygrrrgrrrrrgrr grrrgrrrgrrrrygrr 4 \n", + "20 291 3r_3r grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "21 292 3g_3g grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 37 \n", + "22 329 3g_3y grrrgGGrgrrrrrgrr grrrgrrygrrrrrgrr 4 \n", + "23 333 3g_4r grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 1 \n", + "24 334 3g_4g grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr 23 \n", + "25 357 3y_4g grrrgyyrgrrrrrgrr grrrgrrrgrrrrrgGr 4 \n", + "26 361 4r_4g grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgGr 1 \n", + "27 362 4g_4g grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr 42 \n", + "28 404 4y_4y grrrgrrrgrrrrrgry grrrgrrrgrrrrrgyr 4 \n", + "29 408 1r_1r grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "30 409 1g_1g grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr 38 \n", + "31 447 1y_1y grrrgrrrgyyyyrgrr gyyrgrrrgrrrrrgrr 4 \n", + "32 451 2r_2r grrrgrrrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "33 452 2g_2g grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr 40 \n", + "34 492 2y_2y grrygrrrgrrrrrgrr grrrgrrrgrrrrygrr 4 \n", + "35 496 3r_3r grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgrr 1 \n", + "36 497 3g_3g grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr 28 \n", + "37 525 3g_3y grrrgGGrgrrrrrgrr grrrgrrygrrrrrgrr 22 \n", + "\n", + " state \n", + "0 gGGrgrrrgGGGGrgrr \n", + "1 gyyrgrrrgyyyyrgrr \n", + "2 grrrgrrrgrrrrrgrr \n", + "3 grrGgrrrgrrrrGgrr \n", + "4 grrygrrrgrrrrygrr \n", + "5 grrrgGGrgrrrrrgrr \n", + "6 grrrgGGGgrrrrrgrr \n", + "7 grrrgGGygrrrrrgrr \n", + "8 grrrgGGrgrrrrrgGr \n", + "9 grrrgGGrgrrrrrgGr \n", + "10 grrrgyyrgrrrrrgGr \n", + "11 grrrgrrrgrrrrrgGr \n", + "12 grrrgrrrgrrrrrgGG \n", + "13 grrrgrrrgrrrrrgyy \n", + "14 grrrgrrrgrrrrrgrr \n", + "15 gGGrgrrrgGGGGrgrr \n", + "16 gyyrgrrrgyyyyrgrr \n", + "17 grrrgrrrgrrrrrgrr \n", + "18 grrGgrrrgrrrrGgrr \n", + "19 grrygrrrgrrrrygrr \n", + "20 grrrgGGrgrrrrrgrr \n", + "21 grrrgGGGgrrrrrgrr \n", + "22 grrrgGGygrrrrrgrr \n", + "23 grrrgGGrgrrrrrgGr \n", + "24 grrrgGGrgrrrrrgGr \n", + "25 grrrgyyrgrrrrrgGr \n", + "26 grrrgrrrgrrrrrgGr \n", + "27 grrrgrrrgrrrrrgGG \n", + "28 grrrgrrrgrrrrrgyy \n", + "29 grrrgrrrgrrrrrgrr \n", + "30 gGGrgrrrgGGGGrgrr \n", + "31 gyyrgrrrgyyyyrgrr \n", + "32 grrrgrrrgrrrrrgrr \n", + "33 grrGgrrrgrrrrGgrr \n", + "34 grrygrrrgrrrrygrr \n", + "35 grrrgGGrgrrrrrgrr \n", + "36 grrrgGGGgrrrrrgrr \n", + "37 grrrgGGygrrrrrgrr " + ] + }, + "execution_count": 311, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.merge(df_a, df_b, on='start_time', how='outer')\n", + "df = df.sort_values(by='start_time').reset_index(drop=True)\n", + "df[['phas_A', 'state_A']] = df[['phas_A', 'state_A']].fillna(method='ffill')\n", + "df[['phas_B', 'state_B']] = df[['phas_B', 'state_B']].fillna(method='ffill')\n", + "df['phase'] = df['phas_A'] + \"_\" + df['phas_B']\n", + "df = df[['start_time', 'phase', 'state_A', 'state_B']]\n", + "df['duration'] = df['start_time'].shift(-1) - df['start_time']\n", + "df = df[:-1]\n", + "df['duration'] = df['duration'].astype(int)\n", + "for row in df.itertuples():\n", + " state = ''\n", + " for a, b, in zip(row.state_A, row.state_B):\n", + " if a == 'r':\n", + " state += b\n", + " elif b == 'r':\n", + " state += a\n", + " elif a == b:\n", + " state += a\n", + " else:\n", + " raise ValueError(f\"예상되지 않은 조합 발생: a={a}, b={b}\")\n", + " df.at[row.Index, 'state'] = state\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 276, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 39, 43, 44, 84, 88, 89, 139, 143, 144, 176, 180, 181, 230, 234, 235, 287, 291, 292, 357, 361, 362, 404, 408, 409, 447, 451, 452, 492, 496, 497, 547]\n" + ] + } + ], + "source": [ + "start_times = set.union(set(df_a.start_time.unique()), set(df_a.start_time.unique()))\n", + "start_times = sorted(start_times)\n", + "print(start_times)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = df_a.copy()\n", + "start_times_additional = set(df_b.start_time.unique()) - set(df_a.start_time.unique())\n", + "for i, row in df.iterrows():\n", + " st = row.start_time\n", + " if st in start_times_additional:" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "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", + "
start_timephas_Astate_A
001ggrrrgrrrgGGGGrgrr
1391ygrrrgrrrgyyyyrgrr
2432rgrrrgrrrgrrrrrgrr
3442ggrrGgrrrgrrrrrgrr
4842ygrrygrrrgrrrrrgrr
5883rgrrrgGGrgrrrrrgrr
6893ggrrrgGGrgrrrrrgrr
71393ygrrrgyyrgrrrrrgrr
81434rgrrrgrrrgrrrrrgrr
91444ggrrrgrrrgrrrrrgrG
101764ygrrrgrrrgrrrrrgry
111801rgrrrgrrrgrrrrrgrr
121811ggrrrgrrrgGGGGrgrr
132301ygrrrgrrrgyyyyrgrr
142342rgrrrgrrrgrrrrrgrr
152352ggrrGgrrrgrrrrrgrr
162872ygrrygrrrgrrrrrgrr
172913rgrrrgGGrgrrrrrgrr
182923ggrrrgGGrgrrrrrgrr
193573ygrrrgyyrgrrrrrgrr
203614rgrrrgrrrgrrrrrgrr
213624ggrrrgrrrgrrrrrgrG
224044ygrrrgrrrgrrrrrgry
234081rgrrrgrrrgrrrrrgrr
244091ggrrrgrrrgGGGGrgrr
254471ygrrrgrrrgyyyyrgrr
264512rgrrrgrrrgrrrrrgrr
274522ggrrGgrrrgrrrrrgrr
284922ygrrygrrrgrrrrrgrr
294963rgrrrgGGrgrrrrrgrr
304973ggrrrgGGrgrrrrrgrr
315473ygrrrgyyrgrrrrrgrr
\n", + "
" + ], + "text/plain": [ + " start_time phas_A state_A\n", + "0 0 1g grrrgrrrgGGGGrgrr\n", + "1 39 1y grrrgrrrgyyyyrgrr\n", + "2 43 2r grrrgrrrgrrrrrgrr\n", + "3 44 2g grrGgrrrgrrrrrgrr\n", + "4 84 2y grrygrrrgrrrrrgrr\n", + "5 88 3r grrrgGGrgrrrrrgrr\n", + "6 89 3g grrrgGGrgrrrrrgrr\n", + "7 139 3y grrrgyyrgrrrrrgrr\n", + "8 143 4r grrrgrrrgrrrrrgrr\n", + "9 144 4g grrrgrrrgrrrrrgrG\n", + "10 176 4y grrrgrrrgrrrrrgry\n", + "11 180 1r grrrgrrrgrrrrrgrr\n", + "12 181 1g grrrgrrrgGGGGrgrr\n", + "13 230 1y grrrgrrrgyyyyrgrr\n", + "14 234 2r grrrgrrrgrrrrrgrr\n", + "15 235 2g grrGgrrrgrrrrrgrr\n", + "16 287 2y grrygrrrgrrrrrgrr\n", + "17 291 3r grrrgGGrgrrrrrgrr\n", + "18 292 3g grrrgGGrgrrrrrgrr\n", + "19 357 3y grrrgyyrgrrrrrgrr\n", + "20 361 4r grrrgrrrgrrrrrgrr\n", + "21 362 4g grrrgrrrgrrrrrgrG\n", + "22 404 4y grrrgrrrgrrrrrgry\n", + "23 408 1r grrrgrrrgrrrrrgrr\n", + "24 409 1g grrrgrrrgGGGGrgrr\n", + "25 447 1y grrrgrrrgyyyyrgrr\n", + "26 451 2r grrrgrrrgrrrrrgrr\n", + "27 452 2g grrGgrrrgrrrrrgrr\n", + "28 492 2y grrygrrrgrrrrrgrr\n", + "29 496 3r grrrgGGrgrrrrrgrr\n", + "30 497 3g grrrgGGrgrrrrrgrr\n", + "31 547 3y grrrgyyrgrrrrrgrr" + ] + }, + "execution_count": 207, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_A = df_A.reset_index(drop=True)\n", + "\n", + "df_a = []\n", + "\n", + "start_time = 0\n", + "elapsed = 0\n", + "for i, cur in df_A.iterrows():\n", + " \n", + " # pre, nex\n", + " if i != 0:\n", + " pre = df_A.iloc[i-1]\n", + " if i != len(df_A) - 1:\n", + " nex = df_A.iloc[i+1]\n", + " \n", + " # duration\n", + " if cur.phas_A == nex.phas_A:\n", + " continue\n", + " if cur.phas_A == pre.phas_A:\n", + " duration = cur.duration + pre.duration\n", + " else:\n", + " duration = cur.duration\n", + " start_times = []\n", + " state_As = []\n", + " phas_As = []\n", + "\n", + " # red\n", + " if i != 0:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " state_As.append(get_red(pre.state_A, cur.state_A))\n", + " phas_As.append(f'{cur.phas_A}r')\n", + " elapsed = cur.red_A\n", + " \n", + " # green\n", + " if i == 0:\n", + " start_time = 0\n", + " else:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " state_As.append(cur.state_A)\n", + " phas_As.append(f'{cur.phas_A}g')\n", + " if i == 0:\n", + " elapsed = duration - cur.yellow_A\n", + " else:\n", + " elapsed = duration - cur.yellow_A - cur.red_A\n", + " # yellow\n", + " if i != len(df_A) - 1:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " state_As.append(get_yellow(cur.state_A, nex.state_A))\n", + " phas_As.append(f'{cur.phas_A}y')\n", + " elapsed = cur.yellow_A\n", + " df_ = pd.DataFrame({'start_time':start_times, 'phas_A':phas_As, 'state_A':state_As})\n", + " df_a.append(df_)\n", + "df_a = pd.concat(df_a).reset_index(drop=True)\n", + "df_a" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "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", + "
start_timephas_Astate_A
001ggrrrgrrrgGGGGrgrr
1391ygrrrgrrrgyyyyrgrr
0432rgrrrgrrrgrrrrrgrr
1442ggrrGgrrrgrrrrrgrr
2842ygrrygrrrgrrrrrgrr
\n", + "
" + ], + "text/plain": [ + " start_time phas_A state_A\n", + "0 0 1g grrrgrrrgGGGGrgrr\n", + "1 39 1y grrrgrrrgyyyyrgrr\n", + "0 43 2r grrrgrrrgrrrrrgrr\n", + "1 44 2g grrGgrrrgrrrrrgrr\n", + "2 84 2y grrygrrrgrrrrrgrr" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_A = df_A.reset_index(drop=True)\n", + "df_a = []\n", + "\n", + "###\n", + "i = 0\n", + "cur = df_A.iloc[i]\n", + "nex = df_A.iloc[i+1]\n", + "\n", + "start_times = []\n", + "state_As = []\n", + "phas_As = []\n", + "\n", + "# green\n", + "start_time = 0\n", + "start_times.append(start_time)\n", + "state_As.append(cur.state_A)\n", + "phas_As.append(f'{cur.phas_A}g')\n", + "elapsed = cur.duration - cur.yellow_A\n", + "\n", + "# yellow\n", + "start_time += elapsed\n", + "start_times.append(start_time)\n", + "state_As.append(get_yellow(cur.state_A, nex.state_A))\n", + "phas_As.append(f'{cur.phas_A}y')\n", + "elapsed = cur.yellow_A\n", + "\n", + "df_ = pd.DataFrame({'start_time':start_times, 'phas_A':phas_As, 'state_A':state_As})\n", + "df_a.append(df_)\n", + "\n", + "###\n", + "i = 1\n", + "pre = df_A.iloc[i-1]\n", + "cur = df_A.iloc[i]\n", + "nex = df_A.iloc[i+1]\n", + "\n", + "start_times = []\n", + "state_As = []\n", + "phas_As = []\n", + "\n", + "# red\n", + "start_time += elapsed\n", + "start_times.append(start_time)\n", + "state_As.append(get_red(pre.state_A, cur.state_A))\n", + "phas_As.append(f'{cur.phas_A}r')\n", + "elapsed = cur.red_A\n", + "\n", + "# green\n", + "start_time += elapsed\n", + "start_times.append(start_time)\n", + "state_As.append(cur.state_A)\n", + "phas_As.append(f'{cur.phas_A}g')\n", + "\n", + "elapsed = cur.duration - cur.yellow_A - cur.red_A\n", + "\n", + "# yellow\n", + "start_time += elapsed\n", + "start_times.append(start_time)\n", + "state_As.append(get_yellow(cur.state_A, nex.state_A))\n", + "phas_As.append(f'{cur.phas_A}y')\n", + "\n", + "df_ = pd.DataFrame({'start_time':start_times, 'phas_A':phas_As, 'state_A':state_As})\n", + "df_a.append(df_)\n", + "\n", + "df_a = pd.concat(df_a)\n", + "df_a" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "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", + "
phas_Adurationstate_Ared_Ayellow_A
0143grrrgrrrgGGGGrgrr14
1245grrGgrrrgrrrrrgrr14
2333grrrgGGrgrrrrrgrr14
3322grrrgGGrgrrrrrgrr14
4437grrrgrrrgrrrrrgrG14
5154grrrgrrrgGGGGrgrr14
6257grrGgrrrgrrrrrgrr14
7342grrrgGGrgrrrrrgrr14
8328grrrgGGrgrrrrrgrr14
9447grrrgrrrgrrrrrgrG14
10143grrrgrrrgGGGGrgrr14
11245grrGgrrrgrrrrrgrr14
12333grrrgGGrgrrrrrgrr14
13322grrrgGGrgrrrrrgrr14
14437grrrgrrrgrrrrrgrG14
\n", + "
" + ], + "text/plain": [ + " phas_A duration state_A red_A yellow_A\n", + "0 1 43 grrrgrrrgGGGGrgrr 1 4\n", + "1 2 45 grrGgrrrgrrrrrgrr 1 4\n", + "2 3 33 grrrgGGrgrrrrrgrr 1 4\n", + "3 3 22 grrrgGGrgrrrrrgrr 1 4\n", + "4 4 37 grrrgrrrgrrrrrgrG 1 4\n", + "5 1 54 grrrgrrrgGGGGrgrr 1 4\n", + "6 2 57 grrGgrrrgrrrrrgrr 1 4\n", + "7 3 42 grrrgGGrgrrrrrgrr 1 4\n", + "8 3 28 grrrgGGrgrrrrrgrr 1 4\n", + "9 4 47 grrrgrrrgrrrrrgrG 1 4\n", + "10 1 43 grrrgrrrgGGGGrgrr 1 4\n", + "11 2 45 grrGgrrrgrrrrrgrr 1 4\n", + "12 3 33 grrrgGGrgrrrrrgrr 1 4\n", + "13 3 22 grrrgGGrgrrrrrgrr 1 4\n", + "14 4 37 grrrgrrrgrrrrrgrG 1 4" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_A" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
phas_Astate_Astart_time
01ggrrrgrrrgGGGGrgrr0
\n", + "
" + ], + "text/plain": [ + " phas_A state_A start_time\n", + "0 1g grrrgrrrgGGGGrgrr 0" + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_a = pd.concat(df_a)\n", + "df_a" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "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", + "
Unnamed: 0inter_nophas_Aphas_Bmove_Amove_B
001751184
111752273
221753361
331753462
441754452
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 inter_no phas_A phas_B move_A move_B\n", + "0 0 175 1 1 8 4\n", + "1 1 175 2 2 7 3\n", + "2 2 175 3 3 6 1\n", + "3 3 175 3 4 6 2\n", + "4 4 175 4 4 5 2" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.match1.query('inter_no==@inter_no')" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "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", + "
Unnamed: 0inter_nonode_idphase_noring_typemove_nostate
00175i01A8grrrgrrrgGGGGrgrr
11175i01B4gGGrgrrrgrrrrrgrr
22175i02A7grrGgrrrgrrrrrgrr
33175i02B3grrrgrrrgrrrrGgrr
44175i03A6grrrgGGrgrrrrrgrr
55175i03B1grrrgrrGgrrrrrgrr
66175i04A5grrrgrrrgrrrrrgrG
77175i04B2grrrgrrrgrrrrrgGr
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 inter_no node_id phase_no ring_type move_no \\\n", + "0 0 175 i0 1 A 8 \n", + "1 1 175 i0 1 B 4 \n", + "2 2 175 i0 2 A 7 \n", + "3 3 175 i0 2 B 3 \n", + "4 4 175 i0 3 A 6 \n", + "5 5 175 i0 3 B 1 \n", + "6 6 175 i0 4 A 5 \n", + "7 7 175 i0 4 B 2 \n", + "\n", + " state \n", + "0 grrrgrrrgGGGGrgrr \n", + "1 gGGrgrrrgrrrrrgrr \n", + "2 grrGgrrrgrrrrrgrr \n", + "3 grrrgrrrgrrrrGgrr \n", + "4 grrrgGGrgrrrrrgrr \n", + "5 grrrgrrGgrrrrrgrr \n", + "6 grrrgrrrgrrrrrgrG \n", + "7 grrrgrrrgrrrrrgGr " + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.match6.query('node_id==@Node_id')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "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", + "
Unnamed: 0dura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8dura_B1...red_B4red_A5red_B5red_A6red_B6red_A7red_B7red_A8red_B8inter_no
0243455537000043...111111111175
\n", + "

1 rows × 52 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 dura_A6 dura_A7 \\\n", + "0 2 43 45 55 37 0 0 0 \n", + "\n", + " dura_A8 dura_B1 ... red_B4 red_A5 red_B5 red_A6 red_B6 red_A7 \\\n", + "0 0 43 ... 1 1 1 1 1 1 \n", + "\n", + " red_B7 red_A8 red_B8 inter_no \n", + "0 1 1 1 175 \n", + "\n", + "[1 rows x 52 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from datetime import datetime \n", + "start_unix = self.sigtable.start_unix.iloc[0]\n", + "self.load_prow(inter_no, start_unix)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "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", + "
Unnamed: 0inter_nostart_hourstart_minutedura_A1dura_A2dura_A3dura_A4dura_A5dura_A6...red_A4red_B4red_A5red_B5red_A6red_B6red_A7red_B7red_A8red_B8
00175003739552900...1111111111
11175704042553300...1111111111
22175904345553700...1111111111
3317518304648554100...1111111111
\n", + "

4 rows × 54 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 inter_no start_hour start_minute dura_A1 dura_A2 dura_A3 \\\n", + "0 0 175 0 0 37 39 55 \n", + "1 1 175 7 0 40 42 55 \n", + "2 2 175 9 0 43 45 55 \n", + "3 3 175 18 30 46 48 55 \n", + "\n", + " dura_A4 dura_A5 dura_A6 ... red_A4 red_B4 red_A5 red_B5 red_A6 \\\n", + "0 29 0 0 ... 1 1 1 1 1 \n", + "1 33 0 0 ... 1 1 1 1 1 \n", + "2 37 0 0 ... 1 1 1 1 1 \n", + "3 41 0 0 ... 1 1 1 1 1 \n", + "\n", + " red_B6 red_A7 red_B7 red_A8 red_B8 \n", + "0 1 1 1 1 1 \n", + "1 1 1 1 1 1 \n", + "2 1 1 1 1 1 \n", + "3 1 1 1 1 1 \n", + "\n", + "[4 rows x 54 columns]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.plan.query('inter_no==@inter_no')" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4. 통합 테이블을 생성합니다.\n", + "5. 신호를 생성합니다.\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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstatephase_sumo
16175i01704416358118443gGGrgrrrgGGGGrgrr0
17175i01704416358227345grrGgrrrgrrrrGgrr1
18175i01704416358336133grrrgGGGgrrrrrgrr2
19175i01704416358346222grrrgGGrgrrrrrgGr3
20175i01704416358445237grrrgrrrgrrrrrgGG4
21175i01704416538118443gGGrgrrrgGGGGrgrr0
22175i01704416538227345grrGgrrrgrrrrGgrr1
23175i01704416538336133grrrgGGGgrrrrrgrr2
24175i01704416538346222grrrgGGrgrrrrrgGr3
25175i01704416538445237grrrgrrrgrrrrrgGG4
26175i01704416718118443gGGrgrrrgGGGGrgrr0
27175i01704416718227345grrGgrrrgrrrrGgrr1
28175i01704416718336133grrrgGGGgrrrrrgrr2
29175i01704416718346222grrrgGGrgrrrrrgGr3
30175i01704416718445237grrrgrrrgrrrrrgGG4
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "16 175 i0 1704416358 1 1 8 4 43 \n", + "17 175 i0 1704416358 2 2 7 3 45 \n", + "18 175 i0 1704416358 3 3 6 1 33 \n", + "19 175 i0 1704416358 3 4 6 2 22 \n", + "20 175 i0 1704416358 4 4 5 2 37 \n", + "21 175 i0 1704416538 1 1 8 4 43 \n", + "22 175 i0 1704416538 2 2 7 3 45 \n", + "23 175 i0 1704416538 3 3 6 1 33 \n", + "24 175 i0 1704416538 3 4 6 2 22 \n", + "25 175 i0 1704416538 4 4 5 2 37 \n", + "26 175 i0 1704416718 1 1 8 4 43 \n", + "27 175 i0 1704416718 2 2 7 3 45 \n", + "28 175 i0 1704416718 3 3 6 1 33 \n", + "29 175 i0 1704416718 3 4 6 2 22 \n", + "30 175 i0 1704416718 4 4 5 2 37 \n", + "\n", + " state phase_sumo \n", + "16 gGGrgrrrgGGGGrgrr 0 \n", + "17 grrGgrrrgrrrrGgrr 1 \n", + "18 grrrgGGGgrrrrrgrr 2 \n", + "19 grrrgGGrgrrrrrgGr 3 \n", + "20 grrrgrrrgrrrrrgGG 4 \n", + "21 gGGrgrrrgGGGGrgrr 0 \n", + "22 grrGgrrrgrrrrGgrr 1 \n", + "23 grrrgGGGgrrrrrgrr 2 \n", + "24 grrrgGGrgrrrrrgGr 3 \n", + "25 grrrgrrrgrrrrrgGG 4 \n", + "26 gGGrgrrrgGGGGrgrr 0 \n", + "27 grrGgrrrgrrrrGgrr 1 \n", + "28 grrrgGGGgrrrrrgrr 2 \n", + "29 grrrgGGrgrrrrrgGr 3 \n", + "30 grrrgrrrgrrrrrgGG 4 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "self.make_histids()\n", + "self.get_signals()\n", + "display(self.sigtable.query('node_id==@Node_id'))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "sts", + "language": "python", + "name": "sts" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb b/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb new file mode 100644 index 000000000..186b07f51 --- /dev/null +++ b/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb @@ -0,0 +1,1527 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.listdir('../../scripts')\n", + "import sys\n", + "sys.path.append('../../Scripts')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from generate_signals import SignalGenerator\n", + "from preprocess_daily import DailyPreprocessor" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "inter_no = 175\n", + "Node_id = 'i0'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. 데이터를 준비합니다.\n", + "1-1. 네트워크가 로드되었습니다.\n", + "1-2. 테이블들이 로드되었습니다.\n", + "2. 신호이력 테이블을 변환합니다.\n", + "3. 이동류정보 테이블을 변환합니다.\n", + "4. 통합 테이블을 생성합니다.\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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstatephase_sumo
0178c301704418730118433gggggg0_g
1178c30170441873011844gggggg0_y
2178c30170441873022731gggggg1__r
0178c301704418730227334GGGGGG1_g
1178c30170441873022734GGGGGG1_y
.................................
2210u60170441929933741ggggggggr3__r
0210u601704419299337465ggggggggr3_g
1210u60170441929933744ggggggggr3_y
2210u60170441929944831ggggggggr4__r
237210u601704419299448319ggggggggr4_g
\n", + "

684 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "0 178 c30 1704418730 1 1 8 4 33 \n", + "1 178 c30 1704418730 1 1 8 4 4 \n", + "2 178 c30 1704418730 2 2 7 3 1 \n", + "0 178 c30 1704418730 2 2 7 3 34 \n", + "1 178 c30 1704418730 2 2 7 3 4 \n", + ".. ... ... ... ... ... ... ... ... \n", + "2 210 u60 1704419299 3 3 7 4 1 \n", + "0 210 u60 1704419299 3 3 7 4 65 \n", + "1 210 u60 1704419299 3 3 7 4 4 \n", + "2 210 u60 1704419299 4 4 8 3 1 \n", + "237 210 u60 1704419299 4 4 8 3 19 \n", + "\n", + " state phase_sumo \n", + "0 gggggg 0_g \n", + "1 gggggg 0_y \n", + "2 gggggg 1__r \n", + "0 GGGGGG 1_g \n", + "1 GGGGGG 1_y \n", + ".. ... ... \n", + "2 ggggggggr 3__r \n", + "0 ggggggggr 3_g \n", + "1 ggggggggr 3_y \n", + "2 ggggggggr 4__r \n", + "237 ggggggggr 4_g \n", + "\n", + "[684 rows x 10 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# desired result\n", + "self = SignalGenerator()\n", + "self.prepare_data()\n", + "self.process_history()\n", + "self.process_movement()\n", + "self.make_histids()\n", + "self.set_timepoints()\n", + "self.assign_red_yellow()\n", + "self.self.self.self.self.self.self.self.self.self.self.self.self.self.SIGTABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLE" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. 데이터를 준비합니다.\n", + "1-1. 네트워크가 로드되었습니다.\n", + "1-2. 테이블들이 로드되었습니다.\n", + "2. 신호이력 테이블을 변환합니다.\n", + "3. 이동류정보 테이블을 변환합니다.\n" + ] + } + ], + "source": [ + "self = SignalGenerator()\n", + "self.prepare_data()\n", + "self.process_history()\n", + "self.process_movement()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "self.merge_dfs()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# 4-2. histid\n", + "self.histid = self.movedur.copy()\n", + "self.histid['node_id'] = self.histid['inter_no'].map(self.inter2node)\n", + "histid_start = self.present_time - 600\n", + "self.histid = self.histid[self.histid.start_unix > histid_start]\n", + "\n", + "mapping_dict = self.matching.set_index(['node_id', 'move_no'])['state'].to_dict()\n", + "\n", + "for i, row in self.histid.iterrows():\n", + " node_id = row.node_id\n", + " move_A = row.move_A\n", + " move_B = row.move_B\n", + " \n", + " # A링의 state 지정\n", + " if (node_id, move_A) in mapping_dict:\n", + " state_A = mapping_dict[(node_id, move_A)]\n", + " else:\n", + " state_A = ''.join(self.node2init[node_id])\n", + " self.histid.at[i, 'state_A'] = state_A\n", + "\n", + " # B링의 state 지정\n", + " if (node_id, move_B) in mapping_dict:\n", + " state_B = mapping_dict[(node_id, move_B)]\n", + " else:\n", + " state_B = ''.join(self.node2init[node_id])\n", + " self.histid.at[i, 'state_B'] = state_B " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate_Astate_B
0175i01704418520118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
1175i01704418520227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
2175i01704418520336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
3175i01704418520346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
4175i01704418520445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
62175i01704418699118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
63175i01704418699227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
64175i01704418699336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
65175i01704418699346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
66175i01704418699445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
131175i01704418880118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
132175i01704418880227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
133175i01704418880336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
134175i01704418880346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
135175i01704418880445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
193175i01704419060118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
194175i01704419060227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
195175i01704419060336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
196175i01704419060346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
197175i01704419060445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
259175i01704419240118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
260175i01704419240227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
261175i01704419240336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
262175i01704419240346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
263175i01704419240445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
337175i01704419420118443grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
338175i01704419420227345grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
339175i01704419420336133grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
340175i01704419420346222grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
341175i01704419420445237grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
380175i01704419520118424grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
381175i01704419520227325grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
382175i01704419520336118grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
383175i01704419520346213grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
384175i01704419520445220grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "0 175 i0 1704418520 1 1 8 4 43 \n", + "1 175 i0 1704418520 2 2 7 3 45 \n", + "2 175 i0 1704418520 3 3 6 1 33 \n", + "3 175 i0 1704418520 3 4 6 2 22 \n", + "4 175 i0 1704418520 4 4 5 2 37 \n", + "62 175 i0 1704418699 1 1 8 4 43 \n", + "63 175 i0 1704418699 2 2 7 3 45 \n", + "64 175 i0 1704418699 3 3 6 1 33 \n", + "65 175 i0 1704418699 3 4 6 2 22 \n", + "66 175 i0 1704418699 4 4 5 2 37 \n", + "131 175 i0 1704418880 1 1 8 4 43 \n", + "132 175 i0 1704418880 2 2 7 3 45 \n", + "133 175 i0 1704418880 3 3 6 1 33 \n", + "134 175 i0 1704418880 3 4 6 2 22 \n", + "135 175 i0 1704418880 4 4 5 2 37 \n", + "193 175 i0 1704419060 1 1 8 4 43 \n", + "194 175 i0 1704419060 2 2 7 3 45 \n", + "195 175 i0 1704419060 3 3 6 1 33 \n", + "196 175 i0 1704419060 3 4 6 2 22 \n", + "197 175 i0 1704419060 4 4 5 2 37 \n", + "259 175 i0 1704419240 1 1 8 4 43 \n", + "260 175 i0 1704419240 2 2 7 3 45 \n", + "261 175 i0 1704419240 3 3 6 1 33 \n", + "262 175 i0 1704419240 3 4 6 2 22 \n", + "263 175 i0 1704419240 4 4 5 2 37 \n", + "337 175 i0 1704419420 1 1 8 4 43 \n", + "338 175 i0 1704419420 2 2 7 3 45 \n", + "339 175 i0 1704419420 3 3 6 1 33 \n", + "340 175 i0 1704419420 3 4 6 2 22 \n", + "341 175 i0 1704419420 4 4 5 2 37 \n", + "380 175 i0 1704419520 1 1 8 4 24 \n", + "381 175 i0 1704419520 2 2 7 3 25 \n", + "382 175 i0 1704419520 3 3 6 1 18 \n", + "383 175 i0 1704419520 3 4 6 2 13 \n", + "384 175 i0 1704419520 4 4 5 2 20 \n", + "\n", + " state_A state_B \n", + "0 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "1 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "2 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "3 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "4 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "62 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "63 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "64 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "65 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "66 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "131 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "132 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "133 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "134 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "135 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "193 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "194 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "195 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "196 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "197 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "259 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "260 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "261 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "262 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "263 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "337 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "338 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "339 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "340 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "341 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n", + "380 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n", + "381 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n", + "382 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n", + "383 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n", + "384 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 4-3. histids\n", + "new_histids = []\n", + "for parent_id in self.parent_ids:\n", + " for child_id in self.pa2ch[parent_id]:\n", + " new_histid = self.histid.copy()[self.histid.node_id==parent_id].drop(columns=['state_A', 'state_B'])\n", + " # new_histid[['inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']] = np.nan\n", + " for i, row in new_histid.iterrows():\n", + " phas_A = row.phas_A\n", + " phas_B = row.phas_B\n", + " new_match = self.match6[self.match6.node_id==child_id]\n", + " Arow = new_match[(new_match.phase_no==phas_A) & (new_match.ring_type=='A')]\n", + "\n", + " # A링의 state 지정\n", + " state_A = Arow.iloc[0].state\n", + " new_histid.at[i, 'state_A'] = state_A\n", + "\n", + " # B링의 state 지정\n", + " Brow = new_match[(new_match.phase_no==phas_B) & (new_match.ring_type=='B')]\n", + " state_B = Brow.iloc[0].state\n", + " new_histid.at[i, 'state_B'] = state_B\n", + "\n", + " new_histid.at[i, 'node_id'] = child_id\n", + " new_histids.append(new_histid)\n", + "import pandas as pd\n", + "new_histids = pd.concat(new_histids)\n", + "self.histids = pd.concat([self.histid.copy(), new_histids])\n", + "self.histids = self.histids.sort_values(by=['start_unix', 'node_id', 'phas_A', 'phas_B']).reset_index(drop=True)\n", + "self.histids = self.histids[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration', 'state_A', 'state_B']]\n", + "self.histids.query('node_id==@Node_id')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "self.set_timepoints()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate_Astate_Bphase_sumo
0178c301704418730118438gggggggggggg0
1178c301704418730227339GGGggggggGGG1
2178c301704418730335243GGGggggggGGG2
3178c301704418730446122GGGggggggGGG3
4178c301704418900118438gggggggggggg0
....................................
233210u6017044192991161828ggggggggrggggggggr0
234210u601704419299126215ggggggggrggggggggr1
235210u601704419299225243ggggggggGggggggggr2
236210u601704419299337470ggggggggrggggggggr3
237210u601704419299448324ggggggggrggggggggr4
\n", + "

238 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n", + "0 178 c30 1704418730 1 1 8 4 38 \n", + "1 178 c30 1704418730 2 2 7 3 39 \n", + "2 178 c30 1704418730 3 3 5 2 43 \n", + "3 178 c30 1704418730 4 4 6 1 22 \n", + "4 178 c30 1704418900 1 1 8 4 38 \n", + ".. ... ... ... ... ... ... ... ... \n", + "233 210 u60 1704419299 1 1 6 18 28 \n", + "234 210 u60 1704419299 1 2 6 2 15 \n", + "235 210 u60 1704419299 2 2 5 2 43 \n", + "236 210 u60 1704419299 3 3 7 4 70 \n", + "237 210 u60 1704419299 4 4 8 3 24 \n", + "\n", + " state_A state_B phase_sumo \n", + "0 gggggg gggggg 0 \n", + "1 GGGggg gggGGG 1 \n", + "2 GGGggg gggGGG 2 \n", + "3 GGGggg gggGGG 3 \n", + "4 gggggg gggggg 0 \n", + ".. ... ... ... \n", + "233 ggggggggr ggggggggr 0 \n", + "234 ggggggggr ggggggggr 1 \n", + "235 ggggggggG ggggggggr 2 \n", + "236 ggggggggr ggggggggr 3 \n", + "237 ggggggggr ggggggggr 4 \n", + "\n", + "[238 rows x 11 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.sigtable" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "def get_red(pre_state:str, cur_state:str):\n", + " assert len(pre_state) == len(cur_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n", + " state_r = ''\n", + " for c, n in zip(pre_state, cur_state):\n", + " if c == n:\n", + " state_r += c\n", + " elif (c == 'r') and (n == 'G'):\n", + " state_r += 'r'\n", + " elif (c == 'G') and (n == 'r'):\n", + " state_r += 'r'\n", + " else:\n", + " raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n", + " return state_r\n", + "\n", + "def get_yellow(cur_state:str, nex_state:str):\n", + " assert len(cur_state) == len(nex_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n", + " state_y = ''\n", + " for c, n in zip(cur_state, nex_state):\n", + " if c == n:\n", + " state_y += c\n", + " elif (c == 'r') and (n == 'G'):\n", + " state_y += 'r'\n", + " elif (c == 'G') and (n == 'r'):\n", + " state_y += 'y'\n", + " else:\n", + " raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n", + " return state_y\n", + "\n", + "def cumulate(sig, alph):\n", + " csig = [] # cumulated sig\n", + " pre = pd.Series({f'phas_{alph}':None})\n", + "\n", + " start_time = 0\n", + " elapsed = 0\n", + " for i, cur in sig.iterrows():\n", + " start_unix = cur.start_unix\n", + " \n", + " # pre, nex\n", + " if i != 0:\n", + " pre = sig.iloc[i-1]\n", + " \n", + " if i != len(sig) - 1:\n", + " nex = sig.iloc[i+1]\n", + " \n", + " # duration\n", + " if cur[f'phas_{alph}'] == nex[f'phas_{alph}']:\n", + " continue\n", + " if cur[f'phas_{alph}'] == pre[f'phas_{alph}']:\n", + " duration = cur.duration + pre.duration\n", + " else:\n", + " duration = cur.duration\n", + " start_times = []\n", + " states = []\n", + " phases = []\n", + "\n", + " # red\n", + " if i != 0:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " states.append(get_red(pre[f'state_{alph}'], cur[f'state_{alph}']))\n", + " phases.append(f'{cur[f\"phas_{alph}\"]}r')\n", + "\n", + " elapsed = cur[f'red_{alph}']\n", + "\n", + " # green\n", + " if i == 0:\n", + " start_time = 0\n", + " else:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " states.append(cur[f'state_{alph}'])\n", + " phases.append(f'{cur[f\"phas_{alph}\"]}g')\n", + " if i == 0:\n", + " elapsed = duration - cur[f'yellow_{alph}']\n", + " else:\n", + " elapsed = duration - cur[f'yellow_{alph}'] - cur[f'red_{alph}']\n", + "\n", + " # yellow\n", + " if i != len(sig) - 1:\n", + " start_time += elapsed\n", + " start_times.append(start_time)\n", + " states.append(get_yellow(cur[f'state_{alph}'], nex[f'state_{alph}']))\n", + " phases.append(f'{cur[f\"phas_{alph}\"]}y')\n", + " elapsed = cur[f'yellow_{alph}']\n", + " sig_ = pd.DataFrame({'start_time':start_times, f'phas_{alph}':phases, f'state_{alph}':states})\n", + " sig_['start_unix'] = start_unix\n", + " csig.append(sig_)\n", + " csig = pd.concat(csig).reset_index(drop=True)\n", + " return csig" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "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", + "
node_idstart_unixphasedurationstate
0c3017044186991g_1g39gGGrgrrrgGGGGrgrr
1c3017044186991y_1y4gyyrgrrrgyyyyrgrr
2c3017044186992r_2r1grrrgrrrgrrrrrgrr
3c3017044186992g_2g40grrGgrrrgrrrrGgrr
4c3017044186992y_2y4grrygrrrgrrrrygrr
..................
33u6017044190602g_2g40grrGgrrrgrrrrGgrr
34u6017044190602y_2y4grrygrrrgrrrrygrr
35u6017044190603r_3r1grrrgGGrgrrrrrgrr
36u6017044190603g_3g28grrrgGGGgrrrrrgrr
37u6017044190603g_3y22grrrgGGygrrrrrgrr
\n", + "

570 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " node_id start_unix phase duration state\n", + "0 c30 1704418699 1g_1g 39 gGGrgrrrgGGGGrgrr\n", + "1 c30 1704418699 1y_1y 4 gyyrgrrrgyyyyrgrr\n", + "2 c30 1704418699 2r_2r 1 grrrgrrrgrrrrrgrr\n", + "3 c30 1704418699 2g_2g 40 grrGgrrrgrrrrGgrr\n", + "4 c30 1704418699 2y_2y 4 grrygrrrgrrrrygrr\n", + ".. ... ... ... ... ...\n", + "33 u60 1704419060 2g_2g 40 grrGgrrrgrrrrGgrr\n", + "34 u60 1704419060 2y_2y 4 grrygrrrgrrrrygrr\n", + "35 u60 1704419060 3r_3r 1 grrrgGGrgrrrrrgrr\n", + "36 u60 1704419060 3g_3g 28 grrrgGGGgrrrrrgrr\n", + "37 u60 1704419060 3g_3y 22 grrrgGGygrrrrrgrr\n", + "\n", + "[570 rows x 5 columns]" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self.SIGTABLE = []\n", + "for node_id in self.sigtable.node_id.unique():\n", + " sig = self.sigtable.query('node_id==@Node_id')\n", + " for i, row in sig.iterrows():\n", + " inter_no = row.inter_no\n", + " phas_A = row.phas_A\n", + " phas_B = row.phas_B\n", + " start_unix = row.start_unix\n", + " prow = self.load_prow(inter_no, start_unix)[1].iloc[0]\n", + " red_A = prow[f'red_A{phas_A}']\n", + " yellow_A = prow[f'yellow_A{phas_A}']\n", + " red_B = prow[f'red_B{phas_B}']\n", + " yellow_B = prow[f'yellow_B{phas_B}']\n", + " sig.loc[i, ['red_A', 'red_B', 'yellow_A', 'yellow_B']] = red_A, red_B, yellow_A, yellow_B\n", + " sig = sig.astype({'red_A': int, 'red_B': int, 'yellow_A': int, 'yellow_B': int,\n", + " 'phas_A':str, 'phas_B':str})\n", + " sig = sig.drop(['move_A','move_B'], axis=1)\n", + "\n", + " sig_A = sig[['start_unix', 'phas_A', 'duration', 'state_A', 'red_A', 'yellow_A']].reset_index(drop=True)\n", + " sig_B = sig[['start_unix', 'phas_B', 'duration', 'state_B', 'red_B', 'yellow_B']].reset_index(drop=True)\n", + "\n", + " csig_A = cumulate(sig_A, 'A')\n", + " csig_B = cumulate(sig_B, 'B')\n", + "\n", + " SIG = pd.merge(csig_A, csig_B, on=['start_time', 'start_unix'], how='outer')\n", + " SIG = SIG.sort_values(by='start_time').reset_index(drop=True)\n", + " SIG[['phas_A', 'state_A']] = SIG[['phas_A', 'state_A']].fillna(method='ffill')\n", + " SIG[['phas_B', 'state_B']] = SIG[['phas_B', 'state_B']].fillna(method='ffill')\n", + " SIG['phase'] = SIG['phas_A'] + \"_\" + SIG['phas_B']\n", + " SIG['node_id'] = node_id\n", + " SIG = SIG[['node_id', 'start_unix', 'start_time', 'phase', 'state_A', 'state_B']]\n", + " SIG['duration'] = SIG['start_time'].shift(-1) - SIG['start_time']\n", + " SIG = SIG[:-1]\n", + " SIG['duration'] = SIG['duration'].astype(int)\n", + " for row in SIG.itertuples():\n", + " state = ''\n", + " for a, b, in zip(row.state_A, row.state_B):\n", + " if a == 'r':\n", + " state += b\n", + " elif b == 'r':\n", + " state += a\n", + " elif a == b:\n", + " state += a\n", + " else:\n", + " raise ValueError(f\"예상되지 않은 조합 발생: a={a}, b={b}\")\n", + " SIG.at[row.Index, 'state'] = state\n", + " SIG = SIG.drop(columns=['start_time', 'state_A', 'state_B'])\n", + " self.SIGTABLE.append(SIG)\n", + "self.SIGTABLE = pd.concat(self.SIGTABLE)\n", + "self.SIGTABLE" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "sts", + "language": "python", + "name": "sts" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Analysis/0307_red_yellow/setup_tls_program.py b/Analysis/0307_red_yellow/setup_tls_program.py new file mode 100644 index 000000000..a07bdd3e5 --- /dev/null +++ b/Analysis/0307_red_yellow/setup_tls_program.py @@ -0,0 +1,274 @@ +import os +import sys +if '__file__' in globals(): + script_dir = os.path.dirname(os.path.abspath(__file__)) + sys.path.append(script_dir) + +import numpy as np +import pandas as pd + +GREEN_SET = {'g', 'G'} +YELLOW_SET = {'y'} +RED_SET = {'r'} +def get_intermediate_signal_state(prev, cur, signal_type='yellow'): + ''' + https://github.com/cts198859/deeprl_signal_control/blob/master/envs/env.py#L128-L152 + 'signal_type' has one of the following two values. ['yellow', 'red'] + ''' + + # 이전신호와 같을때 + if prev == cur: + return cur, False + + # 각 인덱스에 해당하는 문자를 비교 + switch_reds, switch_greens = [], [] + for i, (p0, p1) in enumerate(zip(prev, cur)): + + # 녹색에서 적색으로 바뀔 때 + if (p0 in GREEN_SET) and (p1 == 'r'): + switch_reds.append(i) + + # 적색에서 녹색으로 바뀔 때 + elif (p0 in 'r') and (p1 in GREEN_SET): + switch_greens.append(i) + + # 녹색에서 적색으로 바뀌는 경우가 없으면 + if (not switch_reds) and (signal_type == 'yellow'): + return cur, False + + mid = list(cur) + for i in switch_reds: + if signal_type == 'yellow': + mid[i] = 'y' + for i in switch_greens: + mid[i] = 'r' + + return ''.join(mid), True + + +class SetupTLSProgram: + def __init__(self, durations, reds, yellows, offset, states, path_tll_xml, name=None): + self.durations = self.as_array(durations) + self.reds = self.as_array(reds) + self.yellows = self.as_array(yellows) + self.offset = offset + self.states = states + self.path_tll_xml = path_tll_xml + self.name = name + self.num_phase = len(states) // 2 + + + def as_array(self, x): + if isinstance(x, list): + return np.array(x) + return x + + + def _val(self): + + # 길이가 짝수인지 확인 + if len(self.states) % 2 != 0: + raise ValueError("It must have an even number of elements. Odd length detected.") + + length = self.num_phase * 2 + if length != len(self.durations) or length != len(self.reds) or length != len(self.yellows): + raise ValueError("The length must all match length.") + + if len(set([len(s) for s in self.states])) != 1: + ValueError("All elements in 'states' must have the same length.") + + if np.sum(self.durations[:self.num_phase]) != np.sum(self.durations[self.num_phase:]): + raise ValueError("The sums of the two halves of durations do not match") + + self._check_always_red(self.states) + + self._validate_non_negative_elements(self.durations) + self._validate_non_negative_elements(self.reds) + self._validate_non_negative_elements(self.yellows) + self._validate_non_negative_elements(self.durations - self.reds - self.yellows) + + + def _validate_non_negative_elements(self, lst): + if any(x < 0 for x in lst): + raise ValueError('The list contains values less than 0. Please ensure all elements in the list are non-negative.') + + + def _check_always_red(self, states): + colors = ['r'] * len(states[0]) + for s in states: + for i, char in enumerate(s.lower()): + if char != 'r': + colors[i] = char + if 'r' in colors: + raise ValueError("'r' is not allowed in the colors collection.") + + + def _merge(self, s1, s2): + + if len(s1) != len(s2): + raise ValueError("The lengths of s1 and s2 must be the same.") + + new_s = [] + for c1, c2 in zip(s1, s2): + + if c1 == 'r': + new_s.append(c2) + elif c2 == 'r': + new_s.append(c1) + elif c1 == c2: + new_s.append(c1) + else: + raise ValueError(f"Unexpected characters encountered: c1={c1}, c2={c2}") + + return ''.join(new_s) + + + def _add(self, durations, reds, yellows, states, ring_type='None'): + greens = durations - reds - yellows + colors = [] + phase_numbers = [] + new_states = [] + for curr_i in range(len(states)): + + prev_i = (curr_i - 1 + len(states)) % len(states) + next_i = (curr_i + 1) % len(states) + phase_no = curr_i + 1 + + r_state, _ = get_intermediate_signal_state(states[prev_i], states[curr_i], signal_type='red') + y_state, has_y = get_intermediate_signal_state(states[curr_i], states[next_i], signal_type='yellow') + g_state = states[curr_i] + + # red + if reds[curr_i] != 0: + new_states += [r_state] * reds[curr_i] + colors += [1] * reds[curr_i] # 'r' + phase_numbers += [phase_no] * reds[curr_i] + + # green + new_states += [g_state] * greens[curr_i] + colors += [2] * greens[curr_i] # 'g' + phase_numbers += [phase_no] * greens[curr_i] + + # yellow + if has_y and yellows[curr_i] == 0: + raise ValueError('Yellow signal is required, but the yellow duration is 0.') + + if not has_y and yellows[curr_i] != 0: + y_state = g_state + + new_states += [y_state] * yellows[curr_i] + colors += [3] * yellows[curr_i] # 'y' + phase_numbers += [phase_no] * yellows[curr_i] + + df = pd.DataFrame( + { + f'{ring_type}_ring_phase_no':phase_numbers, + f'{ring_type}_ring_color':colors, + f'{ring_type}_ring_state':new_states} + ) + return df + + + def write_tll_xml(self, df_plan, path_tll_xml): + strings = ['\n'] + tllogic_id = 'None' if self.name is None else self.name + strings.append(f' \n') + for _, row in df_plan.iterrows(): + name = str(row['A_ring_phase_no']) + row['A_ring_color'] + name += '_' + str(row['B_ring_phase_no']) + row['B_ring_color'] + duration = row['duration'] + signal_state = row['signal_state'] + strings.append(f' \n') + strings.append(' \n') + strings.append('') + strings = ''.join(strings) + with open(path_tll_xml, 'w') as f: + f.write(strings) + + + def main(self): + + durations, reds, yellows, states = self.durations, self.reds, self.yellows, self.states + n = self.num_phase + + self._val() + + df_a = self._add(durations[:n], reds[:n], yellows[:n], states[:n], 'A') + df_b = self._add(durations[n:], reds[n:], yellows[n:], states[n:], 'B') + group_cols = ['A_ring_phase_no', 'A_ring_color', 'A_ring_state', 'B_ring_phase_no', 'B_ring_color', 'B_ring_state'] + sort_cols = ['A_ring_phase_no', 'A_ring_color', 'B_ring_phase_no', 'B_ring_color'] + df_plan = pd.concat([df_a, df_b], axis=1) \ + .groupby(group_cols) \ + .size() \ + .reset_index(name='duration') \ + .sort_values(by=sort_cols) \ + .reset_index(drop=True) + + mapping = {1: 'r', 2: 'g', 3: 'y'} + df_plan['A_ring_color'] = df_plan['A_ring_color'].map(mapping) + df_plan['B_ring_color'] = df_plan['B_ring_color'].map(mapping) + df_plan['signal_state'] = df_plan.apply(lambda row: self._merge(row['A_ring_state'], row['B_ring_state']), axis=1) + + assert df_plan['duration'].sum() == np.sum(durations[:n]) + assert df_plan['duration'].sum() == np.sum(durations[n:]) + + self.write_tll_xml(df_plan, self.path_tll_xml) + + return df_plan + + +if __name__ == '__main__': + + ''' + Test data + + - 교차로번호: 5034 + - 앞에서 부터 순서대로 A링1현시, A링2현시, ..., B링1현시, B링2현시, ... + ''' + + # 오버랩 테스트 + durations = [51, 34, 52, 43, 46, 39, 52, 43] + reds = [2, 2, 2, 2, 2, 2, 2, 2] + yellows = [4, 4, 4, 4, 4, 4, 4, 4] + offset = 5 + + # # 원본 + # durations = [53, 33, 51, 43, 26, 60, 51, 43] + # reds = [0, 0, 0, 0, 0, 0, 0, 0] + # yellows = [4, 4, 4, 4, 4, 4, 4, 4] + # offset = 0 + + # # 1795 (2023년 12월 20일 7시) + # durations = [58, 29, 50, 43, 28, 59, 50, 43] + # reds = [0, 0, 0, 0, 0, 0, 0, 0] + # yellows = [4, 4, 4, 4, 4, 4, 4, 4] + # offset = 0 + + # # 1888 (2023년 12월 21일 7시) + # durations = [61, 28, 48, 43, 27, 62, 48, 43] + # reds = [0, 0, 0, 0, 0, 0, 0, 0] + # yellows = [4, 4, 4, 4, 4, 4, 4, 4] + # offset = 0 + + # 각 현시의 이동류에 해당하는 signal state + signal_states = [ + 'rrrrrrrrrGGGGrrrrrrrr', + 'rrrGrrrrrrrrrrrrrrrrr', + 'rrrrGGGrrrrrrrrrrrrrr', + 'rrrrrrrrrrrrrrrrrrrGG', + 'rrrrrrrrrrrrrGGrrrrrr', + 'GGGrrrrrrrrrrrrrrrrrr', + 'rrrrrrrGGrrrrrrrrrrrr', + 'rrrrrrrrrrrrrrrGGGGrr' + ] + + # 저장할 경로 + path_xml = 'test.tll.xml' + path_csv = 'test.tll.csv' + + # 노드id + node_id = '11053' # 교차로번호: 5034 + + args = durations, reds, yellows, offset, signal_states, path_xml, node_id + SetupTLSProgram(*args).main().to_csv(path_csv, index=False) + print('hello') \ No newline at end of file diff --git a/Data/tables/plan.csv b/Data/tables/plan.csv index fc0924a78..8c9f751b1 100644 --- a/Data/tables/plan.csv +++ b/Data/tables/plan.csv @@ -1,33 +1,33 @@ -,inter_no,start_hour,start_minute,dura_A1,dura_A2,dura_A3,dura_A4,dura_A5,dura_A6,dura_A7,dura_A8,dura_B1,dura_B2,dura_B3,dura_B4,dura_B5,dura_B6,dura_B7,dura_B8,cycle,offset -0,175,00,00,37,39,55,29,0,0,0,0,37,39,25,59,0,0,0,0,160,57 -1,175,07,00,40,42,55,33,0,0,0,0,40,42,29,59,0,0,0,0,170,40 -2,175,09,00,43,45,55,37,0,0,0,0,43,45,33,59,0,0,0,0,180,28 -3,175,18,30,46,48,55,41,0,0,0,0,46,48,37,59,0,0,0,0,190,18 -4,176,00,00,37,73,40,0,0,0,0,0,37,73,40,0,0,0,0,0,150,131 -5,176,07,00,37,93,40,0,0,0,0,0,37,93,40,0,0,0,0,0,170,153 -6,176,09,00,37,103,40,0,0,0,0,0,37,103,40,0,0,0,0,0,180,169 -7,176,18,30,37,113,40,0,0,0,0,0,37,113,40,0,0,0,0,0,190,185 -8,177,00,00,36,20,68,26,0,0,0,0,36,20,68,26,0,0,0,0,150,35 -9,177,07,00,40,25,71,34,0,0,0,0,40,25,71,34,0,0,0,0,170,33 -10,177,09,00,43,27,70,40,0,0,0,0,43,27,70,40,0,0,0,0,180,41 -11,177,18,30,45,32,77,36,0,0,0,0,45,32,77,36,0,0,0,0,190,49 -12,178,00,00,38,39,40,23,0,0,0,0,38,39,40,23,0,0,0,0,140,50 -13,178,07,00,38,39,42,41,0,0,0,0,38,39,62,21,0,0,0,0,160,90 -14,178,09,00,38,39,43,50,0,0,0,0,38,39,71,22,0,0,0,0,170,80 -15,178,18,30,38,39,44,59,0,0,0,0,38,39,80,23,0,0,0,0,180,75 -16,201,00,00,24,24,17,58,17,0,0,0,24,24,17,58,17,0,0,0,140,133 -17,201,07,00,30,36,18,58,18,0,0,0,30,36,18,58,18,0,0,0,160,132 -18,201,09,00,33,36,25,58,18,0,0,0,33,36,25,58,18,0,0,0,170,134 -19,201,18,30,36,50,18,58,18,0,0,0,36,50,18,58,18,0,0,0,180,137 -20,202,00,00,39,101,0,0,0,0,0,0,39,101,0,0,0,0,0,0,140,103 -21,202,07,00,46,114,0,0,0,0,0,0,46,114,0,0,0,0,0,0,160,103 -22,202,09,00,46,114,0,0,0,0,0,0,46,114,0,0,0,0,0,0,160,103 -23,202,18,30,48,122,0,0,0,0,0,0,48,122,0,0,0,0,0,0,170,103 -24,206,00,00,33,35,26,26,0,0,0,0,33,35,26,26,0,0,0,0,120,10 -25,206,07,00,44,44,26,26,0,0,0,0,44,44,26,26,0,0,0,0,140,7 -26,206,09,00,45,53,26,26,0,0,0,0,45,53,26,26,0,0,0,0,150,17 -27,206,18,30,46,62,26,26,0,0,0,0,46,62,26,26,0,0,0,0,160,10 -28,210,00,00,43,29,56,22,0,0,0,0,24,48,56,22,0,0,0,0,150,115 -29,210,07,00,43,39,65,23,0,0,0,0,24,58,65,23,0,0,0,0,170,131 -30,210,09,00,43,43,70,24,0,0,0,0,28,58,70,24,0,0,0,0,180,137 -31,210,18,30,43,47,75,25,0,0,0,0,24,66,75,25,0,0,0,0,190,143 +,inter_no,start_hour,start_minute,dura_A1,dura_A2,dura_A3,dura_A4,dura_A5,dura_A6,dura_A7,dura_A8,dura_B1,dura_B2,dura_B3,dura_B4,dura_B5,dura_B6,dura_B7,dura_B8,cycle,offset,yellow_A1,yellow_B1,yellow_A2,yellow_B2,yellow_A3,yellow_B3,yellow_A4,yellow_B4,yellow_A5,yellow_B5,yellow_A6,yellow_B6,yellow_A7,yellow_B7,yellow_A8,yellow_B8,red_A1,red_B1,red_A2,red_B2,red_A3,red_B3,red_A4,red_B4,red_A5,red_B5,red_A6,red_B6,red_A7,red_B7,red_A8,red_B8 +0,175,00,00,37,39,55,29,0,0,0,0,37,39,25,59,0,0,0,0,160,57,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +1,175,07,00,40,42,55,33,0,0,0,0,40,42,29,59,0,0,0,0,170,40,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +2,175,09,00,43,45,55,37,0,0,0,0,43,45,33,59,0,0,0,0,180,28,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +3,175,18,30,46,48,55,41,0,0,0,0,46,48,37,59,0,0,0,0,190,18,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +4,176,00,00,37,73,40,0,0,0,0,0,37,73,40,0,0,0,0,0,150,131,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +5,176,07,00,37,93,40,0,0,0,0,0,37,93,40,0,0,0,0,0,170,153,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +6,176,09,00,37,103,40,0,0,0,0,0,37,103,40,0,0,0,0,0,180,169,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +7,176,18,30,37,113,40,0,0,0,0,0,37,113,40,0,0,0,0,0,190,185,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +8,177,00,00,36,20,68,26,0,0,0,0,36,20,68,26,0,0,0,0,150,35,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +9,177,07,00,40,25,71,34,0,0,0,0,40,25,71,34,0,0,0,0,170,33,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +10,177,09,00,43,27,70,40,0,0,0,0,43,27,70,40,0,0,0,0,180,41,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +11,177,18,30,45,32,77,36,0,0,0,0,45,32,77,36,0,0,0,0,190,49,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +12,178,00,00,38,39,40,23,0,0,0,0,38,39,40,23,0,0,0,0,140,50,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +13,178,07,00,38,39,42,41,0,0,0,0,38,39,62,21,0,0,0,0,160,90,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +14,178,09,00,38,39,43,50,0,0,0,0,38,39,71,22,0,0,0,0,170,80,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +15,178,18,30,38,39,44,59,0,0,0,0,38,39,80,23,0,0,0,0,180,75,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +16,201,00,00,24,24,17,58,17,0,0,0,24,24,17,58,17,0,0,0,140,133,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +17,201,07,00,30,36,18,58,18,0,0,0,30,36,18,58,18,0,0,0,160,132,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +18,201,09,00,33,36,25,58,18,0,0,0,33,36,25,58,18,0,0,0,170,134,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +19,201,18,30,36,50,18,58,18,0,0,0,36,50,18,58,18,0,0,0,180,137,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +20,202,00,00,39,101,0,0,0,0,0,0,39,101,0,0,0,0,0,0,140,103,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +21,202,07,00,46,114,0,0,0,0,0,0,46,114,0,0,0,0,0,0,160,103,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +22,202,09,00,46,114,0,0,0,0,0,0,46,114,0,0,0,0,0,0,160,103,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +23,202,18,30,48,122,0,0,0,0,0,0,48,122,0,0,0,0,0,0,170,103,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +24,206,00,00,33,35,26,26,0,0,0,0,33,35,26,26,0,0,0,0,120,10,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +25,206,07,00,44,44,26,26,0,0,0,0,44,44,26,26,0,0,0,0,140,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +26,206,09,00,45,53,26,26,0,0,0,0,45,53,26,26,0,0,0,0,150,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +27,206,18,30,46,62,26,26,0,0,0,0,46,62,26,26,0,0,0,0,160,10,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +28,210,00,00,43,29,56,22,0,0,0,0,24,48,56,22,0,0,0,0,150,115,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +29,210,07,00,43,39,65,23,0,0,0,0,24,58,65,23,0,0,0,0,170,131,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +30,210,09,00,43,43,70,24,0,0,0,0,28,58,70,24,0,0,0,0,180,137,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 +31,210,18,30,43,47,75,25,0,0,0,0,24,66,75,25,0,0,0,0,190,143,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 diff --git a/Data/tables/raw_tables/0116_make_sample_table.ipynb b/Data/tables/raw_tables/0116_make_sample_table.ipynb index 8fd16a5d2..7f30e8d47 100644 --- a/Data/tables/raw_tables/0116_make_sample_table.ipynb +++ b/Data/tables/raw_tables/0116_make_sample_table.ipynb @@ -501,7 +501,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 75, "metadata": {}, "outputs": [ { @@ -535,7 +535,7 @@ " dura_A5\n", " dura_A6\n", " dura_A7\n", - " ...\n", + " dura_A8\n", " dura_B1\n", " dura_B2\n", " dura_B3\n", @@ -546,6 +546,38 @@ " dura_B8\n", " cycle\n", " offset\n", + " yellow_A1\n", + " yellow_B1\n", + " yellow_A2\n", + " yellow_B2\n", + " yellow_A3\n", + " yellow_B3\n", + " yellow_A4\n", + " yellow_B4\n", + " yellow_A5\n", + " yellow_B5\n", + " yellow_A6\n", + " yellow_B6\n", + " yellow_A7\n", + " yellow_B7\n", + " yellow_A8\n", + " yellow_B8\n", + " red_A1\n", + " red_B1\n", + " red_A2\n", + " red_B2\n", + " red_A3\n", + " red_B3\n", + " red_A4\n", + " red_B4\n", + " red_A5\n", + " red_B5\n", + " red_A6\n", + " red_B6\n", + " red_A7\n", + " red_B7\n", + " red_A8\n", + " red_B8\n", " \n", " \n", " \n", @@ -561,7 +593,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 37\n", " 39\n", " 25\n", @@ -572,6 +604,38 @@ " 0\n", " 160\n", " 57\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 1\n", @@ -585,7 +649,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 40\n", " 42\n", " 29\n", @@ -596,6 +660,38 @@ " 0\n", " 170\n", " 40\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 2\n", @@ -609,7 +705,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 43\n", " 45\n", " 33\n", @@ -620,6 +716,38 @@ " 0\n", " 180\n", " 28\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 3\n", @@ -633,7 +761,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 46\n", " 48\n", " 37\n", @@ -644,6 +772,38 @@ " 0\n", " 190\n", " 18\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 4\n", @@ -657,7 +817,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 37\n", " 73\n", " 40\n", @@ -668,6 +828,38 @@ " 0\n", " 150\n", " 131\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 5\n", @@ -681,7 +873,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 37\n", " 93\n", " 40\n", @@ -692,6 +884,38 @@ " 0\n", " 170\n", " 153\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 6\n", @@ -705,7 +929,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 37\n", " 103\n", " 40\n", @@ -716,6 +940,38 @@ " 0\n", " 180\n", " 169\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 7\n", @@ -729,7 +985,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 37\n", " 113\n", " 40\n", @@ -740,6 +996,38 @@ " 0\n", " 190\n", " 185\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 8\n", @@ -753,7 +1041,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 36\n", " 20\n", " 68\n", @@ -764,6 +1052,38 @@ " 0\n", " 150\n", " 35\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 9\n", @@ -777,7 +1097,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 40\n", " 25\n", " 71\n", @@ -788,6 +1108,38 @@ " 0\n", " 170\n", " 33\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 10\n", @@ -801,7 +1153,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 43\n", " 27\n", " 70\n", @@ -812,6 +1164,38 @@ " 0\n", " 180\n", " 41\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 11\n", @@ -825,7 +1209,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 45\n", " 32\n", " 77\n", @@ -836,6 +1220,38 @@ " 0\n", " 190\n", " 49\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 12\n", @@ -849,7 +1265,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 38\n", " 39\n", " 40\n", @@ -860,6 +1276,38 @@ " 0\n", " 140\n", " 50\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 13\n", @@ -873,7 +1321,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 38\n", " 39\n", " 62\n", @@ -884,6 +1332,38 @@ " 0\n", " 160\n", " 90\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 14\n", @@ -897,7 +1377,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 38\n", " 39\n", " 71\n", @@ -908,6 +1388,38 @@ " 0\n", " 170\n", " 80\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 15\n", @@ -921,7 +1433,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 38\n", " 39\n", " 80\n", @@ -932,6 +1444,38 @@ " 0\n", " 180\n", " 75\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 16\n", @@ -945,7 +1489,7 @@ " 17\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 24\n", " 24\n", " 17\n", @@ -956,6 +1500,38 @@ " 0\n", " 140\n", " 133\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 17\n", @@ -969,7 +1545,7 @@ " 18\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 30\n", " 36\n", " 18\n", @@ -980,6 +1556,38 @@ " 0\n", " 160\n", " 132\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 18\n", @@ -993,7 +1601,7 @@ " 18\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 33\n", " 36\n", " 25\n", @@ -1004,6 +1612,38 @@ " 0\n", " 170\n", " 134\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 19\n", @@ -1017,7 +1657,7 @@ " 18\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 36\n", " 50\n", " 18\n", @@ -1028,6 +1668,38 @@ " 0\n", " 180\n", " 137\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 3\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 20\n", @@ -1041,7 +1713,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 39\n", " 101\n", " 0\n", @@ -1052,6 +1724,38 @@ " 0\n", " 140\n", " 103\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 21\n", @@ -1065,7 +1769,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 46\n", " 114\n", " 0\n", @@ -1076,6 +1780,38 @@ " 0\n", " 160\n", " 103\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 22\n", @@ -1089,7 +1825,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 46\n", " 114\n", " 0\n", @@ -1100,6 +1836,38 @@ " 0\n", " 160\n", " 103\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 23\n", @@ -1113,7 +1881,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 48\n", " 122\n", " 0\n", @@ -1124,6 +1892,38 @@ " 0\n", " 170\n", " 103\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 24\n", @@ -1137,7 +1937,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 33\n", " 35\n", " 26\n", @@ -1148,6 +1948,38 @@ " 0\n", " 120\n", " 10\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 25\n", @@ -1161,7 +1993,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 44\n", " 44\n", " 26\n", @@ -1172,6 +2004,38 @@ " 0\n", " 140\n", " 7\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 26\n", @@ -1185,7 +2049,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 45\n", " 53\n", " 26\n", @@ -1196,6 +2060,38 @@ " 0\n", " 150\n", " 17\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 27\n", @@ -1209,7 +2105,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 46\n", " 62\n", " 26\n", @@ -1220,6 +2116,38 @@ " 0\n", " 160\n", " 10\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", " \n", " \n", " 28\n", @@ -1233,7 +2161,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 24\n", " 48\n", " 56\n", @@ -1244,6 +2172,38 @@ " 0\n", " 150\n", " 115\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 29\n", @@ -1257,7 +2217,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 24\n", " 58\n", " 65\n", @@ -1268,6 +2228,38 @@ " 0\n", " 170\n", " 131\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 30\n", @@ -1281,7 +2273,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 28\n", " 58\n", " 70\n", @@ -1292,6 +2284,38 @@ " 0\n", " 180\n", " 137\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", " 31\n", @@ -1305,7 +2329,7 @@ " 0\n", " 0\n", " 0\n", - " ...\n", + " 0\n", " 24\n", " 66\n", " 75\n", @@ -1316,10 +2340,41 @@ " 0\n", " 190\n", " 143\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 4\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", + " 2\n", " \n", " \n", "\n", - "

32 rows × 21 columns

\n", "" ], "text/plain": [ @@ -1357,75 +2412,243 @@ "30 210 09 00 43 43 70 24 \n", "31 210 18 30 43 47 75 25 \n", "\n", - " dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n", - "0 0 0 0 ... 37 39 25 59 \n", - "1 0 0 0 ... 40 42 29 59 \n", - "2 0 0 0 ... 43 45 33 59 \n", - "3 0 0 0 ... 46 48 37 59 \n", - "4 0 0 0 ... 37 73 40 0 \n", - "5 0 0 0 ... 37 93 40 0 \n", - "6 0 0 0 ... 37 103 40 0 \n", - "7 0 0 0 ... 37 113 40 0 \n", - "8 0 0 0 ... 36 20 68 26 \n", - "9 0 0 0 ... 40 25 71 34 \n", - "10 0 0 0 ... 43 27 70 40 \n", - "11 0 0 0 ... 45 32 77 36 \n", - "12 0 0 0 ... 38 39 40 23 \n", - "13 0 0 0 ... 38 39 62 21 \n", - "14 0 0 0 ... 38 39 71 22 \n", - "15 0 0 0 ... 38 39 80 23 \n", - "16 17 0 0 ... 24 24 17 58 \n", - "17 18 0 0 ... 30 36 18 58 \n", - "18 18 0 0 ... 33 36 25 58 \n", - "19 18 0 0 ... 36 50 18 58 \n", - "20 0 0 0 ... 39 101 0 0 \n", - "21 0 0 0 ... 46 114 0 0 \n", - "22 0 0 0 ... 46 114 0 0 \n", - "23 0 0 0 ... 48 122 0 0 \n", - "24 0 0 0 ... 33 35 26 26 \n", - "25 0 0 0 ... 44 44 26 26 \n", - "26 0 0 0 ... 45 53 26 26 \n", - "27 0 0 0 ... 46 62 26 26 \n", - "28 0 0 0 ... 24 48 56 22 \n", - "29 0 0 0 ... 24 58 65 23 \n", - "30 0 0 0 ... 28 58 70 24 \n", - "31 0 0 0 ... 24 66 75 25 \n", + " dura_A5 dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 \\\n", + "0 0 0 0 0 37 39 25 59 \n", + "1 0 0 0 0 40 42 29 59 \n", + "2 0 0 0 0 43 45 33 59 \n", + "3 0 0 0 0 46 48 37 59 \n", + "4 0 0 0 0 37 73 40 0 \n", + "5 0 0 0 0 37 93 40 0 \n", + "6 0 0 0 0 37 103 40 0 \n", + "7 0 0 0 0 37 113 40 0 \n", + "8 0 0 0 0 36 20 68 26 \n", + "9 0 0 0 0 40 25 71 34 \n", + "10 0 0 0 0 43 27 70 40 \n", + "11 0 0 0 0 45 32 77 36 \n", + "12 0 0 0 0 38 39 40 23 \n", + "13 0 0 0 0 38 39 62 21 \n", + "14 0 0 0 0 38 39 71 22 \n", + "15 0 0 0 0 38 39 80 23 \n", + "16 17 0 0 0 24 24 17 58 \n", + "17 18 0 0 0 30 36 18 58 \n", + "18 18 0 0 0 33 36 25 58 \n", + "19 18 0 0 0 36 50 18 58 \n", + "20 0 0 0 0 39 101 0 0 \n", + "21 0 0 0 0 46 114 0 0 \n", + "22 0 0 0 0 46 114 0 0 \n", + "23 0 0 0 0 48 122 0 0 \n", + "24 0 0 0 0 33 35 26 26 \n", + "25 0 0 0 0 44 44 26 26 \n", + "26 0 0 0 0 45 53 26 26 \n", + "27 0 0 0 0 46 62 26 26 \n", + "28 0 0 0 0 24 48 56 22 \n", + "29 0 0 0 0 24 58 65 23 \n", + "30 0 0 0 0 28 58 70 24 \n", + "31 0 0 0 0 24 66 75 25 \n", + "\n", + " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset yellow_A1 yellow_B1 \\\n", + "0 0 0 0 0 160 57 4 4 \n", + "1 0 0 0 0 170 40 4 4 \n", + "2 0 0 0 0 180 28 4 4 \n", + "3 0 0 0 0 190 18 4 4 \n", + "4 0 0 0 0 150 131 4 4 \n", + "5 0 0 0 0 170 153 4 4 \n", + "6 0 0 0 0 180 169 4 4 \n", + "7 0 0 0 0 190 185 4 4 \n", + "8 0 0 0 0 150 35 4 4 \n", + "9 0 0 0 0 170 33 4 4 \n", + "10 0 0 0 0 180 41 4 4 \n", + "11 0 0 0 0 190 49 4 4 \n", + "12 0 0 0 0 140 50 4 4 \n", + "13 0 0 0 0 160 90 4 4 \n", + "14 0 0 0 0 170 80 4 4 \n", + "15 0 0 0 0 180 75 4 4 \n", + "16 17 0 0 0 140 133 3 3 \n", + "17 18 0 0 0 160 132 3 3 \n", + "18 18 0 0 0 170 134 3 3 \n", + "19 18 0 0 0 180 137 3 3 \n", + "20 0 0 0 0 140 103 4 4 \n", + "21 0 0 0 0 160 103 4 4 \n", + "22 0 0 0 0 160 103 4 4 \n", + "23 0 0 0 0 170 103 4 4 \n", + "24 0 0 0 0 120 10 4 4 \n", + "25 0 0 0 0 140 7 4 4 \n", + "26 0 0 0 0 150 17 4 4 \n", + "27 0 0 0 0 160 10 4 4 \n", + "28 0 0 0 0 150 115 4 4 \n", + "29 0 0 0 0 170 131 4 4 \n", + "30 0 0 0 0 180 137 4 4 \n", + "31 0 0 0 0 190 143 4 4 \n", + "\n", + " yellow_A2 yellow_B2 yellow_A3 yellow_B3 yellow_A4 yellow_B4 \\\n", + "0 4 4 4 4 4 4 \n", + "1 4 4 4 4 4 4 \n", + "2 4 4 4 4 4 4 \n", + "3 4 4 4 4 4 4 \n", + "4 4 4 4 4 4 4 \n", + "5 4 4 4 4 4 4 \n", + "6 4 4 4 4 4 4 \n", + "7 4 4 4 4 4 4 \n", + "8 4 4 4 4 4 4 \n", + "9 4 4 4 4 4 4 \n", + "10 4 4 4 4 4 4 \n", + "11 4 4 4 4 4 4 \n", + "12 4 4 4 4 4 4 \n", + "13 4 4 4 4 4 4 \n", + "14 4 4 4 4 4 4 \n", + "15 4 4 4 4 4 4 \n", + "16 3 3 3 3 3 3 \n", + "17 3 3 3 3 3 3 \n", + "18 3 3 3 3 3 3 \n", + "19 3 3 3 3 3 3 \n", + "20 4 4 4 4 4 4 \n", + "21 4 4 4 4 4 4 \n", + "22 4 4 4 4 4 4 \n", + "23 4 4 4 4 4 4 \n", + "24 4 4 4 4 4 4 \n", + "25 4 4 4 4 4 4 \n", + "26 4 4 4 4 4 4 \n", + "27 4 4 4 4 4 4 \n", + "28 4 4 4 4 4 4 \n", + "29 4 4 4 4 4 4 \n", + "30 4 4 4 4 4 4 \n", + "31 4 4 4 4 4 4 \n", + "\n", + " yellow_A5 yellow_B5 yellow_A6 yellow_B6 yellow_A7 yellow_B7 \\\n", + "0 4 4 4 4 4 4 \n", + "1 4 4 4 4 4 4 \n", + "2 4 4 4 4 4 4 \n", + "3 4 4 4 4 4 4 \n", + "4 4 4 4 4 4 4 \n", + "5 4 4 4 4 4 4 \n", + "6 4 4 4 4 4 4 \n", + "7 4 4 4 4 4 4 \n", + "8 4 4 4 4 4 4 \n", + "9 4 4 4 4 4 4 \n", + "10 4 4 4 4 4 4 \n", + "11 4 4 4 4 4 4 \n", + "12 4 4 4 4 4 4 \n", + "13 4 4 4 4 4 4 \n", + "14 4 4 4 4 4 4 \n", + "15 4 4 4 4 4 4 \n", + "16 3 3 3 3 3 3 \n", + "17 3 3 3 3 3 3 \n", + "18 3 3 3 3 3 3 \n", + "19 3 3 3 3 3 3 \n", + "20 4 4 4 4 4 4 \n", + "21 4 4 4 4 4 4 \n", + "22 4 4 4 4 4 4 \n", + "23 4 4 4 4 4 4 \n", + "24 4 4 4 4 4 4 \n", + "25 4 4 4 4 4 4 \n", + "26 4 4 4 4 4 4 \n", + "27 4 4 4 4 4 4 \n", + "28 4 4 4 4 4 4 \n", + "29 4 4 4 4 4 4 \n", + "30 4 4 4 4 4 4 \n", + "31 4 4 4 4 4 4 \n", "\n", - " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n", - "0 0 0 0 0 160 57 \n", - "1 0 0 0 0 170 40 \n", - "2 0 0 0 0 180 28 \n", - "3 0 0 0 0 190 18 \n", - "4 0 0 0 0 150 131 \n", - "5 0 0 0 0 170 153 \n", - "6 0 0 0 0 180 169 \n", - "7 0 0 0 0 190 185 \n", - "8 0 0 0 0 150 35 \n", - "9 0 0 0 0 170 33 \n", - "10 0 0 0 0 180 41 \n", - "11 0 0 0 0 190 49 \n", - "12 0 0 0 0 140 50 \n", - "13 0 0 0 0 160 90 \n", - "14 0 0 0 0 170 80 \n", - "15 0 0 0 0 180 75 \n", - "16 17 0 0 0 140 133 \n", - "17 18 0 0 0 160 132 \n", - "18 18 0 0 0 170 134 \n", - "19 18 0 0 0 180 137 \n", - "20 0 0 0 0 140 103 \n", - "21 0 0 0 0 160 103 \n", - "22 0 0 0 0 160 103 \n", - "23 0 0 0 0 170 103 \n", - "24 0 0 0 0 120 10 \n", - "25 0 0 0 0 140 7 \n", - "26 0 0 0 0 150 17 \n", - "27 0 0 0 0 160 10 \n", - "28 0 0 0 0 150 115 \n", - "29 0 0 0 0 170 131 \n", - "30 0 0 0 0 180 137 \n", - "31 0 0 0 0 190 143 \n", + " yellow_A8 yellow_B8 red_A1 red_B1 red_A2 red_B2 red_A3 red_B3 \\\n", + "0 4 4 1 1 1 1 1 1 \n", + "1 4 4 1 1 1 1 1 1 \n", + "2 4 4 1 1 1 1 1 1 \n", + "3 4 4 1 1 1 1 1 1 \n", + "4 4 4 1 1 1 1 1 1 \n", + "5 4 4 1 1 1 1 1 1 \n", + "6 4 4 1 1 1 1 1 1 \n", + "7 4 4 1 1 1 1 1 1 \n", + "8 4 4 1 1 1 1 1 1 \n", + "9 4 4 1 1 1 1 1 1 \n", + "10 4 4 1 1 1 1 1 1 \n", + "11 4 4 1 1 1 1 1 1 \n", + "12 4 4 2 2 2 2 2 2 \n", + "13 4 4 2 2 2 2 2 2 \n", + "14 4 4 2 2 2 2 2 2 \n", + "15 4 4 2 2 2 2 2 2 \n", + "16 3 3 2 2 2 2 2 2 \n", + "17 3 3 2 2 2 2 2 2 \n", + "18 3 3 2 2 2 2 2 2 \n", + "19 3 3 2 2 2 2 2 2 \n", + "20 4 4 1 1 1 1 1 1 \n", + "21 4 4 1 1 1 1 1 1 \n", + "22 4 4 1 1 1 1 1 1 \n", + "23 4 4 1 1 1 1 1 1 \n", + "24 4 4 1 1 1 1 1 1 \n", + "25 4 4 1 1 1 1 1 1 \n", + "26 4 4 1 1 1 1 1 1 \n", + "27 4 4 1 1 1 1 1 1 \n", + "28 4 4 2 2 2 2 2 2 \n", + "29 4 4 2 2 2 2 2 2 \n", + "30 4 4 2 2 2 2 2 2 \n", + "31 4 4 2 2 2 2 2 2 \n", "\n", - "[32 rows x 21 columns]" + " red_A4 red_B4 red_A5 red_B5 red_A6 red_B6 red_A7 red_B7 red_A8 \\\n", + "0 1 1 1 1 1 1 1 1 1 \n", + "1 1 1 1 1 1 1 1 1 1 \n", + "2 1 1 1 1 1 1 1 1 1 \n", + "3 1 1 1 1 1 1 1 1 1 \n", + "4 1 1 1 1 1 1 1 1 1 \n", + "5 1 1 1 1 1 1 1 1 1 \n", + "6 1 1 1 1 1 1 1 1 1 \n", + "7 1 1 1 1 1 1 1 1 1 \n", + "8 1 1 1 1 1 1 1 1 1 \n", + "9 1 1 1 1 1 1 1 1 1 \n", + "10 1 1 1 1 1 1 1 1 1 \n", + "11 1 1 1 1 1 1 1 1 1 \n", + "12 2 2 2 2 2 2 2 2 2 \n", + "13 2 2 2 2 2 2 2 2 2 \n", + "14 2 2 2 2 2 2 2 2 2 \n", + "15 2 2 2 2 2 2 2 2 2 \n", + "16 2 2 2 2 2 2 2 2 2 \n", + "17 2 2 2 2 2 2 2 2 2 \n", + "18 2 2 2 2 2 2 2 2 2 \n", + "19 2 2 2 2 2 2 2 2 2 \n", + "20 1 1 1 1 1 1 1 1 1 \n", + "21 1 1 1 1 1 1 1 1 1 \n", + "22 1 1 1 1 1 1 1 1 1 \n", + "23 1 1 1 1 1 1 1 1 1 \n", + "24 1 1 1 1 1 1 1 1 1 \n", + "25 1 1 1 1 1 1 1 1 1 \n", + "26 1 1 1 1 1 1 1 1 1 \n", + "27 1 1 1 1 1 1 1 1 1 \n", + "28 2 2 2 2 2 2 2 2 2 \n", + "29 2 2 2 2 2 2 2 2 2 \n", + "30 2 2 2 2 2 2 2 2 2 \n", + "31 2 2 2 2 2 2 2 2 2 \n", + "\n", + " red_B8 \n", + "0 1 \n", + "1 1 \n", + "2 1 \n", + "3 1 \n", + "4 1 \n", + "5 1 \n", + "6 1 \n", + "7 1 \n", + "8 1 \n", + "9 1 \n", + "10 1 \n", + "11 1 \n", + "12 2 \n", + "13 2 \n", + "14 2 \n", + "15 2 \n", + "16 2 \n", + "17 2 \n", + "18 2 \n", + "19 2 \n", + "20 1 \n", + "21 1 \n", + "22 1 \n", + "23 1 \n", + "24 1 \n", + "25 1 \n", + "26 1 \n", + "27 1 \n", + "28 2 \n", + "29 2 \n", + "30 2 \n", + "31 2 " ] }, "metadata": {}, @@ -1449,6 +2672,23 @@ " plan[col] = 0\n", "plan.reset_index(inplace=True)\n", "plan = plan[list(plan.columns)[:3] + sorted(plan.columns)[1:-4] + list(plan.columns)[3:5]]\n", + "\n", + "yellow_columns = [f'yellow_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n", + "red_columns = [f'red_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n", + "\n", + "inter_nos = plan.inter_no.unique()\n", + "yellow_list = np.random.choice([3, 4, 5], size=plan.inter_no.nunique(), p=[0.1, 0.7, 0.2])\n", + "inter2yellow = dict(zip(inter_nos, yellow_list))\n", + "red_list = np.random.choice([0, 1, 2], size=plan.inter_no.nunique(), p=[0.1, 0.7, 0.2])\n", + "inter2red = dict(zip(inter_nos, red_list))\n", + "\n", + "for phase in range(1, 9):\n", + " for ring in ['A', 'B']:\n", + " plan[f'yellow_{ring}{phase}'] = plan['inter_no'].map(inter2yellow)\n", + "for phase in range(1, 9):\n", + " for ring in ['A', 'B']:\n", + " plan[f'red_{ring}{phase}'] = plan['inter_no'].map(inter2red)\n", + "\n", "plan.to_csv('../plan.csv')\n", "pland = plan.copy()\n", "cums_A = np.array(pland[[f'dura_A{k}' for k in range(1,9)]].cumsum(axis=1))\n", @@ -1465,7 +2705,8 @@ " i+=1\n", "pland = pland[['inter_no', 'start_hour', 'start_minute'] + [f'ddur_{i}' for i in range(1,9)] + ['cycle', 'offset']] # plan detailed\n", "pland[[f'ddur_{i}' for i in range(1,9)]] = pland[[f'ddur_{i}' for i in range(1,9)]].astype(int)\n", - "display(plan)\n", + "with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n", + " display(plan)\n", "# pland.to_csv('../pland.csv')\n", "# display(pland)" ] @@ -3265,9 +4506,9 @@ ], "metadata": { "kernelspec": { - "display_name": "rts", + "display_name": "sts", "language": "python", - "name": "python3" + "name": "sts" }, "language_info": { "codemirror_mode": { diff --git a/Documents/0116_header_unix.txt b/Documents/0116_header_unix.txt new file mode 100644 index 000000000..73166ac22 --- /dev/null +++ b/Documents/0116_header_unix.txt @@ -0,0 +1,8 @@ +김선중 대리 동부ICT에서 교차로 주기정보(주기별 현시별 녹색시간) 전송시 header에 시간정보가 있어서 해당 정보를 +주기의 종료시간으로 활용해도 되는지 문의하였고 아래내용은 회신받은 내용입니다. 참고하세요 +1) 메세지 header에서 제공하는 time은 신호제어서버의 정보 제공 시점의 시각입니다. +2) 신호제어기에서 주기가 종료되면, 운영했던 SPLIT을 신호제어서버로 전송하고 + 신호제어서버는 데이터를 큐에 저장한 다음 1~2초 간격으로 묶어서 외부 서버에 제공할 예정입니다. +3) 이런 경우 외부 서버에 SPLIT 정보 전송 지연이 최소 1~2초로 예상됩니다. +4) 따라서 요청을 고려하여 전송 간격을 1초로 하면, 전송 지연을 최소화 할 수 있습니다. +김선중 diff --git a/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_검토의견.hwpx b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_검토의견.hwpx new file mode 100644 index 000000000..4f93c0aad Binary files /dev/null and b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_검토의견.hwpx differ diff --git a/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_검토의견.pdf b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_검토의견.pdf new file mode 100644 index 000000000..859a19701 --- /dev/null +++ b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_검토의견.pdf @@ -0,0 +1,255 @@ +☐ 교통신호제어센터의 교차로 신호정보 제공 방안 + +1. 개요 + 1) 본 문서는 성남시 신호제어서버에서 외부시스템에 신호정보 제공을 위한 인터페이 + + 스를 정의한다. + + 2) 신호정보제공 대상 외부시스템은 다음과 같다 + - 디지털 트윈 서버 + - 긴급차량관제 서버 + - 스마트교차로 서버 + - ITS 센터 + + 3) 연계 구성 + +2. 통신 방식 + 1) 통신 방식 : TCP 소켓 통신 + + [보안정책상 UDP 소켓으로 변경여지 있습니다....] + + Server 측 Client 측 포트 규격 +교통신호제어센터 외부시스템 7072 (TBD) TCP/IP + +2) Byte Ordering : Big-Endian + +- 최상위 바이트(MSB)를 먼저 보내고, 최하위 바이트(LSB)는 맨나중에 보냄 + +3) 데이터 형식 : Byte 형식 + +4) 문자 인코딩 : UTF-8 + +5) 포트번호 : 7072 + 3. 프레임 구조 + 1) 본 시스템의 프레임은 “HEADER + DATA“로 구성하며, ”HEADER“의 구성과 + + ”COMMAND“ 목록은 다음과 같다. + +▪ HEADER 구성 (10 BYTES) + + 항목 설명 데이터크기 데이터 유형 + STX1 BYTE + STX2 통신프레임의 시작 부호 1 (0x7E) 1 BYTE + SEQUENCE BYTE + TIME 통신프레임의 시작 부호 2 (0x7E) 1 BYTE + COMMAND BYTE +DATA LENGTH 순차번호 (0 ~ 255) 1 BYTE + + 현재시각 (32BIT) 4 + + 명령코드 1 + + 데이터 프레임의 BYTE 길이 2 + +▪ COMMAND 목록 + +번호 COMMAND 설명 송수신 방향 비고 + 신호서버 → 외부서버 +1 0xF2 교차로 신호운영현황 전송 신호서버 ← 외부서버 + 신호서버 → 외부서버 +2 0xF3 교차로 신호운영현황 응답 (ACK) 신호서버 ← 외부서버 + 신호서버 → 외부서버 +3 0xF4 교차로 주기정보 전송 신호서버 ← 외부서버 + +4 0xF5 교차로 주기정보 응답 (ACK) + +5 0xF6 교차로 DB 전송 + +6 0xF7 교차로 DB 응답 (ACK) + 4. 메시지 상세 구조 + 1) 교차로 신호운영현황 정보전송 + + ▪ 1초 단위의 교차로 신호운영현황 정보 + ▪ 정보전송 “교차로 시작번호”부터 N개의 교차로를 연속적으로 전송한다 + +BYTE 항목 BIT 설명 + 1 교차로 + 2 16 BIT 정보전송 교차로 시작번호 (1 – 9999) + 3 번호 + 4 현시 75 RING A의 PHASE (0 ∼ 7) + 코드 40 RING A의 STEP (0 ∼ 31) + 5 75 RING B의 PHASE (0 ∼ 7) + 제어기 40 RING B의 STEP (0 ∼ 31) + 6 운영상태 센터 통신 FAIL 상태 1 : FAIL, 0 : 정상 + 7 + 7 제어기 6 운용 맵번호 0 : 일반제, 1~5 : 시차제, 6 : 전용맵 + 8 상태 5 + 9 4 등기종류 1 : 4색등, 0 : 3색등 + 10 3 + 11 교통신호기 운영모드 0 : SCU 고정주기 모드 + - 2 1 : 감응하지 않는 OFFLINE 제어모드 + 18 RING 운영방식 2 : 감응되는 OFFLINE 제어모드 + 19 1 현시유지 4 : 감응되는 온라인 제어모드 + - 우선신호 5 : 감응하지 않는 온라인 제어모드 + 26 0 전이 + 7 감응 1 : DUAL-RING, 0 : SINGLE-RING + 6 소등 1 : ON, 0 : OFF + 5 점멸 1 : 서비스 중, 0 : OFF + 4 수동 1 : 전이 중, 0 : OFF + 3 주기 COUNT 1 : 감응, 0 : 정상 + 2 현 주기 1 : 소등, 0 : 정상 + 1 연동 1 : 점멸, 0 : 정상 + 0 예비 1 : 수동, 0 : 정상 + - 0 ~ 255 초 + - 0 ~ 255 초 + - 실제 계측 OFFSET + - + + 교차로 시작번호+1 신호운영정보 (8 Bytes) + + 교차로 시작번호+2 신호운영정보 (8 Bytes) + + ... + +... 교차로 시작번호+N 신호운영정보 (8 Bytes) + +-> A링, B링의 이동류번호 제공 필요. 시차제가 적용될 경우 교차로 DB정보를 통해 + 서는 파악이 불가능하며, 신호운영현황을 통해 제공되는 이동류번호로만 파악이 + 가능함 + 2) 교차로 주기정보 : 주기 종료 후 Split 정보 제공 + ▪ 주기 종료 후 Ring-A, Ring-B의 운영한 현시정보를 전송한다. + ▪ 정보전송은 N개의 교차로 정보를 연속하여 전송이 가능하다 + +BYTE 항목 BIT 설명 + 교차로 번호 + 1 16 BIT 정보전송 교차로번호 (1 – 9999) + 2 + 3 RING-A 운영시간 8 Bytes PHASE 1 – 8 + - + 10 RING-B 운영시간 8 Bytes PHASE 1 – 8 + 11 + - + 18 + + 2번째 교차로 번호/ Ring-A / RING-B 운영시간 (18 Bytes) + + 3번째 교차로 번호/ Ring-A / RING-B 운영시간 (18 Bytes) + + 4번째 교차로 번호/ Ring-A / RING-B 운영시간 (18 Bytes) + + .... + 3) 교차로 DB 정보 : 교차로 DB 변경시 제공 (JSON 표기) + + WEEK PLAN JSON 표기 WEEK PLAN data 설명 + +{ data : 7 plan_no + “lcid” : number, plan_no = 1 ~ 10 + “type” : “weekplan”, + “data” : number[], +} + + DAYPLAN JSON 표기 DAYPLAN data 설명 + +{ plan_no = 1 ~ 10 + “lcid” : number, [hour, min, cycle, offset, split[16]] * 16 + “type” : “dayplan”, + “plan” : { + + “plan_no”: number, + “data”: number[], + }[] +} + + HOLIDAY PLAN JSON 표기 HOLIDAY PLAN data 설명 +{ + “lcid”: number, [month, day, plan_no] * 30 + “type”: “holidayplan”, plan_no = 1 ~ 10 + “data”: number[], +} + + SIGNAL MAP JSON 표기 SIGNAL MAP data 설명 +{ + “lcid”: number, map_no = 1 - 6 + “type”: “signal_map”, [output[16], min, max, eop] * 32 step + “data”: { + + “map_no” : number, + “a_ring” : number[], + “b_ring” : number[], + }[], +} + + 이동류 번호, 방위각 JSON 표기 기반정보 구성 data 설명 +{ + “lcid”: number, map_no = 1 - 6 + “type”: “geo_map”, [direction(이동류 번호), angle(방위각)] * 8현시 + “data”: { + + “map_no” : number, + “a_ring” : number[], + “b_ring” : number[], + }[], +} + +→ dayplan data에 yellow time, red time, 주현시 정보 추가 필요 + ① 교차로 WEEK PLAN +② 교차로 DAY PLAN + +③ 교차로 HOLIDAY PLAN + ④ 시그널맵 (Ring-A , Ring-B) + +⑤ 교차로 기반정보 구성 (이동류번호, 방위각) + + RING 현시 1 현시 2 현시 3 현시 4 현시 5 현시 6 현시 7 현시 8 + 이동류번호, + + A-ring + 방위각 + 이동류번호, + + B-ring + 방위각 + +-> 방위각 정보는 진입, 진출 모두 제공 필요 + +⑥ etc. + -> 교차로 ID, 이름 및 위-경도 필요. sumo 네트워크 노드와 교차로 ID를 매핑하기 + 위해서 필요 + ▪ 이동류 번호 (1 byte) + +이동류 이동류 이동류 이동류 이동류 이동류 + 설명 + 설명 설명 + 번호 방향 + 번호 방향 번호 방향 + +1 좌회전 (동 → 남) 9 좌회전 (북동 → 남동) 17 ˙ 보행신호 + +2 직진 (서 → 동) 10 직진 (남서 → 북동) 18 ˙ 신호 없음 + +3 좌회전 (남 → 서) 11 좌회전 (남동 → 남서) 21 ˙ 신호우회전 + +4 직진 (북 → 남) 12 직진 (북서 → 남동) + +5 좌회전 (서 → 북) 13 좌회전 (남서 → 북서) + +6 직진 (동 → 서) 14 직진 (북동 → 남서) + +7 좌회전 (북 → 동) 15 좌회전 (북서 → 북동) + +8 직진 (남 → 북) 16 직진 (남동 → 북서) + +▪ 방위각 (2 bytes) : 0 ~ 360도 +▪ 화살표 좌표 (24 bytes) + + 항목 설명 + + 이동류 위도 DD.DDDDDD + (화살표 시작 좌표) 경도 DDD.DDDDDD + 위도 DD.DDDDDD + 이동류 경도 DDD.DDDDDD +(화살표 중간점 좌표) 위도 DD.DDDDDD + 경도 DDD.DDDDDD + 이동류 +(화살표 종료점 좌표) + \ No newline at end of file diff --git a/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_수정_김선중.hwpx b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_수정_김선중.hwpx new file mode 100644 index 000000000..374193e6f Binary files /dev/null and b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240108_수정_김선중.hwpx differ diff --git a/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.hwpx b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.hwpx new file mode 100644 index 000000000..5934081d1 Binary files /dev/null and b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.hwpx differ diff --git a/Documents/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.pdf b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.pdf similarity index 100% rename from Documents/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.pdf rename to Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240111.pdf diff --git a/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240220.hwpx b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240220.hwpx new file mode 100644 index 000000000..0b10f5b54 Binary files /dev/null and b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240220.hwpx differ diff --git a/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240220.pdf b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240220.pdf new file mode 100644 index 000000000..f39b0b244 --- /dev/null +++ b/Documents/동부ICT/교통신호제어센터의 교차로 신호정보 제공 방안_20240220.pdf @@ -0,0 +1,322 @@ +☐ 교통신호제어센터의 교차로 신호정보 제공 방안 + +1. 개요 + 1) 본 문서는 성남시 신호제어서버에서 ITS서버에 신호정보 제공을 위한 인터페이스 + + 를 정의한다. + + 2) 연계 구성 + +2. 통신 방식 + 1) 통신 방식 : UDP 소켓 통신 + + Server 측 Client 측 포트 규격 +교통신호제어센터 외부시스템 7072 (TBD) UDP + +2) Byte Ordering : Big-Endian + +- 최상위 바이트(MSB)를 먼저 보내고, 최하위 바이트(LSB)는 맨나중에 보냄 + +3) 데이터 형식 : Byte 형식 + +4) 문자 인코딩 : UTF-8 + +5) 포트번호 : 7072 + 3. 프레임 구조 + 1) 본 시스템의 프레임은 “HEADER + DATA“로 구성하며, ”HEADER“의 구성과 + + ”COMMAND“ 목록은 다음과 같다. + +▪ HEADER 구성 (10 BYTES) + + 항목 설명 데이터크기 데이터 유형 + STX1 BYTE + STX2 통신프레임의 시작 부호 1 (0x7E) 1 BYTE + SEQUENCE BYTE + TIME 통신프레임의 시작 부호 2 (0x7E) 1 BYTE + COMMAND BYTE +DATA LENGTH 순차번호 (0 ~ 255) 1 BYTE + + 현재시각 (32BIT) 4 + + 명령코드 1 + + 데이터 프레임의 BYTE 길이 2 + +▪ COMMAND 목록 + +번호 COMMAND 설명 송수신 방향 비고 + 예비 +1 0xF0 교차로 신호운영현황 전송-1 신호서버 → 외부서버 예비 + 교차로 신호운영현황 응답 (ACK) 신호서버 ← 외부서버 +2 0xF1 신호서버 → 외부서버 예비 + 교차로 신호운영현황 전송-2 신호서버 ← 외부서버 +3 0xF2 교차로 신호운영현황 응답 (ACK) 신호서버 → 외부서버 + 신호서버 ← 외부서버 +4 0xF3 교차로 주기정보 전송 신호서버 → 외부서버 + 교차로 주기정보 응답 (ACK) 신호서버 ← 외부서버 +5 0xF4 신호서버 ← 외부서버 + 교차로 DB 전송 +6 0xF5 교차로 DB 응답 (ACK) + +7 0xF6 신호정보제공 요청 + +8 0xF7 + +9 0xF9 + +▪ 전체 메시지 구성 (HEADER + DATA) + + HEADER DATA + DATA + STX1 STX2 SEQ. TIME COMMAND LENGTH [Length] Bytes +1 byte 1 byte 1 byte 2 byte + 1 byte 4 byte + 4. 데이터 상세 구조 + 1) 교차로 신호운영현황 정보 전송-1 + + ▪ 1초 단위로 교차로 신호운영현황을 최소 정보만 요약하여 전송한다. + ▪ 전체 교차로를 한번에 전송한다 + + 예) 800 (교차로 수) x 3 bytes = 2400 bytes 전송 + +BYTE 항목 BIT 설명 + 1 현시 + 2 코드 75 RING A의 PHASE (0 ∼ 7) + 40 + 3 제어기 75 RING A의 이동류번호 (1 ∼ 21) + 운영상태 40 + 4 RING B의 PHASE (0 ∼ 7) + - 7 + 6 6 RING B의 이동류번호 (1 ∼ 21) + 7 5 + - 4 제어기 통신상태 1 : 통신 FAIL, 0 : 정상 + 9 3 + 2 모순 상태 1 : 모순, 0 : 정상 + + 1 소등 상태 1 : 소등, 0 : 정상 + + 0 점멸 상태 1 : 점멸, 0 : 정상 + + 수동 상태 1 : 수동, 0 : 정상 + + 교통신호기 운영모드 0 : SCU 고정주기 모드 + 1 : 감응하지 않는 OFFLINE 제어모드 + 2 : 감응되는 OFFLINE 제어모드 + 4 : 감응되는 온라인 제어모드 + 5 : 감응하지 않는 온라인 제어모드 + + 2번 교차로 신호운영정보 (3 Bytes) + + 2번 교차로 신호운영정보 (3 Bytes) + +- ... + +- N번 교차로 신호운영정보 (3 Bytes) + 2) 교차로 신호운영현황 정보 전송-2 + ▪ 1초 단위의 교차로 신호운영현황 정보 + ▪ 정보전송 “교차로 시작번호”부터 N개의 교차로를 연속적으로 전송한다 + +BYTE 항목 BIT 설명 + 1 + 2 교차로 16 BIT 정보전송 교차로 시작번호 (1 – 9999) + 3 번호 + 4 현시 75 RING A의 PHASE (0 ∼ 7) 1 : 통신 FAIL, 0 : 정상 + 코드 40 RING A의 STEP (0 ∼ 31) + 5 75 RING B의 PHASE (0 ∼ 7) + 제어기 40 RING B의 STEP (0 ∼ 31) + 6 운영상태 제어기 통신상태 + 7 + 7 제어기 6 운용 맵번호 0 : 일반제, 1~5 : 시차제, 6 : 전용맵 + 8 상태 5 + 9 4 교차로 연등 0 : 일반교차로, 1 : 연등교차로 + 10 3 + 11 교통신호기 운영모드 0 : SCU 고정주기 모드 + 12 2 1 : 감응하지 않는 OFFLINE 제어모드 + - POLICE PANEL 수동진행 SW 2 : 감응되는 OFFLINE 제어모드 + 20 1 POLICE PANEL 수동 SW 4 : 감응되는 온라인 제어모드 + 21 POLICE PANEL 점멸 SW 5 : 감응하지 않는 온라인 제어모드 + - 0 POLICE PANEL 소등 SW + 29 7 모순 상태 1 : ON, 0 : OFF + 6 소등 상태 1 : ON, 0 : OFF + 5 점멸 상태 1 : ON, 0 : OFF + 4 데이터베이스 상태 1 : ON, 0 : OFF + 3 주기 COUNT 1 : 모순, 0 : 정상 + 2 현 주기 1 : 소등, 0 : 정상 + 1 연동 1 : 점멸, 0 : 정상 + 0 A-ring 이동류번호 1 : 이상, 0 : 정상 + - B-ring 이동류번호 0 ~ 255 초 + - 0 ~ 255 초 + - 실제 계측 OFFSET + - 1 – 21 (보행자 포함여부 ?) + - 1 – 21 (보행자 포함여부 ?) + + 교차로 시작번호+1 신호운영정보 (9 Bytes) + + 교차로 시작번호+2 신호운영정보 (9 Bytes) + + ... + +... 교차로 시작번호+N 신호운영정보 (9 Bytes) + 3) 교차로 주기정보 : 주기 종료 후 Split 정보 제공 + ▪ 주기 종료 후 Ring-A, Ring-B의 운영한 현시정보를 전송한다. + ▪ 정보전송은 N개의 교차로 정보를 연속하여 전송이 가능하다 + +BYTE 항목 BIT 설명 + 교차로 번호 16 BIT 정보전송 교차로번호 (1 – 9999) + 1 + 2 RING-A 운영시간 8 Bytes PHASE 1 – 8 + 3 + - RING-B 운영시간 8 Bytes PHASE 1 – 8 + 10 + 11 + - + 18 + + 2번째 교차로 번호/ Ring-A / RING-B 운영시간 (18 Bytes) + + 3번째 교차로 번호/ Ring-A / RING-B 운영시간 (18 Bytes) + + 4번째 교차로 번호/ Ring-A / RING-B 운영시간 (18 Bytes) + + .... + 4) 교차로 DB 정보 : 교차로 DB 변경시 제공 (JSON 표기) + ① 교차로 WEEK PLAN +∎ JSON 표기 + +WEEK PLAN JSON 표기 WEEK PLAN data 설명 + +{ data : 7 plan_no + “lcid” : number, plan_no = 1 ~ 10 + “type” : “weekplan”, + “data” : number[], +} + +∎ week plan table 정의 + ② 교차로 DAY PLAN DAYPLAN data 설명 + +∎ JSON 표기 plan_no = 1 ~ 10 + time : [A_flow_no, A_red_time, A_yellow_time, A_min_time, + DAYPLAN JSON 표기 + B_flow_no, B_red_time, B_yellow_time, B_min_time] + { data : [hour, min, cycle, offset, split[16]] + “lcid” : number, + “type” : “dayplan”, + “plan” : { + “plan_no”: number, + “time” : number[], + “data” : number[], + }[] + + } + +∎ FLOW/RED/YELLOW + + 현시 이동류번호 A-ring yellow_time 이동류번호 B-ring + red_time red_time yellow_time +현시 1 +현시 2 +현시 3 +현시 4 +현시 5 +현시 6 +현시 7 +현시 8 + +∎ DAY PLAN TIME Table + ③ 교차로 HOLIDAY PLAN HOLIDAY PLAN data 설명 +∎ JSON 표기 + [month, day, plan_no] * 30 + HOLIDAY PLAN JSON 표기 plan_no = 1 ~ 10 + + { + “lcid”: number, + “type”: “holidayplan”, + “data”: number[], + + } + +∎ HOLIDAY Plan Table + ④ SIGNAL MAP (Ring-A , Ring-B) SIGNAL MAP data 설명 + +∎ JSON 표기 map_no = 1 - 6 + [output[16], min, max, eop] * 32 step + SIGNAL MAP JSON 표기 + + { + “lcid”: number, + “type”: “signal_map”, + “data”: { + “map_no” : number, + “a_ring” : number[], + “b_ring” : number[], + }[], + + } + +∎ SIGNAL MAP Table + ⑤ 교차로 기반정보 구성 +∎ JSON 표기 + + 교차로 기반정보 구성 JSON 표기 교차로 기반정보 구성 data 설명 +`{ + + “lcid”: number, + + “type”: “geo_map”, + + “intName”: string, // 교차로명 + + “intType”: number, // 교차로유형 (0: 주교차로, 1: 연등교차로) + + “lcType”: number, // 제어기 유형 (1: 2004년형, 2: 2010 년형, 3: 2023년형) + + “lampType”: number, // 등기 유형 (1: 4색등, 2: 3색등) + + “mainIntNo”: number, // 연등교차로인 경우 주교차로 번호 + + “groupNo”: number, // 그룹번호 + + “nodeNo”: number, // 교차로 노드 ID + + “intLat”: number, // 교차로 위도 (ex : 36.123500) + + “intLng”: number, // 교차로 경도 (ex : 127.123500) + + “ppcType”: number, // PPC 유형 (0 : 설치안됨, 1 : 현장방식, 2 : 중앙제어방식) + + “mainP”: number, // 주현시번호 (1 – 8) + + “flow”: { + + “num”: number, // 이동류 번호 + + “geoXY: number[], // 화살표 시작점 위도/경도, 중간점 위도/경도, 종료점 위도/경도, + + }[] + +} + ▪ 이동류 번호 + +이동류 이동류 이동류 이동류 이동류 이동류 + 설명 + 설명 설명 + 번호 방향 + 번호 방향 번호 방향 + +1 좌회전 (동 → 남) 9 좌회전 (북동 → 남동) 17 ˙ 보행신호 + +2 직진 (서 → 동) 10 직진 (남서 → 북동) 18 ˙ 신호 없음 + +3 좌회전 (남 → 서) 11 좌회전 (남동 → 남서) 21 ˙ 신호우회전 + +4 직진 (북 → 남) 12 직진 (북서 → 남동) + +5 좌회전 (서 → 북) 13 좌회전 (남서 → 북서) + +6 직진 (동 → 서) 14 직진 (북동 → 남서) + +7 좌회전 (북 → 동) 15 좌회전 (북서 → 북동) + +8 직진 (남 → 북) 16 직진 (남동 → 북서) + \ No newline at end of file diff --git a/Results/sn_1704416700.add.xml b/Results/sn_1704416700.add.xml index 6ec8852c0..e9fb412ec 100644 --- a/Results/sn_1704416700.add.xml +++ b/Results/sn_1704416700.add.xml @@ -1,8 +1,8 @@ - - - + + + @@ -10,11 +10,11 @@ - - - - - + + + + + @@ -22,11 +22,11 @@ - - - - - + + + + + @@ -34,11 +34,11 @@ - - - - - + + + + + @@ -48,241 +48,241 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -333,64 +333,64 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -462,52 +462,52 @@ - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - + + + diff --git a/Scripts/__pycache__/generate_signals.cpython-38.pyc b/Scripts/__pycache__/generate_signals.cpython-38.pyc index adbcc7a9a..2ba44d8bb 100644 Binary files a/Scripts/__pycache__/generate_signals.cpython-38.pyc and b/Scripts/__pycache__/generate_signals.cpython-38.pyc differ diff --git a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc index d46b15c16..caff33f56 100644 Binary files a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc and b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc differ diff --git a/Scripts/generate_signals.py b/Scripts/generate_signals.py index 10562430f..95841aa74 100644 --- a/Scripts/generate_signals.py +++ b/Scripts/generate_signals.py @@ -266,7 +266,7 @@ class SignalGenerator(): def load_prow(self, inter_no, time): ''' - load planned row + load the planned row ''' # 프로그램 시작시각 program_starts = np.array(self.timetable.start_seconds) @@ -543,14 +543,12 @@ class SignalGenerator(): state_A = mapping_dict[(node_id, move_A)] else: state_A = ''.join(self.node2init[node_id]) - # self.histid.at[i, 'state_A'] = state_A # B링의 state 지정 if (node_id, move_B) in mapping_dict: state_B = mapping_dict[(node_id, move_B)] else: state_B = ''.join(self.node2init[node_id]) - # self.histid.at[i, 'state_B'] = state_B # 통합된 state 지정 state = '' diff --git a/Scripts/generate_signals_until_4-1.py b/Scripts/generate_signals_until_4-1.py deleted file mode 100644 index 7ef3fb5c4..000000000 --- a/Scripts/generate_signals_until_4-1.py +++ /dev/null @@ -1,876 +0,0 @@ -# python .\Scripts\generate_signals.py -import pandas as pd -import numpy as np -import os, sys -import json -import copy -from tqdm import tqdm -import sumolib, traci -from datetime import datetime -import time - -class SignalGenerator(): - def __init__(self): - # 루트폴더 지정 - self.path_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - with open(os.path.join(self.path_root, 'Scripts', 'config.json'), 'r') as config_file: - config = json.load(config_file) - # 주요 폴더 경로 지정 - self.paths = config['paths'] - self.path_data = os.path.join(self.path_root, *self.paths['data']) - self.path_intermediates = os.path.join(self.path_root, *self.paths['intermediates']) - self.path_results = os.path.join(self.path_root, *self.paths['results']) - self.path_tables = os.path.join(self.path_root, *self.paths['tables']) - self.path_networks = os.path.join(self.path_root, *self.paths['networks']) - self.path_scripts = os.path.join(self.path_root, *self.paths['scripts']) - # 이슈사항 목록 - self.issues = [] - - self.midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp()) - self.next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp()) - self.fsecs = range(self.midnight, self.next_day, 5) # fsecs : unix time by Five SECondS - self.fmins = range(self.midnight, self.next_day, 300) # fmins : unix time by Five MINuteS - - self.present_time = datetime.now().replace(month=1, day=5, hour=10).timestamp() - self.present_time = max([fmin for fmin in list(self.fmins) if fmin <= self.present_time]) - - self.adder = 600 # 10분 : '현재시점 + 10분'에 가상신호를 생성하기 위함. - self.subtractor = 1800 # 30분 : '현재시점 - 30분'의 신호이력을 가져온다. - - # 1. 데이터 준비 - def prepare_data(self): - print("1. 데이터를 준비합니다.") - self.load_networks() - self.time11 = datetime.now() - self.load_tables() - self.time12 = datetime.now() - # self.check_networks() - self.time13 = datetime.now() - # self.check_tables() - self.time14 = datetime.now() - self.prepare_auxiliaries() - self.time15 = datetime.now() - - # 1-1. 네트워크 불러오기 - def load_networks(self): - self.net = sumolib.net.readNet(os.path.join(self.path_networks, 'sn.net.xml')) - print("1-1. 네트워크가 로드되었습니다.") - - # 1-2. 테이블 불러오기 - def load_tables(self): - # 모든 컬럼에 대하여 데이터타입 지정 - loading_dtype = { - 'inter_no':'int', 'start_hour':'int', 'start_minute':'int', 'cycle':'int','offset':'int', - 'node_id':'str', 'inter_type':'str', 'parent_id':'str','child_id':'str', - 'direction':'str', 'condition':'str', 'inc_edge':'str', 'out_edge':'str', - 'end_unix':'int', 'inter_name':'str', 'inter_lat':'float', 'inter_lon':'float', - 'group_no':'int', 'main_phase_no':'int', 'phase_no':'int','ring_type':'str' - } - for alph in ['A', 'B']: - for j in range(1,9): - loading_dtype[f'angle_{alph}{j}'] = 'str' - loading_dtype[f'dura_{alph}{j}'] = 'int' - - # 테이블 불러오기 - self.inter_info = pd.read_csv(os.path.join(self.path_tables, 'inter_info.csv'), dtype=loading_dtype) - self.plan = pd.read_csv(os.path.join(self.path_tables, 'plan.csv'), dtype=loading_dtype) - self.history = pd.read_csv(os.path.join(self.path_tables, 'history.csv'), dtype=loading_dtype).sort_values(by='end_unix') - self.inter_node = pd.read_csv(os.path.join(self.path_tables, 'inter_node.csv'), dtype=loading_dtype) - self.matching = pd.read_csv(os.path.join(self.path_intermediates, 'matching.csv'), dtype=loading_dtype) - self.match1 = pd.read_csv(os.path.join(self.path_intermediates, 'match1.csv'), dtype=loading_dtype) - self.match6 = pd.read_csv(os.path.join(self.path_intermediates, 'match6.csv'), dtype=loading_dtype) - self.match6 = self.match6[['node_id', 'phase_no', 'ring_type', 'inc_edge', 'out_edge']].reset_index(drop=True) - - self.plan_set = self.plan.set_index(['inter_no','start_hour','start_minute']) - - # 교차로목록 정의 - self.inter_nos = sorted(self.inter_info.inter_no.unique()) - print("1-2. 테이블들이 로드되었습니다.") - - # 1-3. 네트워크 무결성 검사 - def check_networks(self): - # https://sumo.dlr.de/docs/Netedit/neteditUsageExamples.html#simplify_tls_program_state_after_changing_connections - if 'SUMO_HOME' in os.environ: - tools = os.path.join(os.environ['SUMO_HOME'], 'tools') - if tools not in sys.path: - sys.path.append(tools) - else: - raise EnvironmentError("please declare environment variable 'SUMO_HOME'") - traci.start([sumolib.checkBinary('sumo'), "-n", os.path.join(self.path_networks, 'sn.net.xml')]) - nodes = [node for node in self.net.getNodes() if node.getType()=='traffic_light'] - for node in nodes: - node_id = node.getID() - from_xml = len([c for c in node.getConnections() if c.getTLLinkIndex() >= 0]) - from_traci = len(traci.trafficlight.getRedYellowGreenState(node_id)) - if from_xml != from_traci: - sub = {'id': node_id, 'type': 'node', 'note': '유효하지 않은 연결이있음. netedit에서 clean states 필요.'} - self.issues.append(sub) - traci.close() - print("1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.") - - # 1-4. 테이블 무결성 검사 - def check_tables(self): - self.check_history() - # 교차로정보, 방위각정보, 신호계획에 대해서는 preprocess_daily.py에서 - # 무결성검사를 완료했으므로 여기에서는 따로 검사하지 않음. - # self.check_moves() # 이동류번호에 대한 무결성검사 필요하나 아직 작성하지 않음. (24. 2. 5 화) - print("1-4. 테이블들의 무결성 검사를 완료했습니다.") - - # 1-4-1. 신호이력(history) 검사 - def check_history(self): - # 1-4-1-1. inter_no 검사 - # self.history.loc[0, 'inter_no'] = '4' # 에러 발생을 위한 코드 - missing_inter_nos = set(self.history.inter_no) - set(self.inter_nos) - if missing_inter_nos: - msg = f"1-4-1-1. history의 inter_no 중 교차로 목록(inter_nos)에 포함되지 않는 항목이 있습니다: {missing_inter_nos}" - self.issues.append(msg) - - # 1-4-1-2. 종료유닉스 검사 - # self.history.loc[0, 'end_unix'] = 38.0 # 에러 발생을 위한 코드 - self.min_unix, self.max_unix = int(datetime(2020, 1, 1).timestamp()), int(datetime(2038, 1, 1).timestamp()) - for row in self.history.itertuples(index=True): - unixbool = self.min_unix <= row['end_unix'] <= self.max_unix - if not unixbool: - msg = f"1-4-1-2. 적정 범위를 벗어난 유닉스시각(end_unix)이 존재합니다 : inter_no : {row['inter_no']}" - self.issues.append(msg) - - # 1-4-1-3. 현시시간 검사 - # self.history.loc[0, 'dura_A1'] = -2 # 에러 발생을 위한 코드 - durations = self.history[[f'dura_{alph}{j}' for alph in ['A','B'] for j in range(1, 9)]] - valid_indices = ((durations >= 0) & (durations <= 200)).all(axis=1) - invalid_inter_nos = sorted(self.history[~ valid_indices].inter_no.unique()) - if invalid_inter_nos: - msg = f"1-4-1-3. 음수이거나 200보다 큰 현시시간이 존재합니다. : {invalid_inter_nos}" - - # 1-5. 보조 딕셔너리, 데이터프레임, 리스트 등 만들기 - def prepare_auxiliaries(self): - # inter2node : a dictionary that maps inter_no to the node_id - inter_node_p = self.inter_node[self.inter_node.inter_type=='parent'] - self.inter2node = dict(zip(inter_node_p['inter_no'], inter_node_p['node_id'])) - self.node2inter = dict(zip(self.inter_node['node_id'], self.inter_node['inter_no'])) - - # split, isplit : A,B 분리 혹은 통합시 사용될 수 있는 딕셔너리 - self.splits = {} # splits maps (inter_no, start_hour, start_minute) to split - for i, row in self.plan.iterrows(): - inter_no = row.inter_no - start_hour = row.start_hour - start_minute = row.start_minute - cycle = row.cycle - - dura_A = np.array(row[[f'dura_A{j}' for j in range(1, 9)]]) - dura_B = np.array(row[[f'dura_B{j}' for j in range(1, 9)]]) - - cums_A = dura_A.cumsum() - cums_B = dura_B.cumsum() - combined_row = np.unique(np.concatenate((cums_A,cums_B))) - detailed_durations = np.concatenate(([combined_row[0]], np.diff(combined_row))) - - self.splits[(inter_no, start_hour, start_minute)] = {} # split maps (phas_A, phas_B) to k - ja = 0 - jb = 0 - for k in range(len(detailed_durations)): - dura_A[ja] -= detailed_durations[k] - dura_B[jb] -= detailed_durations[k] - self.splits[(inter_no, start_hour, start_minute)][(ja+1, jb+1)] = k+1 - if dura_A[ja] == 0: - ja += 1 - if dura_B[jb] == 0: - jb += 1 - - self.isplits = {} # the inverse of splits - for i in self.splits: - self.isplits[i] = {self.splits[i][k]:k for k in self.splits[i]} # isplit maps k to (phas_A, phas_B) - - # timetable : 교차로별 프로그램 시작시각 - self.timetable = self.plan[['start_hour', 'start_minute']].drop_duplicates() - self.timetable['start_seconds'] = self.midnight + self.timetable['start_hour'] * 3600 + self.timetable['start_minute'] * 60 - - # A dictionary that maps parent_id to a list of child_ids - self.pa2ch = {'i0':['u00'], 'i1':[], 'i2':['u20'], 'i3':['c30', 'u30', 'u31', 'u32'], 'i6':['u60'], 'i7':[], 'i8':[], 'i9':[]} - self.node_ids = sorted(self.inter_node.node_id.unique()) - self.parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique()) - self.nodes = [self.net.getNode(node_id) for node_id in self.node_ids] - - # node2num_cycles : A dictionary that maps a node_id to the number of cycles - with open(os.path.join(self.path_intermediates, 'node2num_cycles.json'), 'r') as file: - # json.load() 함수를 사용해 파일 내용을 Python 딕셔너리로 불러옵니다. - self.node2num_cycles = json.load(file) - - # 2. 신호이력 전처리 - def process_history(self): - print("2. 신호이력 테이블을 변환합니다.") - self.make_rhistory() - self.time21 = datetime.now() - self.make_rhists() - self.time22 = datetime.now() - self.make_hrhists() - self.time23 = datetime.now() - - # 2-1. rhistory - def make_rhistory(self): - # 1. 조회시점의 유닉스 타임 이전의 신호이력 수집 - self.rhistory = self.history.copy() # recent history - self.rhistory = self.rhistory[(self.rhistory.end_unix <= self.present_time) & (self.rhistory.end_unix > self.present_time - self.subtractor)] - - # rhistory에 모든 교차로번호가 존재하지 않으면 해당 교차로번호에 대한 신호이력을 추가함 (at 최근 프로그램 시작시각) - whole_inter_nos = set(self.history.inter_no.unique()) - recent_inter_nos = set(self.rhistory.inter_no.unique()) - if not whole_inter_nos==recent_inter_nos: - for inter_no in whole_inter_nos - recent_inter_nos: - program_start, prow = self.load_prow(inter_no, self.present_time - self.subtractor) - cycle = prow.cycle.iloc[0] - row1 = prow.copy() - row2 = prow.copy() - # prow에서 필요한 부분을 rhistory에 추가 - row1['end_unix'] = program_start - row2['end_unix'] = program_start + cycle - self.rhistory = pd.concat([self.rhistory, row1, row2])#.reset_index(drop=True) - - # present_time + adder 의 시각에 한 주기의 신호 추가 - for inter_no in set(whole_inter_nos): - program_start, prow = self.load_prow(inter_no, self.present_time) - cycle = prow.cycle.iloc[0] - row3 = prow.copy() - # prow에서 필요한 부분을 rhistory에 추가 - row3['end_unix'] = self.present_time + self.adder - self.rhistory = pd.concat([self.rhistory, row3])#.reset_index(drop=True) - - # 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력 - # - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정 - for i, row in self.rhistory.iterrows(): - inter_no = row.inter_no - end_unix = row.end_unix - elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합 - # 이전 유닉스 존재하지 않음 : 현시시간 합의 차 - start_unix = end_unix - elapsed_time - pre_rows = self.history[:i] # previous rows - if inter_no in pre_rows.inter_no.unique(): # 이전 유닉스 존재 - pre_unix = pre_rows[pre_rows.inter_no == inter_no]['end_unix'].iloc[-1] # previous unix time - # 이전 유닉스 존재, abs < 10 : 이전 유닉스 - if abs(pre_unix - start_unix) < 10: - start_unix = pre_unix - # 이전 유닉스 존재, abs >=10 : 현시시간 합의 차 - else: - pass - self.rhistory.loc[i, 'start_unix'] = start_unix - self.rhistory[self.rhistory.isna()] = 0 - self.rhistory['start_unix'] = self.rhistory['start_unix'].astype(int) - self.rhistory = self.rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']] - - def load_prow(self, inter_no, time): - ''' - load planned row - ''' - # 프로그램 시작시각 - program_starts = np.array(self.timetable.start_seconds) - idx = (program_starts <= time).sum() - 1 - program_start = program_starts[idx] - - # 최근 프로그램 시작시각에 대한 신호계획 - start_hour = self.timetable.iloc[idx].start_hour - start_minute = self.timetable.iloc[idx].start_minute - # prow = self.plan[(self.plan.inter_no==inter_no) & (self.plan.start_hour==start_hour) & (self.plan.start_minute==start_minute)] # planned row - prow = self.plan_set.loc[(inter_no, start_hour, start_minute)] - prow = pd.DataFrame([prow],index=[0]) - prow['inter_no'] = inter_no - - return program_start, prow - - # 2-2. rhists - def make_rhists(self): - self.rhists = [] - for inter_no in self.rhistory.inter_no.unique(): - self.rhist = self.rhistory.copy()[self.rhistory.inter_no==inter_no] - self.rhist = self.rhist.drop_duplicates(subset=['start_unix']).reset_index(drop=True) - - # D_n 및 S_n 값 정의 - self.rhist['D_n'] = 0 # D_n : 시간차이 - self.rhist['S_n'] = 0 # S_n : 현시시간합 - for n in range(len(self.rhist)): - curr_unix = self.rhist.iloc[n].start_unix # current start_unix - self.rhist.loc[n, ['D_n', 'S_n']] = self.calculate_DS(self.rhist, curr_unix) - - # 이전시각, 현재시각 - prev_unix = self.rhist.loc[0, 'start_unix'] # previous start_unix - curr_unix = self.rhist.loc[1, 'start_unix'] # current start_unix - - # rhist의 마지막 행에 도달할 때까지 반복 - while True: - n = self.rhist[self.rhist.start_unix==curr_unix].index[0] - cycle = self.rhist.loc[n, 'cycle'] - D_n = self.rhist.loc[n, 'D_n'] - S_n = self.rhist.loc[n, 'S_n'] - # 참값인 경우 - if (abs(D_n - S_n) <= 5): - pass - # 참값이 아닌 경우 - else: - # 2-1-1. 결측치 처리 : 인접한 두 start_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단, 신호계획의 현시시간으로 "대체" - if curr_unix - prev_unix >= 2 * cycle: - # prev_unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다. - # (curr_unix와의 차이가 계획된 주기보다 작거나 같아질 때까지) - while curr_unix - prev_unix > cycle: - prev_unix += cycle - # 신호 계획(prow) 불러오기 - start_seconds = np.array(self.timetable.start_seconds) - idx = (start_seconds <= prev_unix).sum() - 1 - start_hour = self.timetable.iloc[idx].start_hour - start_minute = self.timetable.iloc[idx].start_minute - prow = self.plan.copy()[(self.plan.inter_no==inter_no) & (self.plan.start_hour==start_hour) & (self.plan.start_minute==start_minute)] # planned row - # prow에서 필요한 부분을 rhist에 추가 - prow['start_unix'] = prev_unix - prow = prow.drop(['start_hour', 'start_minute', 'offset'], axis=1) - cycle = prow.iloc[0].cycle - self.rhist = pd.concat([self.rhist, prow]) - self.rhist = self.rhist.sort_values(by='start_unix').reset_index(drop=True) - n += 1 - - # 2-1-2. 이상치 처리 : 비율에 따라 해당 행을 "삭제"(R_n <= 0.5) 또는 "조정"(R_n > 0.5)한다 - R_n = (curr_unix - prev_unix) / cycle # R_n : 비율 - # R_n이 0.5보다 작거나 같으면 해당 행을 삭제 - if R_n <= 0.5: - self.rhist = self.rhist.drop(index=n).reset_index(drop=True) - if n >= self.rhist.index[-1]: - break - # 행삭제에 따른 curr_unix, R_n 재정의 - curr_unix = self.rhist.loc[n, 'start_unix'] - R_n = (curr_unix - prev_unix) / cycle # R_n : 비율 - - # R_n이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체) - if R_n > 0.5: - # 신호 계획(prow) 불러오기 - start_seconds = np.array(self.timetable.start_seconds) - idx = (start_seconds <= curr_unix).sum() - 1 - start_hour = self.timetable.iloc[idx].start_hour - start_minute = self.timetable.iloc[idx].start_minute - prow = self.plan[(self.plan.inter_no==inter_no) & (self.plan.start_hour==start_hour) & (self.plan.start_minute==start_minute)] # planned row - # 조정된 현시시간 (prow에 R_n을 곱하고 정수로 바꿈) - adjusted_dur = prow.copy()[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n - int_parts = adjusted_dur.iloc[0].apply(lambda x: int(x)) - frac_parts = adjusted_dur.iloc[0] - int_parts - difference = round(adjusted_dur.iloc[0].sum()) - int_parts.sum() - for _ in range(difference): # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리 - max_frac_index = frac_parts.idxmax() - int_parts[max_frac_index] += 1 - frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정 - # rhist에 조정된 현시시간을 반영 - self.rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values - self.rhist.loc[n, 'cycle'] = int_parts.sum().sum() // 2 - - if n >= self.rhist.index[-1]: - break - prev_unix = curr_unix - curr_unix = self.rhist.loc[n+1, 'start_unix'] - - # D_n 및 S_n 값 재정의 - # 이 함수의 검증시 필요하나 전체 구동에는 필요없으므로 comment해놓음 - # for n in range(len(self.rhist)): - # curr_unix = self.rhist.iloc[n].start_unix # current start_unix - # self.rhist.loc[n, ['D_n', 'S_n']] = self.calculate_DS(self.rhist, curr_unix) - - self.rhists.append(self.rhist) - self.rhists = pd.concat(self.rhists)#.sort_values(by=['start_unix','inter_no']) - self.rhists = self.rhists[self.rhists.start_unix >= self.present_time - self.subtractor // 2] - - def calculate_DS(self, rhist, curr_unix): - # program_starts = np.array(self.timetable.start_seconds) - # idx = (program_starts <= self.present_time).sum() - 1 - # program_start = program_starts[idx] - # if list(self.hours[self.hours <= curr_unix]): - # ghour_lt_curr_unix = self.hours[self.hours <= curr_unix].max() # the greatest hour less than or equal to curr_unix - # else: - # ghour_lt_curr_unix = program_start - # start_unixes = rhist.start_unix.unique() - # start_unixes_lt_ghour = np.sort(start_unixes[start_unixes < ghour_lt_curr_unix]) # start unixes less than ghour_lt_curr_unix - # # 기준유닉스(base_unix) : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 start_unix - # if len(start_unixes_lt_ghour) > 5: - # base_unix = start_unixes_lt_ghour[-5] - # # start_unixes_lt_ghour의 길이가 5 미만일 경우에는 맨 앞 start_unix로 base_unix를 지정 - # else: - # base_unix = rhist.start_unix.min() - base_unix = curr_unix - self.subtractor // 2 - abs_diff = (self.rhist['start_unix'] - base_unix).abs() - closest_index = abs_diff.idxmin() - base_unix = self.rhist.loc[closest_index, 'start_unix'] - - D_n = curr_unix - base_unix - S_n_durs = rhist[(rhist.start_unix > base_unix) & (rhist.start_unix <= curr_unix)] \ - [[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] - S_n = S_n_durs.values.sum() // 2 - return D_n, S_n - - # 2-3. hrhists - def make_hrhists(self): - # 계층화된 형태로 변환 - self.hrhists = [] # hierarchied recent history - for row in self.rhists.itertuples(index=True): - inter_no = row.inter_no - start_unix = row.start_unix - - ind = (self.timetable['start_seconds'] <= row.start_unix).sum() - 1 - start_hour = self.timetable.iloc[ind].start_hour - start_minute = self.timetable.iloc[ind].start_minute - self.isplit = self.isplits[(inter_no, start_hour, start_minute)] - phas_As = [self.isplit[j][0] for j in self.isplit.keys()] - phas_Bs = [self.isplit[j][1] for j in self.isplit.keys()] - # durs_A = row[[f'dura_A{j}' for j in range(1,9)]] - # durs_B = row[[f'dura_B{j}' for j in range(1,9)]] - durs_A = [getattr(row, f'dura_A{j}') for j in range(1, 9)] - durs_B = [getattr(row, f'dura_B{j}') for j in range(1, 9)] - durations = [] - for j in range(1, len(self.isplit)+1): - ja = self.isplit[j][0] - jb = self.isplit[j][1] - if ja == jb: - durations.append(min(durs_A[ja-1], durs_B[jb-1])) - else: - durations.append(abs(durs_A[ja-1] - durs_B[ja-1])) - new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations), - 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations}) - self.hrhists.append(new_rows) - self.hrhists = pd.concat(self.hrhists) - # self.hrhists = self.hrhists.sort_values(by = ['start_unix', 'inter_no', 'phas_A', 'phas_B']).reset_index(drop=True) - - # 3. 이동류정보 전처리 - def process_movement(self): - print("3. 이동류정보 테이블을 변환합니다.") - self.make_movement() - self.time31 = datetime.now() - self.update_movement() - self.time32 = datetime.now() - - # 3-1. movement - def make_movement(self): - # - 아래 절차를 5초마다 반복 - for fsec in range(self.present_time - 300, self.present_time + 1, 5): # fsec : unix time by Five SECond - # 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A - move = pd.read_csv(os.path.join(self.path_tables, 'move', f'move_{fsec}.csv'), index_col=0) - # 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로번호, 종료유닉스타임)만 수집 : B - recent_histories = [group.iloc[-1:] for _, group in self.history[self.history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들 - - # print([group for _, group in self.history[self.history['end_unix'] < fsec].groupby('inter_no')]) - if not recent_histories: - rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history - else: - rhistory = pd.concat(recent_histories) - recent_unix = rhistory[['inter_no', 'end_unix']] - # 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C - move = pd.merge(move, recent_unix, how='left', on='inter_no') - move['end_unix'] = move['end_unix'].fillna(0).astype(int) - # 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거 - move = move.rename(columns = {'end_unix':'start_unix'}) - # 5. 이동류 이력정보 READ - # - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성) - try: - if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀. - pass - else: - movement = pd.DataFrame() - except NameError: # movement가 존재하지 않는 경우 생성 - movement = pd.DataFrame() - # 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add - movement = pd.concat([movement, move]) - # 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거) - movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix']) - # 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - self.subtractor // 2을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관) - movement = movement[movement.start_unix > fsec - self.subtractor // 2] - # movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True) - self.movement = pd.read_csv(os.path.join(self.path_intermediates, 'movement', f'movement_{self.present_time}.csv'), index_col=0) - - # 3-2. movement_updated - def update_movement(self): - # 중복을 제거하고 (inter_no, start_unix) 쌍을 만듭니다. - hrhists_inter_unix = set(self.hrhists[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None)) - movement_inter_unix = set(self.movement[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None)) - - # hrhists에는 있지만 movement에는 없는 (inter_no, start_unix) 쌍을 찾습니다. - missing_in_movement = hrhists_inter_unix - movement_inter_unix - - # 새로운 행들을 생성합니다. - new_rows = [] - if missing_in_movement: - for inter_no, start_unix in missing_in_movement: - # match1에서 해당 inter_no의 데이터를 찾습니다. - new_row = self.match1[self.match1['inter_no'] == inter_no].copy() - # start_unix 값을 설정합니다. - new_row['start_unix'] = start_unix - new_rows.append(new_row) - - # 새로운 데이터프레임을 생성하고 기존 movement 데이터프레임과 합칩니다. - new_movement = pd.concat(new_rows, ignore_index=True) - self.movement_updated = pd.concat([self.movement, new_movement], ignore_index=True) - else: - self.movement_updated = self.movement - - # 4. 통합테이블 생성 - def make_histids(self): - print("4. 통합 테이블을 생성합니다.") - self.merge_dfs() - self.time41 = datetime.now() - # self.attach_children() - # self.time42 = datetime.now() - - # 4-1. histid - def merge_dfs(self): - # movements and durations - movedur = pd.merge(self.hrhists, self.movement_updated, how='inner', on=['inter_no', 'start_unix', 'phas_A', 'phas_B']) - # movedur = movedur.sort_values(by=['start_unix', 'inter_no', 'phas_A','phas_B']) - movedur = movedur[['inter_no', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration']] - - # matching DataFrame에 대해 multi-index 설정 - self.matching.set_index(['inter_no', 'move_no'], inplace=True) - self.matching.sort_index(inplace=True) - - for row in movedur.itertuples(index=True): - inter_no = row.inter_no - start_unix = row.start_unix - move_A = row.move_A - move_B = row.move_B - - # incoming and outgoing edges A - if move_A in [17, 18]: - inc_edge_A = np.nan - out_edge_A = np.nan - else: - match_A = self.matching.loc[(inter_no, move_A)] - inc_edge_A = match_A.inc_edge.values[0] - out_edge_A = match_A.out_edge.values[0] - movedur.at[row.Index, 'inc_edge_A'] = inc_edge_A - movedur.at[row.Index, 'out_edge_A'] = out_edge_A - - # incoming and outgoing edges B - if move_B in [17, 18]: - inc_edge_B = np.nan - out_edge_B = np.nan - else: - match_B = self.matching.loc[(inter_no, move_B)] - inc_edge_B = match_B.inc_edge.values[0] - out_edge_B = match_B.out_edge.values[0] - movedur.at[row.Index, 'inc_edge_B'] = inc_edge_B - movedur.at[row.Index, 'out_edge_B'] = out_edge_B - - # 이동류 컬럼 제거 - movedur = movedur.drop(['move_A', 'move_B'], axis=1) - - self.histid = movedur.copy() # history with edge ids (incoming and outgoing edge ids) - self.histid['node_id'] = self.histid['inter_no'].map(self.inter2node) - self.histid = self.histid[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'duration', 'inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']] - histid_start = self.present_time - 600 - self.histid = self.histid[self.histid.start_unix > histid_start] - - # 4-2. histids - def attach_children(self): - ''' - 자식교차로에 대한 진입·진출 엣지 정보를 붙여주는 함수 - - input : - (1) histid - - 각 교차로에 대한 (시작유닉스, A현시, B현시)별 현시시간, 진입·진출엣지 - - 부모교차로(주교차로)에 대해서만 값이 지정되어 있음 - (2) match6 - - (현시, 링)별 진입·진출엣지 - - 자식교차로(유턴 및 연동교차로)에 대해서도 값이 지정되어 있음 - (3) parent_ids : 부모교차로 목록 - (4) pa2ch : 각 부모교차로id를 부모교차로가 포함하고 있는 자식교차로들의 id들의 리스트로 대응시키는 딕셔너리 - - output : histids - - 모든(부모 및 자식) 교차로에 대한 시작유닉스 (시작유닉스, A현시, B현시)별 현시시간, 진입·진출엣지 - ''' - new_histids = [] - for parent_id in self.parent_ids: - for child_id in self.pa2ch[parent_id]: - new_histid = self.histid.copy()[self.histid.node_id==parent_id] - new_histid[['inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']] = np.nan - for i, row in new_histid.iterrows(): - phas_A = row.phas_A - phas_B = row.phas_B - new_match = self.match6[self.match6.node_id==child_id] - Arow = new_match[(new_match.phase_no==phas_A) & (new_match.ring_type=='A')] - if ~ Arow[['inc_edge', 'out_edge']].isna().all().all(): - inc_edge = Arow.iloc[0].inc_edge - out_edge = Arow.iloc[0].out_edge - new_histid.loc[i, ['inc_edge_A', 'out_edge_A']] = [inc_edge, out_edge] - Brow = new_match[(new_match.phase_no==phas_B) & (new_match.ring_type=='B')] - if ~ Brow[['inc_edge', 'out_edge']].isna().all().all(): - inc_edge = Brow.iloc[0].inc_edge - out_edge = Brow.iloc[0].out_edge - new_histid.loc[i, ['inc_edge_B', 'out_edge_B']] = [inc_edge, out_edge] - new_histid.loc[i, 'node_id'] = child_id - new_histids.append(new_histid) - new_histids = pd.concat(new_histids) - self.histids = pd.concat([self.histid.copy(), new_histids]) - self.histids = self.histids.sort_values(by=['start_unix', 'node_id', 'phas_A', 'phas_B']).reset_index(drop=True) - - # 5. 신호 생성 - def get_signals(self): - print("5. 신호를 생성합니다.") - self.initialize_states() - self.time51 = datetime.now() - self.assign_signals() - self.time52 = datetime.now() - self.set_timepoints() - self.time53 = datetime.now() - self.assign_red_yellow() - self.time54 = datetime.now() - self.make_tl_file() - self.time55 = datetime.now() - - # 5-1. 신호초기화 - def initialize_states(self): - ''' - 신호 초기화 - - input : - (1) net : 네트워크 - (2) nodes : 노드 목록 - (3) histids : 모든 교차로에 대한 시작유닉스 (시작유닉스, A현시, B현시)별 현시시간, 진입·진출엣지 - - output : node2init - - 각 노드를 초기화된 신호로 맵핑하는 딕셔너리 - - 초기화된 신호란, 우회전을 g로 나머지는 r로 지정한 신호를 말함. - ''' - self.node2init = {} - for node in self.nodes: - node_id = node.getID() - conns = [(c.getJunctionIndex(), c) for c in node.getConnections()] - conns = [c for c in conns if c[0] >= 0] - conns = sorted(conns, key=lambda x: x[0]) - state = [] - for i, ci in conns: - if ci.getTLLinkIndex() < 0: - continue - are_foes = False - for j, cj in conns: - if ci.getTo() == cj.getTo(): - continue - if node.areFoes(i, j): - are_foes = True - break - state.append('r' if are_foes else 'g') - self.node2init[node_id] = state - - # 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여 - for _, row in self.histids.iterrows(): - node_id = row['node_id'] - inc_edge_A = row.inc_edge_A - inc_edge_B = row.inc_edge_B - out_edge_A = row.out_edge_A - out_edge_B = row.out_edge_B - - if pd.isna(inc_edge_A) or pd.isna(out_edge_A): - pass - else: - inc_edge_A = self.net.getEdge(inc_edge_A) - out_edge_A = self.net.getEdge(out_edge_A) - for conn in inc_edge_A.getConnections(out_edge_A): - index = conn.getTLLinkIndex() - if index >= 0: - self.node2init[node_id][index] = 'r' - - if pd.isna(inc_edge_B) or pd.isna(out_edge_B): - pass - else: - inc_edge_B = self.net.getEdge(inc_edge_B) - out_edge_B = self.net.getEdge(out_edge_B) - for conn in inc_edge_B.getConnections(out_edge_B): - index = conn.getTLLinkIndex() - if index >= 0: - self.node2init[node_id][index] = 'r' - - # 5-2. 녹색신호 부여 - def assign_signals(self): - ''' - 진입·진출엣지를 신호문자열로 배정 - - input : - (1) histids : 모든 교차로에 대한 (시작유닉스, A현시, B현시)별 현시시간, 진입·진출엣지 - (2) node2init : 각 노드를 초기화된 신호로 맵핑하는 딕셔너리 - (3) net : 네트워크 - - output : sigtable - - 모든 교차로에 대한 (시작유닉스, A현시, B현시)별 현시시간, 신호문자열 - - 황색 및 적색신호는 아직 반영되지 않았음. - ''' - self.sigtable = self.histids.copy() - self.sigtable['init_state'] = self.sigtable['node_id'].map(self.node2init) - self.sigtable['state'] = self.sigtable['init_state'].map(lambda x:''.join(x)) - for row in self.sigtable.itertuples(index=True): - node_id = row.node_id - inc_edge_A = row.inc_edge_A - inc_edge_B = row.inc_edge_B - out_edge_A = row.out_edge_A - out_edge_B = row.out_edge_B - state = copy.deepcopy(self.node2init)[node_id] - if pd.isna(inc_edge_A) or pd.isna(out_edge_A): - pass - else: - inc_edge_A = self.net.getEdge(inc_edge_A) - out_edge_A = self.net.getEdge(out_edge_A) - for conn in inc_edge_A.getConnections(out_edge_A): - index = conn.getTLLinkIndex() - if index >= 0: - state[index] = 'G' - self.sigtable.at[row.Index, 'state'] = ''.join(state) - - if pd.isna(inc_edge_B) or pd.isna(out_edge_B): - pass - else: - inc_edge_B = self.net.getEdge(inc_edge_B) - out_edge_B = self.net.getEdge(out_edge_B) - for conn in inc_edge_B.getConnections(out_edge_B): - index = conn.getTLLinkIndex() - if index >= 0: - state[index] = 'G' - self.sigtable.at[row.Index, 'state'] = ''.join(state) - self.sigtable = self.sigtable.dropna(subset='state') - self.sigtable = self.sigtable.reset_index(drop=True) - self.sigtable['phase_sumo'] = self.sigtable.groupby(['node_id', 'start_unix']).cumcount() - self.sigtable = self.sigtable[['node_id', 'start_unix', 'phase_sumo', 'duration', 'state']] - # self.sigtable = self.sigtable.sort_values(by=['start_unix', 'node_id']) - self.sigtable['start_dt'] = self.sigtable['start_unix'].apply(lambda x:datetime.fromtimestamp(x)) - - # 5-3. 신호 파일의 시작 및 종료시각 설정 - def set_timepoints(self): - self.offsets = {} - self.Sigtable = [] - sim_start = self.present_time - 300 - for node_id, group in self.sigtable.groupby('node_id'): - lsbs = group[group['start_unix'] < sim_start]['start_unix'].max() # the last start_unix before sim_start - self.offsets[node_id] = lsbs - sim_start - group = group[group.start_unix >= lsbs] - start_unixes = np.array(group.start_unix) - start_unixes = np.sort(np.unique(start_unixes))[:self.node2num_cycles[node_id]] - - group = group[group.start_unix.isin(start_unixes)] - self.Sigtable.append(group) - self.Sigtable = pd.concat(self.Sigtable) - - # 5-4. 적색 및 황색신호 부여 - def assign_red_yellow(self): - ''' - 적색, 황색신호를 반영한 신호문자열 배정 - - input : Sigtable - - 모든 교차로에 대한 (시작유닉스, 세부현시번호)별 현시시간, 신호문자열, 진입·진출엣지 - * 세부현시란 오버랩을 반영한 현시번호를 뜻함. - - output : SIGTABLE - - 모든 교차로에 대한 (시작유닉스, 녹황적세부현시번호)별 현시시간, (황·적색신호가 포함된) 신호문자열 - * 녹황적세부현시번호란 세부현시번호에 r, g, y 옵션까지 포함된 현시번호를 뜻함. - ''' - self.SIGTABLE = [] - for _, group in self.Sigtable.groupby('node_id'): - new_rows_list = [] - for i in range(1, len(group)): - prev_row = group.iloc[i-1:i].copy() - next_row = group.iloc[i:i+1].copy() - new_rows = pd.concat([prev_row, prev_row, next_row]).reset_index(drop=True) - new_rows.loc[0, 'phase_sumo'] = str(prev_row.phase_sumo.iloc[0]) + '_g' - new_rows.loc[0, 'duration'] = new_rows.loc[0, 'duration'] - 5 - new_rows.loc[1, 'phase_sumo'] = str(prev_row.phase_sumo.iloc[0]) + '_y' - new_rows.loc[1, 'duration'] = 4 - yellow_state = '' - red_state = '' - for a, b in zip(prev_row.state.iloc[0], next_row.state.iloc[0]): - if a == 'G' and b == 'r': - yellow_state += 'y' - red_state += 'r' - else: - yellow_state += a - red_state += a - new_rows.loc[2, 'phase_sumo'] = str(next_row.phase_sumo.iloc[0]) + '__r' - new_rows.loc[2, 'duration'] = 1 - new_rows.loc[1, 'state'] = yellow_state - new_rows.loc[2, 'state'] = red_state - new_rows_list.append(new_rows) - next_row['phase_sumo'] = str(next_row.phase_sumo.iloc[0]) + '_g' - next_row['duration'] -= 5 - new_rows_list.append(next_row) - new_rows = pd.concat(new_rows_list) - self.SIGTABLE.append(new_rows) - self.SIGTABLE = pd.concat(self.SIGTABLE).sort_values(by=['node_id', 'start_unix', 'phase_sumo']) - - # 5-5. 신호파일 생성 - def make_tl_file(self): - strings = ['\n'] - for node_id, group in self.SIGTABLE.groupby('node_id'): - strings.append(f' \n') - for row in group.itertuples(index=True): - duration = row.duration - state = row.state - strings.append(f' \n') - strings.append(' \n') - strings.append('') - strings = ''.join(strings) - # 저장 - self.path_output = os.path.join(self.path_results, f'sn_{self.present_time}.add.xml') - with open(self.path_output, 'w') as f: - f.write(strings) - - # 6. 이슈사항 저장 - def write_issues(self): - print('6. 이슈사항을 저장합니다.') - path_issues = os.path.join(self.path_results, "issues_generate_signals.txt") - with open(path_issues, "w", encoding="utf-8") as file: - for item in self.issues: - file.write(item + "\n") - if self.issues: - print("데이터 처리 중 발생한 특이사항은 다음과 같습니다. :") - for review in self.issues: - print(review) - - def main(self): - self.time0 = datetime.now() - # 1. 데이터 준비 - self.prepare_data() - self.time1 = datetime.now() - # 2. 신호이력 전처리 - self.process_history() - self.time2 = datetime.now() - # 3. 이동류정보 전처리 - self.process_movement() - self.time3 = datetime.now() - # 4. 통합테이블 생성 - self.make_histids() - self.time4 = datetime.now() - # # 5. 신호 생성 - # self.get_signals() - # self.time5 = datetime.now() - # # 6. 이슈사항 저장 - # self.write_issues() - # self.time6 = datetime.now() - - print('(1)', self.time1 - self.time0) - print('(1-1)', self.time11 - self.time0) - print('(1-2)', self.time12 - self.time11) - print('(1-3)', self.time13 - self.time12) - print('(1-4)', self.time14 - self.time13) - print('(1-5)', self.time15 - self.time14) - print('(2)', self.time2 - self.time1) - print('(2-1)', self.time21 - self.time1) - print('(2-2)', self.time22 - self.time21) - print('(2-3)', self.time23 - self.time22) - print('(3)', self.time3 - self.time2) - print('(3-1)', self.time31 - self.time2) - print('(3-2)', self.time32 - self.time31) - print('(4)', self.time4 - self.time3) - print('(4-1)', self.time41 - self.time3) - # print('(4-2)', self.time42 - self.time41) - # print('(5)', self.time5 - self.time4) - # print('(5-1)', self.time51 - self.time4) - # print('(5-2)', self.time52 - self.time51) - # print('(5-3)', self.time53 - self.time52) - # print('(5-4)', self.time54 - self.time53) - # print('(5-5)', self.time55 - self.time54) - # print('(6)', self.time6 - self.time5) - print('total time :', self.time41 - self.time0) - -if __name__ == '__main__': - self = SignalGenerator() - self.main() - # self.path_unit = os.path.join(self.path_root, 'Analysis', '0207_unit_test') - # self.hrhists.to_csv(os.path.join(self.path_unit, 'hrhists.csv')) - # self.histids.to_csv(os.path.join(self.path_unit, 'histids.csv')) - # self.sigtable.to_csv(os.path.join(self.path_unit, 'sigtable.csv')) - # self.Sigtable.to_csv(os.path.join(self.path_unit, 'ssigtable.csv')) - # print("elapsed time :", datetime.now() - starting_time) \ No newline at end of file