diff --git a/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb b/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb
index e1ece576f..33ae5864e 100644
--- a/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb
+++ b/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -14,7 +14,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
@@ -3282,6 +3282,3820 @@
"source": [
"self.matching[self.matching.node_id=='i2']"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 163,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n",
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:16<00:00, 1053.69it/s]\n"
+ ]
+ }
+ ],
+ "source": [
+ "self = DailyPreprocessor()\n",
+ "self.load_data()\n",
+ "self.make_match1()\n",
+ "self.make_match2()\n",
+ "self.make_match3()\n",
+ "self.make_match4()\n",
+ "self.make_match5()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 164,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "self.node2inter = dict(zip(self.inter_node['node_id'], self.inter_node['inter_no']))\n",
+ "\n",
+ "self.parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique())\n",
+ "self.child_ids = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id.unique())\n",
+ "self.uturn_ids = sorted(self.uturn.child_id.unique())\n",
+ "self.coord_ids = sorted(self.coord.child_id.unique())\n",
+ "\n",
+ "ch2pa = {} # child to parent\n",
+ "for child_id in self.child_ids:\n",
+ " parent_no = self.inter_node[self.inter_node.node_id==child_id].inter_no.iloc[0]\n",
+ " sub_inter_node = self.inter_node[self.inter_node.inter_no==parent_no]\n",
+ " ch2pa[child_id] = sub_inter_node[sub_inter_node.inter_type=='parent'].iloc[0].node_id\n",
+ "directions = ['북', '북동', '동', '남동', '남', '남서', '서', '북서'] # 정북기준 시계방향으로 8방향"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 165,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 각 uturn node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "cmatches = []"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 167,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "parent_id i0\n",
+ "child_id u00\n",
+ "direction 북\n",
+ "condition 좌회전시\n",
+ "inc_edge 571500487_02\n",
+ "out_edge 571500487_01.32\n",
+ "Name: 0, dtype: object\n"
+ ]
+ }
+ ],
+ "source": [
+ "row = self.uturn.iloc[0]\n",
+ "print(row)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 172,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u00 i0\n",
+ "북 좌회전시\n",
+ "571500487_02 571500487_01.32\n"
+ ]
+ }
+ ],
+ "source": [
+ "child_id = row.child_id\n",
+ "parent_id = row.parent_id\n",
+ "direction = row.direction\n",
+ "condition = row.condition\n",
+ "inc_edge_id = row.inc_edge\n",
+ "out_edge_id = row.out_edge\n",
+ "print(child_id, parent_id)\n",
+ "print(direction, condition)\n",
+ "print(inc_edge_id, out_edge_id)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 004 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 003 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 095 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir 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 270 \n",
+ "4 175 3 A 6 동 서 090 270 \n",
+ "5 175 3 B 1 동 남 090 180 \n",
+ "6 175 4 A 5 서 북 268 000 \n",
+ "7 175 4 B 2 서 동 270 090 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u00 \n",
+ "1 NaN NaN u00 \n",
+ "2 NaN NaN u00 \n",
+ "3 NaN NaN u00 \n",
+ "4 NaN NaN u00 \n",
+ "5 NaN NaN u00 \n",
+ "6 NaN NaN u00 \n",
+ "7 NaN NaN u00 "
+ ]
+ },
+ "execution_count": 169,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# match5에서 parent_id에 해당하는 행들을 가져옴\n",
+ "cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ "cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ "cmatch['node_id'] = child_id\n",
+ "cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "cmatch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 173,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# condition 별로 inc_dire, out_dire를 정함\n",
+ "ind = directions.index(direction)\n",
+ "if condition == \"좌회전시\":\n",
+ " inc_dire = direction\n",
+ " out_dire = directions[(ind + 2) % len(directions)]\n",
+ "elif condition == \"보행신호시\":\n",
+ " inc_dire = directions[(ind + 2) % len(directions)]\n",
+ " out_dire = directions[(ind - 2) % len(directions)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 174,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "북 동\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(inc_dire, out_dire)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 177,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 004 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 003 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 095 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir 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 19 북 동 001 095 \n",
+ "3 175 2 B 3 남 서 179 270 \n",
+ "4 175 3 A 6 동 서 090 270 \n",
+ "5 175 3 B 1 동 남 090 180 \n",
+ "6 175 4 A 5 서 북 268 000 \n",
+ "7 175 4 B 2 서 동 270 090 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u00 \n",
+ "1 NaN NaN u00 \n",
+ "2 571500487_02 571500487_01.32 u00 \n",
+ "3 NaN NaN u00 \n",
+ "4 NaN NaN u00 \n",
+ "5 NaN NaN u00 \n",
+ "6 NaN NaN u00 \n",
+ "7 NaN NaN u00 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# (inc_dire, out_dire) 별로 inc_edge_id, out_edge_id를 정함\n",
+ "cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ "if condition == '보행신호시':\n",
+ " # 이동류번호가 17(보행신호)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.\n",
+ " cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ "# 유턴신호의 이동류번호를 19로 부여한다.\n",
+ "cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), 'move_no'] = 19\n",
+ "\n",
+ "display(cmatch)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cmatches = []\n",
+ "for _, row in self.uturn.iterrows():\n",
+ " child_id = row.child_id\n",
+ " parent_id = row.parent_id\n",
+ " direction = row.direction\n",
+ " condition = row.condition\n",
+ " inc_edge_id = row.inc_edge\n",
+ " out_edge_id = row.out_edge\n",
+ " # match5에서 parent_id에 해당하는 행들을 가져옴\n",
+ " cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ " cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ " cmatch['node_id'] = child_id\n",
+ " cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "\n",
+ " # condition 별로 inc_dire, out_dire를 정함\n",
+ " ind = directions.index(direction)\n",
+ " if condition == \"좌회전시\":\n",
+ " inc_dire = direction\n",
+ " out_dire = directions[(ind + 2) % len(directions)]\n",
+ " elif condition == \"보행신호시\":\n",
+ " inc_dire = directions[(ind + 2) % len(directions)]\n",
+ " out_dire = directions[(ind - 2) % len(directions)]\n",
+ "\n",
+ " # (inc_dire, out_dire) 별로 inc_edge_id, out_edge_id를 정함\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " if condition == '보행신호시':\n",
+ " # 이동류번호가 17(보행신호)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.\n",
+ " cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " # 유턴신호의 이동류번호를 19로 부여한다.\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), 'move_no'] = 19\n",
+ " cmatches.append(cmatch)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 191,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 004 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 003 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 095 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542810_01.51 | \n",
+ " 571542810_02 | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " 571556452_01 | \n",
+ " 571556452_02 | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " 571500475_02 | \n",
+ " 571500475_01.26 | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 19 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " 571540303_02 | \n",
+ " -571540303_02 | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " 210 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 210 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " 571500535_02 | \n",
+ " -571500535_02 | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 359 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 210 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 210 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir 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 19 북 동 001 095 \n",
+ "3 175 2 B 3 남 서 179 270 \n",
+ "4 175 3 A 6 동 서 090 270 \n",
+ "5 175 3 B 1 동 남 090 180 \n",
+ "6 175 4 A 5 서 북 268 000 \n",
+ "7 175 4 B 2 서 동 270 090 \n",
+ "0 177 1 A 8 남 북 180 000 \n",
+ "1 177 1 B 4 북 남 001 176 \n",
+ "2 177 2 A 7 북 동 000 090 \n",
+ "3 177 2 B 3 남 서 179 270 \n",
+ "4 177 3 A 17 NaN NaN NaN NaN \n",
+ "5 177 3 B 18 NaN NaN NaN NaN \n",
+ "6 177 4 A 5 서 북 268 000 \n",
+ "7 177 4 B 1 동 남 090 180 \n",
+ "0 178 1 A 8 남 북 180 000 \n",
+ "1 178 1 B 4 북 남 000 180 \n",
+ "2 178 2 A 7 북 동 000 090 \n",
+ "3 178 2 B 3 남 서 180 270 \n",
+ "4 178 3 A 5 서 북 270 000 \n",
+ "5 178 3 B 2 서 동 270 090 \n",
+ "6 178 4 A 19 동 서 090 270 \n",
+ "7 178 4 B 1 동 남 090 180 \n",
+ "0 178 1 A 19 남 북 180 000 \n",
+ "1 178 1 B 4 북 남 000 180 \n",
+ "2 178 2 A 7 북 동 000 090 \n",
+ "3 178 2 B 3 남 서 180 270 \n",
+ "4 178 3 A 5 서 북 270 000 \n",
+ "5 178 3 B 2 서 동 270 090 \n",
+ "6 178 4 A 6 동 서 090 270 \n",
+ "7 178 4 B 1 동 남 090 180 \n",
+ "0 178 1 A 8 남 북 180 000 \n",
+ "1 178 1 B 19 북 남 000 180 \n",
+ "2 178 2 A 7 북 동 000 090 \n",
+ "3 178 2 B 3 남 서 180 270 \n",
+ "4 178 3 A 5 서 북 270 000 \n",
+ "5 178 3 B 2 서 동 270 090 \n",
+ "6 178 4 A 6 동 서 090 270 \n",
+ "7 178 4 B 1 동 남 090 180 \n",
+ "0 210 1 A 6 동 서 090 270 \n",
+ "1 210 1 B 18 NaN NaN NaN NaN \n",
+ "2 210 2 A 19 서 북 268 000 \n",
+ "3 210 2 B 2 서 동 270 090 \n",
+ "4 210 3 A 7 북 동 359 090 \n",
+ "5 210 3 B 4 북 남 000 180 \n",
+ "6 210 4 A 8 남 북 180 000 \n",
+ "7 210 4 B 3 남 서 180 270 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u00 \n",
+ "1 NaN NaN u00 \n",
+ "2 571500487_02 571500487_01.32 u00 \n",
+ "3 NaN NaN u00 \n",
+ "4 NaN NaN u00 \n",
+ "5 NaN NaN u00 \n",
+ "6 NaN NaN u00 \n",
+ "7 NaN NaN u00 \n",
+ "0 NaN NaN u20 \n",
+ "1 NaN NaN u20 \n",
+ "2 NaN NaN u20 \n",
+ "3 NaN NaN u20 \n",
+ "4 571542810_01.51 571542810_02 u20 \n",
+ "5 NaN NaN u20 \n",
+ "6 NaN NaN u20 \n",
+ "7 NaN NaN u20 \n",
+ "0 NaN NaN u30 \n",
+ "1 NaN NaN u30 \n",
+ "2 NaN NaN u30 \n",
+ "3 NaN NaN u30 \n",
+ "4 NaN NaN u30 \n",
+ "5 NaN NaN u30 \n",
+ "6 571556452_01 571556452_02 u30 \n",
+ "7 NaN NaN u30 \n",
+ "0 571500475_02 571500475_01.26 u31 \n",
+ "1 NaN NaN u31 \n",
+ "2 NaN NaN u31 \n",
+ "3 NaN NaN u31 \n",
+ "4 NaN NaN u31 \n",
+ "5 NaN NaN u31 \n",
+ "6 NaN NaN u31 \n",
+ "7 NaN NaN u31 \n",
+ "0 NaN NaN u32 \n",
+ "1 571540303_02 -571540303_02 u32 \n",
+ "2 NaN NaN u32 \n",
+ "3 NaN NaN u32 \n",
+ "4 NaN NaN u32 \n",
+ "5 NaN NaN u32 \n",
+ "6 NaN NaN u32 \n",
+ "7 NaN NaN u32 \n",
+ "0 NaN NaN u60 \n",
+ "1 NaN NaN u60 \n",
+ "2 571500535_02 -571500535_02 u60 \n",
+ "3 NaN NaN u60 \n",
+ "4 NaN NaN u60 \n",
+ "5 NaN NaN u60 \n",
+ "6 NaN NaN u60 \n",
+ "7 NaN NaN u60 "
+ ]
+ },
+ "execution_count": 191,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.concat(cmatches)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n",
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:16<00:00, 1071.54it/s]\n"
+ ]
+ }
+ ],
+ "source": [
+ "self = DailyPreprocessor()\n",
+ "self.load_data()\n",
+ "self.make_match1()\n",
+ "self.make_match2()\n",
+ "self.make_match3()\n",
+ "self.make_match4()\n",
+ "self.make_match5()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u00\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 004 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 003 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 095 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir 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 19 북 동 001 095 \n",
+ "3 175 2 B 3 남 서 179 270 \n",
+ "4 175 3 A 6 동 서 090 270 \n",
+ "5 175 3 B 1 동 남 090 180 \n",
+ "6 175 4 A 5 서 북 268 000 \n",
+ "7 175 4 B 2 서 동 270 090 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u00 \n",
+ "1 NaN NaN u00 \n",
+ "2 571500487_02 571500487_01.32 u00 \n",
+ "3 NaN NaN u00 \n",
+ "4 NaN NaN u00 \n",
+ "5 NaN NaN u00 \n",
+ "6 NaN NaN u00 \n",
+ "7 NaN NaN u00 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u20\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542810_01.51 | \n",
+ " 571542810_02 | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "0 177 1 A 8 남 북 180 000 \n",
+ "1 177 1 B 4 북 남 001 176 \n",
+ "2 177 2 A 7 북 동 000 090 \n",
+ "3 177 2 B 3 남 서 179 270 \n",
+ "4 177 3 A 17 NaN NaN NaN NaN \n",
+ "5 177 3 B 18 NaN NaN NaN NaN \n",
+ "6 177 4 A 5 서 북 268 000 \n",
+ "7 177 4 B 1 동 남 090 180 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u20 \n",
+ "1 NaN NaN u20 \n",
+ "2 NaN NaN u20 \n",
+ "3 NaN NaN u20 \n",
+ "4 571542810_01.51 571542810_02 u20 \n",
+ "5 NaN NaN u20 \n",
+ "6 NaN NaN u20 \n",
+ "7 NaN NaN u20 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u30\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " 571556452_01 | \n",
+ " 571556452_02 | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "0 178 1 A 8 남 북 180 000 \n",
+ "1 178 1 B 4 북 남 000 180 \n",
+ "2 178 2 A 7 북 동 000 090 \n",
+ "3 178 2 B 3 남 서 180 270 \n",
+ "4 178 3 A 5 서 북 270 000 \n",
+ "5 178 3 B 2 서 동 270 090 \n",
+ "6 178 4 A 19 동 서 090 270 \n",
+ "7 178 4 B 1 동 남 090 180 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u30 \n",
+ "1 NaN NaN u30 \n",
+ "2 NaN NaN u30 \n",
+ "3 NaN NaN u30 \n",
+ "4 NaN NaN u30 \n",
+ "5 NaN NaN u30 \n",
+ "6 571556452_01 571556452_02 u30 \n",
+ "7 NaN NaN u30 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u31\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " 571500475_02 | \n",
+ " 571500475_01.26 | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "0 178 1 A 19 남 북 180 000 \n",
+ "1 178 1 B 4 북 남 000 180 \n",
+ "2 178 2 A 7 북 동 000 090 \n",
+ "3 178 2 B 3 남 서 180 270 \n",
+ "4 178 3 A 5 서 북 270 000 \n",
+ "5 178 3 B 2 서 동 270 090 \n",
+ "6 178 4 A 6 동 서 090 270 \n",
+ "7 178 4 B 1 동 남 090 180 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 571500475_02 571500475_01.26 u31 \n",
+ "1 NaN NaN u31 \n",
+ "2 NaN NaN u31 \n",
+ "3 NaN NaN u31 \n",
+ "4 NaN NaN u31 \n",
+ "5 NaN NaN u31 \n",
+ "6 NaN NaN u31 \n",
+ "7 NaN NaN u31 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u32\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 19 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " 571540303_02 | \n",
+ " -571540303_02 | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u32 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "0 178 1 A 8 남 북 180 000 \n",
+ "1 178 1 B 19 북 남 000 180 \n",
+ "2 178 2 A 7 북 동 000 090 \n",
+ "3 178 2 B 3 남 서 180 270 \n",
+ "4 178 3 A 5 서 북 270 000 \n",
+ "5 178 3 B 2 서 동 270 090 \n",
+ "6 178 4 A 6 동 서 090 270 \n",
+ "7 178 4 B 1 동 남 090 180 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u32 \n",
+ "1 571540303_02 -571540303_02 u32 \n",
+ "2 NaN NaN u32 \n",
+ "3 NaN NaN u32 \n",
+ "4 NaN NaN u32 \n",
+ "5 NaN NaN u32 \n",
+ "6 NaN NaN u32 \n",
+ "7 NaN NaN u32 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "u60\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 210 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 210 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " 571500535_02 | \n",
+ " -571500535_02 | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 359 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 210 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 210 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "0 210 1 A 6 동 서 090 270 \n",
+ "1 210 1 B 18 NaN NaN NaN NaN \n",
+ "2 210 2 A 19 서 북 268 000 \n",
+ "3 210 2 B 2 서 동 270 090 \n",
+ "4 210 3 A 7 북 동 359 090 \n",
+ "5 210 3 B 4 북 남 000 180 \n",
+ "6 210 4 A 8 남 북 180 000 \n",
+ "7 210 4 B 3 남 서 180 270 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u60 \n",
+ "1 NaN NaN u60 \n",
+ "2 571500535_02 -571500535_02 u60 \n",
+ "3 NaN NaN u60 \n",
+ "4 NaN NaN u60 \n",
+ "5 NaN NaN u60 \n",
+ "6 NaN NaN u60 \n",
+ "7 NaN NaN u60 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "self.node2inter = dict(zip(self.inter_node['node_id'], self.inter_node['inter_no']))\n",
+ "\n",
+ "self.parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique())\n",
+ "self.child_ids = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id.unique())\n",
+ "self.uturn_ids = sorted(self.uturn.child_id.unique())\n",
+ "self.coord_ids = sorted(self.coord.child_id.unique())\n",
+ "\n",
+ "ch2pa = {} # child to parent\n",
+ "for child_id in self.child_ids:\n",
+ " parent_no = self.inter_node[self.inter_node.node_id==child_id].inter_no.iloc[0]\n",
+ " sub_inter_node = self.inter_node[self.inter_node.inter_no==parent_no]\n",
+ " ch2pa[child_id] = sub_inter_node[sub_inter_node.inter_type=='parent'].iloc[0].node_id\n",
+ "directions = ['북', '북동', '동', '남동', '남', '남서', '서', '북서'] # 정북기준 시계방향으로 8방향\n",
+ "\n",
+ "# 각 uturn node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "cmatches = []\n",
+ "for _, row in self.uturn.iterrows():\n",
+ " child_id = row.child_id\n",
+ " parent_id = row.parent_id\n",
+ " direction = row.direction\n",
+ " condition = row.condition\n",
+ " inc_edge_id = row.inc_edge\n",
+ " out_edge_id = row.out_edge\n",
+ " # match5에서 parent_id에 해당하는 행들을 가져옴\n",
+ " cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ " cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ " cmatch['node_id'] = child_id\n",
+ " cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "\n",
+ " # condition 별로 inc_dire, out_dire를 정함\n",
+ " ind = directions.index(direction)\n",
+ " if condition == \"좌회전시\":\n",
+ " inc_dire = direction\n",
+ " out_dire = directions[(ind + 2) % len(directions)]\n",
+ " elif condition == \"보행신호시\":\n",
+ " inc_dire = directions[(ind + 2) % len(directions)]\n",
+ " out_dire = directions[(ind - 2) % len(directions)]\n",
+ "\n",
+ " # (inc_dire, out_dire) 별로 inc_edge_id, out_edge_id를 정함\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " if condition == '보행신호시':\n",
+ " # 이동류번호가 17(보행신호)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.\n",
+ " cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " # 유턴신호의 이동류번호를 19로 부여한다.\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), 'move_no'] = 19\n",
+ " print(child_id)\n",
+ " display(cmatch)\n",
+ " cmatches.append(cmatch)\n",
+ "\n",
+ "# 각 연등교차로(coordination node)에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "self.coord['inter_no'] = self.coord['parent_id'].map(self.node2inter)\n",
+ "self.coord = self.coord.rename(columns={'child_id':'node_id'})\n",
+ "self.coord[['inc_dir', 'out_dir', 'inc_angle','out_angle']] = np.nan\n",
+ "self.coord['move_no'] = 20\n",
+ "self.coord = self.coord[['inter_no', 'phase_no', 'ring_type', 'move_no', 'inc_dir', 'out_dir', 'inc_angle','out_angle', 'inc_edge', 'out_edge', 'node_id']]\n",
+ "\n",
+ "# display(coord)\n",
+ "cmatches = pd.concat(cmatches)\n",
+ "self.match6 = pd.concat([self.match5, cmatches, self.coord]).drop_duplicates().sort_values(by=['inter_no', 'node_id', 'phase_no', 'ring_type'])\n",
+ "# self.match6.to_csv(os.path.join(self.path_intermediates, 'match6.csv'))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inc | \n",
+ " out | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " 105.0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " NaN | \n",
+ " 5.0 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inc out\n",
+ "0 1.0 105.0\n",
+ "1 2.0 NaN\n",
+ "2 NaN 5.0\n",
+ "3 NaN NaN"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inc | \n",
+ " out | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " True | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " True | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " False | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " False | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inc out\n",
+ "0 True True\n",
+ "1 True False\n",
+ "2 False True\n",
+ "3 False False"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0 True\n",
+ "1 False\n",
+ "2 False\n",
+ "3 False\n",
+ "dtype: bool\n",
+ "inc False\n",
+ "out False\n",
+ "dtype: bool\n"
+ ]
+ }
+ ],
+ "source": [
+ "bdf = pd.DataFrame({'inc':[1, 2, np.nan, np.nan], 'out':[105, np.nan, 5, np.nan]})\n",
+ "display(bdf)\n",
+ "display(bdf.notna())\n",
+ "print(bdf.notna().all(axis=1))\n",
+ "print(bdf.notna().all(axis=0))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inc | \n",
+ " out | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 2.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 5.0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inc out\n",
+ "0 2.0 NaN\n",
+ "1 NaN 5.0\n",
+ "2 NaN NaN"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " inc out\n",
+ "0 False True\n",
+ "1 True False\n",
+ "2 True True\n",
+ "0 True\n",
+ "1 True\n",
+ "2 True\n",
+ "dtype: bool\n",
+ "True\n"
+ ]
+ }
+ ],
+ "source": [
+ "bdf = pd.DataFrame({'inc':[2, np.nan, np.nan], 'out':[np.nan, 5, np.nan]})\n",
+ "display(bdf)\n",
+ "# print((bdf[['inc','out']].notna()))\n",
+ "# print((bdf[['inc','out']].notna()).all(axis=1))\n",
+ "# print((bdf[['inc','out']].notna()).all(axis=1).any())\n",
+ "print((bdf[['inc','out']].isna()))\n",
+ "print((bdf[['inc','out']].isna()).any(axis=1))\n",
+ "print(bdf[['inc','out']].isna().any(axis=1).all())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " inc_edge out_edge\n",
+ "0 False False\n",
+ "1 False False\n",
+ "2 True True\n",
+ "3 False False\n",
+ "4 False False\n",
+ "5 False False\n",
+ "6 False False\n",
+ "7 False False\n",
+ "0 False\n",
+ "1 False\n",
+ "2 True\n",
+ "3 False\n",
+ "4 False\n",
+ "5 False\n",
+ "6 False\n",
+ "7 False\n",
+ "dtype: bool\n",
+ "True\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "print(cmatch[['inc_edge','out_edge']].notna())\n",
+ "print((cmatch[['inc_edge','out_edge']].notna()).all(axis=1))\n",
+ "print((cmatch[['inc_edge','out_edge']].notna()).all(axis=1).any())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cmatch[['inc_edge','out_edge']].isna().any(axis=1).all()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "서\n",
+ "북\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(inc_dire)\n",
+ "print(out_dire)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 210 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 210 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " 571500535_02 | \n",
+ " -571500535_02 | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 359 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 210 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 210 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "0 210 1 A 6 동 서 090 270 \n",
+ "1 210 1 B 18 NaN NaN NaN NaN \n",
+ "2 210 2 A 19 서 북 268 000 \n",
+ "3 210 2 B 2 서 동 270 090 \n",
+ "4 210 3 A 7 북 동 359 090 \n",
+ "5 210 3 B 4 북 남 000 180 \n",
+ "6 210 4 A 8 남 북 180 000 \n",
+ "7 210 4 B 3 남 서 180 270 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u60 \n",
+ "1 NaN NaN u60 \n",
+ "2 571500535_02 -571500535_02 u60 \n",
+ "3 NaN NaN u60 \n",
+ "4 NaN NaN u60 \n",
+ "5 NaN NaN u60 \n",
+ "6 NaN NaN u60 \n",
+ "7 NaN NaN u60 "
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cmatch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "((cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire)).any()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 | \n",
+ " 210 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 19 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " 571500535_02 | \n",
+ " -571500535_02 | \n",
+ " u60 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "2 210 2 A 19 서 북 268 000 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "2 571500535_02 -571500535_02 u60 "
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n"
+ ]
+ }
+ ],
+ "source": [
+ "self.load_data()\n",
+ "self.node2inter = dict(zip(self.inter_node['node_id'], self.inter_node['inter_no']))\n",
+ "\n",
+ "self.parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique())\n",
+ "self.child_ids = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id.unique())\n",
+ "self.uturn_ids = sorted(self.uturn.child_id.unique())\n",
+ "self.coord_ids = sorted(self.coord.child_id.unique())\n",
+ "\n",
+ "ch2pa = {} # child to parent\n",
+ "for child_id in self.child_ids:\n",
+ " parent_no = self.inter_node[self.inter_node.node_id==child_id].inter_no.iloc[0]\n",
+ " sub_inter_node = self.inter_node[self.inter_node.inter_no==parent_no]\n",
+ " ch2pa[child_id] = sub_inter_node[sub_inter_node.inter_type=='parent'].iloc[0].node_id\n",
+ "directions = ['북', '북동', '동', '남동', '남', '남서', '서', '북서'] # 정북기준 시계방향으로 8방향\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 004 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 003 | \n",
+ " 176 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 095 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir 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 270 \n",
+ "4 175 3 A 6 동 서 090 270 \n",
+ "5 175 3 B 1 동 남 090 180 \n",
+ "6 175 4 A 5 서 북 268 000 \n",
+ "7 175 4 B 2 서 동 270 090 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "0 NaN NaN u00 \n",
+ "1 NaN NaN u00 \n",
+ "2 NaN NaN u00 \n",
+ "3 NaN NaN u00 \n",
+ "4 NaN NaN u00 \n",
+ "5 NaN NaN u00 \n",
+ "6 NaN NaN u00 \n",
+ "7 NaN NaN u00 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "row = self.uturn.iloc[0]\n",
+ "\n",
+ "child_id = row.child_id\n",
+ "parent_id = row.parent_id\n",
+ "direction = row.direction\n",
+ "condition = row.condition\n",
+ "inc_edge_id = row.inc_edge\n",
+ "out_edge_id = row.out_edge\n",
+ "\n",
+ "# match5에서 parent_id에 해당하는 행들을 가져옴\n",
+ "cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ "cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ "cmatch['node_id'] = child_id\n",
+ "cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "\n",
+ "display(cmatch)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ind = directions.index(direction)\n",
+ "inc_dire_right = direction\n",
+ "out_dire_right = directions[(ind + 2) % len(directions)]\n",
+ "inc_dire_pedes = directions[(ind + 2) % len(directions)]\n",
+ "out_dire_pedes = directions[(ind - 2) % len(directions)]\n",
+ "\n",
+ "if condition == \"좌회전시\":\n",
+ " inc_dire = inc_dire_right\n",
+ " out_dire = out_dire_right\n",
+ "elif condition == \"보행신호시\":\n",
+ " inc_dire = inc_dire_pedes\n",
+ " out_dire = out_dire_pedes\n",
+ "pedes_condition = ((cmatch.inc_dir==inc_dire_pedes) & (cmatch.out_dir==out_dire_pedes)).any()\n",
+ "right_condition = ((cmatch.inc_dir==inc_dire_right) & (cmatch.out_dir==out_dire_right)).any()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 각 uturn node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "cmatches = []\n",
+ "for _, row in self.uturn.iterrows():\n",
+ " child_id = row.child_id\n",
+ " parent_id = row.parent_id\n",
+ " direction = row.direction\n",
+ " condition = row.condition\n",
+ " inc_edge_id = row.inc_edge\n",
+ " out_edge_id = row.out_edge\n",
+ " # match5에서 parent_id에 해당하는 행들을 가져옴\n",
+ " cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ " cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ " cmatch['node_id'] = child_id\n",
+ " cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "\n",
+ " # condition 별로 inc_dire, out_dire를 정함\n",
+ " ind = directions.index(direction)\n",
+ " if condition == \"좌회전시\":\n",
+ " inc_dire = direction\n",
+ " out_dire = directions[(ind + 2) % len(directions)]\n",
+ " elif condition == \"보행신호시\":\n",
+ " inc_dire = directions[(ind + 2) % len(directions)]\n",
+ " out_dire = directions[(ind - 2) % len(directions)]\n",
+ "\n",
+ " # (inc_dire, out_dire) 별로 inc_edge_id, out_edge_id를 정함\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " if condition == '보행신호시':\n",
+ " # 이동류번호가 17(보행신호이동류)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.\n",
+ " cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ "\n",
+ " # 만약 어떤 유턴신호도 배정되지 않았다면, 보행신호시 > 좌회전시 > 전적색이동류발생시 > 보행신호이동류발생시 순으로 유턴신호를 배정한다.\n",
+ " uturn_not_assigned = cmatch[['inc_edge','out_edge']].isna().any(axis=1).all()\n",
+ " if uturn_not_assigned:\n",
+ " # 보행신호시\n",
+ " inc_dire_pedes = directions[(ind + 2) % len(directions)]\n",
+ " out_dire_pedes = directions[(ind - 2) % len(directions)]\n",
+ " # 좌회전시\n",
+ " inc_dire_right = direction\n",
+ " out_dire_right = directions[(ind + 2) % len(directions)]\n",
+ "\n",
+ " # 보행신호시의 inc_dir, out_dir 존재\n",
+ " pedes_exists = ((cmatch.inc_dir==inc_dire_pedes) & (cmatch.out_dir==out_dire_pedes))\n",
+ " right_exists = ((cmatch.inc_dir==inc_dire_right) & (cmatch.out_dir==out_dire_right))\n",
+ " all_redsigns = cmatch.move_no == 18\n",
+ " crosswalk_on = cmatch.move_no == 17\n",
+ " \n",
+ " if pedes_exists.any():\n",
+ " cmatch.loc[pedes_exists, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " elif right_exists.any():\n",
+ " cmatch.loc[right_exists, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " elif all_redsigns.any():\n",
+ " cmatch.loc[all_redsigns, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " elif crosswalk_on.any():\n",
+ " cmatch.loc[crosswalk_on & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ "\n",
+ " # 유턴신호의 이동류번호를 19로 부여한다.\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), 'move_no'] = 19\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 92,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n",
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 68%|██████▊ | 11723/17280 [01:23<00:39, 140.43it/s] \n",
+ "이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:14<00:00, 1174.55it/s]\n"
+ ]
+ }
+ ],
+ "source": [
+ "self = DailyPreprocessor()\n",
+ "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": 166,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " parent_id | \n",
+ " child_id | \n",
+ " direction | \n",
+ " condition | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " i0 | \n",
+ " u00 | \n",
+ " 북 | \n",
+ " 좌회전시 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " i2 | \n",
+ " u20 | \n",
+ " 북 | \n",
+ " 보행신호시 | \n",
+ " 571542810_01.51 | \n",
+ " 571542810_02 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " i3 | \n",
+ " u30 | \n",
+ " 북 | \n",
+ " 보행신호시 | \n",
+ " 571556452_01 | \n",
+ " 571556452_02 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " i3 | \n",
+ " u31 | \n",
+ " 동 | \n",
+ " 보행신호시 | \n",
+ " 571500475_02 | \n",
+ " 571500475_01.26 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " i3 | \n",
+ " u32 | \n",
+ " 서 | \n",
+ " 보행신호시 | \n",
+ " 571540303_02 | \n",
+ " -571540303_02 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " i6 | \n",
+ " u60 | \n",
+ " 서 | \n",
+ " 좌회전시 | \n",
+ " 571500535_02 | \n",
+ " -571500535_02 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " parent_id child_id direction condition inc_edge out_edge\n",
+ "0 i0 u00 북 좌회전시 571500487_02 571500487_01.32\n",
+ "1 i2 u20 북 보행신호시 571542810_01.51 571542810_02\n",
+ "2 i3 u30 북 보행신호시 571556452_01 571556452_02\n",
+ "3 i3 u31 동 보행신호시 571500475_02 571500475_01.26\n",
+ "4 i3 u32 서 보행신호시 571540303_02 -571540303_02\n",
+ "5 i6 u60 서 좌회전시 571500535_02 -571500535_02"
+ ]
+ },
+ "execution_count": 166,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.uturn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 227,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 각 uturn node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "cmatches = []\n",
+ "for _, row in self.uturn.iterrows():\n",
+ " child_id = row.child_id\n",
+ " parent_id = row.parent_id\n",
+ " direction = row.direction\n",
+ " condition = row.condition\n",
+ "\n",
+ " # match5에서 부모노드id에 해당하는 행들을 가져옴 (cmatch)\n",
+ " cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ " cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ " cmatch['node_id'] = child_id\n",
+ " cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "\n",
+ " # 보행신호시/좌회전시 진입/진출방향\n",
+ " ind = directions.index(direction)\n",
+ " inc_dire_pedes = directions[(ind + 2) % len(directions)]\n",
+ " out_dire_pedes = directions[(ind - 2) % len(directions)]\n",
+ " inc_dire_right = direction\n",
+ " out_dire_right = directions[(ind + 2) % len(directions)]\n",
+ "\n",
+ " # 보행신호시/좌회전시 조건\n",
+ " pedes_exists = (cmatch.inc_dir==inc_dire_pedes) & (cmatch.out_dir==out_dire_pedes)\n",
+ " right_exists = (cmatch.inc_dir==inc_dire_right) & (cmatch.out_dir==out_dire_right)\n",
+ "\n",
+ " # 보행신호시/좌회전시 진입/진출 엣지id 배정\n",
+ " ind = directions.index(direction)\n",
+ " if condition == \"보행신호시\":\n",
+ " cmatch.loc[pedes_exists, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " elif condition == \"좌회전시\":\n",
+ " cmatch.loc[right_exists, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ "\n",
+ " # 신호없음이동류발생시/보행신호이동류발생시 조건\n",
+ " all_redsigns = cmatch.move_no == 18\n",
+ " crosswalk_on = cmatch.move_no == 17\n",
+ "\n",
+ " # 만약 어떤 유턴신호도 배정되지 않았다면\n",
+ " # 신호없음이동류발생시 → 보행신호이동류발생시 → 보행신호시 → 좌회전시 순으로 진입/진출 엣지id 배정\n",
+ " uturn_not_assigned = cmatch[['inc_edge','out_edge']].isna().any(axis=1).all()\n",
+ " if uturn_not_assigned:\n",
+ " # 신호없음이동류(18) 발생시\n",
+ " if all_redsigns.any():\n",
+ " cmatch.loc[all_redsigns, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " # 보행신호이동류(17) 발생시\n",
+ " elif crosswalk_on.any():\n",
+ " cmatch.loc[crosswalk_on & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " # 보행신호시\n",
+ " elif pedes_exists.any():\n",
+ " cmatch.loc[pedes_exists, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " # 좌회전시\n",
+ " elif right_exists.any():\n",
+ " cmatch.loc[right_exists, ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 유턴신호 부여 로직\n",
+ "## 입력 1. `self.match5`\n",
+ "- 컬럼목록 : 노드id, 현시번호, 링타입, 이동류번호, 진입/진출방향, 진입/진출엣지id\n",
+ "- 설명 : 부모교차로에 대한 매칭정보\n",
+ "\n",
+ "## 입력 2. `self.uturn`\n",
+ "- 컬럼목록 : 부모노드id, 자식노드id, 진입방향, 조건, 진입/진출방향\n",
+ "- 설명 : 유턴에 대한 정보\n",
+ "- 여기에서 조건이란 \"좌회전시\" 또는 \"보행신호시\" 또는 \"\"(지정되지 않음) 중 하나임.\n",
+ "\n",
+ "## 출력 : `self.match6`\n",
+ "- 컬럼목록 : `self.match5와` 같음\n",
+ "- 설명 : 부모 및 자식교차로에 대한 매칭정보 (자식교차로 : 유턴교차로, 연등교차로)\n",
+ "\n",
+ "## 유턴신호 부여 알고리즘\n",
+ "\n",
+ "## 요약 :\n",
+ "각 유턴노드별로 `self.match5`에서 해당되는 행들을 가져오고 (이것을 `cmatch`라고 한다.)\n",
+ "조건별로 `cmatch`에서 해당되는 행에 진입/진출엣지id를 지정한다. \n",
+ "\n",
+ "## 상세:\n",
+ "각 유턴 노드에 대하여 `cmatch`를 다음과 같이 정한다.\n",
+ "\n",
+ "- (1) `cmatch`\n",
+ " - (1-1) 부모노드의 `self.match5`에 해당하는 데이터프레임(`cmatch`)을 가져온다.\n",
+ " - (1-2) `node_id`는 자식노드id로 부여하고, 진입/진출엣지id는 `np.nan`으로 초기화한다.\n",
+ "- (2) 조건이 \"좌회전시\", \"보행신호시\"이면\n",
+ " - (2-1) 그에 따라 진입/진출방향을 정한다. (8방위)\n",
+ " - (2-2) `cmatch`에서 진입/진출방향에 대응되는 행에 진입/진출엣지id를 지정한다.\n",
+ "- (3) 조건이 지정되지 않았거나,\n",
+ " 조건이 지정되었어도 진입/진출방향에 대응되는 행이 존재하지 않으면\n",
+ " 보행신호이동류발생시 → 전적색이동류발생시 → 보행신호시 → 좌회전시 순으로 유턴신호를 정한다.\n",
+ " - (3-1) 신호없음이동류발생시\n",
+ " \n",
+ " 이동류번호가 18(신호없음)인 행이 cmatch에 존재하면\n",
+ " 해당 행에 진입/진출엣지id를 지정한다.\n",
+ " - (3-2) 보행신호이동류발생시\n",
+ " \n",
+ " 3-1에 해당하지 않고, 이동류번호가 17(보행신호이동류)인 행이 `cmatch`에 존재하며\n",
+ " 유턴노드 방향으로 진출하는 신호가 없으면\n",
+ " 해당 행에 진입/진출엣지id를 지정한다.\n",
+ " - (3-3) 보행신호시\n",
+ " \n",
+ " 3-1, 3-2에 해당하지 않고\n",
+ " 보행신호에 대응되는 진입/진출방향에 대한 행이 `cmatch`에 존재하면\n",
+ " 해당 행에 진입/진출엣지id를 지정한다.\n",
+ " - (3-4) 좌회전시\n",
+ " \n",
+ " 3-1, 3-2, 3-3에 해당하지 않고\n",
+ " 좌회전에 대응되는 진입/진출방향에 대한 행이 `cmatch`에 존재하면\n",
+ " 해당 행에 진입/진출엣지id를 지정한다.\n",
+ " - (3-5) 3-1 ~ 3-4에 해당되지 않는다면 유턴신호가 지정되지 않는다.\n",
+ "\n",
+ "## 이후과정:\n",
+ "각 유턴노드에 대한 `cmatch`들을 리스트 형태로 저장한 후 `pd.concat`하여 합친다 (`cmatches`).\n",
+ "연동교차로에 대해서도 비슷한 종류의 테이블을 만들어둔다. (`self.coord`, 상세 생성과정 생략)\n",
+ "`self.match5`, `cmatches`, `self.coord를` `pd.concat`하여 `self.match6`를 만든다."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
diff --git a/Analysis/0307_red_yellow/match5.png b/Analysis/0307_red_yellow/match5.png
new file mode 100644
index 000000000..7a8f2c44e
Binary files /dev/null and b/Analysis/0307_red_yellow/match5.png differ
diff --git a/Analysis/0307_red_yellow/match6.png b/Analysis/0307_red_yellow/match6.png
new file mode 100644
index 000000000..a688f2e3e
Binary files /dev/null and b/Analysis/0307_red_yellow/match6.png differ
diff --git a/Analysis/0307_red_yellow/uturn.png b/Analysis/0307_red_yellow/uturn.png
new file mode 100644
index 000000000..22fb16baa
Binary files /dev/null and b/Analysis/0307_red_yellow/uturn.png differ
diff --git a/Results/sn_1704416400.add.xml b/Results/sn_1704416400.add.xml
index fe167a147..c012396eb 100644
--- a/Results/sn_1704416400.add.xml
+++ b/Results/sn_1704416400.add.xml
@@ -1,62 +1,59 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
-
+
-
+
@@ -68,10 +65,10 @@
-
+
-
+
@@ -83,17 +80,12 @@
-
-
-
-
-
-
-
+
+
-
+
@@ -124,168 +116,157 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
@@ -328,72 +309,66 @@
-
-
-
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
@@ -412,12 +387,9 @@
-
-
-
-
+
@@ -454,15 +426,10 @@
-
-
-
-
-
-
+
-
+
@@ -505,212 +472,198 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/Results/sn_1704419100.add.xml b/Results/sn_1704419100.add.xml
index 65d015667..127d6f0a3 100644
--- a/Results/sn_1704419100.add.xml
+++ b/Results/sn_1704419100.add.xml
@@ -1,291 +1,272 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -328,72 +309,66 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -412,12 +387,9 @@
-
-
-
-
+
@@ -454,15 +426,10 @@
-
-
-
-
-
-
+
-
+
@@ -505,212 +472,198 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/Scripts/__pycache__/generate_signals.cpython-38.pyc b/Scripts/__pycache__/generate_signals.cpython-38.pyc
index bd7cb230e..d7e1b054b 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 caff33f56..eb35c4146 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/preprocess_daily.py b/Scripts/preprocess_daily.py
index da8c83c2f..2239d9084 100644
--- a/Scripts/preprocess_daily.py
+++ b/Scripts/preprocess_daily.py
@@ -378,7 +378,7 @@ class DailyPreprocessor():
'''
진입엣지id, 진출엣지id, 노드id를 추가함 (부교차로).
- match6의 컬럼 : inter_no, phase_no, ring_type, move_no, inc_dir, out_dir, inc_angle, out_angle, inc_edge, out_edge, node_id
-
+
사용된 데이터 :
(1) inter_node
- 교차로번호와 노드id를 매칭시키는 테이블.
@@ -410,10 +410,10 @@ class DailyPreprocessor():
* 서 : directions[(ind - 2) % len(directions)]
- uturn의 각 행을 순회하면서 아래 과정을 반복함
- match5에서 parent_id에 해당하는 행들을 가져옴(cmatch).
- - condition 별로 진입방향, 진출방향A, 진출방향B 정함.
+ - condition 별로 진입방향, 진출방향을 정함.
- 상술한 directions를 활용하여 정함.
- - (진입방향, 진출방향A, 진출방향B)을 고려하여 (현시, 링) 별로 진입엣지id, 진출엣지id를 정함.
- - ex) cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]
+ - (진입방향, 진출방향)을 고려하여 (현시, 링) 별로 진입엣지id, 진출엣지id를 정함.
+ - ex) cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]
- 순회하면서 만든 cmatch를 cmatchs라는 리스트에 저장함.
연동교차로 :
@@ -454,25 +454,22 @@ class DailyPreprocessor():
cmatch['node_id'] = child_id
cmatch[['inc_edge', 'out_edge']] = np.nan
- # condition 별로 inc_dire, out_dire_A, out_dire_B를 정함
+ # condition 별로 inc_dire, out_dire를 정함
ind = directions.index(direction)
if condition == "좌회전시":
inc_dire = direction
- out_dire_A = out_dire_B = directions[(ind + 2) % len(directions)]
+ out_dire = directions[(ind + 2) % len(directions)]
elif condition == "보행신호시":
inc_dire = directions[(ind + 2) % len(directions)]
- out_dire_A = directions[(ind - 2) % len(directions)]
- out_dire_B = directions[(ind - 2) % len(directions)]
+ out_dire = directions[(ind - 2) % len(directions)]
- # (inc_dire, out_dire_A, out_dire_B) 별로 inc_edge_id, out_edge_id를 정함
- cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]
- cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]
+ # (inc_dire, out_dire) 별로 inc_edge_id, out_edge_id를 정함
+ cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]
if condition == '보행신호시':
# 이동류번호가 17(보행신호)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.
cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]
# 유턴신호의 이동류번호를 19로 부여한다.
- cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), 'move_no'] = 19
- cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), 'move_no'] = 19
+ cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire), 'move_no'] = 19
cmatches.append(cmatch)
# 각 연등교차로(coordination node)에 대하여 (inc_edge_id, out_edge_id) 부여