From a67597c82bac4328f30befd28a09c02f68d7b5f6 Mon Sep 17 00:00:00 2001 From: govin08 Date: Fri, 8 Mar 2024 15:39:44 +0900 Subject: [PATCH] uturn allocation (make_match6) code is ready, but not applied yet. --- .../0307_red_yellow/0307_red_yellow_2.ipynb | 3818 ++++++++++++++++- Analysis/0307_red_yellow/match5.png | Bin 0 -> 45922 bytes Analysis/0307_red_yellow/match6.png | Bin 0 -> 40804 bytes Analysis/0307_red_yellow/uturn.png | Bin 0 -> 17867 bytes Results/sn_1704416400.add.xml | 675 ++- Results/sn_1704419100.add.xml | 897 ++-- .../generate_signals.cpython-38.pyc | Bin 23000 -> 25385 bytes .../preprocess_daily.cpython-38.pyc | Bin 30995 -> 31189 bytes Scripts/preprocess_daily.py | 23 +- 9 files changed, 4565 insertions(+), 848 deletions(-) create mode 100644 Analysis/0307_red_yellow/match5.png create mode 100644 Analysis/0307_red_yellow/match6.png create mode 100644 Analysis/0307_red_yellow/uturn.png 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01751A8179004NaNNaNu00
11751B4003176NaNNaNu00
21752A7001095NaNNaNu00
31752B3179270NaNNaNu00
41753A6090270NaNNaNu00
51753B1090180NaNNaNu00
61754A5268000NaNNaNu00
71754B2270090NaNNaNu00
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01751A8179004NaNNaNu00
11751B4003176NaNNaNu00
21752A19001095571500487_02571500487_01.32u00
31752B3179270NaNNaNu00
41753A6090270NaNNaNu00
51753B1090180NaNNaNu00
61754A5268000NaNNaNu00
71754B2270090NaNNaNu00
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01751A8179004NaNNaNu00
11751B4003176NaNNaNu00
21752A19001095571500487_02571500487_01.32u00
31752B3179270NaNNaNu00
41753A6090270NaNNaNu00
51753B1090180NaNNaNu00
61754A5268000NaNNaNu00
71754B2270090NaNNaNu00
01771A8180000NaNNaNu20
11771B4001176NaNNaNu20
21772A7000090NaNNaNu20
31772B3179270NaNNaNu20
41773A17NaNNaNNaNNaN571542810_01.51571542810_02u20
51773B18NaNNaNNaNNaNNaNNaNu20
61774A5268000NaNNaNu20
71774B1090180NaNNaNu20
01781A8180000NaNNaNu30
11781B4000180NaNNaNu30
21782A7000090NaNNaNu30
31782B3180270NaNNaNu30
41783A5270000NaNNaNu30
51783B2270090NaNNaNu30
61784A19090270571556452_01571556452_02u30
71784B1090180NaNNaNu30
01781A19180000571500475_02571500475_01.26u31
11781B4000180NaNNaNu31
21782A7000090NaNNaNu31
31782B3180270NaNNaNu31
41783A5270000NaNNaNu31
51783B2270090NaNNaNu31
61784A6090270NaNNaNu31
71784B1090180NaNNaNu31
01781A8180000NaNNaNu32
11781B19000180571540303_02-571540303_02u32
21782A7000090NaNNaNu32
31782B3180270NaNNaNu32
41783A5270000NaNNaNu32
51783B2270090NaNNaNu32
61784A6090270NaNNaNu32
71784B1090180NaNNaNu32
02101A6090270NaNNaNu60
12101B18NaNNaNNaNNaNNaNNaNu60
22102A19268000571500535_02-571500535_02u60
32102B2270090NaNNaNu60
42103A7359090NaNNaNu60
52103B4000180NaNNaNu60
62104A8180000NaNNaNu60
72104B3180270NaNNaNu60
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01751A8179004NaNNaNu00
11751B4003176NaNNaNu00
21752A19001095571500487_02571500487_01.32u00
31752B3179270NaNNaNu00
41753A6090270NaNNaNu00
51753B1090180NaNNaNu00
61754A5268000NaNNaNu00
71754B2270090NaNNaNu00
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01771A8180000NaNNaNu20
11771B4001176NaNNaNu20
21772A7000090NaNNaNu20
31772B3179270NaNNaNu20
41773A17NaNNaNNaNNaN571542810_01.51571542810_02u20
51773B18NaNNaNNaNNaNNaNNaNu20
61774A5268000NaNNaNu20
71774B1090180NaNNaNu20
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01781A8180000NaNNaNu30
11781B4000180NaNNaNu30
21782A7000090NaNNaNu30
31782B3180270NaNNaNu30
41783A5270000NaNNaNu30
51783B2270090NaNNaNu30
61784A19090270571556452_01571556452_02u30
71784B1090180NaNNaNu30
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01781A19180000571500475_02571500475_01.26u31
11781B4000180NaNNaNu31
21782A7000090NaNNaNu31
31782B3180270NaNNaNu31
41783A5270000NaNNaNu31
51783B2270090NaNNaNu31
61784A6090270NaNNaNu31
71784B1090180NaNNaNu31
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01781A8180000NaNNaNu32
11781B19000180571540303_02-571540303_02u32
21782A7000090NaNNaNu32
31782B3180270NaNNaNu32
41783A5270000NaNNaNu32
51783B2270090NaNNaNu32
61784A6090270NaNNaNu32
71784B1090180NaNNaNu32
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
02101A6090270NaNNaNu60
12101B18NaNNaNNaNNaNNaNNaNu60
22102A19268000571500535_02-571500535_02u60
32102B2270090NaNNaNu60
42103A7359090NaNNaNu60
52103B4000180NaNNaNu60
62104A8180000NaNNaNu60
72104B3180270NaNNaNu60
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
incout
01.0105.0
12.0NaN
2NaN5.0
3NaNNaN
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
incout
0TrueTrue
1TrueFalse
2FalseTrue
3FalseFalse
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
incout
02.0NaN
1NaN5.0
2NaNNaN
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
02101A6090270NaNNaNu60
12101B18NaNNaNNaNNaNNaNNaNu60
22102A19268000571500535_02-571500535_02u60
32102B2270090NaNNaNu60
42103A7359090NaNNaNu60
52103B4000180NaNNaNu60
62104A8180000NaNNaNu60
72104B3180270NaNNaNu60
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
22102A19268000571500535_02-571500535_02u60
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01751A8179004NaNNaNu00
11751B4003176NaNNaNu00
21752A7001095NaNNaNu00
31752B3179270NaNNaNu00
41753A6090270NaNNaNu00
51753B1090180NaNNaNu00
61754A5268000NaNNaNu00
71754B2270090NaNNaNu00
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
parent_idchild_iddirectionconditioninc_edgeout_edge
0i0u00좌회전시571500487_02571500487_01.32
1i2u20보행신호시571542810_01.51571542810_02
2i3u30보행신호시571556452_01571556452_02
3i3u31보행신호시571500475_02571500475_01.26
4i3u32보행신호시571540303_02-571540303_02
5i6u60좌회전시571500535_02-571500535_02
\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 0000000000000000000000000000000000000000..7a8f2c44ecec196b09f1f5454a42a96a4912bbb1 GIT binary patch literal 45922 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 Zxa7^IHhJVM8iAvr@OvDs%5kLle*tPt(G&mx literal 0 HcmV?d00001 diff --git a/Analysis/0307_red_yellow/match6.png b/Analysis/0307_red_yellow/match6.png new file mode 100644 index 0000000000000000000000000000000000000000..a688f2e3e3e4b45466563b5b2fc8c4747135f3f5 GIT binary patch literal 40804 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 OE_YZ-CSBU_;{OMa`w+?i literal 0 HcmV?d00001 diff --git a/Analysis/0307_red_yellow/uturn.png b/Analysis/0307_red_yellow/uturn.png new file mode 100644 index 0000000000000000000000000000000000000000..22fb16baa751850a1aa30615ff8d029bdb6ae841 GIT binary patch literal 17867 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 literal 0 HcmV?d00001 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 bd7cb230e25675aa2a32f7ad30e1212aaefb7776..d7e1b054b9a4f6821915b8a01d9dee0247419067 100644 GIT binary patch delta 5874 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 QrW!0_>rDSoHxW($1#762?*IS* delta 3540 zcmZuzdu&@*8NcWH+P;1}PMSDLn=XB?_qTpNr(6q zU^8F~;HQ8~^6A@GhkyO)kqKE*U&$^Mq6_vKq{mvcc;+}s#B||Qc@ zd~NB@mOtVX2E<)yeyl&8E!m}Z`e%&6hL}gxfL6k<%J{O+g|TAX>`Y`6d`RTPi^_4Y z6dqf4O=qu5*?PrS#EkC%-jrWk(M0ZiVnwXwB``(+%1>$?wc*bS)Q=$dhIFrNXjDE@ zJN^xr&k)2yC96t`j)V0u1$9OCl;9}vXc%DlL7AeZbFf0v`Ht1FQpai2)`CbL#zD4RYeK2VN(r|{P5 zRz@z0tX&wp0u7Gdluh9lM*QmNp`Std>KDH$m5l%)1o|l)} z>)X@@dtmS>f}-0RNbq#8B_0OrPJjc#2A~n2j{_beDC*r-EFfoeEE}E@DY|nO>au;3 z=nyWNS!CTs)*~u0RY4Tg{|Lg=pmI$_Xw1)|%*(3us2*W1{2hK4)Wc;oScI809--%} z4V~#!w!3djGMg0L)_{DxW7d)i(t+lud^|#nrnEdGM`#a+iWy!8)J-VgLQ*mt70@_voV%uilTszI>t1crSvh{b)u4XTbZfi z9&U0k_oWQ(KglvPc!1NUC&zh+Mm-qkVP3%_oTY|6wHk(1##C-s(GxextztKT+^UJY z0d69N2~bILOPzd~M0ShkA*gCMQ&0(=Re zjsoPB%0uA?^@(~Wk)r!xI%lPMP9!klWrA3RyuPtzcuHy9lT98?^mkjm2jfP&7&s~d zq$h54fDA&VS|J1~47eqGKPH_m$X>K7jTw}`Vb-9BRqjSu)ZsUx%x_HQZJ6>l$ifZ+ zdH<#ba_4L=-?-~x{T^K=ZmTYw+&+i-;KY*Git@sa+rt%D_8-I)O912Y=8oF>pAcCz z(m6U}KD}r0vYfYbK6_u@xpRRtLQ{L>k)1n+am2dmQFT!yb_xNeC&NZ{P8p=?<55ai zme;9f9F~LYmSO8B7!sLkXB`!Zo^jd+*Q1(k+($KplF2(uT<~kODXzvMM=$;hw1GZyhe@J zTjHoUamWnUCyb7i&8Vcsb!A2snQtm;22mbGRik=GL$;gtPvzQtixTYI#cN2&#iLH@ zHr%sHb7TM9@V_wCq_Jgc0jeCOY~9e z5Z@(U(L5}YN5G7m+2k<`l)yzH?mwRF>l-+lP^VqoBa*yCiqCErTgjd(+JS|Bv4#|A zeiy5zo>4_uP3K-6QFYWI4EoO@noc?$ryY3s<7`9+@fODKd4Vyvyf+@5-8khFwXHgQ zj*#w>BVBSl{>3J2P24}tB$*;RaBDBCCia+KXx)2F7sPObc$Xf7RucISnDrf z&y#=x;9bDq0RIJi1kh-bs07Ra)G+y{NR8X*?@nhg>hi|^6l;)sy6@T#1H@^-1;81= zD}b{Am?Yi-ya#|);zLlldWeq!uuh;`ssIUiLM#L<0#xE!=|$S3jpkO$)}AKMTywtZ zH6!L?Inc9?otLM3qIJK8F35={%!A)1H8ifTY&F;P5AdPB*Emi;k diff --git a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc index caff33f563708ac2a4144f83e4b30fb9b46d7bb9..eb35c41462e84c74297dd4d346392d47aeed225b 100644 GIT binary patch delta 695 zcmZ{hO=wd=5XW~mP0Z&@6VoKmq%8%Fh#s^d*v1NhBv$aNX&a4_(uyz8B-ogjSM~6o zT3V!n)Rys3P$4NT2=!1|#e;&V;MYNr>cx|%Dvf&3lS08wyoet=%%9mg{QkQ$_!ZuM z10iX%nF&8Zc{Q_R{Ejg=3xeA(%t6dY6^<|f8s{sGcRJ|5zbt#SeGdug1BnxLym5M}d>>|@pT;iGL zy{5mo?*DM9?EQ_q!nvV+R1W_^ro}KPuP7eHn-j|$xPwm;DpazM(+q^_Ms* z6vz=0A_>wch3+5FcVNdkm5|m7RxH4CeApNBN%R z-kL1bBvq3zrj<6lpPMj5_-IQq#`E#5PB7HN3sxQi82KjL^q*aJDc`1pYq&V_5bm;k zVK2ZeyK`z8;0;d7KdkR+R0DT15Q;N$h&?Hp0hZY-b8kXCt_>acJlU%oTHFp$dw#Lhrm?8ZE~$N4AYs>y9GjhZuR zxM~GzSZnxG#Kaj&RgD51&emP(tO-IuZpIO-_8S>Ezy+nm=MR=%CK z)M>J|e<7ye9RC$e@s68a0!mpJg(vR{sTJqSFD;2r$t+5ZcZ@=?ohCbkN-{=GjtaFD zkz(Xx6ahhIHAXc?E+#c5ImXQkL;rFzvQ3^JznzhLa(KcCMw!hDi6t>%E z1!l(9$+`La8Ru`-E%0DuY}#B_c$txL-(;`iUyMgKyOww{GVa|xq4X^y