{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os, sys, copy, argparse\n", "import json\n", "import sumolib, traci\n", "from tqdm import tqdm\n", "from datetime import datetime\n", "path_root = os.path.dirname(os.path.dirname(os.path.abspath('.')))\n", "path_scr = os.path.join(path_root, 'scripts')\n", "sys.path.append(path_scr)\n", "from preprocess_daily import DailyPreprocessor\n", "from generate_signals import SignalGenerator" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "self = DailyPreprocessor(config_name='revised')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 로드합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n", "1-5. 테이블을 표준화했습니다.\n", "1-6. 주요 객체 (리스트, 딕셔너리)들을 저장했습니다.\n" ] } ], "source": [ "self.load_data()\n", "self.make_match1()\n", "self.make_match2()\n", "self.make_match3()\n", "self.make_match4()\n", "self.make_match5()\n", "self.make_match6()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "self.make_matching()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_B
01751184
11752273
21753361
31753462
41754452
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B\n", "0 175 1 1 8 4\n", "1 175 2 2 7 3\n", "2 175 3 3 6 1\n", "3 175 3 4 6 2\n", "4 175 4 4 5 2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 모든 inter_no(교차로번호)에 대한 A, B링 현시별 이동류정보\n", "self.match1.head()" ] }, { "cell_type": "code", "execution_count": 6, "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", "
inter_nophase_noring_typemove_no
01751A8
01751B4
11752A7
11752B3
21753A6
\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no\n", "0 175 1 A 8\n", "0 175 1 B 4\n", "1 175 2 A 7\n", "1 175 2 B 3\n", "2 175 3 A 6" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# match1을 계층화한 테이블\n", "self.match2.head()" ] }, { "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", "
inter_nophase_noring_typemove_noinc_direout_dire
01751A8
11751B4
21752A7
31752B3
41753A6
\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no inc_dire out_dire\n", "0 175 1 A 8 남 북\n", "1 175 1 B 4 북 남\n", "2 175 2 A 7 북 동\n", "3 175 2 B 3 남 서\n", "4 175 3 A 6 동 서" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# match2의 각 이동류번호에 진입방향, 진출방향을 매칭시킨 테이블\n", "self.match3.head()" ] }, { "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", "
inter_nophase_noring_typemove_noinc_direout_direinc_angleout_angle
01751A8179004
11751B4003176
21752A7001095
31752B3179271
41753A6092270
\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no inc_dire out_dire inc_angle out_angle\n", "0 175 1 A 8 남 북 179 004\n", "1 175 1 B 4 북 남 003 176\n", "2 175 2 A 7 북 동 001 095\n", "3 175 2 B 3 남 서 179 271\n", "4 175 3 A 6 동 서 092 270" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# match3의 각 이동류번호에 진입/진출 방위각을 매칭시킨 테이블\n", "self.match4.head()" ] }, { "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", "
inter_nophase_noring_typemove_noinc_direout_direinc_angleout_angleinc_edge_idout_edge_idnode_idnode_typeturn_type
01751A8179004-571542797_02571500487_01i0normalstraight
11751B4003176-571500487_01571542797_02i0normalstraight
21752A7001095-571500487_01571545870_01i0normalleft
31752B3179271-571542797_02571510153_01i0normalleft
41753A6092270571545870_02571510153_01i0normalstraight
\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n", "0 175 1 A 8 남 북 179 \n", "1 175 1 B 4 북 남 003 \n", "2 175 2 A 7 북 동 001 \n", "3 175 2 B 3 남 서 179 \n", "4 175 3 A 6 동 서 092 \n", "\n", " out_angle inc_edge_id out_edge_id node_id node_type turn_type \n", "0 004 -571542797_02 571500487_01 i0 normal straight \n", "1 176 -571500487_01 571542797_02 i0 normal straight \n", "2 095 -571500487_01 571545870_01 i0 normal left \n", "3 271 -571542797_02 571510153_01 i0 normal left \n", "4 270 571545870_02 571510153_01 i0 normal straight " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# match4의 각 행에 진입엣지id, 진출엣지id 노드id 추가한 테이블\n", "self.match5.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_noinc_direout_direinc_angleout_angleinc_edge_idout_edge_idnode_idnode_typeturn_type
01751A8179004-571542797_02571500487_01i0normalstraight
11751B4003176-571500487_01571542797_02i0normalstraight
21752A7001095-571500487_01571545870_01i0normalleft
31752B3179271-571542797_02571510153_01i0normalleft
41753A6092270571545870_02571510153_01i0normalstraight
\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n", "0 175 1 A 8 남 북 179 \n", "1 175 1 B 4 북 남 003 \n", "2 175 2 A 7 북 동 001 \n", "3 175 2 B 3 남 서 179 \n", "4 175 3 A 6 동 서 092 \n", "\n", " out_angle inc_edge_id out_edge_id node_id node_type turn_type \n", "0 004 -571542797_02 571500487_01 i0 normal straight \n", "1 176 -571500487_01 571542797_02 i0 normal straight \n", "2 095 -571500487_01 571545870_01 i0 normal left \n", "3 271 -571542797_02 571510153_01 i0 normal left \n", "4 270 571545870_02 571510153_01 i0 normal straight " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# match5에서 부교차로(유턴교차로, 연동교차로)에 대한 행들을 추가함\n", "self.match6.head()" ] }, { "cell_type": "code", "execution_count": 11, "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", "
inter_nonode_idmove_noinc_direout_direinc_edge_idout_edge_idturn_type
0175i01571545870_02571542797_02left
1175i02571510153_02571545870_01straight
2175i03-571542797_02571510153_01left
3175i04-571500487_01571542797_02straight
4175i05571510153_02571500487_01left
\n", "
" ], "text/plain": [ " inter_no node_id move_no inc_dire out_dire inc_edge_id out_edge_id \\\n", "0 175 i0 1 동 남 571545870_02 571542797_02 \n", "1 175 i0 2 서 동 571510153_02 571545870_01 \n", "2 175 i0 3 남 서 -571542797_02 571510153_01 \n", "3 175 i0 4 북 남 -571500487_01 571542797_02 \n", "4 175 i0 5 서 북 571510153_02 571500487_01 \n", "\n", " turn_type \n", "0 left \n", "1 straight \n", "2 left \n", "3 straight \n", "4 left " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 각 교차로에 대하여, 가능한 모든 이동류 (1~16)에 대한 진입·진출엣지ID를 지정한 테이블\n", "self.matching.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2-2. 초기화 신호가 지정되었습니다. (우회전 : g)\n", "2-3. 유턴 인덱스 / 비보호좌회전 인덱스를 지정했습니다.\n", "2-4. 직진 및 좌회전(G)을 배정했습니다.\n" ] } ], "source": [ "self.initialize_state()\n", "self.assign_indices()\n", "self.assign_signals()" ] }, { "cell_type": "code", "execution_count": 14, "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", "
inter_nonode_idphase_noring_typemove_noinc_edge_idout_edge_idstateturn_type
0175i01A8-571542797_02571500487_01grrrgrrrgGGGGrgrrstraight
1175i01B4-571500487_01571542797_02gGGrgrrrgrrrrrgrrstraight
2175i02A7-571500487_01571545870_01grrGgrrrgrrrrrgrrleft
3175i02B3-571542797_02571510153_01grrrgrrrgrrrrGgrrleft
4175i03A6571545870_02571510153_01grrrgGGrgrrrrrgrrstraight
\n", "
" ], "text/plain": [ " inter_no node_id phase_no ring_type move_no inc_edge_id out_edge_id \\\n", "0 175 i0 1 A 8 -571542797_02 571500487_01 \n", "1 175 i0 1 B 4 -571500487_01 571542797_02 \n", "2 175 i0 2 A 7 -571500487_01 571545870_01 \n", "3 175 i0 2 B 3 -571542797_02 571510153_01 \n", "4 175 i0 3 A 6 571545870_02 571510153_01 \n", "\n", " state turn_type \n", "0 grrrgrrrgGGGGrgrr straight \n", "1 gGGrgrrrgrrrrrgrr straight \n", "2 grrGgrrrgrrrrrgrr left \n", "3 grrrgrrrgrrrrGgrr left \n", "4 grrrgGGrgrrrrrgrr straight " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 신호배정\n", "self.match6.head()" ] }, { "cell_type": "code", "execution_count": 15, "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", "
inter_nonode_idmove_noinc_edge_idout_edge_idstateturn_type
0175i01571545870_02571542797_02grrrgrrGgrrrrrgrrleft
1175i02571510153_02571545870_01grrrgrrrgrrrrrgGrstraight
2175i03-571542797_02571510153_01grrrgrrrgrrrrGgrrleft
3175i04-571500487_01571542797_02gGGrgrrrgrrrrrgrrstraight
4175i05571510153_02571500487_01grrrgrrrgrrrrrgrGleft
\n", "
" ], "text/plain": [ " inter_no node_id move_no inc_edge_id out_edge_id state \\\n", "0 175 i0 1 571545870_02 571542797_02 grrrgrrGgrrrrrgrr \n", "1 175 i0 2 571510153_02 571545870_01 grrrgrrrgrrrrrgGr \n", "2 175 i0 3 -571542797_02 571510153_01 grrrgrrrgrrrrGgrr \n", "3 175 i0 4 -571500487_01 571542797_02 gGGrgrrrgrrrrrgrr \n", "4 175 i0 5 571510153_02 571500487_01 grrrgrrrgrrrrrgrG \n", "\n", " turn_type \n", "0 left \n", "1 straight \n", "2 left \n", "3 straight \n", "4 left " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 신호배정\n", "self.matching.head()" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1. 데이터를 준비합니다.\n", "1-1. 네트워크가 로드되었습니다.\n", "1-2. 테이블들이 로드되었습니다.\n", "1-5. 필요한 보조 객체들이 모두 준비되었습니다.\n", "2. 신호이력 테이블을 변환합니다.\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os, sys, copy, argparse\n", "import json\n", "import sumolib, traci\n", "from tqdm import tqdm\n", "from datetime import datetime\n", "path_root = os.path.dirname(os.path.dirname(os.path.abspath('.')))\n", "path_scr = os.path.join(path_root, 'scripts')\n", "sys.path.append(path_scr)\n", "from preprocess_daily import DailyPreprocessor\n", "from generate_signals import SignalGenerator\n", "self = SignalGenerator()\n", "self.prepare_data()\n", "self.process_history()\n", "\n", "fsecs = list(range(self.present_time - self.sim_timespan, self.present_time + 1, 5))\n", "fsec = fsecs[0]\n", "\n", "# 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n", "move = pd.read_csv(os.path.join(self.path_tables, 'move', f'move_{fsec}.csv'), index_col=0)\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "isinstance(movement, pd.DataFrame)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로번호, 종료유닉스타임)만 수집 : B\n", "recent_histories = [group.iloc[-1:] for _, group in self.history[self.history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", "\n", "if not recent_histories:\n", " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", "else:\n", " rhistory = pd.concat(recent_histories)\n", "recent_unix = rhistory[['inter_no', 'end_unix']]\n", "# 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", "move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", "move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", "# 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n", "move = move.rename(columns = {'end_unix':'start_unix'})\n", "# 5. 이동류 이력정보 READ\n", "# - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n", "try:\n", " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", " pass\n", " else: \n", " movement = pd.DataFrame()\n", "except NameError: # movement가 존재하지 않는 경우 생성\n", " movement = pd.DataFrame()\n", "# 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n", "movement = pd.concat([movement, move])\n", "# 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거)\n", "movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix'])\n", "# 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - self.subtractor // 2을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관)\n", "movement = movement[movement.start_unix > fsec - self.subtractor // 2]\n", "# movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", "self.movement = pd.read_csv(os.path.join(self.path_intermediates, 'movement', f'movement_{self.present_time}.csv'), index_col=0)\n" ] } ], "metadata": { "kernelspec": { "display_name": "siggen", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 }