{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import os\n",
"import sumolib\n",
"import random\n",
"from tqdm import tqdm\n",
"from datetime import datetime"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A. 이동류 매칭"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17280/17280 [00:55<00:00, 313.57it/s]\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phas_A | \n",
" phas_B | \n",
" move_A | \n",
" move_B | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
" 4 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
" 1 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
" 2 | \n",
"
\n",
" \n",
" 4 | \n",
" 175 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
" 2 | \n",
"
\n",
" \n",
" 5 | \n",
" 176 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
" 4 | \n",
"
\n",
" \n",
" 6 | \n",
" 176 | \n",
" 2 | \n",
" 2 | \n",
" 8 | \n",
" 3 | \n",
"
\n",
" \n",
" 7 | \n",
" 176 | \n",
" 3 | \n",
" 3 | \n",
" 5 | \n",
" 18 | \n",
"
\n",
" \n",
" 8 | \n",
" 177 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
" 4 | \n",
"
\n",
" \n",
" 9 | \n",
" 177 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no phas_A phas_B move_A move_B\n",
"0 175 1 1 8 4\n",
"1 175 2 2 7 3\n",
"2 175 3 3 6 1\n",
"3 175 3 4 6 2\n",
"4 175 4 4 5 2\n",
"5 176 1 1 8 4\n",
"6 176 2 2 8 3\n",
"7 176 3 3 5 18\n",
"8 177 1 1 8 4\n",
"9 177 2 2 7 3"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# [이동류번호] 불러오기 (약 1분의 소요시간)\n",
"path_moves = '../../Data/tables/moves/'\n",
"csv_moves = os.listdir('../../Data/tables/moves/')\n",
"moves = [pd.read_csv(path_moves + csv_move, index_col=0) for csv_move in tqdm(csv_moves)]\n",
"match1 = pd.concat(moves).drop_duplicates().sort_values(by=['inter_no','phas_A','phas_B']).reset_index(drop=True)\n",
"match1.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phase_no | \n",
" ring_type | \n",
" move_no | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
"
\n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 2 | \n",
" A | \n",
" 7 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 2 | \n",
" B | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 3 | \n",
" A | \n",
" 6 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 3 | \n",
" B | \n",
" 1 | \n",
"
\n",
" \n",
" 4 | \n",
" 175 | \n",
" 4 | \n",
" A | \n",
" 5 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 4 | \n",
" B | \n",
" 2 | \n",
"
\n",
" \n",
" 5 | \n",
" 176 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
"
\n",
" \n",
" 5 | \n",
" 176 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no phase_no ring_type move_no\n",
"0 175 1 A 8\n",
"0 175 1 B 4\n",
"1 175 2 A 7\n",
"1 175 2 B 3\n",
"2 175 3 A 6\n",
"2 175 3 B 1\n",
"4 175 4 A 5\n",
"3 175 4 B 2\n",
"5 176 1 A 8\n",
"5 176 1 B 4"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 계층화 (inter_no, phas_A, phas_B, move_A, move_B) -> ('inter_no', 'phase_no', 'ring_type', 'move_no')\n",
"matchA = match1[['inter_no', 'phas_A', 'move_A']].copy()\n",
"matchA.columns = ['inter_no', 'phase_no', 'move_no']\n",
"matchA['ring_type'] = 'A'\n",
"matchB = match1[['inter_no', 'phas_B', 'move_B']].copy()\n",
"matchB.columns = ['inter_no', 'phase_no', 'move_no']\n",
"matchB['ring_type'] = 'B'\n",
"match2 = pd.concat([matchA, matchB]).drop_duplicates()\n",
"match2 = match2[['inter_no', 'phase_no', 'ring_type', 'move_no']]\n",
"match2 = match2.sort_values(by=list(match2.columns))\n",
"match2.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phase_no | \n",
" ring_type | \n",
" move_no | \n",
" inc_dir | \n",
" out_dir | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 2 | \n",
" A | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 2 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
"
\n",
" \n",
" 4 | \n",
" 175 | \n",
" 3 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 59 | \n",
" 210 | \n",
" 4 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
"
\n",
" \n",
" 60 | \n",
" 211 | \n",
" 1 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
"
\n",
" \n",
" 61 | \n",
" 211 | \n",
" 1 | \n",
" B | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
"
\n",
" \n",
" 62 | \n",
" 211 | \n",
" 2 | \n",
" A | \n",
" 17 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 63 | \n",
" 211 | \n",
" 2 | \n",
" B | \n",
" 18 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
64 rows × 6 columns
\n",
"
"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dir out_dir\n",
"0 175 1 A 8 남 북\n",
"1 175 1 B 4 북 남\n",
"2 175 2 A 7 북 동\n",
"3 175 2 B 3 남 서\n",
"4 175 3 A 6 동 서\n",
".. ... ... ... ... ... ...\n",
"59 210 4 B 3 남 서\n",
"60 211 1 A 6 동 서\n",
"61 211 1 B 2 서 동\n",
"62 211 2 A 17 NaN NaN\n",
"63 211 2 B 18 NaN NaN\n",
"\n",
"[64 rows x 6 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# [nema 이동류목록] 불러오기 및 병합\n",
"nema = pd.read_csv('../../Data/tables/nema.csv', encoding='cp949')\n",
"match3 = pd.merge(match2, nema, how='left', on='move_no').drop_duplicates()\n",
"match3"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" phase_no | \n",
" ring_type | \n",
" move_no | \n",
" inc_dir | \n",
" out_dir | \n",
" inc_angle | \n",
" out_angle | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" A | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 179 | \n",
" 004 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 1 | \n",
" B | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 003 | \n",
" 176 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 2 | \n",
" A | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 001 | \n",
" 095 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 2 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 179 | \n",
" 270 | \n",
"
\n",
" \n",
" 4 | \n",
" 175 | \n",
" 3 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 090 | \n",
" 270 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 59 | \n",
" 210 | \n",
" 4 | \n",
" B | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 180 | \n",
" 270 | \n",
"
\n",
" \n",
" 60 | \n",
" 211 | \n",
" 1 | \n",
" A | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 090 | \n",
" 270 | \n",
"
\n",
" \n",
" 61 | \n",
" 211 | \n",
" 1 | \n",
" B | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 270 | \n",
" 090 | \n",
"
\n",
" \n",
" 62 | \n",
" 211 | \n",
" 2 | \n",
" A | \n",
" 17 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 63 | \n",
" 211 | \n",
" 2 | \n",
" B | \n",
" 18 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
64 rows × 8 columns
\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",
".. ... ... ... ... ... ... ... ...\n",
"59 210 4 B 3 남 서 180 270\n",
"60 211 1 A 6 동 서 090 270\n",
"61 211 1 B 2 서 동 270 090\n",
"62 211 2 A 17 NaN NaN NaN NaN\n",
"63 211 2 B 18 NaN NaN NaN NaN\n",
"\n",
"[64 rows x 8 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# [방위각정보] 불러오기, 계층화, 병합\n",
"# 불러오기\n",
"dtype_dict = {f'angle_{alph}{j}':'str' for alph in ['A', 'B'] for j in range(1,9)}\n",
"angle_original = pd.read_csv('../../Data/tables/angle.csv', index_col=0, dtype = dtype_dict)\n",
"# 계층화\n",
"angle = []\n",
"for i, row in angle_original.iterrows():\n",
" angle_codes = row[[f'angle_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
" new = pd.DataFrame({'inter_no':[row.inter_no] * 16, 'phase_no':list(range(1, 9))*2, 'ring_type':['A'] * 8 + ['B'] * 8, 'angle_code':angle_codes.to_list()})\n",
" angle.append(new)\n",
"angle = pd.concat(angle)\n",
"angle = angle.dropna().reset_index(drop=True)\n",
"# 병합\n",
"six_chars = angle.angle_code.apply(lambda x:len(x)==6)\n",
"angle.loc[six_chars,'inc_angle'] = angle.angle_code.apply(lambda x:x[:3])\n",
"angle.loc[six_chars,'out_angle'] = angle.angle_code.apply(lambda x:x[3:])\n",
"angle = angle.drop('angle_code', axis=1)\n",
"match4 = pd.merge(match3, angle, how='left', left_on=['inter_no', 'phase_no', 'ring_type'],\n",
" right_on=['inter_no', 'phase_no', 'ring_type']).drop_duplicates()\n",
"match4"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# [네트워크], [교차로-노드 매칭], [교차로정보] 불러오기 \n",
"net = sumolib.net.readNet('../../Data/networks/SN_sample.net.xml')\n",
"inter_node = pd.read_csv('../../Data/tables/inter_node.csv', index_col=0)\n",
"inter_info = pd.read_csv('../../Data/tables/inter_info.csv', index_col=0)\n",
"\n",
"inter_node1 = inter_node[inter_node.inter_type == 'parent'].drop('inter_type', axis=1)\n",
"inter_info1 = inter_info[['inter_no', 'inter_lat', 'inter_lon']]\n",
"inter = pd.merge(inter_node1, inter_info1, how='left', left_on=['inter_no'],\n",
" right_on=['inter_no']).drop_duplicates()\n",
"\n",
"inter2node = dict(zip(inter['inter_no'], inter['node_id']))\n",
"\n",
"match5 = match4.copy()\n",
"# 진입진출ID 매칭\n",
"for index, row in match5.iterrows():\n",
" node_id = inter2node[row.inter_no]\n",
" node = net.getNode(node_id)\n",
" # 교차로의 모든 (from / to) edges\n",
" inc_edges = [edge for edge in node.getIncoming() if edge.getFunction() == ''] # incoming edges\n",
" out_edges = [edge for edge in node.getOutgoing() if edge.getFunction() == ''] # outgoing edges\n",
" # 교차로의 모든 (from / to) directions\n",
" inc_dirs = []\n",
" for inc_edge in inc_edges:\n",
" start = inc_edge.getShape()[-2]\n",
" end = inc_edge.getShape()[-1]\n",
" inc_dir = np.array(end) - np.array(start)\n",
" inc_dir = inc_dir / (inc_dir ** 2).sum() ** 0.5\n",
" inc_dirs.append(inc_dir)\n",
" out_dirs = []\n",
" for out_edge in out_edges:\n",
" start = out_edge.getShape()[0]\n",
" end = out_edge.getShape()[1]\n",
" out_dir = np.array(end) - np.array(start)\n",
" out_dir = out_dir / (out_dir ** 2).sum() ** 0.5\n",
" out_dirs.append(out_dir)\n",
" # 진입각, 진출각 불러오기\n",
" if not pd.isna(row.inc_angle):\n",
" inc_angle = int(row.inc_angle)\n",
" out_angle = int(row.out_angle)\n",
" # 방위각을 일반각으로 가공, 라디안 변환, 단위벡터로 변환\n",
" inc_angle = (-90 - inc_angle) % 360\n",
" inc_angle = inc_angle * np.pi / 180.\n",
" inc_dir_true = np.array([np.cos(inc_angle), np.sin(inc_angle)])\n",
" out_angle = (90 - out_angle) % 360\n",
" out_angle = out_angle * np.pi / 180.\n",
" out_dir_true = np.array([np.cos(out_angle), np.sin(out_angle)])\n",
" # 매칭 엣지 반환\n",
" inc_index = np.array([np.dot(inc_dir, inc_dir_true) for inc_dir in inc_dirs]).argmax()\n",
" out_index = np.array([np.dot(out_dir, out_dir_true) for out_dir in out_dirs]).argmax()\n",
" inc_edge_id = inc_edges[inc_index].getID()\n",
" out_edge_id = out_edges[out_index].getID()\n",
" match5.at[index, 'inc_edge'] = inc_edge_id\n",
" match5.at[index, 'out_edge'] = out_edge_id\n",
"match5['node_id'] = match5['inter_no'].map(inter2node)\n",
"# match5 = match5[['inter_no', 'node_id', 'move_no', 'inc_edge', 'out_edge']]\n",
"match5 = match5.sort_values(by=['inter_no', 'move_no']).reset_index(drop=True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" move_no | \n",
" inc_dir | \n",
" out_dir | \n",
" inc_edge | \n",
" out_edge | \n",
" node_id | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" 571545870_02 | \n",
" 571542797_02 | \n",
" i0 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 571510153_02 | \n",
" 571545870_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" -571542797_02 | \n",
" 571510153_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" -571500487_01 | \n",
" 571542797_02 | \n",
" i0 | \n",
"
\n",
" \n",
" 4 | \n",
" 175 | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 571510153_02 | \n",
" 571500487_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 5 | \n",
" 175 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 571545870_02 | \n",
" 571510153_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 6 | \n",
" 175 | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" -571500487_01 | \n",
" 571545870_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 7 | \n",
" 175 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" -571542797_02 | \n",
" 571500487_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 8 | \n",
" 175 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i0 | \n",
"
\n",
" \n",
" 9 | \n",
" 175 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i0 | \n",
"
\n",
" \n",
" 10 | \n",
" 175 | \n",
" 21 | \n",
" 북 | \n",
" 서 | \n",
" -571500487_01 | \n",
" 571510153_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 11 | \n",
" 175 | \n",
" 21 | \n",
" 서 | \n",
" 남 | \n",
" 571510153_02 | \n",
" 571542797_02 | \n",
" i0 | \n",
"
\n",
" \n",
" 12 | \n",
" 175 | \n",
" 21 | \n",
" 남 | \n",
" 동 | \n",
" -571542797_02 | \n",
" 571545870_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 13 | \n",
" 175 | \n",
" 21 | \n",
" 동 | \n",
" 북 | \n",
" 571545870_02 | \n",
" 571500487_01 | \n",
" i0 | \n",
"
\n",
" \n",
" 14 | \n",
" 176 | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" -571542810_01 | \n",
" 571543469_01 | \n",
" i1 | \n",
"
\n",
" \n",
" 15 | \n",
" 176 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 571542797_02.99 | \n",
" 571542810_01 | \n",
" i1 | \n",
"
\n",
" \n",
" 16 | \n",
" 176 | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 571543469_02 | \n",
" -571542797_02.99 | \n",
" i1 | \n",
"
\n",
" \n",
" 17 | \n",
" 176 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" -571542810_01 | \n",
" -571542797_02.99 | \n",
" i1 | \n",
"
\n",
" \n",
" 18 | \n",
" 176 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i1 | \n",
"
\n",
" \n",
" 19 | \n",
" 176 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i1 | \n",
"
\n",
" \n",
" 20 | \n",
" 176 | \n",
" 21 | \n",
" 북 | \n",
" 서 | \n",
" 571542797_02.99 | \n",
" 571543469_01 | \n",
" i1 | \n",
"
\n",
" \n",
" 21 | \n",
" 176 | \n",
" 21 | \n",
" 서 | \n",
" 남 | \n",
" 571543469_02 | \n",
" 571542810_01 | \n",
" i1 | \n",
"
\n",
" \n",
" 22 | \n",
" 177 | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" 571542107_02 | \n",
" 571542809_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 23 | \n",
" 177 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" -571542809_01 | \n",
" 571542107_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 24 | \n",
" 177 | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" -571542809_01 | \n",
" 571542809_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 25 | \n",
" 177 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 571542811_02 | \n",
" 571542809_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 26 | \n",
" 177 | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" -571542809_01 | \n",
" 571542811_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 27 | \n",
" 177 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 571542107_02 | \n",
" 571542809_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 28 | \n",
" 177 | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 571542811_02 | \n",
" 571542107_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 29 | \n",
" 177 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" -571542809_01 | \n",
" 571542811_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 30 | \n",
" 177 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i2 | \n",
"
\n",
" \n",
" 31 | \n",
" 177 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i2 | \n",
"
\n",
" \n",
" 32 | \n",
" 177 | \n",
" 21 | \n",
" 북 | \n",
" 서 | \n",
" 571542811_02 | \n",
" 571542809_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 33 | \n",
" 177 | \n",
" 21 | \n",
" 서 | \n",
" 남 | \n",
" -571542809_01 | \n",
" 571542809_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 34 | \n",
" 177 | \n",
" 21 | \n",
" 남 | \n",
" 동 | \n",
" -571542809_01 | \n",
" 571542107_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 35 | \n",
" 177 | \n",
" 21 | \n",
" 동 | \n",
" 북 | \n",
" 571542107_02 | \n",
" 571542811_01 | \n",
" i2 | \n",
"
\n",
" \n",
" 36 | \n",
" 178 | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" -571500475_01 | \n",
" 571540304_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 37 | \n",
" 178 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 571540303_02.21 | \n",
" 571500475_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 38 | \n",
" 178 | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 571540304_02 | \n",
" 571540303_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 39 | \n",
" 178 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 571556450_02 | \n",
" 571540304_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 40 | \n",
" 178 | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 571540303_02.21 | \n",
" 571556450_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 41 | \n",
" 178 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" -571500475_01 | \n",
" 571540303_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 42 | \n",
" 178 | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 571556450_02 | \n",
" 571500475_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 43 | \n",
" 178 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 571540304_02 | \n",
" 571556450_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 44 | \n",
" 178 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i3 | \n",
"
\n",
" \n",
" 45 | \n",
" 178 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i3 | \n",
"
\n",
" \n",
" 46 | \n",
" 178 | \n",
" 21 | \n",
" 북 | \n",
" 서 | \n",
" 571556450_02 | \n",
" 571540303_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 47 | \n",
" 178 | \n",
" 21 | \n",
" 서 | \n",
" 남 | \n",
" 571540303_02.21 | \n",
" 571540304_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 48 | \n",
" 178 | \n",
" 21 | \n",
" 남 | \n",
" 동 | \n",
" 571540304_02 | \n",
" 571500475_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 49 | \n",
" 178 | \n",
" 21 | \n",
" 동 | \n",
" 북 | \n",
" -571500475_01 | \n",
" 571556450_01 | \n",
" i3 | \n",
"
\n",
" \n",
" 50 | \n",
" 201 | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" 571500617_02 | \n",
" 571500569_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 51 | \n",
" 201 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 571500618_02 | \n",
" 571500617_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 52 | \n",
" 201 | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" -571500569_01 | \n",
" 571500618_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 53 | \n",
" 201 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 571500583_01 | \n",
" 571500569_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 54 | \n",
" 201 | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 571500618_02 | \n",
" 571500583_02 | \n",
" i8 | \n",
"
\n",
" \n",
" 55 | \n",
" 201 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 571500617_02 | \n",
" 571500618_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 56 | \n",
" 201 | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 571500583_01 | \n",
" 571500617_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 57 | \n",
" 201 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" -571500569_01 | \n",
" 571500583_02 | \n",
" i8 | \n",
"
\n",
" \n",
" 58 | \n",
" 201 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i8 | \n",
"
\n",
" \n",
" 59 | \n",
" 201 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i8 | \n",
"
\n",
" \n",
" 60 | \n",
" 201 | \n",
" 21 | \n",
" 북 | \n",
" 서 | \n",
" 571500583_01 | \n",
" 571500618_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 61 | \n",
" 201 | \n",
" 21 | \n",
" 서 | \n",
" 남 | \n",
" 571500618_02 | \n",
" 571500569_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 62 | \n",
" 201 | \n",
" 21 | \n",
" 남 | \n",
" 동 | \n",
" -571500569_01 | \n",
" 571500617_01 | \n",
" i8 | \n",
"
\n",
" \n",
" 63 | \n",
" 201 | \n",
" 21 | \n",
" 동 | \n",
" 북 | \n",
" 571500617_02 | \n",
" 571500583_02 | \n",
" i8 | \n",
"
\n",
" \n",
" 64 | \n",
" 202 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 571510152_01 | \n",
" 571510152_01.65 | \n",
" i9 | \n",
"
\n",
" \n",
" 65 | \n",
" 202 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 571510152_02 | \n",
" -571510152_01 | \n",
" i9 | \n",
"
\n",
" \n",
" 66 | \n",
" 202 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i9 | \n",
"
\n",
" \n",
" 67 | \n",
" 202 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i9 | \n",
"
\n",
" \n",
" 68 | \n",
" 206 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 571542073_01 | \n",
" 571511538_02 | \n",
" i7 | \n",
"
\n",
" \n",
" 69 | \n",
" 206 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" -571511538_02 | \n",
" 571542073_02 | \n",
" i7 | \n",
"
\n",
" \n",
" 70 | \n",
" 206 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i7 | \n",
"
\n",
" \n",
" 71 | \n",
" 206 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i7 | \n",
"
\n",
" \n",
" 72 | \n",
" 210 | \n",
" 1 | \n",
" 동 | \n",
" 남 | \n",
" -571542115_01 | \n",
" 571500585_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 73 | \n",
" 210 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 571500535_02.18 | \n",
" 571542115_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 74 | \n",
" 210 | \n",
" 3 | \n",
" 남 | \n",
" 서 | \n",
" 571500585_02 | \n",
" 571500535_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 75 | \n",
" 210 | \n",
" 4 | \n",
" 북 | \n",
" 남 | \n",
" 571511538_02.121 | \n",
" 571500585_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 76 | \n",
" 210 | \n",
" 5 | \n",
" 서 | \n",
" 북 | \n",
" 571500535_02.18 | \n",
" 571511538_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 77 | \n",
" 210 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" -571542115_01 | \n",
" 571500535_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 78 | \n",
" 210 | \n",
" 7 | \n",
" 북 | \n",
" 동 | \n",
" 571511538_02.121 | \n",
" 571542115_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 79 | \n",
" 210 | \n",
" 8 | \n",
" 남 | \n",
" 북 | \n",
" 571500585_02 | \n",
" 571511538_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 80 | \n",
" 210 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i6 | \n",
"
\n",
" \n",
" 81 | \n",
" 210 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" i6 | \n",
"
\n",
" \n",
" 82 | \n",
" 210 | \n",
" 21 | \n",
" 북 | \n",
" 서 | \n",
" 571511538_02.121 | \n",
" 571500535_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 83 | \n",
" 210 | \n",
" 21 | \n",
" 서 | \n",
" 남 | \n",
" 571500535_02.18 | \n",
" 571500585_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 84 | \n",
" 210 | \n",
" 21 | \n",
" 남 | \n",
" 동 | \n",
" 571500585_02 | \n",
" 571542115_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 85 | \n",
" 210 | \n",
" 21 | \n",
" 동 | \n",
" 북 | \n",
" -571542115_01 | \n",
" 571511538_01 | \n",
" i6 | \n",
"
\n",
" \n",
" 86 | \n",
" 211 | \n",
" 2 | \n",
" 서 | \n",
" 동 | \n",
" 571542116_02.96 | \n",
" 571542116_02.164 | \n",
" c30 | \n",
"
\n",
" \n",
" 87 | \n",
" 211 | \n",
" 6 | \n",
" 동 | \n",
" 서 | \n",
" 571542116_01 | \n",
" -571542116_02.96 | \n",
" c30 | \n",
"
\n",
" \n",
" 88 | \n",
" 211 | \n",
" 17 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" c30 | \n",
"
\n",
" \n",
" 89 | \n",
" 211 | \n",
" 18 | \n",
" None | \n",
" None | \n",
" None | \n",
" None | \n",
" c30 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no move_no inc_dir out_dir inc_edge out_edge \\\n",
"0 175 1 동 남 571545870_02 571542797_02 \n",
"1 175 2 서 동 571510153_02 571545870_01 \n",
"2 175 3 남 서 -571542797_02 571510153_01 \n",
"3 175 4 북 남 -571500487_01 571542797_02 \n",
"4 175 5 서 북 571510153_02 571500487_01 \n",
"5 175 6 동 서 571545870_02 571510153_01 \n",
"6 175 7 북 동 -571500487_01 571545870_01 \n",
"7 175 8 남 북 -571542797_02 571500487_01 \n",
"8 175 17 None None None None \n",
"9 175 18 None None None None \n",
"10 175 21 북 서 -571500487_01 571510153_01 \n",
"11 175 21 서 남 571510153_02 571542797_02 \n",
"12 175 21 남 동 -571542797_02 571545870_01 \n",
"13 175 21 동 북 571545870_02 571500487_01 \n",
"14 176 3 남 서 -571542810_01 571543469_01 \n",
"15 176 4 북 남 571542797_02.99 571542810_01 \n",
"16 176 5 서 북 571543469_02 -571542797_02.99 \n",
"17 176 8 남 북 -571542810_01 -571542797_02.99 \n",
"18 176 17 None None None None \n",
"19 176 18 None None None None \n",
"20 176 21 북 서 571542797_02.99 571543469_01 \n",
"21 176 21 서 남 571543469_02 571542810_01 \n",
"22 177 1 동 남 571542107_02 571542809_01 \n",
"23 177 2 서 동 -571542809_01 571542107_01 \n",
"24 177 3 남 서 -571542809_01 571542809_01 \n",
"25 177 4 북 남 571542811_02 571542809_01 \n",
"26 177 5 서 북 -571542809_01 571542811_01 \n",
"27 177 6 동 서 571542107_02 571542809_01 \n",
"28 177 7 북 동 571542811_02 571542107_01 \n",
"29 177 8 남 북 -571542809_01 571542811_01 \n",
"30 177 17 None None None None \n",
"31 177 18 None None None None \n",
"32 177 21 북 서 571542811_02 571542809_01 \n",
"33 177 21 서 남 -571542809_01 571542809_01 \n",
"34 177 21 남 동 -571542809_01 571542107_01 \n",
"35 177 21 동 북 571542107_02 571542811_01 \n",
"36 178 1 동 남 -571500475_01 571540304_01 \n",
"37 178 2 서 동 571540303_02.21 571500475_01 \n",
"38 178 3 남 서 571540304_02 571540303_01 \n",
"39 178 4 북 남 571556450_02 571540304_01 \n",
"40 178 5 서 북 571540303_02.21 571556450_01 \n",
"41 178 6 동 서 -571500475_01 571540303_01 \n",
"42 178 7 북 동 571556450_02 571500475_01 \n",
"43 178 8 남 북 571540304_02 571556450_01 \n",
"44 178 17 None None None None \n",
"45 178 18 None None None None \n",
"46 178 21 북 서 571556450_02 571540303_01 \n",
"47 178 21 서 남 571540303_02.21 571540304_01 \n",
"48 178 21 남 동 571540304_02 571500475_01 \n",
"49 178 21 동 북 -571500475_01 571556450_01 \n",
"50 201 1 동 남 571500617_02 571500569_01 \n",
"51 201 2 서 동 571500618_02 571500617_01 \n",
"52 201 3 남 서 -571500569_01 571500618_01 \n",
"53 201 4 북 남 571500583_01 571500569_01 \n",
"54 201 5 서 북 571500618_02 571500583_02 \n",
"55 201 6 동 서 571500617_02 571500618_01 \n",
"56 201 7 북 동 571500583_01 571500617_01 \n",
"57 201 8 남 북 -571500569_01 571500583_02 \n",
"58 201 17 None None None None \n",
"59 201 18 None None None None \n",
"60 201 21 북 서 571500583_01 571500618_01 \n",
"61 201 21 서 남 571500618_02 571500569_01 \n",
"62 201 21 남 동 -571500569_01 571500617_01 \n",
"63 201 21 동 북 571500617_02 571500583_02 \n",
"64 202 2 서 동 571510152_01 571510152_01.65 \n",
"65 202 6 동 서 571510152_02 -571510152_01 \n",
"66 202 17 None None None None \n",
"67 202 18 None None None None \n",
"68 206 4 북 남 571542073_01 571511538_02 \n",
"69 206 8 남 북 -571511538_02 571542073_02 \n",
"70 206 17 None None None None \n",
"71 206 18 None None None None \n",
"72 210 1 동 남 -571542115_01 571500585_01 \n",
"73 210 2 서 동 571500535_02.18 571542115_01 \n",
"74 210 3 남 서 571500585_02 571500535_01 \n",
"75 210 4 북 남 571511538_02.121 571500585_01 \n",
"76 210 5 서 북 571500535_02.18 571511538_01 \n",
"77 210 6 동 서 -571542115_01 571500535_01 \n",
"78 210 7 북 동 571511538_02.121 571542115_01 \n",
"79 210 8 남 북 571500585_02 571511538_01 \n",
"80 210 17 None None None None \n",
"81 210 18 None None None None \n",
"82 210 21 북 서 571511538_02.121 571500535_01 \n",
"83 210 21 서 남 571500535_02.18 571500585_01 \n",
"84 210 21 남 동 571500585_02 571542115_01 \n",
"85 210 21 동 북 -571542115_01 571511538_01 \n",
"86 211 2 서 동 571542116_02.96 571542116_02.164 \n",
"87 211 6 동 서 571542116_01 -571542116_02.96 \n",
"88 211 17 None None None None \n",
"89 211 18 None None None None \n",
"\n",
" node_id \n",
"0 i0 \n",
"1 i0 \n",
"2 i0 \n",
"3 i0 \n",
"4 i0 \n",
"5 i0 \n",
"6 i0 \n",
"7 i0 \n",
"8 i0 \n",
"9 i0 \n",
"10 i0 \n",
"11 i0 \n",
"12 i0 \n",
"13 i0 \n",
"14 i1 \n",
"15 i1 \n",
"16 i1 \n",
"17 i1 \n",
"18 i1 \n",
"19 i1 \n",
"20 i1 \n",
"21 i1 \n",
"22 i2 \n",
"23 i2 \n",
"24 i2 \n",
"25 i2 \n",
"26 i2 \n",
"27 i2 \n",
"28 i2 \n",
"29 i2 \n",
"30 i2 \n",
"31 i2 \n",
"32 i2 \n",
"33 i2 \n",
"34 i2 \n",
"35 i2 \n",
"36 i3 \n",
"37 i3 \n",
"38 i3 \n",
"39 i3 \n",
"40 i3 \n",
"41 i3 \n",
"42 i3 \n",
"43 i3 \n",
"44 i3 \n",
"45 i3 \n",
"46 i3 \n",
"47 i3 \n",
"48 i3 \n",
"49 i3 \n",
"50 i8 \n",
"51 i8 \n",
"52 i8 \n",
"53 i8 \n",
"54 i8 \n",
"55 i8 \n",
"56 i8 \n",
"57 i8 \n",
"58 i8 \n",
"59 i8 \n",
"60 i8 \n",
"61 i8 \n",
"62 i8 \n",
"63 i8 \n",
"64 i9 \n",
"65 i9 \n",
"66 i9 \n",
"67 i9 \n",
"68 i7 \n",
"69 i7 \n",
"70 i7 \n",
"71 i7 \n",
"72 i6 \n",
"73 i6 \n",
"74 i6 \n",
"75 i6 \n",
"76 i6 \n",
"77 i6 \n",
"78 i6 \n",
"79 i6 \n",
"80 i6 \n",
"81 i6 \n",
"82 i6 \n",
"83 i6 \n",
"84 i6 \n",
"85 i6 \n",
"86 c30 \n",
"87 c30 \n",
"88 c30 \n",
"89 c30 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 이동류 매칭\n",
"# 각 교차로에 대하여, 가능한 모든 이동류(1~18, 21)에 대한 진입·진출엣지ID를 지정한다.\n",
"# 모든 이동류에 대해 지정하므로, 시차제시 이전과 다른 이동류가 등장하더라도 항상 진입·진출 엣지 ID를 지정할 수 있다.\n",
"match6 = match5.copy().dropna()\n",
"match6 = match6[['inter_no', 'move_no', 'inc_dir', 'out_dir', 'inc_edge', 'out_edge', 'node_id']]\n",
"# (1) 가능한 (진입방향, 진출방향) 목록\n",
"flows = nema.dropna().apply(lambda row: (row['inc_dir'], row['out_dir']), axis=1).tolist()\n",
"# (2) 각 교차로별 방향 목록 : pdires\n",
"pdires = {}\n",
"for inter_no in match6.inter_no.unique():\n",
" dires = match6[match6.inter_no == inter_no][['inc_dir','out_dir']].values.flatten()\n",
" dires = {dire for dire in dires if type(dire)==str}\n",
" pdires[inter_no] = dires\n",
"# (3) 각 (교차로, 진입방향) 별 진입id 목록 : inc2id\n",
"inc2id = {}\n",
"for inter_no in match6.inter_no.unique():\n",
" for inc_dir in pdires[inter_no]:\n",
" df = match6[(match6.inter_no==inter_no) & (match6.inc_dir==inc_dir)]\n",
" inc2id[(inter_no, inc_dir)] = df.inc_edge.iloc[0]\n",
"# (4) 각 (교차로, 진출방향) 별 진출id 목록 : out2id\n",
"out2id = {}\n",
"for inter_no in match6.inter_no.unique():\n",
" for out_dir in pdires[inter_no]:\n",
" df = match6[(match6.inter_no==inter_no) & (match6.out_dir==out_dir)]\n",
" out2id[(inter_no, out_dir)] = df.out_edge.iloc[0]\n",
"# (5) 각 교차로별 가능한 (진입방향, 진출방향) 목록 : pflows\n",
"pflow = {}\n",
"for inter_no in match6.inter_no.unique():\n",
" pflow[inter_no] = [flow for flow in flows if set(flow).issubset(pdires[inter_no])]\n",
"# (6) 가능한 이동류에 대하여 진입id, 진출id 배정 : matching\n",
"inter2node = dict(zip(match6['inter_no'], match6['node_id']))\n",
"dires_right = ['북', '서', '남', '동', '북']\n",
"matching = []\n",
"for inter_no in match6.inter_no.unique():\n",
" node_id = inter2node[inter_no]\n",
" # 좌회전과 직진(1 ~ 16)\n",
" for (inc_dir, out_dir) in pflow[inter_no]:\n",
" move_no = nema[(nema.inc_dir==inc_dir) & (nema.out_dir==out_dir)].move_no.iloc[0]\n",
" inc_edge = inc2id[(inter_no, inc_dir)]\n",
" out_edge = out2id[(inter_no, out_dir)]\n",
" new_row = pd.DataFrame({'inter_no':[inter_no], 'move_no':[move_no],\n",
" 'inc_dir':[inc_dir], 'out_dir':[out_dir],\n",
" 'inc_edge':[inc_edge], 'out_edge':[out_edge], 'node_id':[node_id]})\n",
" matching.append(new_row)\n",
" # 보행신호(17), 전적색(18)\n",
" new_row = pd.DataFrame({'inter_no':[inter_no] * 2, 'move_no':[17, 18],\n",
" 'inc_dir':[None]*2, 'out_dir':[None]*2,\n",
" 'inc_edge':[None]*2, 'out_edge':[None]*2, 'node_id':[node_id]*2})\n",
" matching.append(new_row)\n",
" # 신호우회전(21)\n",
" for d in range(len(dires_right)-1):\n",
" inc_dir = dires_right[d]\n",
" out_dir = dires_right[d+1]\n",
" if {inc_dir, out_dir}.issubset(pdires[inter_no]):\n",
" inc_edge = inc2id[(inter_no, inc_dir)]\n",
" out_edge = out2id[(inter_no, out_dir)]\n",
" new_row = pd.DataFrame({'inter_no':[inter_no], 'move_no':[21],\n",
" 'inc_dir':[inc_dir], 'out_dir':[out_dir],\n",
" 'inc_edge':[inc_edge], 'out_edge':[out_edge], 'node_id':[node_id]})\n",
" matching.append(new_row)\n",
"matching = pd.concat(matching)\n",
"matching = matching.sort_values(by=['inter_no', 'move_no']).reset_index(drop=True)\n",
"with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
" display(matching)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# B. 5초 간격으로 이동류번호 수집"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/17280 [00:00, ?it/s]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17280/17280 [02:01<00:00, 142.50it/s]\n"
]
}
],
"source": [
"# 5초 단위로 이동류번호 저장 및 신호이력에서 유닉스시각 가져와서 표시, 한시간동안의 데이터만 보관\n",
"midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n",
"fsecs = range(midnight, next_day, 5) # fsecs : unix time by Five SECondS\n",
"time2move = dict(zip(fsecs,moves)) # move : 어느 순간의 이동류정보\n",
"history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n",
"\n",
"time2movement = {} # movement : 어느 순간의, 그 순간으로부터 한시간 동안의 (교차로번호 + 현시별이동류번호 + 시작시간)\n",
"# - 아래 절차를 5초마다 반복\n",
"for fsec in tqdm(fsecs): # fsec : unix time by Five SECond\n",
" # 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n",
" move = time2move[fsec]\n",
" # 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로변호, 종료유닉스타임)만 수집 : B\n",
" recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n",
" if not recent_histories:\n",
" rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n",
" else:\n",
" rhistory = pd.concat(recent_histories)\n",
" recent_unix = rhistory[['inter_no', 'end_unix']]\n",
" # 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n",
" move = pd.merge(move, recent_unix, how='left', on='inter_no')\n",
" move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n",
" move = move.drop_duplicates()\n",
" # 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n",
" move = move.rename(columns = {'end_unix':'start_unix'})\n",
" # 5. 이동류 이력정보 READ\n",
" # - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n",
" try:\n",
" if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n",
" pass\n",
" else: \n",
" movement = pd.DataFrame()\n",
" except NameError: # movement가 존재하지 않는 경우 생성\n",
" movement = pd.DataFrame()\n",
" # 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n",
" movement = pd.concat([movement, move])\n",
" # 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거)\n",
" movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix'])\n",
" # 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - 3600을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관)\n",
" movement = movement[movement.start_unix > fsec - 3600]\n",
" start_unix_min = movement.start_unix.min()\n",
" start_unix_max = movement.start_unix.max()\n",
" movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n",
"\n",
" time2movement[fsec] = movement\n",
" movement.to_csv(f'../../Data/tables/movements/movements_{fsec}.csv')\n",
"\n",
"# 각 movement들의 길이 시각화\n",
"import matplotlib.pyplot as plt\n",
"plt.plot(fsecs, [len(time2movement[fsec]) for fsec in fsecs])\n",
"plt.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# C. 5분 간격으로 신호이력 수집 및 통합테이블 생성"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" start_hour | \n",
" start_minute | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 0 | \n",
" 0 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 7 | \n",
" 0 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 9 | \n",
" 0 | \n",
" 43 | \n",
" 45 | \n",
" 33 | \n",
" 22 | \n",
" 37 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 28 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 18 | \n",
" 30 | \n",
" 46 | \n",
" 48 | \n",
" 37 | \n",
" 18 | \n",
" 41 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 18 | \n",
"
\n",
" \n",
" 4 | \n",
" 176 | \n",
" 0 | \n",
" 0 | \n",
" 37 | \n",
" 73 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 131 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no start_hour start_minute ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 \\\n",
"0 175 0 0 37 39 25 30 29 \n",
"1 175 7 0 40 42 29 26 33 \n",
"2 175 9 0 43 45 33 22 37 \n",
"3 175 18 30 46 48 37 18 41 \n",
"4 176 0 0 37 73 40 0 0 \n",
"\n",
" ddur_6 ddur_7 ddur_8 cycle offset \n",
"0 0 0 0 160 57 \n",
"1 0 0 0 170 40 \n",
"2 0 0 0 180 28 \n",
"3 0 0 0 190 18 \n",
"4 0 0 0 150 131 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 206 | \n",
" 1704380520 | \n",
" 33 | \n",
" 35 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 10 | \n",
"
\n",
" \n",
" 1 | \n",
" 211 | \n",
" 1704380525 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 2 | \n",
" 178 | \n",
" 1704380540 | \n",
" 38 | \n",
" 39 | \n",
" 40 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 50 | \n",
"
\n",
" \n",
" 3 | \n",
" 201 | \n",
" 1704380540 | \n",
" 24 | \n",
" 24 | \n",
" 17 | \n",
" 58 | \n",
" 17 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 133 | \n",
"
\n",
" \n",
" 4 | \n",
" 202 | \n",
" 1704380540 | \n",
" 39 | \n",
" 101 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 103 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"0 206 1704380520 33 35 26 26 0 0 \n",
"1 211 1704380525 28 97 0 0 0 0 \n",
"2 178 1704380540 38 39 40 23 0 0 \n",
"3 201 1704380540 24 24 17 58 17 0 \n",
"4 202 1704380540 39 101 0 0 0 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset \n",
"0 0 0 120 10 \n",
"1 0 0 125 45 \n",
"2 0 0 140 50 \n",
"3 0 0 140 133 \n",
"4 0 0 140 103 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pland = pd.read_csv('../../Data/tables/pland.csv', index_col=0)\n",
"plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n",
"history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n",
"display(pland.head())\n",
"display(history.head())\n",
"# plan은 A, B가 통합된 형식으로 history는 분리된 형식으로 표시되었음."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
" diff | \n",
"
\n",
" \n",
" \n",
" \n",
" 723 | \n",
" 175 | \n",
" 1704391690 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 732 | \n",
" 175 | \n",
" 1704391850 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 741 | \n",
" 175 | \n",
" 1704392010 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 755 | \n",
" 175 | \n",
" 1704392170 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 764 | \n",
" 175 | \n",
" 1704392330 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 773 | \n",
" 175 | \n",
" 1704392490 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 784 | \n",
" 175 | \n",
" 1704392651 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 161 | \n",
"
\n",
" \n",
" 793 | \n",
" 175 | \n",
" 1704392810 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 159 | \n",
"
\n",
" \n",
" 802 | \n",
" 175 | \n",
" 1704392970 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 813 | \n",
" 175 | \n",
" 1704393130 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 825 | \n",
" 175 | \n",
" 1704393290 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 834 | \n",
" 175 | \n",
" 1704393450 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 846 | \n",
" 175 | \n",
" 1704393610 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 856 | \n",
" 175 | \n",
" 1704393770 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 865 | \n",
" 175 | \n",
" 1704393930 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 876 | \n",
" 175 | \n",
" 1704394090 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 886 | \n",
" 175 | \n",
" 1704394250 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 898 | \n",
" 175 | \n",
" 1704394410 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 909 | \n",
" 175 | \n",
" 1704394570 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
" 918 | \n",
" 175 | \n",
" 1704394730 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
" 160 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"723 175 1704391690 37 39 25 30 29 0 \n",
"732 175 1704391850 37 39 25 30 29 0 \n",
"741 175 1704392010 37 39 25 30 29 0 \n",
"755 175 1704392170 37 39 25 30 29 0 \n",
"764 175 1704392330 37 39 25 30 29 0 \n",
"773 175 1704392490 37 39 25 30 29 0 \n",
"784 175 1704392651 37 39 25 30 29 0 \n",
"793 175 1704392810 37 39 25 30 29 0 \n",
"802 175 1704392970 37 39 25 30 29 0 \n",
"813 175 1704393130 37 39 25 30 29 0 \n",
"825 175 1704393290 37 39 25 30 29 0 \n",
"834 175 1704393450 37 39 25 30 29 0 \n",
"846 175 1704393610 37 39 25 30 29 0 \n",
"856 175 1704393770 37 39 25 30 29 0 \n",
"865 175 1704393930 37 39 25 30 29 0 \n",
"876 175 1704394090 37 39 25 30 29 0 \n",
"886 175 1704394250 37 39 25 30 29 0 \n",
"898 175 1704394410 37 39 25 30 29 0 \n",
"909 175 1704394570 37 39 25 30 29 0 \n",
"918 175 1704394730 37 39 25 30 29 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset diff \n",
"723 0 0 160 57 160 \n",
"732 0 0 160 57 160 \n",
"741 0 0 160 57 160 \n",
"755 0 0 160 57 160 \n",
"764 0 0 160 57 160 \n",
"773 0 0 160 57 160 \n",
"784 0 0 160 57 161 \n",
"793 0 0 160 57 159 \n",
"802 0 0 160 57 160 \n",
"813 0 0 160 57 160 \n",
"825 0 0 160 57 160 \n",
"834 0 0 160 57 160 \n",
"846 0 0 160 57 160 \n",
"856 0 0 160 57 160 \n",
"865 0 0 160 57 160 \n",
"876 0 0 160 57 160 \n",
"886 0 0 160 57 160 \n",
"898 0 0 160 57 160 \n",
"909 0 0 160 57 160 \n",
"918 0 0 160 57 160 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hist = history.copy()\n",
"hist = hist[hist.inter_no==175]\n",
"hist['diff'] = hist['end_unix'].diff().fillna(0).astype(int)\n",
"hist[70:90]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" start_hour | \n",
" start_minute | \n",
" start_seconds | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1704380400 | \n",
"
\n",
" \n",
" 1 | \n",
" 7 | \n",
" 0 | \n",
" 1704405600 | \n",
"
\n",
" \n",
" 2 | \n",
" 9 | \n",
" 0 | \n",
" 1704412800 | \n",
"
\n",
" \n",
" 3 | \n",
" 18 | \n",
" 30 | \n",
" 1704447000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" start_hour start_minute start_seconds\n",
"0 0 0 1704380400\n",
"1 7 0 1704405600\n",
"2 9 0 1704412800\n",
"3 18 30 1704447000"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# split, isplit : A,B 분리 혹은 통합시 사용될 수 있는 딕셔너리\n",
"splits = {} # splits maps (inter_no, start_hour, start_minute) to split\n",
"for i, row in plan.iterrows():\n",
" inter_no = row.inter_no\n",
" start_hour = row.start_hour\n",
" start_minute = row.start_minute\n",
" cycle = row.cycle\n",
" cums_A = row[[f'dura_A{j}' for j in range(1,9)]].cumsum()\n",
" cums_B = row[[f'dura_B{j}' for j in range(1,9)]].cumsum()\n",
" splits[(inter_no, start_hour, start_minute)] = {} # split maps (phas_A, phas_B) to k\n",
" k = 0\n",
" for t in range(cycle):\n",
" new_phas_A = len(cums_A[cums_A < t]) + 1\n",
" new_phas_B = len(cums_B[cums_B < t]) + 1\n",
" if k == 0 or ((new_phas_A, new_phas_B) != (phas_A, phas_B)):\n",
" k += 1\n",
" phas_A = new_phas_A\n",
" phas_B = new_phas_B\n",
" splits[(inter_no, start_hour, start_minute)][(phas_A, phas_B)] = k\n",
"\n",
"isplits = {} # the inverse of splits\n",
"for i in splits:\n",
" isplits[i] = {splits[i][k]:k for k in splits[i]} # isplit maps k to (phas_A, phas_B)\n",
"\n",
"# timetable\n",
"timetable = plan[['start_hour', 'start_minute']].drop_duplicates()\n",
"timetable['start_seconds'] = midnight + timetable['start_hour'] * 3600 + timetable['start_minute'] * 60\n",
"timetable"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[175, 176, 177, 178, 201, 202, 206, 210, 211]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(history.inter_no.unique())"
]
},
{
"cell_type": "code",
"execution_count": 378,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" start_hour | \n",
" start_minute | \n",
" start_seconds | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1704380400 | \n",
"
\n",
" \n",
" 1 | \n",
" 7 | \n",
" 0 | \n",
" 1704405600 | \n",
"
\n",
" \n",
" 2 | \n",
" 9 | \n",
" 0 | \n",
" 1704412800 | \n",
"
\n",
" \n",
" 3 | \n",
" 18 | \n",
" 30 | \n",
" 1704447000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" start_hour start_minute start_seconds\n",
"0 0 0 1704380400\n",
"1 7 0 1704405600\n",
"2 9 0 1704412800\n",
"3 18 30 1704447000"
]
},
"execution_count": 378,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"timetable"
]
},
{
"cell_type": "code",
"execution_count": 379,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
"
\n",
" \n",
" \n",
" \n",
" 1460 | \n",
" 175 | \n",
" 1704403110 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1470 | \n",
" 175 | \n",
" 1704403270 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1479 | \n",
" 175 | \n",
" 1704403430 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1489 | \n",
" 175 | \n",
" 1704403590 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1497 | \n",
" 175 | \n",
" 1704403750 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1506 | \n",
" 175 | \n",
" 1704403910 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1517 | \n",
" 175 | \n",
" 1704404070 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1528 | \n",
" 175 | \n",
" 1704404230 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1686 | \n",
" 175 | \n",
" 1704407111 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1695 | \n",
" 175 | \n",
" 1704407280 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1705 | \n",
" 175 | \n",
" 1704407449 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1715 | \n",
" 175 | \n",
" 1704407620 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1725 | \n",
" 175 | \n",
" 1704407791 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1735 | \n",
" 175 | \n",
" 1704407960 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1745 | \n",
" 175 | \n",
" 1704408130 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1754 | \n",
" 175 | \n",
" 1704408300 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1765 | \n",
" 175 | \n",
" 1704408470 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1774 | \n",
" 175 | \n",
" 1704408640 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1783 | \n",
" 175 | \n",
" 1704408810 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 1792 | \n",
" 175 | \n",
" 1704408980 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"1460 175 1704403110 37 39 25 30 29 0 \n",
"1470 175 1704403270 37 39 25 30 29 0 \n",
"1479 175 1704403430 37 39 25 30 29 0 \n",
"1489 175 1704403590 37 39 25 30 29 0 \n",
"1497 175 1704403750 37 39 25 30 29 0 \n",
"1506 175 1704403910 37 39 25 30 29 0 \n",
"1517 175 1704404070 37 39 25 30 29 0 \n",
"1528 175 1704404230 37 39 25 30 29 0 \n",
"1686 175 1704407111 37 39 25 30 29 0 \n",
"1695 175 1704407280 40 42 29 26 33 0 \n",
"1705 175 1704407449 40 42 29 26 33 0 \n",
"1715 175 1704407620 40 42 29 26 33 0 \n",
"1725 175 1704407791 40 42 29 26 33 0 \n",
"1735 175 1704407960 40 42 29 26 33 0 \n",
"1745 175 1704408130 40 42 29 26 33 0 \n",
"1754 175 1704408300 40 42 29 26 33 0 \n",
"1765 175 1704408470 40 42 29 26 33 0 \n",
"1774 175 1704408640 40 42 29 26 33 0 \n",
"1783 175 1704408810 40 42 29 26 33 0 \n",
"1792 175 1704408980 40 42 29 26 33 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset \n",
"1460 0 0 160 57 \n",
"1470 0 0 160 57 \n",
"1479 0 0 160 57 \n",
"1489 0 0 160 57 \n",
"1497 0 0 160 57 \n",
"1506 0 0 160 57 \n",
"1517 0 0 160 57 \n",
"1528 0 0 160 57 \n",
"1686 0 0 160 57 \n",
"1695 0 0 170 40 \n",
"1705 0 0 170 40 \n",
"1715 0 0 170 40 \n",
"1725 0 0 170 40 \n",
"1735 0 0 170 40 \n",
"1745 0 0 170 40 \n",
"1754 0 0 170 40 \n",
"1765 0 0 170 40 \n",
"1774 0 0 170 40 \n",
"1783 0 0 170 40 \n",
"1792 0 0 170 40 "
]
},
"execution_count": 379,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"history[(history.inter_no==175) & (history.end_unix>=1704403000) & (history.end_unix<=1704409000)]"
]
},
{
"cell_type": "code",
"execution_count": 465,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2024-01-05 14:29:20\n",
"2024-01-05 15:29:19\n"
]
}
],
"source": [
"# inter_no = 175, m = 30 : 조정 (수축)\n",
"# inter_no = 175, m = 70 : 삭제 + 조정(수축)\n",
"# inter_no = 175, m = 90 : 결측(전이) + 삭제 + 조정(수축)\n",
"# inter_no = 175, m = 140 : 삭제 + 조정(수축)\n",
"# inter_no = 176, m = 50 : 조정(수축)\n",
"# inter_no = 176, m = 155 : 삭제(마지막 행에서 삭제)\n",
"# inter_no = 176, m = 160 : 조정(수축) + 삭제 + 조정(수축)\n",
"# inter_no = 176, m = 190 : 결측\n",
"# inter_no = 176, m = 220 : 삭제\n",
"# inter_no = 176, m = 270 : 삭제\n",
"# inter_no = 176, m = 275 : 삭제\n",
"# inter_no = 177, m = 40 : 조정(수축)\n",
"# inter_no = 178, m = 70 : 삭제\n",
"# inter_no = 178, m = 100 : 조정(확장) + 삭제\n",
"# inter_no = 178, m = 270 : 결측 + 조정(확장)\n",
"\n",
"print(datetime.fromtimestamp(1704432560))\n",
"print(datetime.fromtimestamp(1704436159))"
]
},
{
"cell_type": "code",
"execution_count": 483,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 211 | \n",
" 1704380525 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 10 | \n",
" 211 | \n",
" 1704380645 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 19 | \n",
" 211 | \n",
" 1704380765 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 28 | \n",
" 211 | \n",
" 1704380885 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 36 | \n",
" 211 | \n",
" 1704381005 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 4835 | \n",
" 211 | \n",
" 1704466205 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
" 4842 | \n",
" 211 | \n",
" 1704466345 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
" 4851 | \n",
" 211 | \n",
" 1704466485 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
" 4857 | \n",
" 211 | \n",
" 1704466625 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
" 4864 | \n",
" 211 | \n",
" 1704466765 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
"
\n",
"
649 rows × 12 columns
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"1 211 1704380525 28 97 0 0 0 0 \n",
"10 211 1704380645 28 97 0 0 0 0 \n",
"19 211 1704380765 28 97 0 0 0 0 \n",
"28 211 1704380885 28 97 0 0 0 0 \n",
"36 211 1704381005 28 97 0 0 0 0 \n",
"... ... ... ... ... ... ... ... ... \n",
"4835 211 1704466205 28 117 0 0 0 0 \n",
"4842 211 1704466345 28 117 0 0 0 0 \n",
"4851 211 1704466485 28 117 0 0 0 0 \n",
"4857 211 1704466625 28 117 0 0 0 0 \n",
"4864 211 1704466765 28 117 0 0 0 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset \n",
"1 0 0 125 45 \n",
"10 0 0 125 45 \n",
"19 0 0 125 45 \n",
"28 0 0 125 45 \n",
"36 0 0 125 45 \n",
"... ... ... ... ... \n",
"4835 0 0 145 55 \n",
"4842 0 0 145 55 \n",
"4851 0 0 145 55 \n",
"4857 0 0 145 55 \n",
"4864 0 0 145 55 \n",
"\n",
"[649 rows x 12 columns]"
]
},
"execution_count": 483,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"history[history.inter_no==211]"
]
},
{
"cell_type": "code",
"execution_count": 481,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"결측치 처리 전\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
" diff | \n",
"
\n",
" \n",
" \n",
" \n",
" 52 | \n",
" 211 | \n",
" 1704386765 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 53 | \n",
" 211 | \n",
" 1704386885 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 54 | \n",
" 211 | \n",
" 1704387005 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 55 | \n",
" 211 | \n",
" 1704387125 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 56 | \n",
" 211 | \n",
" 1704387245 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 57 | \n",
" 211 | \n",
" 1704387365 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 58 | \n",
" 211 | \n",
" 1704387485 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 59 | \n",
" 211 | \n",
" 1704387605 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 60 | \n",
" 211 | \n",
" 1704387725 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 61 | \n",
" 211 | \n",
" 1704387845 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 62 | \n",
" 211 | \n",
" 1704387965 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 63 | \n",
" 211 | \n",
" 1704388085 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 64 | \n",
" 211 | \n",
" 1704388205 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 65 | \n",
" 211 | \n",
" 1704388325 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 66 | \n",
" 211 | \n",
" 1704388445 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 67 | \n",
" 211 | \n",
" 1704388565 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 68 | \n",
" 211 | \n",
" 1704388685 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 69 | \n",
" 211 | \n",
" 1704388805 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 70 | \n",
" 211 | \n",
" 1704388925 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 71 | \n",
" 211 | \n",
" 1704389045 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 72 | \n",
" 211 | \n",
" 1704389165 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 73 | \n",
" 211 | \n",
" 1704389285 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"52 211 1704386765 28 97 0 0 0 0 \n",
"53 211 1704386885 28 97 0 0 0 0 \n",
"54 211 1704387005 28 97 0 0 0 0 \n",
"55 211 1704387125 28 97 0 0 0 0 \n",
"56 211 1704387245 28 97 0 0 0 0 \n",
"57 211 1704387365 28 97 0 0 0 0 \n",
"58 211 1704387485 28 97 0 0 0 0 \n",
"59 211 1704387605 28 97 0 0 0 0 \n",
"60 211 1704387725 28 97 0 0 0 0 \n",
"61 211 1704387845 28 97 0 0 0 0 \n",
"62 211 1704387965 28 97 0 0 0 0 \n",
"63 211 1704388085 28 97 0 0 0 0 \n",
"64 211 1704388205 28 97 0 0 0 0 \n",
"65 211 1704388325 28 97 0 0 0 0 \n",
"66 211 1704388445 28 97 0 0 0 0 \n",
"67 211 1704388565 28 97 0 0 0 0 \n",
"68 211 1704388685 28 97 0 0 0 0 \n",
"69 211 1704388805 28 97 0 0 0 0 \n",
"70 211 1704388925 28 97 0 0 0 0 \n",
"71 211 1704389045 28 97 0 0 0 0 \n",
"72 211 1704389165 28 97 0 0 0 0 \n",
"73 211 1704389285 28 97 0 0 0 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset diff \n",
"52 0 0 125 45 120 \n",
"53 0 0 125 45 120 \n",
"54 0 0 125 45 120 \n",
"55 0 0 125 45 120 \n",
"56 0 0 125 45 120 \n",
"57 0 0 125 45 120 \n",
"58 0 0 125 45 120 \n",
"59 0 0 125 45 120 \n",
"60 0 0 125 45 120 \n",
"61 0 0 125 45 120 \n",
"62 0 0 125 45 120 \n",
"63 0 0 125 45 120 \n",
"64 0 0 125 45 120 \n",
"65 0 0 125 45 120 \n",
"66 0 0 125 45 120 \n",
"67 0 0 125 45 120 \n",
"68 0 0 125 45 120 \n",
"69 0 0 125 45 120 \n",
"70 0 0 125 45 120 \n",
"71 0 0 125 45 120 \n",
"72 0 0 125 45 120 \n",
"73 0 0 125 45 120 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"결측치 처리 후\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
" diff | \n",
"
\n",
" \n",
" \n",
" \n",
" 52 | \n",
" 211 | \n",
" 1704386765 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 53 | \n",
" 211 | \n",
" 1704386885 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 54 | \n",
" 211 | \n",
" 1704387005 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 55 | \n",
" 211 | \n",
" 1704387125 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 56 | \n",
" 211 | \n",
" 1704387245 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 57 | \n",
" 211 | \n",
" 1704387365 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 58 | \n",
" 211 | \n",
" 1704387485 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 59 | \n",
" 211 | \n",
" 1704387605 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 60 | \n",
" 211 | \n",
" 1704387725 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 61 | \n",
" 211 | \n",
" 1704387845 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 62 | \n",
" 211 | \n",
" 1704387965 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 63 | \n",
" 211 | \n",
" 1704388085 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 64 | \n",
" 211 | \n",
" 1704388205 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 65 | \n",
" 211 | \n",
" 1704388325 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 66 | \n",
" 211 | \n",
" 1704388445 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 67 | \n",
" 211 | \n",
" 1704388565 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 68 | \n",
" 211 | \n",
" 1704388685 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 69 | \n",
" 211 | \n",
" 1704388805 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 70 | \n",
" 211 | \n",
" 1704388925 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 71 | \n",
" 211 | \n",
" 1704389045 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 72 | \n",
" 211 | \n",
" 1704389165 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
" 73 | \n",
" 211 | \n",
" 1704389285 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 120 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"52 211 1704386765 28 97 0 0 0 0 \n",
"53 211 1704386885 28 97 0 0 0 0 \n",
"54 211 1704387005 28 97 0 0 0 0 \n",
"55 211 1704387125 28 97 0 0 0 0 \n",
"56 211 1704387245 28 97 0 0 0 0 \n",
"57 211 1704387365 28 97 0 0 0 0 \n",
"58 211 1704387485 28 97 0 0 0 0 \n",
"59 211 1704387605 28 97 0 0 0 0 \n",
"60 211 1704387725 28 97 0 0 0 0 \n",
"61 211 1704387845 28 97 0 0 0 0 \n",
"62 211 1704387965 28 97 0 0 0 0 \n",
"63 211 1704388085 28 97 0 0 0 0 \n",
"64 211 1704388205 28 97 0 0 0 0 \n",
"65 211 1704388325 28 97 0 0 0 0 \n",
"66 211 1704388445 28 97 0 0 0 0 \n",
"67 211 1704388565 28 97 0 0 0 0 \n",
"68 211 1704388685 28 97 0 0 0 0 \n",
"69 211 1704388805 28 97 0 0 0 0 \n",
"70 211 1704388925 28 97 0 0 0 0 \n",
"71 211 1704389045 28 97 0 0 0 0 \n",
"72 211 1704389165 28 97 0 0 0 0 \n",
"73 211 1704389285 28 97 0 0 0 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset diff \n",
"52 0 0 125 45 120 \n",
"53 0 0 125 45 120 \n",
"54 0 0 125 45 120 \n",
"55 0 0 125 45 120 \n",
"56 0 0 125 45 120 \n",
"57 0 0 125 45 120 \n",
"58 0 0 125 45 120 \n",
"59 0 0 125 45 120 \n",
"60 0 0 125 45 120 \n",
"61 0 0 125 45 120 \n",
"62 0 0 125 45 120 \n",
"63 0 0 125 45 120 \n",
"64 0 0 125 45 120 \n",
"65 0 0 125 45 120 \n",
"66 0 0 125 45 120 \n",
"67 0 0 125 45 120 \n",
"68 0 0 125 45 120 \n",
"69 0 0 125 45 120 \n",
"70 0 0 125 45 120 \n",
"71 0 0 125 45 120 \n",
"72 0 0 125 45 120 \n",
"73 0 0 125 45 120 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"이상치 처리 전\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
" D_n | \n",
" S_n | \n",
" diff | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 211 | \n",
" 1704385805 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2400 | \n",
" 2500 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 211 | \n",
" 1704385925 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2520 | \n",
" 2625 | \n",
" 120 | \n",
"
\n",
" \n",
" 2 | \n",
" 211 | \n",
" 1704386045 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2640 | \n",
" 2750 | \n",
" 120 | \n",
"
\n",
" \n",
" 3 | \n",
" 211 | \n",
" 1704386165 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2760 | \n",
" 2875 | \n",
" 120 | \n",
"
\n",
" \n",
" 4 | \n",
" 211 | \n",
" 1704386285 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2880 | \n",
" 3000 | \n",
" 120 | \n",
"
\n",
" \n",
" 5 | \n",
" 211 | \n",
" 1704386405 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3000 | \n",
" 3125 | \n",
" 120 | \n",
"
\n",
" \n",
" 6 | \n",
" 211 | \n",
" 1704386525 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3120 | \n",
" 3250 | \n",
" 120 | \n",
"
\n",
" \n",
" 7 | \n",
" 211 | \n",
" 1704386645 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3240 | \n",
" 3375 | \n",
" 120 | \n",
"
\n",
" \n",
" 8 | \n",
" 211 | \n",
" 1704386765 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3360 | \n",
" 3500 | \n",
" 120 | \n",
"
\n",
" \n",
" 9 | \n",
" 211 | \n",
" 1704386885 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3480 | \n",
" 3625 | \n",
" 120 | \n",
"
\n",
" \n",
" 10 | \n",
" 211 | \n",
" 1704387005 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3600 | \n",
" 3750 | \n",
" 120 | \n",
"
\n",
" \n",
" 11 | \n",
" 211 | \n",
" 1704387125 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3720 | \n",
" 3875 | \n",
" 120 | \n",
"
\n",
" \n",
" 12 | \n",
" 211 | \n",
" 1704387245 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3840 | \n",
" 4000 | \n",
" 120 | \n",
"
\n",
" \n",
" 13 | \n",
" 211 | \n",
" 1704387365 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 3960 | \n",
" 4125 | \n",
" 120 | \n",
"
\n",
" \n",
" 14 | \n",
" 211 | \n",
" 1704387485 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 4080 | \n",
" 4250 | \n",
" 120 | \n",
"
\n",
" \n",
" 15 | \n",
" 211 | \n",
" 1704387605 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 600 | \n",
" 625 | \n",
" 120 | \n",
"
\n",
" \n",
" 16 | \n",
" 211 | \n",
" 1704387725 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 720 | \n",
" 750 | \n",
" 120 | \n",
"
\n",
" \n",
" 17 | \n",
" 211 | \n",
" 1704387845 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 840 | \n",
" 875 | \n",
" 120 | \n",
"
\n",
" \n",
" 18 | \n",
" 211 | \n",
" 1704387965 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 960 | \n",
" 1000 | \n",
" 120 | \n",
"
\n",
" \n",
" 19 | \n",
" 211 | \n",
" 1704388085 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1080 | \n",
" 1125 | \n",
" 120 | \n",
"
\n",
" \n",
" 20 | \n",
" 211 | \n",
" 1704388205 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1200 | \n",
" 1250 | \n",
" 120 | \n",
"
\n",
" \n",
" 21 | \n",
" 211 | \n",
" 1704388325 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1320 | \n",
" 1375 | \n",
" 120 | \n",
"
\n",
" \n",
" 22 | \n",
" 211 | \n",
" 1704388445 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1440 | \n",
" 1500 | \n",
" 120 | \n",
"
\n",
" \n",
" 23 | \n",
" 211 | \n",
" 1704388565 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1560 | \n",
" 1625 | \n",
" 120 | \n",
"
\n",
" \n",
" 24 | \n",
" 211 | \n",
" 1704388685 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1680 | \n",
" 1750 | \n",
" 120 | \n",
"
\n",
" \n",
" 25 | \n",
" 211 | \n",
" 1704388805 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1800 | \n",
" 1875 | \n",
" 120 | \n",
"
\n",
" \n",
" 26 | \n",
" 211 | \n",
" 1704388925 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 1920 | \n",
" 2000 | \n",
" 120 | \n",
"
\n",
" \n",
" 27 | \n",
" 211 | \n",
" 1704389045 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2040 | \n",
" 2125 | \n",
" 120 | \n",
"
\n",
" \n",
" 28 | \n",
" 211 | \n",
" 1704389165 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2160 | \n",
" 2250 | \n",
" 120 | \n",
"
\n",
" \n",
" 29 | \n",
" 211 | \n",
" 1704389285 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2280 | \n",
" 2375 | \n",
" 120 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"0 211 1704385805 28 97 0 0 0 0 \n",
"1 211 1704385925 28 97 0 0 0 0 \n",
"2 211 1704386045 28 97 0 0 0 0 \n",
"3 211 1704386165 28 97 0 0 0 0 \n",
"4 211 1704386285 28 97 0 0 0 0 \n",
"5 211 1704386405 28 97 0 0 0 0 \n",
"6 211 1704386525 28 97 0 0 0 0 \n",
"7 211 1704386645 28 97 0 0 0 0 \n",
"8 211 1704386765 28 97 0 0 0 0 \n",
"9 211 1704386885 28 97 0 0 0 0 \n",
"10 211 1704387005 28 97 0 0 0 0 \n",
"11 211 1704387125 28 97 0 0 0 0 \n",
"12 211 1704387245 28 97 0 0 0 0 \n",
"13 211 1704387365 28 97 0 0 0 0 \n",
"14 211 1704387485 28 97 0 0 0 0 \n",
"15 211 1704387605 28 97 0 0 0 0 \n",
"16 211 1704387725 28 97 0 0 0 0 \n",
"17 211 1704387845 28 97 0 0 0 0 \n",
"18 211 1704387965 28 97 0 0 0 0 \n",
"19 211 1704388085 28 97 0 0 0 0 \n",
"20 211 1704388205 28 97 0 0 0 0 \n",
"21 211 1704388325 28 97 0 0 0 0 \n",
"22 211 1704388445 28 97 0 0 0 0 \n",
"23 211 1704388565 28 97 0 0 0 0 \n",
"24 211 1704388685 28 97 0 0 0 0 \n",
"25 211 1704388805 28 97 0 0 0 0 \n",
"26 211 1704388925 28 97 0 0 0 0 \n",
"27 211 1704389045 28 97 0 0 0 0 \n",
"28 211 1704389165 28 97 0 0 0 0 \n",
"29 211 1704389285 28 97 0 0 0 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset D_n S_n diff \n",
"0 0 0 125 45 2400 2500 0 \n",
"1 0 0 125 45 2520 2625 120 \n",
"2 0 0 125 45 2640 2750 120 \n",
"3 0 0 125 45 2760 2875 120 \n",
"4 0 0 125 45 2880 3000 120 \n",
"5 0 0 125 45 3000 3125 120 \n",
"6 0 0 125 45 3120 3250 120 \n",
"7 0 0 125 45 3240 3375 120 \n",
"8 0 0 125 45 3360 3500 120 \n",
"9 0 0 125 45 3480 3625 120 \n",
"10 0 0 125 45 3600 3750 120 \n",
"11 0 0 125 45 3720 3875 120 \n",
"12 0 0 125 45 3840 4000 120 \n",
"13 0 0 125 45 3960 4125 120 \n",
"14 0 0 125 45 4080 4250 120 \n",
"15 0 0 125 45 600 625 120 \n",
"16 0 0 125 45 720 750 120 \n",
"17 0 0 125 45 840 875 120 \n",
"18 0 0 125 45 960 1000 120 \n",
"19 0 0 125 45 1080 1125 120 \n",
"20 0 0 125 45 1200 1250 120 \n",
"21 0 0 125 45 1320 1375 120 \n",
"22 0 0 125 45 1440 1500 120 \n",
"23 0 0 125 45 1560 1625 120 \n",
"24 0 0 125 45 1680 1750 120 \n",
"25 0 0 125 45 1800 1875 120 \n",
"26 0 0 125 45 1920 2000 120 \n",
"27 0 0 125 45 2040 2125 120 \n",
"28 0 0 125 45 2160 2250 120 \n",
"29 0 0 125 45 2280 2375 120 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"이상치 처리 후\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" end_unix | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
" D_n | \n",
" S_n | \n",
" diff | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 211 | \n",
" 1704385805 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
" 2400 | \n",
" 2500 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 211 | \n",
" 1704385925 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2520 | \n",
" 2625 | \n",
" 120 | \n",
"
\n",
" \n",
" 2 | \n",
" 211 | \n",
" 1704386045 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2640 | \n",
" 2750 | \n",
" 120 | \n",
"
\n",
" \n",
" 3 | \n",
" 211 | \n",
" 1704386165 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2760 | \n",
" 2875 | \n",
" 120 | \n",
"
\n",
" \n",
" 4 | \n",
" 211 | \n",
" 1704386285 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2880 | \n",
" 3000 | \n",
" 120 | \n",
"
\n",
" \n",
" 5 | \n",
" 211 | \n",
" 1704386405 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3000 | \n",
" 3125 | \n",
" 120 | \n",
"
\n",
" \n",
" 6 | \n",
" 211 | \n",
" 1704386525 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3120 | \n",
" 3250 | \n",
" 120 | \n",
"
\n",
" \n",
" 7 | \n",
" 211 | \n",
" 1704386645 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3240 | \n",
" 3375 | \n",
" 120 | \n",
"
\n",
" \n",
" 8 | \n",
" 211 | \n",
" 1704386765 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3360 | \n",
" 3500 | \n",
" 120 | \n",
"
\n",
" \n",
" 9 | \n",
" 211 | \n",
" 1704386885 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3480 | \n",
" 3625 | \n",
" 120 | \n",
"
\n",
" \n",
" 10 | \n",
" 211 | \n",
" 1704387005 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3600 | \n",
" 3750 | \n",
" 120 | \n",
"
\n",
" \n",
" 11 | \n",
" 211 | \n",
" 1704387125 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3720 | \n",
" 3875 | \n",
" 120 | \n",
"
\n",
" \n",
" 12 | \n",
" 211 | \n",
" 1704387245 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3840 | \n",
" 4000 | \n",
" 120 | \n",
"
\n",
" \n",
" 13 | \n",
" 211 | \n",
" 1704387365 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 3960 | \n",
" 4125 | \n",
" 120 | \n",
"
\n",
" \n",
" 14 | \n",
" 211 | \n",
" 1704387485 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 4080 | \n",
" 4250 | \n",
" 120 | \n",
"
\n",
" \n",
" 15 | \n",
" 211 | \n",
" 1704387605 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 600 | \n",
" 625 | \n",
" 120 | \n",
"
\n",
" \n",
" 16 | \n",
" 211 | \n",
" 1704387725 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 720 | \n",
" 750 | \n",
" 120 | \n",
"
\n",
" \n",
" 17 | \n",
" 211 | \n",
" 1704387845 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 840 | \n",
" 875 | \n",
" 120 | \n",
"
\n",
" \n",
" 18 | \n",
" 211 | \n",
" 1704387965 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 960 | \n",
" 1000 | \n",
" 120 | \n",
"
\n",
" \n",
" 19 | \n",
" 211 | \n",
" 1704388085 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1080 | \n",
" 1125 | \n",
" 120 | \n",
"
\n",
" \n",
" 20 | \n",
" 211 | \n",
" 1704388205 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1200 | \n",
" 1250 | \n",
" 120 | \n",
"
\n",
" \n",
" 21 | \n",
" 211 | \n",
" 1704388325 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1320 | \n",
" 1375 | \n",
" 120 | \n",
"
\n",
" \n",
" 22 | \n",
" 211 | \n",
" 1704388445 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1440 | \n",
" 1500 | \n",
" 120 | \n",
"
\n",
" \n",
" 23 | \n",
" 211 | \n",
" 1704388565 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1560 | \n",
" 1625 | \n",
" 120 | \n",
"
\n",
" \n",
" 24 | \n",
" 211 | \n",
" 1704388685 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1680 | \n",
" 1750 | \n",
" 120 | \n",
"
\n",
" \n",
" 25 | \n",
" 211 | \n",
" 1704388805 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1800 | \n",
" 1875 | \n",
" 120 | \n",
"
\n",
" \n",
" 26 | \n",
" 211 | \n",
" 1704388925 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 1920 | \n",
" 2000 | \n",
" 120 | \n",
"
\n",
" \n",
" 27 | \n",
" 211 | \n",
" 1704389045 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2040 | \n",
" 2125 | \n",
" 120 | \n",
"
\n",
" \n",
" 28 | \n",
" 211 | \n",
" 1704389165 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2160 | \n",
" 2250 | \n",
" 120 | \n",
"
\n",
" \n",
" 29 | \n",
" 211 | \n",
" 1704389285 | \n",
" 27 | \n",
" 93 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 45 | \n",
" 2280 | \n",
" 2375 | \n",
" 120 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"0 211 1704385805 28 97 0 0 0 0 \n",
"1 211 1704385925 27 93 0 0 0 0 \n",
"2 211 1704386045 27 93 0 0 0 0 \n",
"3 211 1704386165 27 93 0 0 0 0 \n",
"4 211 1704386285 27 93 0 0 0 0 \n",
"5 211 1704386405 27 93 0 0 0 0 \n",
"6 211 1704386525 27 93 0 0 0 0 \n",
"7 211 1704386645 27 93 0 0 0 0 \n",
"8 211 1704386765 27 93 0 0 0 0 \n",
"9 211 1704386885 27 93 0 0 0 0 \n",
"10 211 1704387005 27 93 0 0 0 0 \n",
"11 211 1704387125 27 93 0 0 0 0 \n",
"12 211 1704387245 27 93 0 0 0 0 \n",
"13 211 1704387365 27 93 0 0 0 0 \n",
"14 211 1704387485 27 93 0 0 0 0 \n",
"15 211 1704387605 27 93 0 0 0 0 \n",
"16 211 1704387725 27 93 0 0 0 0 \n",
"17 211 1704387845 27 93 0 0 0 0 \n",
"18 211 1704387965 27 93 0 0 0 0 \n",
"19 211 1704388085 27 93 0 0 0 0 \n",
"20 211 1704388205 27 93 0 0 0 0 \n",
"21 211 1704388325 27 93 0 0 0 0 \n",
"22 211 1704388445 27 93 0 0 0 0 \n",
"23 211 1704388565 27 93 0 0 0 0 \n",
"24 211 1704388685 27 93 0 0 0 0 \n",
"25 211 1704388805 27 93 0 0 0 0 \n",
"26 211 1704388925 27 93 0 0 0 0 \n",
"27 211 1704389045 27 93 0 0 0 0 \n",
"28 211 1704389165 27 93 0 0 0 0 \n",
"29 211 1704389285 27 93 0 0 0 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset D_n S_n diff \n",
"0 0 0 125 45 2400 2500 0 \n",
"1 0 0 120 45 2520 2625 120 \n",
"2 0 0 120 45 2640 2750 120 \n",
"3 0 0 120 45 2760 2875 120 \n",
"4 0 0 120 45 2880 3000 120 \n",
"5 0 0 120 45 3000 3125 120 \n",
"6 0 0 120 45 3120 3250 120 \n",
"7 0 0 120 45 3240 3375 120 \n",
"8 0 0 120 45 3360 3500 120 \n",
"9 0 0 120 45 3480 3625 120 \n",
"10 0 0 120 45 3600 3750 120 \n",
"11 0 0 120 45 3720 3875 120 \n",
"12 0 0 120 45 3840 4000 120 \n",
"13 0 0 120 45 3960 4125 120 \n",
"14 0 0 120 45 4080 4250 120 \n",
"15 0 0 120 45 600 625 120 \n",
"16 0 0 120 45 720 750 120 \n",
"17 0 0 120 45 840 875 120 \n",
"18 0 0 120 45 960 1000 120 \n",
"19 0 0 120 45 1080 1125 120 \n",
"20 0 0 120 45 1200 1250 120 \n",
"21 0 0 120 45 1320 1375 120 \n",
"22 0 0 120 45 1440 1500 120 \n",
"23 0 0 120 45 1560 1625 120 \n",
"24 0 0 120 45 1680 1750 120 \n",
"25 0 0 120 45 1800 1875 120 \n",
"26 0 0 120 45 1920 2000 120 \n",
"27 0 0 120 45 2040 2125 120 \n",
"28 0 0 120 45 2160 2250 120 \n",
"29 0 0 120 45 2280 2375 120 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"inter_no = 211\n",
"m = 30 # ranges from 0 to 287, but 0 makes an error where 288 = 86400//300\n",
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
"present_time = fmins[m] # 현재시점\n",
"# - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n",
"# 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 1시간 이내인 데이터 수집\n",
"rhistory = history.copy() # recent history (3시간 이내)\n",
"rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 10800)]\n",
"hours = np.array(range(midnight, next_day + 1, 3600))\n",
"rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n",
"rhist = rhist.reset_index(drop=True)\n",
"print(\"결측치 처리 전\")\n",
"rhist_diff = rhist.copy()\n",
"rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n",
"display(rhist_diff.tail(22)) # 결측치 처리 전\n",
"new_rows = []\n",
"# 1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n",
"for n in range(len(rhist) - 1):\n",
" curr_unix = rhist.iloc[n].end_unix # current end_unix\n",
" next_unix = rhist.iloc[n+1].end_unix # next end_unix\n",
" cycle = rhist.iloc[n].cycle\n",
" if next_unix - curr_unix >= 2 * cycle:\n",
" # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n",
" #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n",
" while next_unix - curr_unix > cycle:\n",
" curr_unix += cycle\n",
" start_seconds = np.array(timetable.start_seconds)\n",
" idx = (start_seconds <= curr_unix).sum() - 1\n",
" start_hour = timetable.iloc[idx].start_hour\n",
" start_minute = timetable.iloc[idx].start_minute\n",
" prow = pland[(pland.inter_no==inter_no) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)] # planned row\n",
" prow = prow.drop(['start_hour', 'start_minute'], axis=1)\n",
" prow['end_unix'] = curr_unix\n",
" cycle = prow.iloc[0].cycle\n",
" display(prow)\n",
" new_rows.append(prow)\n",
"\n",
"rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n",
"print(\"결측치 처리 후\")\n",
"rhist_diff = rhist.copy()\n",
"rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n",
"display(rhist_diff.tail(22)) # 결측치 처리 후\n",
"rhist = rhist.reset_index(drop=True)\n",
"\n",
"# 1-2. 이상치 처리 : 기준유닉스로부터의 시간차이와 현시시간합이 11 이상 차이나면 이상치가 발생했다고 판단\n",
"Rhist = rhist.copy() # recent history 1704393231\n",
"Rhist = Rhist[(Rhist.end_unix < present_time) & (Rhist.end_unix >= present_time - 3600)] # Recent history (1시간 이내)\n",
"Rhist = Rhist.reset_index(drop=True)\n",
"Rhist['D_n'] = 0\n",
"Rhist['S_n'] = 0\n",
"for n in range(len(Rhist)):\n",
" curr_unix = Rhist.iloc[n].end_unix # current end_unix\n",
" cycle = Rhist.iloc[n].cycle\n",
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
" end_unixes = rhist.end_unix.unique()\n",
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
" # D_n : 시간차이\n",
" D_n = curr_unix - base_unix\n",
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n",
" # S_n : 현시시간합\n",
" S_n = ddurations.values.sum()\n",
" Rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n",
"print(\"이상치 처리 전\")\n",
"Rhist_diff = Rhist.copy()\n",
"Rhist_diff['diff'] = Rhist_diff['end_unix'].diff().fillna(0).astype(int)\n",
"display(Rhist_diff)\n",
"# for n in range(1, len(Rhist)):\n",
"n = 1\n",
"while n < len(Rhist):\n",
" prev_unix = Rhist[Rhist.index==n-1]['end_unix'].iloc[0] # previous end_unix\n",
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
" R_n = (curr_unix - prev_unix) / cycle\n",
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
" end_unixes = rhist.end_unix.unique()\n",
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
" # D_n : 시간차이\n",
" D_n = curr_unix - base_unix\n",
" # S_n : 현시시간합\n",
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n",
" S_n = ddurations.values.sum()\n",
" # 비율이 0.5보다 작거나 같으면 해당 행을 삭제\n",
" if (abs(D_n - S_n) > 10) & (R_n <= 0.5):\n",
" print(\"lt\", n, curr_unix, round(R_n,2), D_n, S_n)\n",
" Rhist = Rhist.drop(index=n)\n",
" n += 1\n",
" # 행삭제에 따른 curr_unix, D_n, S_n 등 재정의\n",
" if not Rhist[Rhist.index==n]['end_unix'].empty: # 마지막 행을 삭제하여 뒤의 행이 없을 때를 대비\n",
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
" R_n = (curr_unix - prev_unix) / cycle\n",
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
" end_unixes = rhist.end_unix.unique()\n",
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
" # D_n : 시간차이\n",
" D_n = curr_unix - base_unix\n",
" # S_n : 현시시간합\n",
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n",
" S_n = ddurations.values.sum()\n",
" # 비율이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n",
" if (abs(D_n - S_n) > 10) & (R_n > 0.5):\n",
" start_seconds = np.array(timetable.start_seconds)\n",
" idx = (start_seconds <= curr_unix).sum() - 1\n",
" start_hour = timetable.iloc[idx].start_hour\n",
" start_minute = timetable.iloc[idx].start_minute\n",
" prow = pland[(pland.inter_no==inter_no) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n",
" adjusted_dur = prow[['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] * R_n\n",
" # 조정된 현시시간을 정수로 바꿈\n",
" int_parts = adjusted_dur.apply(lambda x: int(x))\n",
" frac_parts = adjusted_dur - int_parts\n",
" difference = int(round(adjusted_dur.sum())) - int_parts.sum()\n",
" # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n",
" for _ in range(difference):\n",
" max_frac_index = frac_parts.idxmax()\n",
" int_parts[max_frac_index] += 1\n",
" frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n",
" Rhist.loc[n, ['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] = int_parts.values\n",
" Rhist.loc[n, 'cycle'] = int_parts.sum()\n",
" n += 1\n",
"print(\"이상치 처리 후\")\n",
"Rhist_diff = Rhist.copy()\n",
"Rhist_diff['diff'] = Rhist_diff['end_unix'].diff().fillna(0).astype(int)\n",
"display(Rhist_diff)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 세부현시로 되어있던 history를 A, B로 나뉘어 현시시간이 구성된 형태로 바꿈.\n",
"plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n",
"history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n",
"\n",
"# A, B 분리 혹은 통합시 사용할 수 있는 딕셔너리\n",
"splits = {} # splits maps (inter_no, start_hour, start_minute) to split\n",
"for i, row in plan.iterrows():\n",
" inter_no = row.inter_no\n",
" start_hour = row.start_hour\n",
" start_minute = row.start_minute\n",
" cycle = row.cycle\n",
" cums_A = row[[f'dura_A{j}' for j in range(1,9)]].cumsum()\n",
" cums_B = row[[f'dura_B{j}' for j in range(1,9)]].cumsum()\n",
" splits[(inter_no, start_hour, start_minute)] = {} # split maps (phas_A, phas_B) to k\n",
" k = 0\n",
" for t in range(cycle):\n",
" new_phas_A = len(cums_A[cums_A < t]) + 1\n",
" new_phas_B = len(cums_B[cums_B < t]) + 1\n",
" if k == 0 or ((new_phas_A, new_phas_B) != (phas_A, phas_B)):\n",
" k += 1\n",
" phas_A = new_phas_A\n",
" phas_B = new_phas_B\n",
" splits[(inter_no, start_hour, start_minute)][(phas_A, phas_B)] = k\n",
"# the inverse of splits\n",
"isplits = {} # isplit maps k to (phas_A, phas_B)\n",
"for i in splits:\n",
" isplits[i] = {splits[i][k]:k for k in splits[i]}\n",
"\n",
"timetable = plan[['start_hour', 'start_minute']].drop_duplicates()\n",
"timetable['start_seconds'] = midnight + timetable['start_hour'] * 3600 + timetable['start_minute'] * 60\n",
"\n",
"abhistory = history.copy() # A, B가 나뉘어진 history\n",
"# history의 행들을 순회하며 새로운 열 dur_A1, dur_A2, ... 를 만들어내고 값을 배정함.\n",
"for i, row in abhistory.iterrows():\n",
" inter_no = row.inter_no\n",
" ind = (timetable['start_seconds'] < row.end_unix).sum() - 1\n",
" start_hour = timetable.iloc[ind].start_hour\n",
" start_minute = timetable.iloc[ind].start_minute\n",
" isplit = isplits[(inter_no,start_hour,start_minute)]\n",
" dur_dict = {}\n",
" dur_chars = [f'dur_{alph}{j}' for alph in ['A', 'B'] for j in range(1, 9)] # 새로운 행들\n",
" for dur_char in dur_chars:\n",
" dur_dict[dur_char] = 0\n",
" for k in range(1, len(isplit)+1): # dur_dict에 값 저장\n",
" ja = isplit[k][0] # A현시번호\n",
" jb = isplit[k][1] # B현시번호\n",
" dur_dict[f'dur_A{ja}'] += row[f'ddur_{k}']\n",
" dur_dict[f'dur_B{jb}'] += row[f'ddur_{k}']\n",
" for dur_char in dur_chars: # history의 새로운 열들에 값 배정\n",
" abhistory.at[i, dur_char] = dur_dict[dur_char]\n",
"abhistory = abhistory[['inter_no','end_unix'] + dur_chars + ['cycle']].astype(int)\n",
"abhistory = abhistory.astype(int).sort_values(by = ['end_unix','inter_no'])\n",
"abhistory.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
"\n",
"def make_histid(m:int):\n",
" '''\n",
" input : m\n",
" - m ranges from 0 to 287, but 0 makes an error where 288 = 86400//300\n",
" - present_time = fmins[m] : 현재시점\n",
" output : histid\n",
" - history with edge ids (incoming and outgoing edge ids)\n",
" - 현재시점으로부터 한시간동안 (교차로번호, 현시, 링)별 현시시간, 진입엣지id, 진출엣지id\n",
" '''\n",
" present_time = fmins[m] ####### 현재 시점 ranges from 0 to 287\n",
" # - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n",
" # 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 1시간 이내인 데이터 수집\n",
" rhistory = history.copy()\n",
" rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 3600)]\n",
" ddurs = [f'ddur_{j}' for j in range(1, 9)]\n",
"\n",
" # 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력\n",
" # - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정\n",
" # # 이전 유닉스 존재하지 않음 => 현시시간 합의 차\n",
" # # 이전 유닉스 존재, abs < 10 => 이전 유닉스\n",
" # # 이전 유닉스 존재, abs >=10 => 현시시간 합의 차\n",
" for i, row in rhistory.iterrows():\n",
" inter_no = row.inter_no\n",
" end_unix = row.end_unix\n",
" elapsed_time = row[ddurs].sum()\n",
" start_unix = end_unix - elapsed_time\n",
" pre_rows = history[:i] # previous rows\n",
" if inter_no in pre_rows.inter_no.unique(): # 이전 유닉스 존재\n",
" pre_unix = pre_rows[pre_rows.inter_no == inter_no]['end_unix'].iloc[-1] # previous unix time\n",
" if abs(pre_unix - start_unix) < 10: # abs < 10\n",
" start_unix = pre_unix\n",
" else: # abs >= 10\n",
" pass\n",
" rhistory.loc[i, 'start_unix'] = start_unix\n",
" rhistory[rhistory.isna()] = 0\n",
" rhistory['start_unix'] = rhistory['start_unix'].astype(int)\n",
" # with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
" # display(rhistory)\n",
" rhistory = rhistory[['inter_no', 'start_unix'] + ddurs + ['cycle']]\n",
"\n",
" # 계층화된 형태로 변환\n",
" hrhistory = [] # hierarchied recent history\n",
" for i, row in rhistory.iterrows():\n",
" inter_no = row.inter_no #\n",
" start_unix = row.start_unix #\n",
" ind = (timetable['start_seconds'] <= row.start_unix).sum() - 1\n",
" start_hour = timetable.iloc[ind].start_hour\n",
" start_minute = timetable.iloc[ind].start_minute\n",
" isplit = isplits[(inter_no, start_hour, start_minute)]\n",
" new_rows = []\n",
" for j in isplit.keys():\n",
" phas_A, phas_B = isplit[j]\n",
" duration = row[f'ddur_{j}']\n",
" new_rows.append(pd.DataFrame({'inter_no':[inter_no], 'start_unix':[start_unix],\n",
" 'phas_A':[phas_A],'phas_B':[phas_B],'duration':[duration]}))\n",
" new_rows = pd.concat(new_rows)\n",
" hrhistory.append(new_rows)\n",
" hrhistory = pd.concat(hrhistory)\n",
" hrhistory = hrhistory.sort_values(by = ['start_unix', 'inter_no', 'phas_A', 'phas_B']).reset_index(drop=True)\n",
"\n",
" # 5초단위로 수집한 이동류정보(time2movement[present_time])와 최근 1시간 신호이력(hrhistory)을 병합\n",
" movedur = pd.merge(time2movement[present_time], hrhistory, how='inner', on=['inter_no', 'start_unix', 'phas_A', 'phas_B'])\n",
" # movements and durations\n",
" movedur = movedur.sort_values(by=['start_unix', 'inter_no', 'phas_A','phas_B'])\n",
" movedur = movedur[['inter_no', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration']]\n",
" # 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n",
" for i, row in movedur.iterrows():\n",
" inter_no = row.inter_no\n",
" start_unix = row.start_unix\n",
" move_A = row.move_A\n",
" move_B = row.move_B\n",
" match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
" match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
" inc_edge_A = match_A.inc_edge\n",
" inc_edge_B = match_B.inc_edge\n",
" out_edge_A = match_A.out_edge\n",
" out_edge_B = match_B.out_edge\n",
" movedur.loc[i, ['inc_edge_A', 'inc_edge_B', 'out_edge_A', 'out_edge_B']] = [inc_edge_A, inc_edge_B, out_edge_A, out_edge_B]\n",
" # 이동류 컬럼 제거\n",
" movedur = movedur.drop(['move_A', 'move_B'], axis=1)\n",
"\n",
" histid = movedur.copy() # history with edge ids (incoming and outgoing edge ids)\n",
" return histid"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"make_histid(200).inter_no.unique()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"hist = history.copy()[history.inter_no==175]\n",
"hist['diff'] = hist['end_unix'].diff()\n",
"hist = hist[1:]\n",
"hist\n",
"hist['diff'] = hist['diff'].astype(int)\n",
"with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
" display(hist)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. 결측, 이상치 처리"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"planned = plan.copy()\n",
"planned['start_unix'] = planned['start_hour'] * 3600 +planned['start_minute'] * 60 + midnight\n",
"start_unixes = planned.start_unix.unique()\n",
"planned['pstart_unix'] = planned['start_unix'].apply(lambda x:start_unixes[sum(start_unixes <= x) - 1]) # the unix time when the program started\n",
"planned = planned[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle', 'pstart_unix']]\n",
"planned.head(10)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"make_histid(100).inter_no.unique()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pland = plan.copy() # A, B가 통합된 plan (plan detailed)\n",
"cums_A = np.array(pland[[f'dura_A{k}' for k in range(1,9)]].cumsum(axis=1))\n",
"cums_B = np.array(pland[[f'dura_B{k}' for k in range(1,9)]].cumsum(axis=1))\n",
"detailed_cums = []\n",
"i = 0\n",
"for row_A, row_B in zip(cums_A, cums_B):\n",
" combined_row = np.unique(np.concatenate((row_A, row_B)))\n",
" ddur = np.concatenate(([combined_row[0]], np.diff(combined_row)))\n",
" ddur = np.pad(ddur, (0, 8 - len(ddur)), constant_values=(0))\n",
" detailed_cums.append(ddur)\n",
" for j in range(8):\n",
" pland.at[i, f'ddur_{j+1}'] = ddur[j]\n",
" i+=1\n",
"pland = pland[['inter_no', 'start_hour', 'start_minute'] + [f'ddur_{i}' for i in range(1,9)] + ['cycle', 'offset']] # plan detailed\n",
"pland[[f'ddur_{i}' for i in range(1,9)]] = pland[[f'ddur_{i}' for i in range(1,9)]].astype(int)\n",
"pland[:10]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"histid = make_histid(25)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"inter_no = 175\n",
"hist = histid.copy()[histid.inter_no==inter_no]\n",
"hist = hist.reset_index(drop=True)\n",
"hist['diff'] = hist['start_unix'].diff().fillna(0).astype(int)\n",
"hist = hist.set_index('start_unix')\n",
"with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
" display(hist)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"inter_no = 175\n",
"hist = histid.copy()[histid.inter_no==inter_no]\n",
"hist = hist.reset_index(drop=True)\n",
"hist['diff'] = hist['start_unix'].diff().fillna(0).astype(int)\n",
"hist = hist.set_index('start_unix')\n",
"start_unixes = hist.index.unique()\n",
"for n in range(1, len(start_unixes)):\n",
" ind = (timetable['start_seconds'] <= start_unixes[n]).sum() - 1 \n",
" start_hour = timetable.iloc[ind].start_hour\n",
" start_minute = timetable.iloc[ind].start_minute\n",
" prow = pland[(pland.inter_no == inter_no)&(pland.start_hour == start_hour)&(pland.start_minute == start_minute)].iloc[0] # planned row\n",
" cycle = prow.cycle\n",
" if start_unixes[n] - start_unixes[n-1] < 2 * cycle:\n",
" pass\n",
" else:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"hist"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"matching"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"n = 3\n",
"ind = (timetable['start_seconds'] <= start_unixes[n]).sum() - 1 \n",
"start_hour = timetable.iloc[ind].start_hour\n",
"start_minute = timetable.iloc[ind].start_minute\n",
"prow = pland[(pland.inter_no == inter_no)&(pland.start_hour == start_hour)&(pland.start_minute == start_minute)].iloc[0] # planned row\n",
"cycle = prow.cycle\n",
"print(start_unixes[n] - start_unixes[n-1] < 2 * cycle)\n",
"ddurs = [f'ddur_{j}' for j in range(1, 9)]\n",
"print(prow[ddurs])\n",
"ndphase = (prow[ddurs]!=0).sum() # the number of (detailed) phases\n",
"isplit = isplits[(inter_no,start_hour,start_minute)]\n",
"print(isplit)\n",
"inter_nos = [inter_no] * ndphase\n",
"phas_As = [isplit[i][0] for i in isplit.keys()]\n",
"phas_Bs = [isplit[i][1] for i in isplit.keys()]\n",
"durations = prow[ddurs][prow[ddurs]!=0]\n",
"# new_rows = pd.DataFrame()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "rts",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}