{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_B
01751184
11752273
21753361
31753462
41754452
51761184
61762283
717633518
81771184
91772273
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_no
01751A8
01751B4
11752A7
11752B3
21753A6
21753B1
41754A5
31754B2
51761A8
51761B4
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_noinc_dirout_dir
01751A8
11751B4
21752A7
31752B3
41753A6
.....................
592104B3
602111A6
612111B2
622112A17NaNNaN
632112B18NaNNaN
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angle
01751A8179004
11751B4003176
21752A7001095
31752B3179270
41753A6090270
...........................
592104B3180270
602111A6090270
612111B2270090
622112A17NaNNaNNaNNaN
632112B18NaNNaNNaNNaN
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nomove_noinc_dirout_dirinc_edgeout_edgenode_id
01751571545870_02571542797_02i0
11752571510153_02571545870_01i0
21753-571542797_02571510153_01i0
31754-571500487_01571542797_02i0
41755571510153_02571500487_01i0
51756571545870_02571510153_01i0
61757-571500487_01571545870_01i0
71758-571542797_02571500487_01i0
817517NoneNoneNoneNonei0
917518NoneNoneNoneNonei0
1017521-571500487_01571510153_01i0
1117521571510153_02571542797_02i0
1217521-571542797_02571545870_01i0
1317521571545870_02571500487_01i0
141763-571542810_01571543469_01i1
151764571542797_02.99571542810_01i1
161765571543469_02-571542797_02.99i1
171768-571542810_01-571542797_02.99i1
1817617NoneNoneNoneNonei1
1917618NoneNoneNoneNonei1
2017621571542797_02.99571543469_01i1
2117621571543469_02571542810_01i1
221771571542107_02571542809_01i2
231772-571542809_01571542107_01i2
241773-571542809_01571542809_01i2
251774571542811_02571542809_01i2
261775-571542809_01571542811_01i2
271776571542107_02571542809_01i2
281777571542811_02571542107_01i2
291778-571542809_01571542811_01i2
3017717NoneNoneNoneNonei2
3117718NoneNoneNoneNonei2
3217721571542811_02571542809_01i2
3317721-571542809_01571542809_01i2
3417721-571542809_01571542107_01i2
3517721571542107_02571542811_01i2
361781-571500475_01571540304_01i3
371782571540303_02.21571500475_01i3
381783571540304_02571540303_01i3
391784571556450_02571540304_01i3
401785571540303_02.21571556450_01i3
411786-571500475_01571540303_01i3
421787571556450_02571500475_01i3
431788571540304_02571556450_01i3
4417817NoneNoneNoneNonei3
4517818NoneNoneNoneNonei3
4617821571556450_02571540303_01i3
4717821571540303_02.21571540304_01i3
4817821571540304_02571500475_01i3
4917821-571500475_01571556450_01i3
502011571500617_02571500569_01i8
512012571500618_02571500617_01i8
522013-571500569_01571500618_01i8
532014571500583_01571500569_01i8
542015571500618_02571500583_02i8
552016571500617_02571500618_01i8
562017571500583_01571500617_01i8
572018-571500569_01571500583_02i8
5820117NoneNoneNoneNonei8
5920118NoneNoneNoneNonei8
6020121571500583_01571500618_01i8
6120121571500618_02571500569_01i8
6220121-571500569_01571500617_01i8
6320121571500617_02571500583_02i8
642022571510152_01571510152_01.65i9
652026571510152_02-571510152_01i9
6620217NoneNoneNoneNonei9
6720218NoneNoneNoneNonei9
682064571542073_01571511538_02i7
692068-571511538_02571542073_02i7
7020617NoneNoneNoneNonei7
7120618NoneNoneNoneNonei7
722101-571542115_01571500585_01i6
732102571500535_02.18571542115_01i6
742103571500585_02571500535_01i6
752104571511538_02.121571500585_01i6
762105571500535_02.18571511538_01i6
772106-571542115_01571500535_01i6
782107571511538_02.121571542115_01i6
792108571500585_02571511538_01i6
8021017NoneNoneNoneNonei6
8121018NoneNoneNoneNonei6
8221021571511538_02.121571500535_01i6
8321021571500535_02.18571500585_01i6
8421021571500585_02571542115_01i6
8521021-571542115_01571511538_01i6
862112571542116_02.96571542116_02.164c30
872116571542116_01-571542116_02.96c30
8821117NoneNoneNoneNonec30
8921118NoneNoneNoneNonec30
\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 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nostart_hourstart_minuteddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
017500373925302900016057
117570404229263300017040
217590434533223700018028
31751830464837184100019018
41760037734000000150131
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
0206170438052033352626000012010
12111704380525289700000012545
2178170438054038394023000014050
320117043805402424175817000140133
4202170438054039101000000140103
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
7231751704391690373925302900016057160
7321751704391850373925302900016057160
7411751704392010373925302900016057160
7551751704392170373925302900016057160
7641751704392330373925302900016057160
7731751704392490373925302900016057160
7841751704392651373925302900016057161
7931751704392810373925302900016057159
8021751704392970373925302900016057160
8131751704393130373925302900016057160
8251751704393290373925302900016057160
8341751704393450373925302900016057160
8461751704393610373925302900016057160
8561751704393770373925302900016057160
8651751704393930373925302900016057160
8761751704394090373925302900016057160
8861751704394250373925302900016057160
8981751704394410373925302900016057160
9091751704394570373925302900016057160
9181751704394730373925302900016057160
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
start_hourstart_minutestart_seconds
0001704380400
1701704405600
2901704412800
318301704447000
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
start_hourstart_minutestart_seconds
0001704380400
1701704405600
2901704412800
318301704447000
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
14601751704403110373925302900016057
14701751704403270373925302900016057
14791751704403430373925302900016057
14891751704403590373925302900016057
14971751704403750373925302900016057
15061751704403910373925302900016057
15171751704404070373925302900016057
15281751704404230373925302900016057
16861751704407111373925302900016057
16951751704407280404229263300017040
17051751704407449404229263300017040
17151751704407620404229263300017040
17251751704407791404229263300017040
17351751704407960404229263300017040
17451751704408130404229263300017040
17541751704408300404229263300017040
17651751704408470404229263300017040
17741751704408640404229263300017040
17831751704408810404229263300017040
17921751704408980404229263300017040
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
12111704380525289700000012545
102111704380645289700000012545
192111704380765289700000012545
282111704380885289700000012545
362111704381005289700000012545
.......................................
483521117044662052811700000014555
484221117044663452811700000014555
485121117044664852811700000014555
485721117044666252811700000014555
486421117044667652811700000014555
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
522111704386765289700000012545120
532111704386885289700000012545120
542111704387005289700000012545120
552111704387125289700000012545120
562111704387245289700000012545120
572111704387365289700000012545120
582111704387485289700000012545120
592111704387605289700000012545120
602111704387725289700000012545120
612111704387845289700000012545120
622111704387965289700000012545120
632111704388085289700000012545120
642111704388205289700000012545120
652111704388325289700000012545120
662111704388445289700000012545120
672111704388565289700000012545120
682111704388685289700000012545120
692111704388805289700000012545120
702111704388925289700000012545120
712111704389045289700000012545120
722111704389165289700000012545120
732111704389285289700000012545120
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
522111704386765289700000012545120
532111704386885289700000012545120
542111704387005289700000012545120
552111704387125289700000012545120
562111704387245289700000012545120
572111704387365289700000012545120
582111704387485289700000012545120
592111704387605289700000012545120
602111704387725289700000012545120
612111704387845289700000012545120
622111704387965289700000012545120
632111704388085289700000012545120
642111704388205289700000012545120
652111704388325289700000012545120
662111704388445289700000012545120
672111704388565289700000012545120
682111704388685289700000012545120
692111704388805289700000012545120
702111704388925289700000012545120
712111704389045289700000012545120
722111704389165289700000012545120
732111704389285289700000012545120
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetD_nS_ndiff
02111704385805289700000012545240025000
1211170438592528970000001254525202625120
2211170438604528970000001254526402750120
3211170438616528970000001254527602875120
4211170438628528970000001254528803000120
5211170438640528970000001254530003125120
6211170438652528970000001254531203250120
7211170438664528970000001254532403375120
8211170438676528970000001254533603500120
9211170438688528970000001254534803625120
10211170438700528970000001254536003750120
11211170438712528970000001254537203875120
12211170438724528970000001254538404000120
13211170438736528970000001254539604125120
14211170438748528970000001254540804250120
152111704387605289700000012545600625120
162111704387725289700000012545720750120
172111704387845289700000012545840875120
1821117043879652897000000125459601000120
19211170438808528970000001254510801125120
20211170438820528970000001254512001250120
21211170438832528970000001254513201375120
22211170438844528970000001254514401500120
23211170438856528970000001254515601625120
24211170438868528970000001254516801750120
25211170438880528970000001254518001875120
26211170438892528970000001254519202000120
27211170438904528970000001254520402125120
28211170438916528970000001254521602250120
29211170438928528970000001254522802375120
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetD_nS_ndiff
02111704385805289700000012545240025000
1211170438592527930000001204525202625120
2211170438604527930000001204526402750120
3211170438616527930000001204527602875120
4211170438628527930000001204528803000120
5211170438640527930000001204530003125120
6211170438652527930000001204531203250120
7211170438664527930000001204532403375120
8211170438676527930000001204533603500120
9211170438688527930000001204534803625120
10211170438700527930000001204536003750120
11211170438712527930000001204537203875120
12211170438724527930000001204538404000120
13211170438736527930000001204539604125120
14211170438748527930000001204540804250120
152111704387605279300000012045600625120
162111704387725279300000012045720750120
172111704387845279300000012045840875120
1821117043879652793000000120459601000120
19211170438808527930000001204510801125120
20211170438820527930000001204512001250120
21211170438832527930000001204513201375120
22211170438844527930000001204514401500120
23211170438856527930000001204515601625120
24211170438868527930000001204516801750120
25211170438880527930000001204518001875120
26211170438892527930000001204519202000120
27211170438904527930000001204520402125120
28211170438916527930000001204521602250120
29211170438928527930000001204522802375120
\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 }