{ "cells": [ { "cell_type": "code", "execution_count": 37, "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:13<00:00, 1247.47it/s]\n" ] } ], "source": [ "import sys\n", "from datetime import datetime\n", "sys.path.append('../../Scripts')\n", "from preprocess_daily import DailyPreprocessor\n", "self = DailyPreprocessor()\n", "\n", "# 1. 데이터 준비\n", "self.load_data()\n", "\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": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "u00 True\n", "u20 False\n", "u30 True\n", "u31 True\n", "u32 True\n", "u60 True\n" ] } ], "source": [ "self.node2inter = dict(zip(self.inter_node['node_id'], self.inter_node['inter_no']))\n", "\n", "child_ids = self.inter_node[self.inter_node.inter_type=='child'].node_id.unique()\n", "ch2pa = {} # child to parent\n", "for child_id in 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_A, out_dire_B를 정함\n", " ind = directions.index(direction)\n", " if condition == \"좌회전시\":\n", " inc_dire = direction\n", " out_dire_A = out_dire_B = directions[(ind + 2) % len(directions)]\n", " elif condition == \"보행신호시\":\n", " inc_dire = directions[(ind + 2) % len(directions)]\n", " out_dire_A = directions[(ind - 2) % len(directions)]\n", " out_dire_B = directions[(ind - 2) % len(directions)]\n", " print(child_id, ((cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A)).any())\n", " # (inc_dire, out_dire_A, out_dire_B) 별로 inc_edge_id, out_edge_id를 정함\n", " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n", " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), ['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_A), 'move_no'] = 19\n", " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), 'move_no'] = 19\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'))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\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", "
---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "175 | \n", "1 | \n", "A | \n", "8 | \n", "남 | \n", "북 | \n", "179 | \n", "004 | \n", "-571542797_02 | \n", "571500487_01 | \n", "i0 | \n", "
1 | \n", "175 | \n", "1 | \n", "B | \n", "4 | \n", "북 | \n", "남 | \n", "003 | \n", "176 | \n", "-571500487_01 | \n", "571542797_02 | \n", "i0 | \n", "
2 | \n", "175 | \n", "2 | \n", "A | \n", "7 | \n", "북 | \n", "동 | \n", "001 | \n", "095 | \n", "-571500487_01 | \n", "571545870_01 | \n", "i0 | \n", "
3 | \n", "175 | \n", "2 | \n", "B | \n", "3 | \n", "남 | \n", "서 | \n", "179 | \n", "270 | \n", "-571542797_02 | \n", "571510153_01 | \n", "i0 | \n", "
4 | \n", "175 | \n", "3 | \n", "A | \n", "6 | \n", "동 | \n", "서 | \n", "090 | \n", "270 | \n", "571545870_02 | \n", "571510153_01 | \n", "i0 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \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", "
4 | \n", "210 | \n", "3 | \n", "A | \n", "7 | \n", "북 | \n", "동 | \n", "359 | \n", "090 | \n", "NaN | \n", "NaN | \n", "u60 | \n", "
5 | \n", "210 | \n", "3 | \n", "B | \n", "4 | \n", "북 | \n", "남 | \n", "000 | \n", "180 | \n", "NaN | \n", "NaN | \n", "u60 | \n", "
6 | \n", "210 | \n", "4 | \n", "A | \n", "8 | \n", "남 | \n", "북 | \n", "180 | \n", "000 | \n", "NaN | \n", "NaN | \n", "u60 | \n", "
7 | \n", "210 | \n", "4 | \n", "B | \n", "3 | \n", "남 | \n", "서 | \n", "180 | \n", "270 | \n", "NaN | \n", "NaN | \n", "u60 | \n", "
116 rows × 11 columns
\n", "