신호생성 repo (24. 1. 5 ~).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

1267 lines
42 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os, sumolib\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib_venn import venn2, venn3\n",
"from datetime import datetime"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"class DailyPreprocessor:\n",
" def __init__(self, config_name='revised', nowTime=datetime.now()):\n",
" self.config_name = config_name\n",
" self.nowTime = nowTime\n",
"self = DailyPreprocessor(nowTime = datetime.now())"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"56\n",
"436, 437, 438, 442, 443, 444, 455, 456, 457, 458, 459, 460, 461, 462, 463, 472, 474, 482, 483, 484, \n",
"485, 486, 488, 490, 491, 492, 493, 494, 498, 499, 502, 503, 504, 514, 515, 523, 524, 527, 565, 575, \n",
"576, 581, 582, 583, 611, 615, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640\n"
]
}
],
"source": [
"## 교차로목록 정의\n",
"sixties = pd.read_excel('교차로기반정보_(시범지역).xlsx', header=1)\n",
"self.inter_nos = set(sixties['교차로 ID'].dropna().astype(int))\n",
"# 551, 561은 TC_IF_TOD_RED_YELLO, TN_IF_SIGL_FLOW에 존재하지 않음. TOD 보고서에서도 확인할 수 없음\n",
"# 551 : 보육시설 삼거리, 561 : 공영주차장 단일로\n",
"self.inter_nos = self.inter_nos - {551, 561}\n",
"# 464는 매칭테이블에 존재하지 않음. 500에 매칭되는 node_id가 네트워크에 존재하지 않음.\n",
"# 464 : 성남공판장 단일로, 500 : 단남아파트 단일로\n",
"self.inter_nos = self.inter_nos - {464, 500}\n",
"print(len(self.inter_nos))\n",
"inter_nos_display = \", \".join(map(str, sorted(self.inter_nos)))\n",
"inter_nos_display = \"\\n\".join([inter_nos_display[i:i+100] for i in range(0, len(inter_nos_display), 100)])\n",
"# print(len(inter_nos_display))\n",
"print(inter_nos_display)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"## 매칭테이블 정의, 교차로-노드 딕셔너리 정의\n",
"self.net = sumolib.net.readNet('new_sungnam_network_internal_0809.net.xml')\n",
"self.inter_node = pd.read_excel('signal_node_matching.xlsx', dtype={'node_id':str})\n",
"self.inter_node = self.inter_node.rename(columns={'signal_id':'inter_no'})\n",
"self.inter_node['inter_type'] = 'parent'\n",
"self.inter_node = self.inter_node[self.inter_node.inter_no.isin(self.inter_nos)].reset_index(drop=True)\n",
"\n",
"# 일대일대응 확인\n",
"if not len(self.inter_node) == self.inter_node.inter_no.nunique() == self.inter_node.node_id.nunique():\n",
" raise ValueError(\"Warning: 'inter_no'와 'node_id' 간에 일대일대응 관계가 성립하지 않습니다.\")\n",
"\n",
"# 교차로번호 vs 노드id 간 딕셔너리\n",
"self.inter2node = dict(zip(self.inter_node.inter_no, self.inter_node.node_id))\n",
"self.node2inter = dict(zip(self.inter_node.node_id, self.inter_node.inter_no))\n",
"self.node_ids = {self.inter2node[inter_no] for inter_no in self.inter_nos}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# net = sumolib.net.readNet('new_sungnam_network_internal_0809.net.xml')\n",
"# inter_node = pd.read_excel('signal_node_matching.xlsx', dtype={'node_id':str})\n",
"# print(len(set(inter_node.signal_id)))\n",
"# print(inter_nos - set(inter_node.signal_id))\n",
"# inter_node = inter_node[inter_node.node_id.isin(node.getID() for node in net.getNodes())]\n",
"# print(len(set(inter_node.signal_id)))\n",
"# print(inter_nos - set(inter_node.signal_id))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"## 테이블 표준화\n",
"\n",
"# 주요 테이블 로드 (실제로는 쿼리문 작성 부분이 되어야 함.)\n",
"self.dayplan = pd.read_csv(os.path.join(os.path.abspath('.'), 'sn_admin_tables', 'TC_IF_TOD_DAY_PLAN.csv'))\n",
"self.holyplan = pd.read_csv(os.path.join(os.path.abspath('.'), 'sn_admin_tables', 'TC_IF_TOD_HOLIDAY_PLAN.csv'))\n",
"self.red_yel = pd.read_csv(os.path.join(os.path.abspath('.'), 'sn_admin_tables', 'TC_IF_TOD_RED_YELLO.csv'))\n",
"self.weekplan = pd.read_csv(os.path.join(os.path.abspath('.'), 'sn_admin_tables', 'TC_IF_TOD_WEEK_PLAN.csv'))\n",
"# 교차로정보 테이블은 불러오지 않음 (해당 테이블이 실질적으로 쓰이지는 않고, 60개 테이블 정보가 있지도 않음)\n",
"# inter_info=pd.read_csv(os.path.join(os.path.abspath('.'), 'sn_admin_tables', 'TM_FA_CRSRD.csv'))\n",
"self.flows = pd.read_csv(os.path.join(os.path.abspath('.'), 'sn_admin_tables', 'TN_IF_SIGL_FLOW.csv'))\n",
"\n",
"# 유효한 교차로들에 대하여만 슬라이싱\n",
"self.dayplan = self.dayplan[self.dayplan.CRSRD_ID.isin(self.inter_nos)]\n",
"self.weekplan= self.weekplan[self.weekplan.CRSRD_ID.isin(self.inter_nos)]\n",
"self.red_yel = self.red_yel[self.red_yel.CRSRD_ID.isin(self.inter_nos)]\n",
"self.flows = self.flows[self.flows.CRSRD_ID.isin(self.inter_nos)]\n",
"\n",
"# 컬럼명 변경 적용\n",
"rename_cname_1 = {'CRSRD_ID':'inter_no', 'CYCL':'cycle', 'DAY':'DD',\n",
" 'HOUR':'hh', 'MIN':'mm', 'MNTH':'MM',\n",
" 'OFFSET':'offset', 'PHASE':'phase_no', 'PLAN_NO':'plan_no',\n",
" 'RINGA_RED_SEC':'red_A', 'RINGA_YELLO_SEC':'yel_A', 'RINGB_RED_SEC':'red_B',\n",
" 'RINGB_YELLO_SEC':'yel_B'}\n",
"\n",
"rename_cname_2 = {f'RING{alph}_PHASE{i}':f'dura_{alph}{i}' for alph in ['A', 'B'] for i in range(1,9)}\n",
"rename_cname = {**rename_cname_1, **rename_cname_2}\n",
"self.dayplan = self.dayplan.rename(columns=rename_cname)\n",
"self.holyplan = self.holyplan.rename(columns=rename_cname)\n",
"self.weekplan = self.weekplan.rename(columns=rename_cname)\n",
"self.red_yel = self.red_yel.rename(columns=rename_cname)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"## self.plan : 신호계획 테이블 생성\n",
"\n",
"# 날짜, 요일 지정\n",
"MM, DD = self.nowTime.month, self.nowTime.day # 날짜\n",
"dow_number = self.nowTime.weekday() # 요일\n",
"hplan = self.holyplan[(self.holyplan.MM==MM) & (self.holyplan.DD==DD)]\n",
"dows = [dow for dow in self.weekplan.columns if dow.endswith('PLAN_NO')]\n",
"dows = dows[1:] + dows[0:1]\n",
"dow = dows[dow_number]\n",
"\n",
"# (신호교차로, 신호계획번호) 목록\n",
"if len(hplan):\n",
" inter_pnos = list(zip(hplan['inter_no'], hplan['plan_no']))\n",
"else:\n",
" inter_pnos = list(zip(self.weekplan.inter_no, self.weekplan[dow]))\n",
"\n",
"# 신호테이블 통합\n",
"self.plan = self.dayplan.copy()\n",
"self.plan['inter_pno'] = list(zip(self.plan['inter_no'], self.plan['plan_no']))\n",
"self.plan = self.plan[(self.plan.inter_pno.isin(inter_pnos))]\n",
"self.plan = self.plan.drop(columns='inter_pno')\n",
"max_phase_no = int(self.red_yel.phase_no.max())\n",
"for j in range(1,max_phase_no+1):\n",
" RY = self.red_yel[self.red_yel.phase_no==j].iloc[0]\n",
" red_A = RY.red_A\n",
" red_B = RY.red_B\n",
" yel_A = RY.yel_A\n",
" yel_B = RY.yel_B\n",
" self.plan[f'red_A{j}'] = red_A\n",
" self.plan[f'red_B{j}'] = red_B\n",
" self.plan[f'yellow_A{j}'] = yel_A\n",
" self.plan[f'yellow_B{j}'] = yel_B"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>STOS_NO</th>\n",
" <th>angle_code</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>436</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>262358</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>436</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>262074</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>436</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>174355</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>436</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>172263</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>436</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>0</td>\n",
" <td>356074</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>371</th>\n",
" <td>639</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>0</td>\n",
" <td>120312</td>\n",
" </tr>\n",
" <tr>\n",
" <th>372</th>\n",
" <td>639</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>126221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>373</th>\n",
" <td>640</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>226052</td>\n",
" </tr>\n",
" <tr>\n",
" <th>374</th>\n",
" <td>640</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>043222</td>\n",
" </tr>\n",
" <tr>\n",
" <th>375</th>\n",
" <td>640</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>376 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no STOS_NO angle_code\n",
"0 436 1 A 5 0 262358\n",
"1 436 1 B 2 0 262074\n",
"2 436 2 A 8 0 174355\n",
"3 436 2 B 3 0 172263\n",
"4 436 3 A 7 0 356074\n",
".. ... ... ... ... ... ...\n",
"371 639 4 A 6 0 120312\n",
"372 639 4 B 1 0 126221\n",
"373 640 1 A 8 0 226052\n",
"374 640 1 B 4 0 043222\n",
"375 640 2 A 17 0 None\n",
"\n",
"[376 rows x 6 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## self.angle : 각도(이동류방향) 테이블 생성\n",
"self.angle = self.flows.copy()\n",
"self.angle = self.angle.rename(columns={'CRSRD_ID':'inter_no', 'PHASE':'phase_no',\n",
" 'RING':'ring_type', 'FLOW_NO':'move_no'})\n",
"# 유효한 이동류번호 및 교차로번호로 슬라이싱\n",
"self.angle = self.angle[self.angle.move_no.isin(range(1,19))]\n",
"self.angle = self.angle[self.angle.inter_no.isin(self.inter_nos)]\n",
"# 세 점 데이터 파싱 및 각도코드 열 생성\n",
"for ind, row in self.angle.iterrows():\n",
" arrow = row.SIGL_ARROW\n",
" # 위경도 추출\n",
" # arrow = re.findall(r'-?\\d+\\.?\\d*', arrow)\n",
" arrow = [coord.lstrip(' ') for coord in arrow.split(',')]\n",
" arrow = [coord.lstrip('[') for coord in arrow]\n",
" arrow = [coord.rstrip(']') for coord in arrow]\n",
" exists = all([bool(coord) for coord in arrow])\n",
" if exists:\n",
" y1, x1, y2, x2, y3, x3 = arrow\n",
"\n",
" # 미터 단위로 변환\n",
" x1, y1 = self.net.convertLonLat2XY(x1, y1)\n",
" x2, y2 = self.net.convertLonLat2XY(x2, y2)\n",
" x3, y3 = self.net.convertLonLat2XY(x3, y3)\n",
"\n",
" # 진입각, 진출각 설정\n",
" inc_angle = np.arctan2(y1 - y2, x1 - x2)\n",
" out_angle = np.arctan2(y3 - y2, x3 - x2)\n",
" inc_angle = inc_angle * 180 / np.pi\n",
" out_angle = out_angle * 180 / np.pi\n",
" inc_angle = int((90 - inc_angle) % 360)\n",
" out_angle = int((90 - out_angle) % 360)\n",
"\n",
" # 각도코드 설정\n",
" angle_code = str(inc_angle).zfill(3) + str(out_angle).zfill(3)\n",
" # print(angle_code)\n",
" self.angle.loc[ind, 'angle_code'] = angle_code\n",
" else:\n",
" self.angle.loc[ind, 'angle_code'] = None\n",
"self.angle = self.angle.drop(columns='SIGL_ARROW')\n",
"self.angle = self.angle.reset_index(drop=True)\\\n",
" .sort_values(by=['inter_no', 'phase_no', 'ring_type']).reset_index(drop=True)\n",
"self.angle"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>436</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>436</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>436</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>436</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>436</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>383</th>\n",
" <td>576</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>384</th>\n",
" <td>582</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>385</th>\n",
" <td>632</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>386</th>\n",
" <td>634</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>387</th>\n",
" <td>640</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>388 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no\n",
"0 436 1 A 5\n",
"1 436 1 B 2\n",
"2 436 2 A 8\n",
"3 436 2 B 3\n",
"4 436 3 A 7\n",
".. ... ... ... ...\n",
"383 576 2 B 17\n",
"384 582 2 B 17\n",
"385 632 2 B 17\n",
"386 634 4 B 5\n",
"387 640 2 B 17\n",
"\n",
"[388 rows x 4 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>436</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>436</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>436</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>436</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>436</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>383</th>\n",
" <td>576</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>384</th>\n",
" <td>582</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>385</th>\n",
" <td>632</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>386</th>\n",
" <td>634</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>387</th>\n",
" <td>640</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>17</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>388 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no\n",
"0 436 1 A 5\n",
"1 436 1 B 2\n",
"2 436 2 A 8\n",
"3 436 2 B 3\n",
"4 436 3 A 7\n",
".. ... ... ... ...\n",
"383 576 2 B 17\n",
"384 582 2 B 17\n",
"385 632 2 B 17\n",
"386 634 4 B 5\n",
"387 640 2 B 17\n",
"\n",
"[388 rows x 4 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"## self.match1 테이블 생성\n",
"match1 = self.flows.copy()\n",
"match1 = match1[['CRSRD_ID', 'PHASE', 'RING', 'FLOW_NO']]\n",
"match1 = match1.rename(columns={'CRSRD_ID':'inter_no', 'PHASE':'phase_no', 'RING':'ring_type', 'FLOW_NO':'move_no'})\n",
"match1 = match1.sort_values(by=['inter_no', 'phase_no', 'ring_type']).reset_index(drop=True)\n",
"# 유효한 이동류번호 및 교차로번호로 슬라이싱\n",
"match1 = match1[match1.move_no.isin(range(1,19))]\n",
"match1 = match1[match1.inter_no.isin(self.inter_nos)]\n",
"# 특정한 (교차로번호, 현시번호)에 대하여 한 링에 대해서만 이동류번호만 정의된 경우, 나머지 링에 대해서 이동류 정의\n",
"additional_m1s = []\n",
"for key, group in match1.groupby(['inter_no', 'phase_no']):\n",
" inter_no, phase_no = map(int,key)\n",
" if set(group.ring_type) != {'A', 'B'}:\n",
" assert len(group)==1\n",
" ring_type = group.iloc[0].ring_type\n",
" RING_TYPE = list({'A', 'B'} - set(ring_type))[0]\n",
" additional_m1 = group.copy()\n",
" additional_m1['ring_type'] = RING_TYPE\n",
" additional_m1s.append(additional_m1)\n",
"match1 = pd.concat([match1] + additional_m1s)\n",
"match1 = match1.reset_index(drop=True)\n",
"display(match1)\n",
"# 열 재편 : 현시시간과 이동류번호 열을 A, B로 구분\n",
"match1s = []\n",
"for key, group in match1.copy().groupby(['inter_no', 'phase_no']):\n",
" inter_no, phase_no = map(int, key)\n",
" assert len(group) == 2\n",
" row_A = group[group.ring_type=='A']\n",
" row_B = group[group.ring_type=='B']\n",
" assert len(row_A)==len(row_B)==1\n",
" row_A = row_A.iloc[0]\n",
" row_B = row_B.iloc[0]\n",
" m1 = pd.DataFrame({'inter_no':[inter_no], 'phas_A':[phase_no], 'phas_B':[phase_no],\n",
" 'move_A':[row_A.move_no], 'move_B':[row_B.move_no]})\n",
" match1s.append(m1)\n",
"display(match1)\n",
"self.match1 = pd.concat(match1s).reset_index(drop=True)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>parent_id</th>\n",
" <th>child_id</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>inc_edge_id</th>\n",
" <th>out_edge_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [parent_id, child_id, phase_no, ring_type, inc_edge_id, out_edge_id]\n",
"Index: []"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# # self.coord : 연등교차로 테이블 생성\n",
"# self.coord = pd.DataFrame(columns=['parent_id', 'child_id', 'phase_no', 'ring_type', 'inc_edge_id', 'out_edge_id'])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>inter_type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>436</td>\n",
" <td>109836</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>437</td>\n",
" <td>109986</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>438</td>\n",
" <td>106350</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>442</td>\n",
" <td>106332</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>443</td>\n",
" <td>108769</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>444</td>\n",
" <td>109842</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>455</td>\n",
" <td>109901</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>456</td>\n",
" <td>106231</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>457</td>\n",
" <td>106234</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>458</td>\n",
" <td>106238</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>459</td>\n",
" <td>106242</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>460</td>\n",
" <td>109946</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>461</td>\n",
" <td>109829</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>462</td>\n",
" <td>106174</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>463</td>\n",
" <td>106267</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>472</td>\n",
" <td>109965</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>474</td>\n",
" <td>109845</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>482</td>\n",
" <td>106329</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>483</td>\n",
" <td>107928</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>484</td>\n",
" <td>106303</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>485</td>\n",
" <td>107940</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>486</td>\n",
" <td>106273</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>488</td>\n",
" <td>107093</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>490</td>\n",
" <td>106908</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>491</td>\n",
" <td>109987</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>492</td>\n",
" <td>106244</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>493</td>\n",
" <td>106225</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>494</td>\n",
" <td>108235</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>498</td>\n",
" <td>107120</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>499</td>\n",
" <td>107111</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>502</td>\n",
" <td>106286</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>503</td>\n",
" <td>106313</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>504</td>\n",
" <td>109897</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>514</td>\n",
" <td>106708</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>515</td>\n",
" <td>106969</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>523</td>\n",
" <td>106325</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>524</td>\n",
" <td>107049</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>527</td>\n",
" <td>107123</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>565</td>\n",
" <td>109943</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>575</td>\n",
" <td>106197</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>576</td>\n",
" <td>107955</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>581</td>\n",
" <td>106326</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>582</td>\n",
" <td>108639</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>583</td>\n",
" <td>106184</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>611</td>\n",
" <td>107345</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>615</td>\n",
" <td>106717</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>631</td>\n",
" <td>109823</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>632</td>\n",
" <td>109964</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>633</td>\n",
" <td>106450</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>634</td>\n",
" <td>108112</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <td>635</td>\n",
" <td>108179</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>636</td>\n",
" <td>107293</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>637</td>\n",
" <td>109852</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>638</td>\n",
" <td>109853</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>639</td>\n",
" <td>109854</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55</th>\n",
" <td>640</td>\n",
" <td>109990</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no node_id inter_type\n",
"0 436 109836 parent\n",
"1 437 109986 parent\n",
"2 438 106350 parent\n",
"3 442 106332 parent\n",
"4 443 108769 parent\n",
"5 444 109842 parent\n",
"6 455 109901 parent\n",
"7 456 106231 parent\n",
"8 457 106234 parent\n",
"9 458 106238 parent\n",
"10 459 106242 parent\n",
"11 460 109946 parent\n",
"12 461 109829 parent\n",
"13 462 106174 parent\n",
"14 463 106267 parent\n",
"15 472 109965 parent\n",
"16 474 109845 parent\n",
"17 482 106329 parent\n",
"18 483 107928 parent\n",
"19 484 106303 parent\n",
"20 485 107940 parent\n",
"21 486 106273 parent\n",
"22 488 107093 parent\n",
"23 490 106908 parent\n",
"24 491 109987 parent\n",
"25 492 106244 parent\n",
"26 493 106225 parent\n",
"27 494 108235 parent\n",
"28 498 107120 parent\n",
"29 499 107111 parent\n",
"30 502 106286 parent\n",
"31 503 106313 parent\n",
"32 504 109897 parent\n",
"33 514 106708 parent\n",
"34 515 106969 parent\n",
"35 523 106325 parent\n",
"36 524 107049 parent\n",
"37 527 107123 parent\n",
"38 565 109943 parent\n",
"39 575 106197 parent\n",
"40 576 107955 parent\n",
"41 581 106326 parent\n",
"42 582 108639 parent\n",
"43 583 106184 parent\n",
"44 611 107345 parent\n",
"45 615 106717 parent\n",
"46 631 109823 parent\n",
"47 632 109964 parent\n",
"48 633 106450 parent\n",
"49 634 108112 parent\n",
"50 635 108179 parent\n",
"51 636 107293 parent\n",
"52 637 109852 parent\n",
"53 638 109853 parent\n",
"54 639 109854 parent\n",
"55 640 109990 parent"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.inter_node"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['make_intermediates.ipynb',\n",
" 'new_sungnam_network_internal_0809.net.xml',\n",
" 'signal_node_matching.xlsx',\n",
" 'sn_admin_tables',\n",
" '~$signal_node_matching.xlsx',\n",
" '~$교차로기반정보_(시범지역).xlsx',\n",
" '교차로기반정보_(시범지역).xlsx']"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"os.listdir()"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"# dfs = {'dayplan':dayplan, 'red_yel':red_yel, 'weekplan':weekplan, 'flows':flows}\n",
"# for df_name, df in dfs.items():\n",
"# print(df_name)\n",
"# assert set(df.CRSRD_ID).issubset(inter_nos)\n",
"# inter_no_coincide = inter_nos == set(df.CRSRD_ID)\n",
"# if not inter_no_coincide:\n",
"# print(f\" inter_no's doesn't conicide.\")\n",
"# print(f\" missing inter_no's : {inter_nos - set(df.CRSRD_ID)}\")"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"# venn3([set(dayplan.CRSRD_ID), set(red_yel.CRSRD_ID), set(weekplan.CRSRD_ID)], ('dayplan', 'redyel', 'weekplan'))\n",
"# plt.show()\n",
"# print(f'일간계획 테이블의 교차로 개수 : {len(set(dayplan.CRSRD_ID))}')\n",
"# print(f'황색적색 테이블의 교차로 개수 : {len(set(red_yel.CRSRD_ID))}')\n",
"# print(f'주간계획 테이블의 교차로 개수 : {len(set(weekplan.CRSRD_ID))}')\n",
"# CRSRD_IDs_plan = set(dayplan.CRSRD_ID) & set(red_yel.CRSRD_ID) & set(weekplan.CRSRD_ID)\n",
"# print(f'겹치는 교차로 개수 : {len(CRSRD_IDs_plan)}')\n",
"# print(f'겹치는 교차로 목록 : {sorted(CRSRD_IDs_plan)}')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "siggen_env",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}