{ "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:58<00:00, 294.84it/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": [ "100%|██████████| 17280/17280 [02:00<00:00, 143.08it/s]\n" ] } ], "source": [ "# 5초 단위로 이동류번호 저장 및 신호이력에서 유닉스시각 가져와서 표시, 한시간동안의 데이터만 보관\n", "midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", "next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n", "fsecs = range(midnight, next_day, 5) # fsecs : unix time by Five SECondS\n", "time2move = dict(zip(fsecs,moves)) # move : 어느 순간의 이동류정보\n", "history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n", "\n", "time2movement = {} # movement : 어느 순간의, 그 순간으로부터 한시간 동안의 (교차로번호 + 현시별이동류번호 + 시작시간)\n", "# - 아래 절차를 5초마다 반복\n", "for fsec in tqdm(fsecs): # fsec : unix time by Five SECond\n", " # 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n", " move = time2move[fsec]\n", " # 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로변호, 종료유닉스타임)만 수집 : B\n", " recent_histories = [group.iloc[-1:] for _, group in history[history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", " if not recent_histories:\n", " rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", " else:\n", " rhistory = pd.concat(recent_histories)\n", " recent_unix = rhistory[['inter_no', 'end_unix']]\n", " # 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", " move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", " move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", " move = move.drop_duplicates()\n", " # 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n", " move = move.rename(columns = {'end_unix':'start_unix'})\n", " # 5. 이동류 이력정보 READ\n", " # - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n", " try:\n", " if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", " pass\n", " else: \n", " movement = pd.DataFrame()\n", " except NameError: # movement가 존재하지 않는 경우 생성\n", " movement = pd.DataFrame()\n", " # 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n", " movement = pd.concat([movement, move])\n", " # 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거)\n", " movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix'])\n", " # 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - 3600을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관)\n", " movement = movement[movement.start_unix > fsec - 3600]\n", " start_unix_min = movement.start_unix.min()\n", " start_unix_max = movement.start_unix.max()\n", " movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", "\n", " time2movement[fsec] = movement\n", " movement.to_csv(f'../../Data/tables/movements/movements_{fsec}.csv')\n", "\n", "# 각 movement들의 길이 시각화\n", "import matplotlib.pyplot as plt\n", "plt.plot(fsecs, [len(time2movement[fsec]) for fsec in fsecs])\n", "plt.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# C. 5분 간격으로 신호이력 수집 및 통합테이블 생성" ] }, { "cell_type": "code", "execution_count": 267, "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": 268, "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": 268, "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": 269, "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": 269, "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": 270, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[175, 176, 177, 178, 201, 202, 206, 210, 211]" ] }, "execution_count": 270, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(history.inter_no.unique())" ] }, { "cell_type": "code", "execution_count": 271, "metadata": {}, "outputs": [], "source": [ "# inter_no == 178, end_unix ==1704460864" ] }, { "cell_type": "code", "execution_count": 295, "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", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
426417817044551403839443623000180750
42731781704455320383944362300018075180
42821781704455500383944362300018075180
42911781704455680383944362300018075180
43011781704455860383944362300018075180
43101781704456040383944362300018075180
43191781704456220383944362300018075180
43301781704456400383944362300018075180
43391781704456580383944362300018075180
43481781704456759383944362300018075179
43581781704456940383944362300018075181
43661781704457120383944362300018075180
43751781704457300383944362300018075180
43841781704457480383944362300018075180
43941781704457660383944362300018075180
44031781704457840383944362300018075180
44111781704458020383944362300018075180
44201781704458201383944362300018075181
44311781704458380383944362300018075179
44411781704458560383944362300018075180
44501781704458740383944362300018075180
44601781704458920383944362300018075180
44681781704459100383944362300018075180
44771781704459280383944362300018075180
44871781704459460383944362300018075180
44971781704459640383944362300018075180
45061781704459820383944362300018075180
45161781704460000383944362300018075180
45261781704460180383944362300018075180
45331781704460360383944362300018075180
45591781704460864383944362300018075504
45691781704461040383944362300018075176
45771781704461219383944362300018075179
45861781704461400383944362300018075181
45971781704461579383944362300018075179
46061781704461760383944362300018075181
46151781704461939383944362300018075179
46251781704462120383944362300018075181
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "4264 178 1704455140 38 39 44 36 23 0 \n", "4273 178 1704455320 38 39 44 36 23 0 \n", "4282 178 1704455500 38 39 44 36 23 0 \n", "4291 178 1704455680 38 39 44 36 23 0 \n", "4301 178 1704455860 38 39 44 36 23 0 \n", "4310 178 1704456040 38 39 44 36 23 0 \n", "4319 178 1704456220 38 39 44 36 23 0 \n", "4330 178 1704456400 38 39 44 36 23 0 \n", "4339 178 1704456580 38 39 44 36 23 0 \n", "4348 178 1704456759 38 39 44 36 23 0 \n", "4358 178 1704456940 38 39 44 36 23 0 \n", "4366 178 1704457120 38 39 44 36 23 0 \n", "4375 178 1704457300 38 39 44 36 23 0 \n", "4384 178 1704457480 38 39 44 36 23 0 \n", "4394 178 1704457660 38 39 44 36 23 0 \n", "4403 178 1704457840 38 39 44 36 23 0 \n", "4411 178 1704458020 38 39 44 36 23 0 \n", "4420 178 1704458201 38 39 44 36 23 0 \n", "4431 178 1704458380 38 39 44 36 23 0 \n", "4441 178 1704458560 38 39 44 36 23 0 \n", "4450 178 1704458740 38 39 44 36 23 0 \n", "4460 178 1704458920 38 39 44 36 23 0 \n", "4468 178 1704459100 38 39 44 36 23 0 \n", "4477 178 1704459280 38 39 44 36 23 0 \n", "4487 178 1704459460 38 39 44 36 23 0 \n", "4497 178 1704459640 38 39 44 36 23 0 \n", "4506 178 1704459820 38 39 44 36 23 0 \n", "4516 178 1704460000 38 39 44 36 23 0 \n", "4526 178 1704460180 38 39 44 36 23 0 \n", "4533 178 1704460360 38 39 44 36 23 0 \n", "4559 178 1704460864 38 39 44 36 23 0 \n", "4569 178 1704461040 38 39 44 36 23 0 \n", "4577 178 1704461219 38 39 44 36 23 0 \n", "4586 178 1704461400 38 39 44 36 23 0 \n", "4597 178 1704461579 38 39 44 36 23 0 \n", "4606 178 1704461760 38 39 44 36 23 0 \n", "4615 178 1704461939 38 39 44 36 23 0 \n", "4625 178 1704462120 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "4264 0 0 180 75 0 \n", "4273 0 0 180 75 180 \n", "4282 0 0 180 75 180 \n", "4291 0 0 180 75 180 \n", "4301 0 0 180 75 180 \n", "4310 0 0 180 75 180 \n", "4319 0 0 180 75 180 \n", "4330 0 0 180 75 180 \n", "4339 0 0 180 75 180 \n", "4348 0 0 180 75 179 \n", "4358 0 0 180 75 181 \n", "4366 0 0 180 75 180 \n", "4375 0 0 180 75 180 \n", "4384 0 0 180 75 180 \n", "4394 0 0 180 75 180 \n", "4403 0 0 180 75 180 \n", "4411 0 0 180 75 180 \n", "4420 0 0 180 75 181 \n", "4431 0 0 180 75 179 \n", "4441 0 0 180 75 180 \n", "4450 0 0 180 75 180 \n", "4460 0 0 180 75 180 \n", "4468 0 0 180 75 180 \n", "4477 0 0 180 75 180 \n", "4487 0 0 180 75 180 \n", "4497 0 0 180 75 180 \n", "4506 0 0 180 75 180 \n", "4516 0 0 180 75 180 \n", "4526 0 0 180 75 180 \n", "4533 0 0 180 75 180 \n", "4559 0 0 180 75 504 \n", "4569 0 0 180 75 176 \n", "4577 0 0 180 75 179 \n", "4586 0 0 180 75 181 \n", "4597 0 0 180 75 179 \n", "4606 0 0 180 75 181 \n", "4615 0 0 180 75 179 \n", "4625 0 0 180 75 181 " ] }, "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", "
inter_noddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
151783839443623000180751704460540
\n", "
" ], "text/plain": [ " inter_no ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 ddur_7 ddur_8 \\\n", "15 178 38 39 44 36 23 0 0 0 \n", "\n", " cycle offset end_unix \n", "15 180 75 1704460540 " ] }, "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", "
inter_noddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
151783839443623000180751704460720
\n", "
" ], "text/plain": [ " inter_no ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 ddur_7 ddur_8 \\\n", "15 178 38 39 44 36 23 0 0 0 \n", "\n", " cycle offset end_unix \n", "15 180 75 1704460720 " ] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
017817044551403839443623000180750
11781704455320383944362300018075180
21781704455500383944362300018075180
31781704455680383944362300018075180
41781704455860383944362300018075180
51781704456040383944362300018075180
61781704456220383944362300018075180
71781704456400383944362300018075180
81781704456580383944362300018075180
91781704456759383944362300018075179
101781704456940383944362300018075181
111781704457120383944362300018075180
121781704457300383944362300018075180
131781704457480383944362300018075180
141781704457660383944362300018075180
151781704457840383944362300018075180
161781704458020383944362300018075180
171781704458201383944362300018075181
181781704458380383944362300018075179
191781704458560383944362300018075180
201781704458740383944362300018075180
211781704458920383944362300018075180
221781704459100383944362300018075180
231781704459280383944362300018075180
241781704459460383944362300018075180
251781704459640383944362300018075180
261781704459820383944362300018075180
271781704460000383944362300018075180
281781704460180383944362300018075180
291781704460360383944362300018075180
151781704460540383944362300018075180
151781704460720383944362300018075180
301781704460864383944362300018075144
311781704461040383944362300018075176
321781704461219383944362300018075179
331781704461400383944362300018075181
341781704461579383944362300018075179
351781704461760383944362300018075181
361781704461939383944362300018075179
371781704462120383944362300018075181
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 178 1704455140 38 39 44 36 23 0 \n", "1 178 1704455320 38 39 44 36 23 0 \n", "2 178 1704455500 38 39 44 36 23 0 \n", "3 178 1704455680 38 39 44 36 23 0 \n", "4 178 1704455860 38 39 44 36 23 0 \n", "5 178 1704456040 38 39 44 36 23 0 \n", "6 178 1704456220 38 39 44 36 23 0 \n", "7 178 1704456400 38 39 44 36 23 0 \n", "8 178 1704456580 38 39 44 36 23 0 \n", "9 178 1704456759 38 39 44 36 23 0 \n", "10 178 1704456940 38 39 44 36 23 0 \n", "11 178 1704457120 38 39 44 36 23 0 \n", "12 178 1704457300 38 39 44 36 23 0 \n", "13 178 1704457480 38 39 44 36 23 0 \n", "14 178 1704457660 38 39 44 36 23 0 \n", "15 178 1704457840 38 39 44 36 23 0 \n", "16 178 1704458020 38 39 44 36 23 0 \n", "17 178 1704458201 38 39 44 36 23 0 \n", "18 178 1704458380 38 39 44 36 23 0 \n", "19 178 1704458560 38 39 44 36 23 0 \n", "20 178 1704458740 38 39 44 36 23 0 \n", "21 178 1704458920 38 39 44 36 23 0 \n", "22 178 1704459100 38 39 44 36 23 0 \n", "23 178 1704459280 38 39 44 36 23 0 \n", "24 178 1704459460 38 39 44 36 23 0 \n", "25 178 1704459640 38 39 44 36 23 0 \n", "26 178 1704459820 38 39 44 36 23 0 \n", "27 178 1704460000 38 39 44 36 23 0 \n", "28 178 1704460180 38 39 44 36 23 0 \n", "29 178 1704460360 38 39 44 36 23 0 \n", "15 178 1704460540 38 39 44 36 23 0 \n", "15 178 1704460720 38 39 44 36 23 0 \n", "30 178 1704460864 38 39 44 36 23 0 \n", "31 178 1704461040 38 39 44 36 23 0 \n", "32 178 1704461219 38 39 44 36 23 0 \n", "33 178 1704461400 38 39 44 36 23 0 \n", "34 178 1704461579 38 39 44 36 23 0 \n", "35 178 1704461760 38 39 44 36 23 0 \n", "36 178 1704461939 38 39 44 36 23 0 \n", "37 178 1704462120 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "0 0 0 180 75 0 \n", "1 0 0 180 75 180 \n", "2 0 0 180 75 180 \n", "3 0 0 180 75 180 \n", "4 0 0 180 75 180 \n", "5 0 0 180 75 180 \n", "6 0 0 180 75 180 \n", "7 0 0 180 75 180 \n", "8 0 0 180 75 180 \n", "9 0 0 180 75 179 \n", "10 0 0 180 75 181 \n", "11 0 0 180 75 180 \n", "12 0 0 180 75 180 \n", "13 0 0 180 75 180 \n", "14 0 0 180 75 180 \n", "15 0 0 180 75 180 \n", "16 0 0 180 75 180 \n", "17 0 0 180 75 181 \n", "18 0 0 180 75 179 \n", "19 0 0 180 75 180 \n", "20 0 0 180 75 180 \n", "21 0 0 180 75 180 \n", "22 0 0 180 75 180 \n", "23 0 0 180 75 180 \n", "24 0 0 180 75 180 \n", "25 0 0 180 75 180 \n", "26 0 0 180 75 180 \n", "27 0 0 180 75 180 \n", "28 0 0 180 75 180 \n", "29 0 0 180 75 180 \n", "15 0 0 180 75 180 \n", "15 0 0 180 75 180 \n", "30 0 0 180 75 144 \n", "31 0 0 180 75 176 \n", "32 0 0 180 75 179 \n", "33 0 0 180 75 181 \n", "34 0 0 180 75 179 \n", "35 0 0 180 75 181 \n", "36 0 0 180 75 179 \n", "37 0 0 180 75 181 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", "m = 273 # ranges from 0 to 287, but 0 makes an error where 288 = 86400//300\n", "present_time = fmins[m] # 현재시점\n", "# - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n", "# 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 2시간 이내인 데이터 수집\n", "rhistory = history.copy() # recent history 1704393231\n", "rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 7200)]\n", "hours = np.array(range(midnight, next_day + 1, 3600))\n", "rhist = rhistory.copy()[rhistory.inter_no == 178]\n", "hist = history.copy()[history.inter_no == 178]\n", "end_unixes = hist.end_unix.unique()\n", "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "display(rhist_diff) # 결측치 처리 전\n", "rhist = rhist.reset_index(drop=True)\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", " 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", " if next_unix - curr_unix >= 2 * cycle:\n", " # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", " #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", " while next_unix - curr_unix > cycle:\n", " curr_unix += cycle\n", " # print(curr_unix)\n", " prow = pland[(pland.inter_no==178) & (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", " display(prow)\n", " new_rows.append(prow)\n", "\n", "rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n", "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "display(rhist_diff) # 결측치 처리 후\n", "rhist = rhist.reset_index(drop=True)" ] }, { "cell_type": "code", "execution_count": 294, "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", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
017817044603603839443623000180750
11781704460540383944362300018075180
21781704460720383944362300018075180
31781704460864383944362300018075144
41781704461040383944362300018075176
51781704461219383944362300018075179
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 178 1704460360 38 39 44 36 23 0 \n", "1 178 1704460540 38 39 44 36 23 0 \n", "2 178 1704460720 38 39 44 36 23 0 \n", "3 178 1704460864 38 39 44 36 23 0 \n", "4 178 1704461040 38 39 44 36 23 0 \n", "5 178 1704461219 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "0 0 0 180 75 0 \n", "1 0 0 180 75 180 \n", "2 0 0 180 75 180 \n", "3 0 0 180 75 144 \n", "4 0 0 180 75 176 \n", "5 0 0 180 75 179 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1.0\n", "1704460360\n", "1704458740\n", "1620\n", "1620\n", "0\n", "1.0\n", "1704460540\n", "1704458740\n", "1800\n", "1800\n", "0\n", "0.8\n", "1704460720\n", "1704458740\n", "1980\n", "1980\n", "0\n", "0.9777777777777777\n", "1704460864\n", "1704458740\n", "2124\n", "2160\n", "-36\n", "0.9944444444444445\n", "1704461040\n", "1704458740\n", "2300\n", "2340\n", "-40\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", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
01781704460360383944362300018075
11781704460540383944362300018075
21781704460720383944362300018075
31781704460864373843352200017575
41781704461040373843352200017575
51781704461219383944362300018075
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 178 1704460360 38 39 44 36 23 0 \n", "1 178 1704460540 38 39 44 36 23 0 \n", "2 178 1704460720 38 39 44 36 23 0 \n", "3 178 1704460864 37 38 43 35 22 0 \n", "4 178 1704461040 37 38 43 35 22 0 \n", "5 178 1704461219 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset \n", "0 0 0 180 75 \n", "1 0 0 180 75 \n", "2 0 0 180 75 \n", "3 0 0 175 75 \n", "4 0 0 175 75 \n", "5 0 0 180 75 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Rhist = rhist.copy() # recent history 1704393231\n", "Rhist = rhist[(rhist.end_unix < present_time) & (rhist.end_unix >= present_time - 1200)]\n", "Rhist = Rhist.reset_index(drop=True)\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(len(Rhist)-1):\n", " curr_unix = Rhist.iloc[n].end_unix # current end_unix\n", " next_unix = Rhist.iloc[n+1].end_unix # current end_unix\n", " cycle = rhist.iloc[n].cycle\n", " R_n = (next_unix - curr_unix) / cycle\n", " print(R_n)\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", " print(curr_unix)\n", " ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\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", " print(base_unix)\n", " # D_n : 시간차이\n", " D_n = curr_unix - base_unix\n", " print(D_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 : 현시시간합\n", " S_n = ddurations.values.sum()\n", " print(S_n)\n", " print(D_n - S_n)\n", " if (abs(D_n - S_n) > 10) & (R_n > 0.5):\n", " prow = pland[(pland.inter_no==178) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)].copy() # planned row\n", " adjusted_row = prow.loc[15, ['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] * R_n\n", " adjusted_row = adjusted_row.astype(int)\n", " Rhist.loc[n, ['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] = adjusted_row.values\n", " Rhist.loc[n, 'cycle'] = adjusted_row.sum()\n", " pass\n", "\n", "display(Rhist)" ] }, { "cell_type": "code", "execution_count": 257, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1704454239\n", "1704452400\n", "[]\n" ] }, { "ename": "IndexError", "evalue": "index -5 is out of bounds for axis 0 with size 0", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[257], line 12\u001b[0m\n\u001b[0;32m 10\u001b[0m end_unixes_lt_ghour \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39msort(end_unixes[end_unixes \u001b[38;5;241m<\u001b[39m ghour_lt_end_unix]) \u001b[38;5;66;03m# end unixes less than ghour_lt_end_unix\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(end_unixes_lt_ghour)\n\u001b[1;32m---> 12\u001b[0m base_unix \u001b[38;5;241m=\u001b[39m \u001b[43mend_unixes_lt_ghour\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;66;03m# 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\u001b[39;00m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(base_unix)\n", "\u001b[1;31mIndexError\u001b[0m: index -5 is out of bounds for axis 0 with size 0" ] } ], "source": [ "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "# display(rhist_diff) # 이상치 처리 전\n", "end_unixes = rhist.end_unix.unique()\n", "n = 0\n", "curr_unix = rhist.iloc[n].end_unix # current end_unix\n", "print(curr_unix)\n", "ghour_lt_end_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n", "print(ghour_lt_end_unix)\n", "end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_end_unix]) # end unixes less than ghour_lt_end_unix\n", "print(end_unixes_lt_ghour)\n", "base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n", "print(base_unix)" ] }, { "cell_type": "code", "execution_count": 176, "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", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
437517817044573003839443623000180750
43841781704457480383944362300018075180
43941781704457660383944362300018075180
44031781704457840383944362300018075180
44111781704458020383944362300018075180
44201781704458201383944362300018075181
44311781704458380383944362300018075179
44411781704458560383944362300018075180
44501781704458740383944362300018075180
44601781704458920383944362300018075180
44681781704459100383944362300018075180
44771781704459280383944362300018075180
44871781704459460383944362300018075180
44971781704459640383944362300018075180
45061781704459820383944362300018075180
45161781704460000383944362300018075180
45261781704460180383944362300018075180
45331781704460360383944362300018075180
45591781704460864383944362300018075504
45691781704461040383944362300018075176
45771781704461219383944362300018075179
45861781704461400383944362300018075181
45971781704461579383944362300018075179
46061781704461760383944362300018075181
46151781704461939383944362300018075179
46251781704462120383944362300018075181
46351781704462300383944362300018075180
46441781704462480383944362300018075180
46531781704462660383944362300018075180
46631781704462840383944362300018075180
46741781704463021383944362300018075181
46811781704463200383944362300018075179
46901781704463381383944362300018075181
47001781704463560383944362300018075179
47091781704463741383944362300018075181
47171781704463920383944362300018075179
47261781704464100383944362300018075180
47371781704464280383944362300018075180
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "4375 178 1704457300 38 39 44 36 23 0 \n", "4384 178 1704457480 38 39 44 36 23 0 \n", "4394 178 1704457660 38 39 44 36 23 0 \n", "4403 178 1704457840 38 39 44 36 23 0 \n", "4411 178 1704458020 38 39 44 36 23 0 \n", "4420 178 1704458201 38 39 44 36 23 0 \n", "4431 178 1704458380 38 39 44 36 23 0 \n", "4441 178 1704458560 38 39 44 36 23 0 \n", "4450 178 1704458740 38 39 44 36 23 0 \n", "4460 178 1704458920 38 39 44 36 23 0 \n", "4468 178 1704459100 38 39 44 36 23 0 \n", "4477 178 1704459280 38 39 44 36 23 0 \n", "4487 178 1704459460 38 39 44 36 23 0 \n", "4497 178 1704459640 38 39 44 36 23 0 \n", "4506 178 1704459820 38 39 44 36 23 0 \n", "4516 178 1704460000 38 39 44 36 23 0 \n", "4526 178 1704460180 38 39 44 36 23 0 \n", "4533 178 1704460360 38 39 44 36 23 0 \n", "4559 178 1704460864 38 39 44 36 23 0 \n", "4569 178 1704461040 38 39 44 36 23 0 \n", "4577 178 1704461219 38 39 44 36 23 0 \n", "4586 178 1704461400 38 39 44 36 23 0 \n", "4597 178 1704461579 38 39 44 36 23 0 \n", "4606 178 1704461760 38 39 44 36 23 0 \n", "4615 178 1704461939 38 39 44 36 23 0 \n", "4625 178 1704462120 38 39 44 36 23 0 \n", "4635 178 1704462300 38 39 44 36 23 0 \n", "4644 178 1704462480 38 39 44 36 23 0 \n", "4653 178 1704462660 38 39 44 36 23 0 \n", "4663 178 1704462840 38 39 44 36 23 0 \n", "4674 178 1704463021 38 39 44 36 23 0 \n", "4681 178 1704463200 38 39 44 36 23 0 \n", "4690 178 1704463381 38 39 44 36 23 0 \n", "4700 178 1704463560 38 39 44 36 23 0 \n", "4709 178 1704463741 38 39 44 36 23 0 \n", "4717 178 1704463920 38 39 44 36 23 0 \n", "4726 178 1704464100 38 39 44 36 23 0 \n", "4737 178 1704464280 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "4375 0 0 180 75 0 \n", "4384 0 0 180 75 180 \n", "4394 0 0 180 75 180 \n", "4403 0 0 180 75 180 \n", "4411 0 0 180 75 180 \n", "4420 0 0 180 75 181 \n", "4431 0 0 180 75 179 \n", "4441 0 0 180 75 180 \n", "4450 0 0 180 75 180 \n", "4460 0 0 180 75 180 \n", "4468 0 0 180 75 180 \n", "4477 0 0 180 75 180 \n", "4487 0 0 180 75 180 \n", "4497 0 0 180 75 180 \n", "4506 0 0 180 75 180 \n", "4516 0 0 180 75 180 \n", "4526 0 0 180 75 180 \n", "4533 0 0 180 75 180 \n", "4559 0 0 180 75 504 \n", "4569 0 0 180 75 176 \n", "4577 0 0 180 75 179 \n", "4586 0 0 180 75 181 \n", "4597 0 0 180 75 179 \n", "4606 0 0 180 75 181 \n", "4615 0 0 180 75 179 \n", "4625 0 0 180 75 181 \n", "4635 0 0 180 75 180 \n", "4644 0 0 180 75 180 \n", "4653 0 0 180 75 180 \n", "4663 0 0 180 75 180 \n", "4674 0 0 180 75 181 \n", "4681 0 0 180 75 179 \n", "4690 0 0 180 75 181 \n", "4700 0 0 180 75 179 \n", "4709 0 0 180 75 181 \n", "4717 0 0 180 75 179 \n", "4726 0 0 180 75 180 \n", "4737 0 0 180 75 180 " ] }, "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", "
inter_noddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
01753739253029000160571704460540
\n", "
" ], "text/plain": [ " inter_no ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 ddur_7 ddur_8 \\\n", "0 175 37 39 25 30 29 0 0 0 \n", "\n", " cycle offset end_unix \n", "0 160 57 1704460540 " ] }, "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", "
inter_noddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
01753739253029000160571704460720
\n", "
" ], "text/plain": [ " inter_no ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 ddur_7 ddur_8 \\\n", "0 175 37 39 25 30 29 0 0 0 \n", "\n", " cycle offset end_unix \n", "0 160 57 1704460720 " ] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
017817044573003839443623000180750
11781704457480383944362300018075180
21781704457660383944362300018075180
31781704457840383944362300018075180
41781704458020383944362300018075180
51781704458201383944362300018075181
61781704458380383944362300018075179
71781704458560383944362300018075180
81781704458740383944362300018075180
91781704458920383944362300018075180
101781704459100383944362300018075180
111781704459280383944362300018075180
121781704459460383944362300018075180
131781704459640383944362300018075180
141781704459820383944362300018075180
151781704460000383944362300018075180
161781704460180383944362300018075180
171781704460360383944362300018075180
01751704460540373925302900016057180
01751704460720373925302900016057180
181781704460864383944362300018075144
191781704461040383944362300018075176
201781704461219383944362300018075179
211781704461400383944362300018075181
221781704461579383944362300018075179
231781704461760383944362300018075181
241781704461939383944362300018075179
251781704462120383944362300018075181
261781704462300383944362300018075180
271781704462480383944362300018075180
281781704462660383944362300018075180
291781704462840383944362300018075180
301781704463021383944362300018075181
311781704463200383944362300018075179
321781704463381383944362300018075181
331781704463560383944362300018075179
341781704463741383944362300018075181
351781704463920383944362300018075179
361781704464100383944362300018075180
371781704464280383944362300018075180
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 178 1704457300 38 39 44 36 23 0 \n", "1 178 1704457480 38 39 44 36 23 0 \n", "2 178 1704457660 38 39 44 36 23 0 \n", "3 178 1704457840 38 39 44 36 23 0 \n", "4 178 1704458020 38 39 44 36 23 0 \n", "5 178 1704458201 38 39 44 36 23 0 \n", "6 178 1704458380 38 39 44 36 23 0 \n", "7 178 1704458560 38 39 44 36 23 0 \n", "8 178 1704458740 38 39 44 36 23 0 \n", "9 178 1704458920 38 39 44 36 23 0 \n", "10 178 1704459100 38 39 44 36 23 0 \n", "11 178 1704459280 38 39 44 36 23 0 \n", "12 178 1704459460 38 39 44 36 23 0 \n", "13 178 1704459640 38 39 44 36 23 0 \n", "14 178 1704459820 38 39 44 36 23 0 \n", "15 178 1704460000 38 39 44 36 23 0 \n", "16 178 1704460180 38 39 44 36 23 0 \n", "17 178 1704460360 38 39 44 36 23 0 \n", "0 175 1704460540 37 39 25 30 29 0 \n", "0 175 1704460720 37 39 25 30 29 0 \n", "18 178 1704460864 38 39 44 36 23 0 \n", "19 178 1704461040 38 39 44 36 23 0 \n", "20 178 1704461219 38 39 44 36 23 0 \n", "21 178 1704461400 38 39 44 36 23 0 \n", "22 178 1704461579 38 39 44 36 23 0 \n", "23 178 1704461760 38 39 44 36 23 0 \n", "24 178 1704461939 38 39 44 36 23 0 \n", "25 178 1704462120 38 39 44 36 23 0 \n", "26 178 1704462300 38 39 44 36 23 0 \n", "27 178 1704462480 38 39 44 36 23 0 \n", "28 178 1704462660 38 39 44 36 23 0 \n", "29 178 1704462840 38 39 44 36 23 0 \n", "30 178 1704463021 38 39 44 36 23 0 \n", "31 178 1704463200 38 39 44 36 23 0 \n", "32 178 1704463381 38 39 44 36 23 0 \n", "33 178 1704463560 38 39 44 36 23 0 \n", "34 178 1704463741 38 39 44 36 23 0 \n", "35 178 1704463920 38 39 44 36 23 0 \n", "36 178 1704464100 38 39 44 36 23 0 \n", "37 178 1704464280 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "0 0 0 180 75 0 \n", "1 0 0 180 75 180 \n", "2 0 0 180 75 180 \n", "3 0 0 180 75 180 \n", "4 0 0 180 75 180 \n", "5 0 0 180 75 181 \n", "6 0 0 180 75 179 \n", "7 0 0 180 75 180 \n", "8 0 0 180 75 180 \n", "9 0 0 180 75 180 \n", "10 0 0 180 75 180 \n", "11 0 0 180 75 180 \n", "12 0 0 180 75 180 \n", "13 0 0 180 75 180 \n", "14 0 0 180 75 180 \n", "15 0 0 180 75 180 \n", "16 0 0 180 75 180 \n", "17 0 0 180 75 180 \n", "0 0 0 160 57 180 \n", "0 0 0 160 57 180 \n", "18 0 0 180 75 144 \n", "19 0 0 180 75 176 \n", "20 0 0 180 75 179 \n", "21 0 0 180 75 181 \n", "22 0 0 180 75 179 \n", "23 0 0 180 75 181 \n", "24 0 0 180 75 179 \n", "25 0 0 180 75 181 \n", "26 0 0 180 75 180 \n", "27 0 0 180 75 180 \n", "28 0 0 180 75 180 \n", "29 0 0 180 75 180 \n", "30 0 0 180 75 181 \n", "31 0 0 180 75 179 \n", "32 0 0 180 75 181 \n", "33 0 0 180 75 179 \n", "34 0 0 180 75 181 \n", "35 0 0 180 75 179 \n", "36 0 0 180 75 180 \n", "37 0 0 180 75 180 " ] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
01781704457300383944362300018075
11781704457480383944362300018075
21781704457660383944362300018075
31781704457840383944362300018075
41781704458020383944362300018075
51781704458201383944362300018075
61781704458380383944362300018075
71781704458560383944362300018075
81781704458740383944362300018075
91781704458920383944362300018075
101781704459100383944362300018075
111781704459280383944362300018075
121781704459460383944362300018075
131781704459640383944362300018075
141781704459820383944362300018075
151781704460000383944362300018075
161781704460180383944362300018075
171781704460360383944362300018075
181751704460540373925302900016057
191751704460720373925302900016057
201781704460864383944362300018075
211781704461040383944362300018075
221781704461219383944362300018075
231781704461400383944362300018075
241781704461579383944362300018075
251781704461760383944362300018075
261781704461939383944362300018075
271781704462120383944362300018075
281781704462300383944362300018075
291781704462480383944362300018075
301781704462660383944362300018075
311781704462840383944362300018075
321781704463021383944362300018075
331781704463200383944362300018075
341781704463381383944362300018075
351781704463560383944362300018075
361781704463741383944362300018075
371781704463920383944362300018075
381781704464100383944362300018075
391781704464280383944362300018075
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 178 1704457300 38 39 44 36 23 0 \n", "1 178 1704457480 38 39 44 36 23 0 \n", "2 178 1704457660 38 39 44 36 23 0 \n", "3 178 1704457840 38 39 44 36 23 0 \n", "4 178 1704458020 38 39 44 36 23 0 \n", "5 178 1704458201 38 39 44 36 23 0 \n", "6 178 1704458380 38 39 44 36 23 0 \n", "7 178 1704458560 38 39 44 36 23 0 \n", "8 178 1704458740 38 39 44 36 23 0 \n", "9 178 1704458920 38 39 44 36 23 0 \n", "10 178 1704459100 38 39 44 36 23 0 \n", "11 178 1704459280 38 39 44 36 23 0 \n", "12 178 1704459460 38 39 44 36 23 0 \n", "13 178 1704459640 38 39 44 36 23 0 \n", "14 178 1704459820 38 39 44 36 23 0 \n", "15 178 1704460000 38 39 44 36 23 0 \n", "16 178 1704460180 38 39 44 36 23 0 \n", "17 178 1704460360 38 39 44 36 23 0 \n", "18 175 1704460540 37 39 25 30 29 0 \n", "19 175 1704460720 37 39 25 30 29 0 \n", "20 178 1704460864 38 39 44 36 23 0 \n", "21 178 1704461040 38 39 44 36 23 0 \n", "22 178 1704461219 38 39 44 36 23 0 \n", "23 178 1704461400 38 39 44 36 23 0 \n", "24 178 1704461579 38 39 44 36 23 0 \n", "25 178 1704461760 38 39 44 36 23 0 \n", "26 178 1704461939 38 39 44 36 23 0 \n", "27 178 1704462120 38 39 44 36 23 0 \n", "28 178 1704462300 38 39 44 36 23 0 \n", "29 178 1704462480 38 39 44 36 23 0 \n", "30 178 1704462660 38 39 44 36 23 0 \n", "31 178 1704462840 38 39 44 36 23 0 \n", "32 178 1704463021 38 39 44 36 23 0 \n", "33 178 1704463200 38 39 44 36 23 0 \n", "34 178 1704463381 38 39 44 36 23 0 \n", "35 178 1704463560 38 39 44 36 23 0 \n", "36 178 1704463741 38 39 44 36 23 0 \n", "37 178 1704463920 38 39 44 36 23 0 \n", "38 178 1704464100 38 39 44 36 23 0 \n", "39 178 1704464280 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset \n", "0 0 0 180 75 \n", "1 0 0 180 75 \n", "2 0 0 180 75 \n", "3 0 0 180 75 \n", "4 0 0 180 75 \n", "5 0 0 180 75 \n", "6 0 0 180 75 \n", "7 0 0 180 75 \n", "8 0 0 180 75 \n", "9 0 0 180 75 \n", "10 0 0 180 75 \n", "11 0 0 180 75 \n", "12 0 0 180 75 \n", "13 0 0 180 75 \n", "14 0 0 180 75 \n", "15 0 0 180 75 \n", "16 0 0 180 75 \n", "17 0 0 180 75 \n", "18 0 0 160 57 \n", "19 0 0 160 57 \n", "20 0 0 180 75 \n", "21 0 0 180 75 \n", "22 0 0 180 75 \n", "23 0 0 180 75 \n", "24 0 0 180 75 \n", "25 0 0 180 75 \n", "26 0 0 180 75 \n", "27 0 0 180 75 \n", "28 0 0 180 75 \n", "29 0 0 180 75 \n", "30 0 0 180 75 \n", "31 0 0 180 75 \n", "32 0 0 180 75 \n", "33 0 0 180 75 \n", "34 0 0 180 75 \n", "35 0 0 180 75 \n", "36 0 0 180 75 \n", "37 0 0 180 75 \n", "38 0 0 180 75 \n", "39 0 0 180 75 " ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", "m = 280 # ranges from 0 to 287, but 0 makes an error where 288 = 86400//300\n", "present_time = fmins[m] # 현재시점\n", "# - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n", "# 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 2시간 이내인 데이터 수집\n", "rhistory = history.copy() # recent history 1704393231\n", "rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 7200)]\n", "hours = np.array(range(midnight, next_day + 1, 3600))\n", "rhist = rhistory.copy()[rhistory.inter_no == 178]\n", "hist = history.copy()[history.inter_no == 178]\n", "end_unixes = rhist.end_unix.unique()\n", "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "display(rhist_diff) # 결측치 처리 전\n", "rhist = rhist.reset_index(drop=True)\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", " start_seconds = np.array(timetable.start_seconds)\n", " idx = (start_seconds <= 1704396909).sum() - 1\n", " start_hour = timetable.iloc[idx].start_hour\n", " start_minute = timetable.iloc[idx].start_minute\n", " if next_unix - curr_unix >= 2 * cycle:\n", " # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", " #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", " while next_unix - curr_unix > cycle:\n", " curr_unix += cycle\n", " # print(curr_unix)\n", " prow = pland[(pland.inter_no==175) & (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", " display(prow)\n", " new_rows.append(prow)\n", "\n", "rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n", "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "display(rhist_diff) # 결측치 처리 후\n", "rhist = rhist.reset_index(drop=True)\n", "rhist" ] }, { "cell_type": "code", "execution_count": 169, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
01753739253029000160571704460540
\n", "
" ], "text/plain": [ " inter_no ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 ddur_7 ddur_8 \\\n", "0 175 37 39 25 30 29 0 0 0 \n", "\n", " cycle offset end_unix \n", "0 160 57 1704460540 " ] }, "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", "
inter_noddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
01753739253029000160571704460720
\n", "
" ], "text/plain": [ " inter_no ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 ddur_7 ddur_8 \\\n", "0 175 37 39 25 30 29 0 0 0 \n", "\n", " cycle offset end_unix \n", "0 160 57 1704460720 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "curr_unix:1704460720\n", "2024-01-05 22:00:00\n", "ghour_lt_end_unix:1704459600\n", "base_unix:1704458740\n", "1980\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", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffset
44501781704458740383944362300018075
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "4450 178 1704458740 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset \n", "4450 0 0 180 75 " ] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
81781704458740383944362300018075
91781704458920383944362300018075
101781704459100383944362300018075
111781704459280383944362300018075
121781704459460383944362300018075
131781704459640383944362300018075
141781704459820383944362300018075
151781704460000383944362300018075
161781704460180383944362300018075
171781704460360383944362300018075
181781704460864383944362300018075
191781704461040383944362300018075
201781704461219383944362300018075
211781704461400383944362300018075
221781704461579383944362300018075
231781704461760383944362300018075
241781704461939383944362300018075
251781704462120383944362300018075
261781704462300383944362300018075
271781704462480383944362300018075
281781704462660383944362300018075
291781704462840383944362300018075
301781704463021383944362300018075
311781704463200383944362300018075
321781704463381383944362300018075
331781704463560383944362300018075
341781704463741383944362300018075
351781704463920383944362300018075
361781704464100383944362300018075
371781704464280383944362300018075
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "8 178 1704458740 38 39 44 36 23 0 \n", "9 178 1704458920 38 39 44 36 23 0 \n", "10 178 1704459100 38 39 44 36 23 0 \n", "11 178 1704459280 38 39 44 36 23 0 \n", "12 178 1704459460 38 39 44 36 23 0 \n", "13 178 1704459640 38 39 44 36 23 0 \n", "14 178 1704459820 38 39 44 36 23 0 \n", "15 178 1704460000 38 39 44 36 23 0 \n", "16 178 1704460180 38 39 44 36 23 0 \n", "17 178 1704460360 38 39 44 36 23 0 \n", "18 178 1704460864 38 39 44 36 23 0 \n", "19 178 1704461040 38 39 44 36 23 0 \n", "20 178 1704461219 38 39 44 36 23 0 \n", "21 178 1704461400 38 39 44 36 23 0 \n", "22 178 1704461579 38 39 44 36 23 0 \n", "23 178 1704461760 38 39 44 36 23 0 \n", "24 178 1704461939 38 39 44 36 23 0 \n", "25 178 1704462120 38 39 44 36 23 0 \n", "26 178 1704462300 38 39 44 36 23 0 \n", "27 178 1704462480 38 39 44 36 23 0 \n", "28 178 1704462660 38 39 44 36 23 0 \n", "29 178 1704462840 38 39 44 36 23 0 \n", "30 178 1704463021 38 39 44 36 23 0 \n", "31 178 1704463200 38 39 44 36 23 0 \n", "32 178 1704463381 38 39 44 36 23 0 \n", "33 178 1704463560 38 39 44 36 23 0 \n", "34 178 1704463741 38 39 44 36 23 0 \n", "35 178 1704463920 38 39 44 36 23 0 \n", "36 178 1704464100 38 39 44 36 23 0 \n", "37 178 1704464280 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset \n", "8 0 0 180 75 \n", "9 0 0 180 75 \n", "10 0 0 180 75 \n", "11 0 0 180 75 \n", "12 0 0 180 75 \n", "13 0 0 180 75 \n", "14 0 0 180 75 \n", "15 0 0 180 75 \n", "16 0 0 180 75 \n", "17 0 0 180 75 \n", "18 0 0 180 75 \n", "19 0 0 180 75 \n", "20 0 0 180 75 \n", "21 0 0 180 75 \n", "22 0 0 180 75 \n", "23 0 0 180 75 \n", "24 0 0 180 75 \n", "25 0 0 180 75 \n", "26 0 0 180 75 \n", "27 0 0 180 75 \n", "28 0 0 180 75 \n", "29 0 0 180 75 \n", "30 0 0 180 75 \n", "31 0 0 180 75 \n", "32 0 0 180 75 \n", "33 0 0 180 75 \n", "34 0 0 180 75 \n", "35 0 0 180 75 \n", "36 0 0 180 75 \n", "37 0 0 180 75 " ] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
017817044573003839443623000180750
11781704457480383944362300018075180
21781704457660383944362300018075180
31781704457840383944362300018075180
41781704458020383944362300018075180
51781704458201383944362300018075181
61781704458380383944362300018075179
71781704458560383944362300018075180
81781704458740383944362300018075180
91781704458920383944362300018075180
101781704459100383944362300018075180
111781704459280383944362300018075180
121781704459460383944362300018075180
131781704459640383944362300018075180
141781704459820383944362300018075180
151781704460000383944362300018075180
161781704460180383944362300018075180
171781704460360383944362300018075180
01751704460540373925302900016057180
01751704460720373925302900016057180
181781704460864383944362300018075144
191781704461040383944362300018075176
201781704461219383944362300018075179
211781704461400383944362300018075181
221781704461579383944362300018075179
231781704461760383944362300018075181
241781704461939383944362300018075179
251781704462120383944362300018075181
261781704462300383944362300018075180
271781704462480383944362300018075180
281781704462660383944362300018075180
291781704462840383944362300018075180
301781704463021383944362300018075181
311781704463200383944362300018075179
321781704463381383944362300018075181
331781704463560383944362300018075179
341781704463741383944362300018075181
351781704463920383944362300018075179
361781704464100383944362300018075180
371781704464280383944362300018075180
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 178 1704457300 38 39 44 36 23 0 \n", "1 178 1704457480 38 39 44 36 23 0 \n", "2 178 1704457660 38 39 44 36 23 0 \n", "3 178 1704457840 38 39 44 36 23 0 \n", "4 178 1704458020 38 39 44 36 23 0 \n", "5 178 1704458201 38 39 44 36 23 0 \n", "6 178 1704458380 38 39 44 36 23 0 \n", "7 178 1704458560 38 39 44 36 23 0 \n", "8 178 1704458740 38 39 44 36 23 0 \n", "9 178 1704458920 38 39 44 36 23 0 \n", "10 178 1704459100 38 39 44 36 23 0 \n", "11 178 1704459280 38 39 44 36 23 0 \n", "12 178 1704459460 38 39 44 36 23 0 \n", "13 178 1704459640 38 39 44 36 23 0 \n", "14 178 1704459820 38 39 44 36 23 0 \n", "15 178 1704460000 38 39 44 36 23 0 \n", "16 178 1704460180 38 39 44 36 23 0 \n", "17 178 1704460360 38 39 44 36 23 0 \n", "0 175 1704460540 37 39 25 30 29 0 \n", "0 175 1704460720 37 39 25 30 29 0 \n", "18 178 1704460864 38 39 44 36 23 0 \n", "19 178 1704461040 38 39 44 36 23 0 \n", "20 178 1704461219 38 39 44 36 23 0 \n", "21 178 1704461400 38 39 44 36 23 0 \n", "22 178 1704461579 38 39 44 36 23 0 \n", "23 178 1704461760 38 39 44 36 23 0 \n", "24 178 1704461939 38 39 44 36 23 0 \n", "25 178 1704462120 38 39 44 36 23 0 \n", "26 178 1704462300 38 39 44 36 23 0 \n", "27 178 1704462480 38 39 44 36 23 0 \n", "28 178 1704462660 38 39 44 36 23 0 \n", "29 178 1704462840 38 39 44 36 23 0 \n", "30 178 1704463021 38 39 44 36 23 0 \n", "31 178 1704463200 38 39 44 36 23 0 \n", "32 178 1704463381 38 39 44 36 23 0 \n", "33 178 1704463560 38 39 44 36 23 0 \n", "34 178 1704463741 38 39 44 36 23 0 \n", "35 178 1704463920 38 39 44 36 23 0 \n", "36 178 1704464100 38 39 44 36 23 0 \n", "37 178 1704464280 38 39 44 36 23 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "0 0 0 180 75 0 \n", "1 0 0 180 75 180 \n", "2 0 0 180 75 180 \n", "3 0 0 180 75 180 \n", "4 0 0 180 75 180 \n", "5 0 0 180 75 181 \n", "6 0 0 180 75 179 \n", "7 0 0 180 75 180 \n", "8 0 0 180 75 180 \n", "9 0 0 180 75 180 \n", "10 0 0 180 75 180 \n", "11 0 0 180 75 180 \n", "12 0 0 180 75 180 \n", "13 0 0 180 75 180 \n", "14 0 0 180 75 180 \n", "15 0 0 180 75 180 \n", "16 0 0 180 75 180 \n", "17 0 0 180 75 180 \n", "0 0 0 160 57 180 \n", "0 0 0 160 57 180 \n", "18 0 0 180 75 144 \n", "19 0 0 180 75 176 \n", "20 0 0 180 75 179 \n", "21 0 0 180 75 181 \n", "22 0 0 180 75 179 \n", "23 0 0 180 75 181 \n", "24 0 0 180 75 179 \n", "25 0 0 180 75 181 \n", "26 0 0 180 75 180 \n", "27 0 0 180 75 180 \n", "28 0 0 180 75 180 \n", "29 0 0 180 75 180 \n", "30 0 0 180 75 181 \n", "31 0 0 180 75 179 \n", "32 0 0 180 75 181 \n", "33 0 0 180 75 179 \n", "34 0 0 180 75 181 \n", "35 0 0 180 75 179 \n", "36 0 0 180 75 180 \n", "37 0 0 180 75 180 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 1704460864\n", "fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", "m = 280 # ranges from 0 to 287, but 0 makes an error where 288 = 86400//300\n", "present_time = fmins[m] # 현재시점\n", "# - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n", "# 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 2시간 이내인 데이터 수집\n", "rhistory = history.copy() # recent history 1704393231\n", "rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 7200)]\n", "hours = np.array(range(midnight, next_day + 1, 3600))\n", "rhist = rhistory.copy()[rhistory.inter_no == 178]\n", "hist = history.copy()[history.inter_no == 178]\n", "end_unixes = rhist.end_unix.unique()\n", "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "# display(rhist_diff.reset_index(drop=True))\n", "# display(rhist_diff)\n", "rhist = rhist.reset_index(drop=True)\n", "new_rows = []\n", "# n = 16 : 정상\n", "# n = 17 : 비정상\n", "n = 17\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", "start_seconds = np.array(timetable.start_seconds)\n", "idx = (start_seconds <= 1704396909).sum() - 1\n", "start_hour = timetable.iloc[idx].start_hour\n", "start_minute = timetable.iloc[idx].start_minute\n", "# 1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n", "if next_unix - curr_unix >= 2 * cycle:\n", " # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", " #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", " while next_unix - curr_unix > cycle:\n", " curr_unix += cycle\n", " # print(curr_unix)\n", " prow = pland[(pland.inter_no==175) & (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", " display(prow)\n", " new_rows.append(prow)\n", "# 1-2. 이상치 처리 : D_n(시간차이)과 S_n(현시시간합)의 차이가 10보다 크면 이상치가 발생했다고 판단\n", "ghour_lt_end_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n", "end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_end_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", "print(f\"curr_unix:{curr_unix}\")\n", "print(datetime.fromtimestamp(ghour_lt_end_unix))\n", "print(f\"ghour_lt_end_unix:{ghour_lt_end_unix}\")\n", "print(f\"base_unix:{base_unix}\")\n", "print(D_n)\n", "display(history[history.end_unix==base_unix])\n", "# display(hist[495:]) # max 538\n", "# display(hist[(hist.end_unix >= base_unix) & (hist.end_unix <= curr_unix)])\n", "display(rhist[(rhist.end_unix >= base_unix)])# & (rhist.end_unix <= curr_unix)])\n", "# datetime.utcfromtimestamp(unix_timestamp)\n", "\n", "rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\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": 110, "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", "
inter_noend_unixddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetdiff
69317517043912103739253029000160570
7021751704391370373925302900016057160
7121751704391530373925302900016057160
7231751704391690373925302900016057160
7321751704391850373925302900016057160
7411751704392010373925302900016057160
7551751704392170373925302900016057160
7641751704392330373925302900016057160
7731751704392490373925302900016057160
7841751704392651373925302900016057161
7931751704392810373925302900016057159
8021751704392970373925302900016057160
8131751704393130373925302900016057160
8251751704393290373925302900016057160
8341751704393450373925302900016057160
8461751704393610373925302900016057160
8561751704393770373925302900016057160
8651751704393930373925302900016057160
8761751704394090373925302900016057160
8861751704394250373925302900016057160
8981751704394410373925302900016057160
9091751704394570373925302900016057160
9181751704394730373925302900016057160
9271751704394890373925302900016057160
9381751704395050373925302900016057160
9471751704395210373925302900016057160
9561751704395370373925302900016057160
9701751704395530373925302900016057160
9791751704395690373925302900016057160
9881751704395850373925302900016057160
9991751704396010373925302900016057160
10091751704396170373925302900016057160
10181751704396330373925302900016057160
10301751704396490373925302900016057160
10421751704396650373925302900016057160
10521751704396810373925302900016057160
10631751704396970373925302900016057160
10721751704397130373925302900016057160
10811751704397290373925302900016057160
10931751704397451373925302900016057161
11021751704397610373925302900016057159
11131751704397770373925302900016057160
11241751704397930373925302900016057160
11341751704398089373925302900016057159
11421751704398250373925302900016057161
\n", "
" ], "text/plain": [ " inter_no end_unix ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "693 175 1704391210 37 39 25 30 29 0 \n", "702 175 1704391370 37 39 25 30 29 0 \n", "712 175 1704391530 37 39 25 30 29 0 \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", "927 175 1704394890 37 39 25 30 29 0 \n", "938 175 1704395050 37 39 25 30 29 0 \n", "947 175 1704395210 37 39 25 30 29 0 \n", "956 175 1704395370 37 39 25 30 29 0 \n", "970 175 1704395530 37 39 25 30 29 0 \n", "979 175 1704395690 37 39 25 30 29 0 \n", "988 175 1704395850 37 39 25 30 29 0 \n", "999 175 1704396010 37 39 25 30 29 0 \n", "1009 175 1704396170 37 39 25 30 29 0 \n", "1018 175 1704396330 37 39 25 30 29 0 \n", "1030 175 1704396490 37 39 25 30 29 0 \n", "1042 175 1704396650 37 39 25 30 29 0 \n", "1052 175 1704396810 37 39 25 30 29 0 \n", "1063 175 1704396970 37 39 25 30 29 0 \n", "1072 175 1704397130 37 39 25 30 29 0 \n", "1081 175 1704397290 37 39 25 30 29 0 \n", "1093 175 1704397451 37 39 25 30 29 0 \n", "1102 175 1704397610 37 39 25 30 29 0 \n", "1113 175 1704397770 37 39 25 30 29 0 \n", "1124 175 1704397930 37 39 25 30 29 0 \n", "1134 175 1704398089 37 39 25 30 29 0 \n", "1142 175 1704398250 37 39 25 30 29 0 \n", "\n", " ddur_7 ddur_8 cycle offset diff \n", "693 0 0 160 57 0 \n", "702 0 0 160 57 160 \n", "712 0 0 160 57 160 \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 \n", "927 0 0 160 57 160 \n", "938 0 0 160 57 160 \n", "947 0 0 160 57 160 \n", "956 0 0 160 57 160 \n", "970 0 0 160 57 160 \n", "979 0 0 160 57 160 \n", "988 0 0 160 57 160 \n", "999 0 0 160 57 160 \n", "1009 0 0 160 57 160 \n", "1018 0 0 160 57 160 \n", "1030 0 0 160 57 160 \n", "1042 0 0 160 57 160 \n", "1052 0 0 160 57 160 \n", "1063 0 0 160 57 160 \n", "1072 0 0 160 57 160 \n", "1081 0 0 160 57 160 \n", "1093 0 0 160 57 161 \n", "1102 0 0 160 57 159 \n", "1113 0 0 160 57 160 \n", "1124 0 0 160 57 160 \n", "1134 0 0 160 57 159 \n", "1142 0 0 160 57 161 " ] }, "metadata": {}, "output_type": "display_data" }, { "ename": "IndexError", "evalue": "index -5 is out of bounds for axis 0 with size 0", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[110], line 39\u001b[0m\n\u001b[0;32m 37\u001b[0m ghour_lt_end_unix \u001b[38;5;241m=\u001b[39m hours[hours \u001b[38;5;241m<\u001b[39m curr_unix]\u001b[38;5;241m.\u001b[39mmax() \u001b[38;5;66;03m# the greatest hour less than end_unix\u001b[39;00m\n\u001b[0;32m 38\u001b[0m end_unixes_lt_ghour \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39msort(end_unixes[end_unixes \u001b[38;5;241m<\u001b[39m ghour_lt_end_unix]) \u001b[38;5;66;03m# end unixes less than ghour_lt_end_unix\u001b[39;00m\n\u001b[1;32m---> 39\u001b[0m base_unix \u001b[38;5;241m=\u001b[39m \u001b[43mend_unixes_lt_ghour\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;66;03m# 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\u001b[39;00m\n\u001b[0;32m 40\u001b[0m \u001b[38;5;66;03m# D_n : 시간차이\u001b[39;00m\n\u001b[0;32m 41\u001b[0m D_n \u001b[38;5;241m=\u001b[39m curr_unix \u001b[38;5;241m-\u001b[39m base_unix\n", "\u001b[1;31mIndexError\u001b[0m: index -5 is out of bounds for axis 0 with size 0" ] } ], "source": [ "fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", "m = 60 # ranges from 0 to 287, but 0 makes an error where 288 = 86400//300\n", "present_time = fmins[m] # 현재시점\n", "# - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n", "# 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 2시간 이내인 데이터 수집\n", "rhistory = history.copy() # recent history 1704393231\n", "rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 7200)]\n", "end_unixes = rhistory.end_unix.unique()\n", "hours = np.array(range(midnight, next_day + 1, 3600))\n", "rhist = rhistory.copy()[rhistory.inter_no == 175]\n", "rhist_diff = rhist.copy()\n", "rhist_diff['diff'] = rhist_diff['end_unix'].diff().fillna(0).astype(int)\n", "display(rhist_diff)\n", "rhist = rhist.reset_index(drop=True)\n", "new_rows = []\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", " start_seconds = np.array(timetable.start_seconds)\n", " idx = (start_seconds <= 1704396909).sum() - 1\n", " start_hour = timetable.iloc[idx].start_hour\n", " start_minute = timetable.iloc[idx].start_minute\n", " # 1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n", " if next_unix - curr_unix >= 2 * cycle:\n", " # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", " #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", " while next_unix - curr_unix > cycle:\n", " curr_unix += cycle\n", " # print(curr_unix)\n", " prow = pland[(pland.inter_no==175) & (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", " display(prow)\n", " new_rows.append(prow)\n", " # 1-2. 이상치 처리 : D_n(시간차이)과 S_n(현시시간합)의 차이가 10보다 크면 이상치가 발생했다고 판단\n", " ghour_lt_end_unix = hours[hours < curr_unix].max() # the greatest hour less than end_unix\n", " end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_end_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", "\n", "rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\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": [ "print(present_time)\n", "print(midnight)\n", "print(rhistory.end_unix.max() - rhistory.end_unix.min())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "# 주어진 배열\n", "A = np.array([1, 3, 2, 5, 7])\n", "\n", "# 배열이 정렬되었는지 확인하는 간단한 방법\n", "is_sorted = np.sort(A) is A\n", "\n", "is_sorted\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "L = np.array([1,4,6,10,14,25,31,38])\n", "L[-4]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "end_unixes = rhistory.end_unix.unique()\n", "end_unix = end_unixes[300] # 0 ~ 338\n", "ghour_lt_end_unix = hours[hours < end_unix].max() # the greatest hour less than end_unix\n", "end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_end_unix]) # end unixes less than ghour_lt_end_unix\n", "base_unix = end_unixes_lt_ghour[-5]\n", "D_n = end_unix - base_unix\n", "print(f'D_n : {D_n}')\n", "print(base_unix)\n", "print(end_unix)\n", "print(hours)\n", "S_n = rhistory.loc[(rhistory.end_unix > base_unix) & (rhistory.end_unix <= end_unix)][[f'ddur_{j}' for j in range(1,9)]].values.shape#sum()\n", "print(S_n)\n", "# 이 두 값이 같아야 하는데 같지 않다. 2024. 1. 12 금 : 퇴근하면서" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rhistory" ] }, { "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 }