{
|
|
"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": [
|
|
" 0%| | 0/17280 [00:00<?, ?it/s]"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 17280/17280 [00:13<00:00, 1294.28it/s]\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>move_A</th>\n",
|
|
" <th>move_B</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>4</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>4</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>4</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>25</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>27</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>28</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>30</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>31</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>32</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>33</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>34</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>35</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>36</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>37</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>38</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>39</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>40</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>41</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>42</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>43</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>44</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>45</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>46</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>47</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>48</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>49</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>50</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>51</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>52</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>53</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>54</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>55</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>56</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>57</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>58</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>59</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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",
|
|
"5 175 3 B 1 동 남\n",
|
|
"6 175 4 A 5 서 북\n",
|
|
"7 175 4 B 2 서 동\n",
|
|
"8 176 1 A 8 남 북\n",
|
|
"9 176 1 B 4 북 남\n",
|
|
"10 176 2 A 8 남 북\n",
|
|
"11 176 2 B 3 남 서\n",
|
|
"12 176 3 A 5 서 북\n",
|
|
"13 176 3 B 18 NaN NaN\n",
|
|
"14 177 1 A 8 남 북\n",
|
|
"15 177 1 B 4 북 남\n",
|
|
"16 177 2 A 7 북 동\n",
|
|
"17 177 2 B 3 남 서\n",
|
|
"18 177 3 A 17 NaN NaN\n",
|
|
"19 177 3 B 18 NaN NaN\n",
|
|
"20 177 4 A 5 서 북\n",
|
|
"21 177 4 B 1 동 남\n",
|
|
"22 178 1 A 8 남 북\n",
|
|
"23 178 1 B 4 북 남\n",
|
|
"24 178 2 A 7 북 동\n",
|
|
"25 178 2 B 3 남 서\n",
|
|
"26 178 3 A 5 서 북\n",
|
|
"27 178 3 B 2 서 동\n",
|
|
"28 178 4 A 6 동 서\n",
|
|
"29 178 4 B 1 동 남\n",
|
|
"30 201 1 A 8 남 북\n",
|
|
"31 201 1 B 3 남 서\n",
|
|
"32 201 2 A 5 서 북\n",
|
|
"33 201 2 B 2 서 동\n",
|
|
"34 201 3 A 6 동 서\n",
|
|
"35 201 3 B 2 서 동\n",
|
|
"36 201 4 A 6 동 서\n",
|
|
"37 201 4 B 1 동 남\n",
|
|
"38 201 5 A 7 북 동\n",
|
|
"39 201 5 B 4 북 남\n",
|
|
"40 202 1 A 6 동 서\n",
|
|
"41 202 1 B 2 서 동\n",
|
|
"42 202 2 A 17 NaN NaN\n",
|
|
"43 202 2 B 18 NaN NaN\n",
|
|
"44 206 1 A 8 남 북\n",
|
|
"45 206 1 B 4 북 남\n",
|
|
"46 206 2 A 17 NaN NaN\n",
|
|
"47 206 2 B 18 NaN NaN\n",
|
|
"48 206 3 A 8 남 북\n",
|
|
"49 206 3 B 4 북 남\n",
|
|
"50 206 4 A 17 NaN NaN\n",
|
|
"51 206 4 B 18 NaN NaN\n",
|
|
"52 210 1 A 6 동 서\n",
|
|
"53 210 1 B 18 NaN NaN\n",
|
|
"54 210 2 A 5 서 북\n",
|
|
"55 210 2 B 2 서 동\n",
|
|
"56 210 3 A 7 북 동\n",
|
|
"57 210 3 B 4 북 남\n",
|
|
"58 210 4 A 8 남 북\n",
|
|
"59 210 4 B 3 남 서"
|
|
]
|
|
},
|
|
"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": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>004</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>003</td>\n",
|
|
" <td>176</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>095</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>359</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>356</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>176</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>25</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>27</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>28</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>30</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>31</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>32</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>33</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>34</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>35</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>36</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>37</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>38</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>39</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>40</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>41</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>42</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>43</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>44</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>45</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>46</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>47</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>48</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>49</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>50</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>51</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>52</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>53</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>54</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>55</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>56</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>359</td>\n",
|
|
" <td>090</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>57</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>58</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>59</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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",
|
|
"5 175 3 B 1 동 남 090 180\n",
|
|
"6 175 4 A 5 서 북 268 000\n",
|
|
"7 175 4 B 2 서 동 270 090\n",
|
|
"8 176 1 A 8 남 북 180 000\n",
|
|
"9 176 1 B 4 북 남 359 180\n",
|
|
"10 176 2 A 8 남 북 180 000\n",
|
|
"11 176 2 B 3 남 서 180 270\n",
|
|
"12 176 3 A 5 서 북 270 356\n",
|
|
"13 176 3 B 18 NaN NaN NaN NaN\n",
|
|
"14 177 1 A 8 남 북 180 000\n",
|
|
"15 177 1 B 4 북 남 001 176\n",
|
|
"16 177 2 A 7 북 동 000 090\n",
|
|
"17 177 2 B 3 남 서 179 270\n",
|
|
"18 177 3 A 17 NaN NaN NaN NaN\n",
|
|
"19 177 3 B 18 NaN NaN NaN NaN\n",
|
|
"20 177 4 A 5 서 북 268 000\n",
|
|
"21 177 4 B 1 동 남 090 180\n",
|
|
"22 178 1 A 8 남 북 180 000\n",
|
|
"23 178 1 B 4 북 남 000 180\n",
|
|
"24 178 2 A 7 북 동 000 090\n",
|
|
"25 178 2 B 3 남 서 180 270\n",
|
|
"26 178 3 A 5 서 북 270 000\n",
|
|
"27 178 3 B 2 서 동 270 090\n",
|
|
"28 178 4 A 6 동 서 090 270\n",
|
|
"29 178 4 B 1 동 남 090 180\n",
|
|
"30 201 1 A 8 남 북 180 000\n",
|
|
"31 201 1 B 3 남 서 180 270\n",
|
|
"32 201 2 A 5 서 북 270 000\n",
|
|
"33 201 2 B 2 서 동 270 090\n",
|
|
"34 201 3 A 6 동 서 090 270\n",
|
|
"35 201 3 B 2 서 동 270 090\n",
|
|
"36 201 4 A 6 동 서 090 270\n",
|
|
"37 201 4 B 1 동 남 090 180\n",
|
|
"38 201 5 A 7 북 동 000 090\n",
|
|
"39 201 5 B 4 북 남 000 180\n",
|
|
"40 202 1 A 6 동 서 090 270\n",
|
|
"41 202 1 B 2 서 동 270 090\n",
|
|
"42 202 2 A 17 NaN NaN NaN NaN\n",
|
|
"43 202 2 B 18 NaN NaN NaN NaN\n",
|
|
"44 206 1 A 8 남 북 180 000\n",
|
|
"45 206 1 B 4 북 남 000 180\n",
|
|
"46 206 2 A 17 NaN NaN NaN NaN\n",
|
|
"47 206 2 B 18 NaN NaN NaN NaN\n",
|
|
"48 206 3 A 8 남 북 180 000\n",
|
|
"49 206 3 B 4 북 남 000 180\n",
|
|
"50 206 4 A 17 NaN NaN NaN NaN\n",
|
|
"51 206 4 B 18 NaN NaN NaN NaN\n",
|
|
"52 210 1 A 6 동 서 090 270\n",
|
|
"53 210 1 B 18 NaN NaN NaN NaN\n",
|
|
"54 210 2 A 5 서 북 268 000\n",
|
|
"55 210 2 B 2 서 동 270 090\n",
|
|
"56 210 3 A 7 북 동 359 090\n",
|
|
"57 210 3 B 4 북 남 000 180\n",
|
|
"58 210 4 A 8 남 북 180 000\n",
|
|
"59 210 4 B 3 남 서 180 270"
|
|
]
|
|
},
|
|
"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": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>004</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>003</td>\n",
|
|
" <td>176</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>095</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>i1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>359</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571542797_02.99</td>\n",
|
|
" <td>571542810_01</td>\n",
|
|
" <td>i1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>i1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>571543469_01</td>\n",
|
|
" <td>i1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>356</td>\n",
|
|
" <td>571543469_02</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>i1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>176</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542107_01</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571542107_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" <td>i2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571540304_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>25</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571540303_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571540303_02.21</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>27</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571540303_02.21</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>28</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571500475_01</td>\n",
|
|
" <td>571540303_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>-571500475_01</td>\n",
|
|
" <td>571540304_01</td>\n",
|
|
" <td>i3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>30</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571500569_01</td>\n",
|
|
" <td>571500583_02</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>31</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571500569_01</td>\n",
|
|
" <td>571500618_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>32</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571500618_02</td>\n",
|
|
" <td>571500583_02</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>33</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571500618_02</td>\n",
|
|
" <td>571500617_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>34</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571500617_02</td>\n",
|
|
" <td>571500618_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>35</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571500618_02</td>\n",
|
|
" <td>571500617_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>36</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571500617_02</td>\n",
|
|
" <td>571500618_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>37</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571500617_02</td>\n",
|
|
" <td>571500569_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>38</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571500583_01</td>\n",
|
|
" <td>571500617_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>39</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571500583_01</td>\n",
|
|
" <td>571500569_01</td>\n",
|
|
" <td>i8</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>40</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571510152_02</td>\n",
|
|
" <td>-571510152_01</td>\n",
|
|
" <td>i9</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>41</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571510152_01</td>\n",
|
|
" <td>571510152_01.65</td>\n",
|
|
" <td>i9</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>42</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i9</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>43</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i9</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>44</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571511538_02</td>\n",
|
|
" <td>571542073_02</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>45</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571542073_01</td>\n",
|
|
" <td>571511538_02</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>46</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>47</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>48</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>-571511538_02</td>\n",
|
|
" <td>571542073_02</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>49</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571542073_01</td>\n",
|
|
" <td>571511538_02</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>50</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>51</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i7</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>52</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571542115_01</td>\n",
|
|
" <td>571500535_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>53</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>54</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571500535_02.18</td>\n",
|
|
" <td>571511538_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>55</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571500535_02.18</td>\n",
|
|
" <td>571542115_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>56</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>359</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571511538_02.121</td>\n",
|
|
" <td>571542115_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>57</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571511538_02.121</td>\n",
|
|
" <td>571500585_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>58</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571500585_02</td>\n",
|
|
" <td>571511538_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>59</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571500585_02</td>\n",
|
|
" <td>571500535_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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",
|
|
"5 175 3 B 1 동 남 090 180 \n",
|
|
"6 175 4 A 5 서 북 268 000 \n",
|
|
"7 175 4 B 2 서 동 270 090 \n",
|
|
"8 176 1 A 8 남 북 180 000 \n",
|
|
"9 176 1 B 4 북 남 359 180 \n",
|
|
"10 176 2 A 8 남 북 180 000 \n",
|
|
"11 176 2 B 3 남 서 180 270 \n",
|
|
"12 176 3 A 5 서 북 270 356 \n",
|
|
"13 176 3 B 18 NaN NaN NaN NaN \n",
|
|
"14 177 1 A 8 남 북 180 000 \n",
|
|
"15 177 1 B 4 북 남 001 176 \n",
|
|
"16 177 2 A 7 북 동 000 090 \n",
|
|
"17 177 2 B 3 남 서 179 270 \n",
|
|
"18 177 3 A 17 NaN NaN NaN NaN \n",
|
|
"19 177 3 B 18 NaN NaN NaN NaN \n",
|
|
"20 177 4 A 5 서 북 268 000 \n",
|
|
"21 177 4 B 1 동 남 090 180 \n",
|
|
"22 178 1 A 8 남 북 180 000 \n",
|
|
"23 178 1 B 4 북 남 000 180 \n",
|
|
"24 178 2 A 7 북 동 000 090 \n",
|
|
"25 178 2 B 3 남 서 180 270 \n",
|
|
"26 178 3 A 5 서 북 270 000 \n",
|
|
"27 178 3 B 2 서 동 270 090 \n",
|
|
"28 178 4 A 6 동 서 090 270 \n",
|
|
"29 178 4 B 1 동 남 090 180 \n",
|
|
"30 201 1 A 8 남 북 180 000 \n",
|
|
"31 201 1 B 3 남 서 180 270 \n",
|
|
"32 201 2 A 5 서 북 270 000 \n",
|
|
"33 201 2 B 2 서 동 270 090 \n",
|
|
"34 201 3 A 6 동 서 090 270 \n",
|
|
"35 201 3 B 2 서 동 270 090 \n",
|
|
"36 201 4 A 6 동 서 090 270 \n",
|
|
"37 201 4 B 1 동 남 090 180 \n",
|
|
"38 201 5 A 7 북 동 000 090 \n",
|
|
"39 201 5 B 4 북 남 000 180 \n",
|
|
"40 202 1 A 6 동 서 090 270 \n",
|
|
"41 202 1 B 2 서 동 270 090 \n",
|
|
"42 202 2 A 17 NaN NaN NaN NaN \n",
|
|
"43 202 2 B 18 NaN NaN NaN NaN \n",
|
|
"44 206 1 A 8 남 북 180 000 \n",
|
|
"45 206 1 B 4 북 남 000 180 \n",
|
|
"46 206 2 A 17 NaN NaN NaN NaN \n",
|
|
"47 206 2 B 18 NaN NaN NaN NaN \n",
|
|
"48 206 3 A 8 남 북 180 000 \n",
|
|
"49 206 3 B 4 북 남 000 180 \n",
|
|
"50 206 4 A 17 NaN NaN NaN NaN \n",
|
|
"51 206 4 B 18 NaN NaN NaN NaN \n",
|
|
"52 210 1 A 6 동 서 090 270 \n",
|
|
"53 210 1 B 18 NaN NaN NaN NaN \n",
|
|
"54 210 2 A 5 서 북 268 000 \n",
|
|
"55 210 2 B 2 서 동 270 090 \n",
|
|
"56 210 3 A 7 북 동 359 090 \n",
|
|
"57 210 3 B 4 북 남 000 180 \n",
|
|
"58 210 4 A 8 남 북 180 000 \n",
|
|
"59 210 4 B 3 남 서 180 270 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 -571542797_02 571500487_01 i0 \n",
|
|
"1 -571500487_01 571542797_02 i0 \n",
|
|
"2 -571500487_01 571545870_01 i0 \n",
|
|
"3 -571542797_02 571510153_01 i0 \n",
|
|
"4 571545870_02 571510153_01 i0 \n",
|
|
"5 571545870_02 571542797_02 i0 \n",
|
|
"6 571510153_02 571500487_01 i0 \n",
|
|
"7 571510153_02 571545870_01 i0 \n",
|
|
"8 -571542810_01 -571542797_02.99 i1 \n",
|
|
"9 571542797_02.99 571542810_01 i1 \n",
|
|
"10 -571542810_01 -571542797_02.99 i1 \n",
|
|
"11 -571542810_01 571543469_01 i1 \n",
|
|
"12 571543469_02 -571542797_02.99 i1 \n",
|
|
"13 NaN NaN i1 \n",
|
|
"14 -571542809_01 571542811_01 i2 \n",
|
|
"15 571542811_02 571542809_01 i2 \n",
|
|
"16 571542811_02 571542107_01 i2 \n",
|
|
"17 -571542809_01 571542809_01 i2 \n",
|
|
"18 NaN NaN i2 \n",
|
|
"19 NaN NaN i2 \n",
|
|
"20 -571542809_01 571542811_01 i2 \n",
|
|
"21 571542107_02 571542809_01 i2 \n",
|
|
"22 571540304_02 571556450_01 i3 \n",
|
|
"23 571556450_02 571540304_01 i3 \n",
|
|
"24 571556450_02 571500475_01 i3 \n",
|
|
"25 571540304_02 571540303_01 i3 \n",
|
|
"26 571540303_02.21 571556450_01 i3 \n",
|
|
"27 571540303_02.21 571500475_01 i3 \n",
|
|
"28 -571500475_01 571540303_01 i3 \n",
|
|
"29 -571500475_01 571540304_01 i3 \n",
|
|
"30 -571500569_01 571500583_02 i8 \n",
|
|
"31 -571500569_01 571500618_01 i8 \n",
|
|
"32 571500618_02 571500583_02 i8 \n",
|
|
"33 571500618_02 571500617_01 i8 \n",
|
|
"34 571500617_02 571500618_01 i8 \n",
|
|
"35 571500618_02 571500617_01 i8 \n",
|
|
"36 571500617_02 571500618_01 i8 \n",
|
|
"37 571500617_02 571500569_01 i8 \n",
|
|
"38 571500583_01 571500617_01 i8 \n",
|
|
"39 571500583_01 571500569_01 i8 \n",
|
|
"40 571510152_02 -571510152_01 i9 \n",
|
|
"41 571510152_01 571510152_01.65 i9 \n",
|
|
"42 NaN NaN i9 \n",
|
|
"43 NaN NaN i9 \n",
|
|
"44 -571511538_02 571542073_02 i7 \n",
|
|
"45 571542073_01 571511538_02 i7 \n",
|
|
"46 NaN NaN i7 \n",
|
|
"47 NaN NaN i7 \n",
|
|
"48 -571511538_02 571542073_02 i7 \n",
|
|
"49 571542073_01 571511538_02 i7 \n",
|
|
"50 NaN NaN i7 \n",
|
|
"51 NaN NaN i7 \n",
|
|
"52 -571542115_01 571500535_01 i6 \n",
|
|
"53 NaN NaN i6 \n",
|
|
"54 571500535_02.18 571511538_01 i6 \n",
|
|
"55 571500535_02.18 571542115_01 i6 \n",
|
|
"56 571511538_02.121 571542115_01 i6 \n",
|
|
"57 571511538_02.121 571500585_01 i6 \n",
|
|
"58 571500585_02 571511538_01 i6 \n",
|
|
"59 571500585_02 571500535_01 i6 "
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"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.sort_values(by=['inter_no','phase_no','ring_type']).reset_index(drop=True)\n",
|
|
"match5"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array(['u00', 'u20', 'u30', 'u31', 'u32', 'u60'], dtype=object)"
|
|
]
|
|
},
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# 유턴/연동교차로에 대하여 진입ID, 진출ID 부여\n",
|
|
"node2inter = dict(zip(inter_node['node_id'], inter_node['inter_no']))\n",
|
|
"\n",
|
|
"uturn = pd.read_csv('../../Data/tables/child_uturn.csv')\n",
|
|
"coord = pd.read_csv('../../Data/tables/child_coord.csv')\n",
|
|
"\n",
|
|
"child_ids = inter_node[inter_node.inter_type=='child'].node_id.unique()\n",
|
|
"ch2pa = {} # child to parent\n",
|
|
"for child_id in child_ids:\n",
|
|
" parent_no = inter_node[inter_node.node_id==child_id].inter_no.iloc[0]\n",
|
|
" sub_inter_node = inter_node[inter_node.inter_no==parent_no]\n",
|
|
" ch2pa[child_id] = sub_inter_node[sub_inter_node.inter_type=='parent'].iloc[0].node_id\n",
|
|
"directions = ['북', '북동', '동', '남동', '남', '남서', '서', '북서'] # 정북기준 시계방향으로 8방향\n",
|
|
"u_ids = uturn.child_id.unique()\n",
|
|
"u_ids"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"u00 i0 좌회전시 북\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>004</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>003</td>\n",
|
|
" <td>176</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>095</td>\n",
|
|
" <td>571500487_02</td>\n",
|
|
" <td>571500487_01.32</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u00</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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 19 북 동 001 095 \n",
|
|
"3 175 2 B 3 남 서 179 270 \n",
|
|
"4 175 3 A 6 동 서 090 270 \n",
|
|
"5 175 3 B 1 동 남 090 180 \n",
|
|
"6 175 4 A 5 서 북 268 000 \n",
|
|
"7 175 4 B 2 서 동 270 090 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 NaN NaN u00 \n",
|
|
"1 NaN NaN u00 \n",
|
|
"2 571500487_02 571500487_01.32 u00 \n",
|
|
"3 NaN NaN u00 \n",
|
|
"4 NaN NaN u00 \n",
|
|
"5 NaN NaN u00 \n",
|
|
"6 NaN NaN u00 \n",
|
|
"7 NaN NaN u00 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"u20 i2 보행신호시 북\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>176</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542810_01.51</td>\n",
|
|
" <td>571542810_02</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u20</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
|
|
"0 177 1 A 8 남 북 180 000 \n",
|
|
"1 177 1 B 4 북 남 001 176 \n",
|
|
"2 177 2 A 7 북 동 000 090 \n",
|
|
"3 177 2 B 3 남 서 179 270 \n",
|
|
"4 177 3 A 17 NaN NaN NaN NaN \n",
|
|
"5 177 3 B 18 NaN NaN NaN NaN \n",
|
|
"6 177 4 A 5 서 북 268 000 \n",
|
|
"7 177 4 B 1 동 남 090 180 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 NaN NaN u20 \n",
|
|
"1 NaN NaN u20 \n",
|
|
"2 NaN NaN u20 \n",
|
|
"3 NaN NaN u20 \n",
|
|
"4 571542810_01.51 571542810_02 u20 \n",
|
|
"5 NaN NaN u20 \n",
|
|
"6 NaN NaN u20 \n",
|
|
"7 NaN NaN u20 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"u30 i3 보행신호시 북\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571556452_01</td>\n",
|
|
" <td>571556452_02</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u30</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
|
|
"0 178 1 A 8 남 북 180 000 \n",
|
|
"1 178 1 B 4 북 남 000 180 \n",
|
|
"2 178 2 A 7 북 동 000 090 \n",
|
|
"3 178 2 B 3 남 서 180 270 \n",
|
|
"4 178 3 A 5 서 북 270 000 \n",
|
|
"5 178 3 B 2 서 동 270 090 \n",
|
|
"6 178 4 A 19 동 서 090 270 \n",
|
|
"7 178 4 B 1 동 남 090 180 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 NaN NaN u30 \n",
|
|
"1 NaN NaN u30 \n",
|
|
"2 NaN NaN u30 \n",
|
|
"3 NaN NaN u30 \n",
|
|
"4 NaN NaN u30 \n",
|
|
"5 NaN NaN u30 \n",
|
|
"6 571556452_01 571556452_02 u30 \n",
|
|
"7 NaN NaN u30 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"u31 i3 보행신호시 동\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571500475_02</td>\n",
|
|
" <td>571500475_01.26</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u31</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
|
|
"0 178 1 A 19 남 북 180 000 \n",
|
|
"1 178 1 B 4 북 남 000 180 \n",
|
|
"2 178 2 A 7 북 동 000 090 \n",
|
|
"3 178 2 B 3 남 서 180 270 \n",
|
|
"4 178 3 A 5 서 북 270 000 \n",
|
|
"5 178 3 B 2 서 동 270 090 \n",
|
|
"6 178 4 A 6 동 서 090 270 \n",
|
|
"7 178 4 B 1 동 남 090 180 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 571500475_02 571500475_01.26 u31 \n",
|
|
"1 NaN NaN u31 \n",
|
|
"2 NaN NaN u31 \n",
|
|
"3 NaN NaN u31 \n",
|
|
"4 NaN NaN u31 \n",
|
|
"5 NaN NaN u31 \n",
|
|
"6 NaN NaN u31 \n",
|
|
"7 NaN NaN u31 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"u32 i3 보행신호시 서\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>571540303_02</td>\n",
|
|
" <td>-571540303_02</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u32</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
|
|
"0 178 1 A 8 남 북 180 000 \n",
|
|
"1 178 1 B 19 북 남 000 180 \n",
|
|
"2 178 2 A 7 북 동 000 090 \n",
|
|
"3 178 2 B 3 남 서 180 270 \n",
|
|
"4 178 3 A 5 서 북 270 000 \n",
|
|
"5 178 3 B 2 서 동 270 090 \n",
|
|
"6 178 4 A 6 동 서 090 270 \n",
|
|
"7 178 4 B 1 동 남 090 180 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 NaN NaN u32 \n",
|
|
"1 571540303_02 -571540303_02 u32 \n",
|
|
"2 NaN NaN u32 \n",
|
|
"3 NaN NaN u32 \n",
|
|
"4 NaN NaN u32 \n",
|
|
"5 NaN NaN u32 \n",
|
|
"6 NaN NaN u32 \n",
|
|
"7 NaN NaN u32 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"u60 i6 직좌시 서\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>268</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>571500535_02</td>\n",
|
|
" <td>-571500535_02</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571500535_02</td>\n",
|
|
" <td>-571500535_02</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>359</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
|
|
"0 210 1 A 6 동 서 090 270 \n",
|
|
"1 210 1 B 18 NaN NaN NaN NaN \n",
|
|
"2 210 2 A 19 서 북 268 000 \n",
|
|
"3 210 2 B 19 서 동 270 090 \n",
|
|
"4 210 3 A 7 북 동 359 090 \n",
|
|
"5 210 3 B 4 북 남 000 180 \n",
|
|
"6 210 4 A 8 남 북 180 000 \n",
|
|
"7 210 4 B 3 남 서 180 270 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 NaN NaN u60 \n",
|
|
"1 NaN NaN u60 \n",
|
|
"2 571500535_02 -571500535_02 u60 \n",
|
|
"3 571500535_02 -571500535_02 u60 \n",
|
|
"4 NaN NaN u60 \n",
|
|
"5 NaN NaN u60 \n",
|
|
"6 NaN NaN u60 \n",
|
|
"7 NaN NaN u60 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542116_01</td>\n",
|
|
" <td>-571542116_02.96</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542116_02.96</td>\n",
|
|
" <td>571542116_02.164</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542116_01</td>\n",
|
|
" <td>-571542116_02.96</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542116_02.96</td>\n",
|
|
" <td>571542116_02.164</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542116_01</td>\n",
|
|
" <td>-571542116_02.96</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>571542116_02.96</td>\n",
|
|
" <td>571542116_02.164</td>\n",
|
|
" <td>c30</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phase_no ring_type move_no inc_dir out_dir inc_angle \\\n",
|
|
"0 178 1 A 20 NaN NaN NaN \n",
|
|
"1 178 1 B 20 NaN NaN NaN \n",
|
|
"2 178 2 A 20 NaN NaN NaN \n",
|
|
"3 178 2 B 20 NaN NaN NaN \n",
|
|
"4 178 3 A 20 NaN NaN NaN \n",
|
|
"5 178 3 B 20 NaN NaN NaN \n",
|
|
"6 178 4 A 20 NaN NaN NaN \n",
|
|
"7 178 4 B 20 NaN NaN NaN \n",
|
|
"\n",
|
|
" out_angle inc_edge out_edge node_id \n",
|
|
"0 NaN NaN NaN c30 \n",
|
|
"1 NaN NaN NaN c30 \n",
|
|
"2 NaN 571542116_01 -571542116_02.96 c30 \n",
|
|
"3 NaN 571542116_02.96 571542116_02.164 c30 \n",
|
|
"4 NaN 571542116_01 -571542116_02.96 c30 \n",
|
|
"5 NaN 571542116_02.96 571542116_02.164 c30 \n",
|
|
"6 NaN 571542116_01 -571542116_02.96 c30 \n",
|
|
"7 NaN 571542116_02.96 571542116_02.164 c30 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phase_no</th>\n",
|
|
" <th>ring_type</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_angle</th>\n",
|
|
" <th>out_angle</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>004</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>003</td>\n",
|
|
" <td>176</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>001</td>\n",
|
|
" <td>095</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>179</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>571500535_02</td>\n",
|
|
" <td>-571500535_02</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>359</td>\n",
|
|
" <td>090</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>A</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>000</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>B</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>180</td>\n",
|
|
" <td>270</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>u60</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>116 rows × 11 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"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",
|
|
"3 210 2 B 19 서 동 270 090 \n",
|
|
"4 210 3 A 7 북 동 359 090 \n",
|
|
"5 210 3 B 4 북 남 000 180 \n",
|
|
"6 210 4 A 8 남 북 180 000 \n",
|
|
"7 210 4 B 3 남 서 180 270 \n",
|
|
"\n",
|
|
" inc_edge out_edge node_id \n",
|
|
"0 -571542797_02 571500487_01 i0 \n",
|
|
"1 -571500487_01 571542797_02 i0 \n",
|
|
"2 -571500487_01 571545870_01 i0 \n",
|
|
"3 -571542797_02 571510153_01 i0 \n",
|
|
"4 571545870_02 571510153_01 i0 \n",
|
|
".. ... ... ... \n",
|
|
"3 571500535_02 -571500535_02 u60 \n",
|
|
"4 NaN NaN u60 \n",
|
|
"5 NaN NaN u60 \n",
|
|
"6 NaN NaN u60 \n",
|
|
"7 NaN NaN u60 \n",
|
|
"\n",
|
|
"[116 rows x 11 columns]"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# 유턴/연동교차로에 대하여 진입ID, 진출ID 부여\n",
|
|
"node2inter = dict(zip(inter_node['node_id'], inter_node['inter_no']))\n",
|
|
"\n",
|
|
"uturn = pd.read_csv('../../Data/tables/child_uturn.csv')\n",
|
|
"coord = pd.read_csv('../../Data/tables/child_coord.csv')\n",
|
|
"child_ids = inter_node[inter_node.inter_type=='child'].node_id.unique()\n",
|
|
"ch2pa = {} # child to parent\n",
|
|
"for child_id in child_ids:\n",
|
|
" parent_no = inter_node[inter_node.node_id==child_id].inter_no.iloc[0]\n",
|
|
" sub_inter_node = inter_node[inter_node.inter_no==parent_no]\n",
|
|
" ch2pa[child_id] = sub_inter_node[sub_inter_node.inter_type=='parent'].iloc[0].node_id\n",
|
|
"directions = ['북', '북동', '동', '남동', '남', '남서', '서', '북서'] # 정북기준 시계방향으로 8방향\n",
|
|
"u_ids = uturn.child_id.unique()\n",
|
|
"# 각 child uturn node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
|
|
"cmatches = []\n",
|
|
"for _, row in uturn.iterrows():\n",
|
|
" child_id = row.child_id\n",
|
|
" parent_id = row.parent_id\n",
|
|
" direction = row.direction\n",
|
|
" condition = row.condition\n",
|
|
" inc_edge_id = row.inc_edge\n",
|
|
" out_edge_id = row.out_edge\n",
|
|
" ind = directions.index(direction)\n",
|
|
" if condition == \"좌회전시\":\n",
|
|
" print(child_id, parent_id, condition, direction)\n",
|
|
" inc_dire = direction\n",
|
|
" out_dire_A = out_dire_B = directions[(ind + 2) % len(directions)]\n",
|
|
" elif condition == \"직진시\":\n",
|
|
" print(child_id, parent_id, condition, direction)\n",
|
|
" inc_dire = direction\n",
|
|
" out_dire_A = out_dire_B = directions[(ind + 4) % len(directions)]\n",
|
|
" elif condition == \"직좌시\":\n",
|
|
" print(child_id, parent_id, condition, direction)\n",
|
|
" inc_dire = direction\n",
|
|
" out_dire_A = directions[(ind + 2) % len(directions)]\n",
|
|
" out_dire_B = directions[(ind + 4) % len(directions)]\n",
|
|
" elif condition == \"보행신호시\":\n",
|
|
" print(child_id, parent_id, condition, direction)\n",
|
|
" inc_dire = directions[(ind + 2) % len(directions)]\n",
|
|
" out_dire_A = directions[(ind - 2) % len(directions)]\n",
|
|
" out_dire_B = directions[(ind - 2) % len(directions)]\n",
|
|
" cmatch = match5.copy()[match5.node_id==parent_id] # match dataframe for a child node\n",
|
|
" cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
|
|
" cmatch['node_id'] = child_id\n",
|
|
" cmatch[['inc_edge', 'out_edge']] = np.nan\n",
|
|
" if condition == '직좌시':\n",
|
|
" ap = cmatch[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A)].phase_no.iloc[0]\n",
|
|
" bp = cmatch[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B)].phase_no.iloc[0]\n",
|
|
" # 직진과 좌회전이 같은 현시에 있는 경우에만 (inc_edge_id, out_edge_id)를 부여한다.\n",
|
|
" if ap == bp:\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" elif condition == '보행신호시':\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" # 이동류번호가 17(보행신호)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.\n",
|
|
" cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" else:\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
|
|
" # 유턴신호의 이동류번호를 19로 부여한다.\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), 'move_no'] = 19\n",
|
|
" cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), 'move_no'] = 19\n",
|
|
" display(cmatch)\n",
|
|
" cmatches.append(cmatch)\n",
|
|
"\n",
|
|
"# 각 child coordination node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
|
|
"coord['inter_no'] = coord['parent_id'].map(node2inter)\n",
|
|
"coord = coord.rename(columns={'child_id':'node_id'})\n",
|
|
"coord[['inc_dir', 'out_dir', 'inc_angle','out_angle']] = np.nan\n",
|
|
"coord['move_no'] = 20\n",
|
|
"coord = coord[['inter_no', 'phase_no', 'ring_type', 'move_no', 'inc_dir', 'out_dir', 'inc_angle','out_angle', 'inc_edge', 'out_edge', 'node_id']]\n",
|
|
"# display(coord)\n",
|
|
"cmatches = pd.concat(cmatches)\n",
|
|
"display(coord)\n",
|
|
"match6 = pd.concat([match5, cmatches, coord]).drop_duplicates().sort_values(by=['inter_no', 'node_id', 'phase_no', 'ring_type'])\n",
|
|
"# with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
|
|
"match6.to_csv('../../Data/tables/matching/match6.csv')\n",
|
|
"display(match6)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>move_no</th>\n",
|
|
" <th>inc_dir</th>\n",
|
|
" <th>out_dir</th>\n",
|
|
" <th>inc_edge</th>\n",
|
|
" <th>out_edge</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>i0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>69</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>571500585_02</td>\n",
|
|
" <td>571511538_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>70</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>571511538_02.121</td>\n",
|
|
" <td>571500535_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>71</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>서</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>571500535_02.18</td>\n",
|
|
" <td>571500585_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>72</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>남</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>571500585_02</td>\n",
|
|
" <td>571542115_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>73</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>동</td>\n",
|
|
" <td>북</td>\n",
|
|
" <td>-571542115_01</td>\n",
|
|
" <td>571511538_01</td>\n",
|
|
" <td>i6</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>74 rows × 7 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no move_no inc_dir out_dir inc_edge out_edge node_id\n",
|
|
"0 175 1 동 남 571545870_02 571542797_02 i0\n",
|
|
"1 175 2 서 동 571510153_02 571545870_01 i0\n",
|
|
"2 175 3 남 서 -571542797_02 571510153_01 i0\n",
|
|
"3 175 4 북 남 -571500487_01 571542797_02 i0\n",
|
|
"4 175 5 서 북 571510153_02 571500487_01 i0\n",
|
|
".. ... ... ... ... ... ... ...\n",
|
|
"69 210 8 남 북 571500585_02 571511538_01 i6\n",
|
|
"70 210 21 북 서 571511538_02.121 571500535_01 i6\n",
|
|
"71 210 21 서 남 571500535_02.18 571500585_01 i6\n",
|
|
"72 210 21 남 동 571500585_02 571542115_01 i6\n",
|
|
"73 210 21 동 북 -571542115_01 571511538_01 i6\n",
|
|
"\n",
|
|
"[74 rows x 7 columns]"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# 이동류 매칭\n",
|
|
"# 각 교차로에 대하여, 가능한 모든 이동류(1~18, 21)에 대한 진입·진출엣지ID를 지정한다.\n",
|
|
"# 모든 이동류에 대해 지정하므로, 시차제시 이전과 다른 이동류가 등장하더라도 항상 진입·진출 엣지 ID를 지정할 수 있다.\n",
|
|
"match7 = match6.copy()\n",
|
|
"match7 = match7[['inter_no', 'move_no', 'inc_dir', 'out_dir', 'inc_edge', 'out_edge', 'node_id']]\n",
|
|
"\n",
|
|
"parent_ids = sorted(inter_node[inter_node.inter_type=='parent'].node_id.unique())\n",
|
|
"child_ids = sorted(inter_node[inter_node.inter_type=='child'].node_id.unique())\n",
|
|
"\n",
|
|
"# (1) 가능한 (진입방향, 진출방향) 목록\n",
|
|
"flows = nema.dropna().apply(lambda row: (row['inc_dir'], row['out_dir']), axis=1).tolist()\n",
|
|
"# (2) 각 교차로별 방향 목록 : pdires (possible directions)\n",
|
|
"pdires = {}\n",
|
|
"for node_id in parent_ids:\n",
|
|
" dires = match7[match7.node_id == node_id][['inc_dir','out_dir']].values.flatten()\n",
|
|
" dires = {dire for dire in dires if type(dire)==str}\n",
|
|
" pdires[node_id] = dires\n",
|
|
"# (3) 각 (교차로, 진입방향) 별 진입id 목록 : inc2id (incoming direction to incoming edge_id)\n",
|
|
"inc2id = {}\n",
|
|
"for node_id in parent_ids:\n",
|
|
" for inc_dir in pdires[node_id]:\n",
|
|
" df = match7[(match7.node_id==node_id) & (match7.inc_dir==inc_dir)]\n",
|
|
" inc2id[(node_id, inc_dir)] = df.inc_edge.iloc[0]\n",
|
|
"# (4) 각 (교차로, 진출방향) 별 진출id 목록 : out2id (outgoing direction to outgoing edge_id)\n",
|
|
"out2id = {}\n",
|
|
"for node_id in parent_ids:\n",
|
|
" for out_dir in pdires[node_id]:\n",
|
|
" df = match7[(match7.node_id==node_id) & (match7.out_dir==out_dir)]\n",
|
|
" out2id[(node_id, out_dir)] = df.out_edge.iloc[0]\n",
|
|
"# (5) 각 교차로별 가능한 (진입방향, 진출방향) 목록 : pflow (possible flows)\n",
|
|
"pflow = {}\n",
|
|
"for node_id in parent_ids:\n",
|
|
" pflow[node_id] = [flow for flow in flows if set(flow).issubset(pdires[node_id])]\n",
|
|
"# (6) 가능한 이동류에 대하여 진입id, 진출id 배정 : matching\n",
|
|
"node2inter = dict(zip(match7['node_id'], match7['inter_no']))\n",
|
|
"dires_right = ['북', '서', '남', '동', '북'] # ex (북, 서), (서, 남) 등은 우회전 flow\n",
|
|
"matching = []\n",
|
|
"for node_id in parent_ids:\n",
|
|
" inter_no = node2inter[node_id]\n",
|
|
" # 좌회전과 직진(1 ~ 16)\n",
|
|
" for (inc_dir, out_dir) in pflow[node_id]:\n",
|
|
" move_no = nema[(nema.inc_dir==inc_dir) & (nema.out_dir==out_dir)].move_no.iloc[0]\n",
|
|
" inc_edge = inc2id[(node_id, inc_dir)]\n",
|
|
" out_edge = out2id[(node_id, 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[node_id]):\n",
|
|
" inc_edge = inc2id[(node_id, inc_dir)]\n",
|
|
" out_edge = out2id[(node_id, 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.append(match7[match7.node_id.isin(child_ids)])\n",
|
|
"matching = pd.concat(matching)\n",
|
|
"matching = matching.dropna().sort_values(by=['inter_no', 'node_id', 'move_no']).reset_index(drop=True)\n",
|
|
"matching['move_no'] = matching['move_no'].astype(int)\n",
|
|
"matching.to_csv('../../Data/tables/matching/matching.csv')\n",
|
|
"display(matching)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# B. 5초 간격으로 이동류번호 수집"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" 0%| | 0/17280 [00:00<?, ?it/s]"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 17280/17280 [02:07<00:00, 135.82it/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",
|
|
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\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",
|
|
" move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\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",
|
|
" 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": 11,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n",
|
|
"history = pd.read_csv('../../Data/tables/history.csv', index_col=0)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>start_hour</th>\n",
|
|
" <th>start_minute</th>\n",
|
|
" <th>start_seconds</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1704380400</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>7</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1704405600</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>9</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1704412800</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>18</td>\n",
|
|
" <td>30</td>\n",
|
|
" <td>1704447000</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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": 12,
|
|
"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": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-01-05 03:20:00\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" <th>dura_A1</th>\n",
|
|
" <th>dura_A2</th>\n",
|
|
" <th>dura_A3</th>\n",
|
|
" <th>dura_A4</th>\n",
|
|
" <th>dura_A5</th>\n",
|
|
" <th>dura_A6</th>\n",
|
|
" <th>dura_A7</th>\n",
|
|
" <th>dura_A8</th>\n",
|
|
" <th>dura_B1</th>\n",
|
|
" <th>dura_B2</th>\n",
|
|
" <th>dura_B3</th>\n",
|
|
" <th>dura_B4</th>\n",
|
|
" <th>dura_B5</th>\n",
|
|
" <th>dura_B6</th>\n",
|
|
" <th>dura_B7</th>\n",
|
|
" <th>dura_B8</th>\n",
|
|
" <th>cycle</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>60</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>60</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>60</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>70</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>120</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>56</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1704388801</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>68</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>68</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>150</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>78</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1704392159</td>\n",
|
|
" <td>43</td>\n",
|
|
" <td>29</td>\n",
|
|
" <td>56</td>\n",
|
|
" <td>22</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>48</td>\n",
|
|
" <td>56</td>\n",
|
|
" <td>22</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>150</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>84</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>84</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>98</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>120</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>84</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704392211</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>194 rows × 19 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n",
|
|
"60 178 1704388800 38 39 40 23 0 \n",
|
|
"60 201 1704388800 24 24 17 58 17 \n",
|
|
"60 202 1704388800 39 101 0 0 0 \n",
|
|
"70 206 1704388800 33 35 26 26 0 \n",
|
|
"56 177 1704388801 36 20 68 26 0 \n",
|
|
".. ... ... ... ... ... ... ... \n",
|
|
"78 210 1704392159 43 29 56 22 0 \n",
|
|
"84 178 1704392160 38 39 40 23 0 \n",
|
|
"84 201 1704392160 24 24 17 58 17 \n",
|
|
"98 206 1704392160 33 35 26 26 0 \n",
|
|
"84 202 1704392211 39 101 0 0 0 \n",
|
|
"\n",
|
|
" dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n",
|
|
"60 0 0 0 38 39 40 23 0 \n",
|
|
"60 0 0 0 24 24 17 58 17 \n",
|
|
"60 0 0 0 39 101 0 0 0 \n",
|
|
"70 0 0 0 33 35 26 26 0 \n",
|
|
"56 0 0 0 36 20 68 26 0 \n",
|
|
".. ... ... ... ... ... ... ... ... \n",
|
|
"78 0 0 0 24 48 56 22 0 \n",
|
|
"84 0 0 0 38 39 40 23 0 \n",
|
|
"84 0 0 0 24 24 17 58 17 \n",
|
|
"98 0 0 0 33 35 26 26 0 \n",
|
|
"84 0 0 0 39 101 0 0 0 \n",
|
|
"\n",
|
|
" dura_B6 dura_B7 dura_B8 cycle \n",
|
|
"60 0 0 0 140 \n",
|
|
"60 0 0 0 140 \n",
|
|
"60 0 0 0 140 \n",
|
|
"70 0 0 0 120 \n",
|
|
"56 0 0 0 150 \n",
|
|
".. ... ... ... ... \n",
|
|
"78 0 0 0 150 \n",
|
|
"84 0 0 0 140 \n",
|
|
"84 0 0 0 140 \n",
|
|
"98 0 0 0 120 \n",
|
|
"84 0 0 0 140 \n",
|
|
"\n",
|
|
"[194 rows x 19 columns]"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"m = 40\n",
|
|
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
"present_time = fmins[m] # 현재시점\n",
|
|
"print(datetime.fromtimestamp(present_time))\n",
|
|
"\n",
|
|
"# 1. 조회시점의 유닉스 타임 이전의 신호이력 수집\n",
|
|
"rhistory = history.copy() # recent history\n",
|
|
"rhistory = rhistory[(rhistory.end_unix < present_time)]\n",
|
|
"# 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력\n",
|
|
"# - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정\n",
|
|
"for i, row in rhistory.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" end_unix = row.end_unix\n",
|
|
" elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합\n",
|
|
" # 이전 유닉스 존재하지 않음 : 현시시간 합의 차\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",
|
|
" # 이전 유닉스 존재, abs < 10 : 이전 유닉스\n",
|
|
" if abs(pre_unix - start_unix) < 10:\n",
|
|
" start_unix = pre_unix\n",
|
|
" # 이전 유닉스 존재, abs >=10 : 현시시간 합의 차\n",
|
|
" else:\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",
|
|
"rhistory[['inter_no', 'start_unix', 'cycle']][rhistory.inter_no==175]\n",
|
|
"rhistory = rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n",
|
|
"rhistory\n",
|
|
"\n",
|
|
"# 2-1. 참값 판단 프로세스\n",
|
|
"hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n",
|
|
"\n",
|
|
"def calculate_DS(rhist, curr_unix):\n",
|
|
" ghour_lt_curr_unix = hours[hours <= curr_unix].max() # the greatest hour less than (or equal to) curr_unix\n",
|
|
" start_unixes = rhist.start_unix.unique()\n",
|
|
" start_unixes_lt_ghour = np.sort(start_unixes[start_unixes < ghour_lt_curr_unix]) # start unixes less than ghour_lt_curr_unix\n",
|
|
" # 기준유닉스(base_unix) : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 start_unix\n",
|
|
" if list(start_unixes_lt_ghour):\n",
|
|
" base_unix = start_unixes_lt_ghour[-5]\n",
|
|
" # start_unixes_lt_ghour가 비었을 경우에는 맨 앞 start_unix로 base_unix를 지정\n",
|
|
" else:\n",
|
|
" base_unix = rhist.start_unix.min()\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" S_n_durs = rhist[(rhist.start_unix > base_unix) & (rhist.start_unix <= curr_unix)] \\\n",
|
|
" [[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = S_n_durs.values.sum() // 2\n",
|
|
" return D_n, S_n\n",
|
|
"\n",
|
|
"rhists = []\n",
|
|
"for inter_no in sorted(rhistory.inter_no.unique()):\n",
|
|
" rhist = rhistory.copy()[rhistory.inter_no==inter_no]\n",
|
|
" rhist = rhist.drop_duplicates(subset=['start_unix']).reset_index(drop=True)\n",
|
|
"\n",
|
|
" # D_n 및 S_n 값 정의\n",
|
|
" rhist['D_n'] = 0 # D_n : 시간차이\n",
|
|
" rhist['S_n'] = 0 # S_n : 현시시간합\n",
|
|
" for n in range(len(rhist)):\n",
|
|
" curr_unix = rhist.iloc[n].start_unix # current start_unix\n",
|
|
" rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n",
|
|
"\n",
|
|
" # 이전시각, 현재시각\n",
|
|
" prev_unix = rhist.loc[0, 'start_unix'] # previous start_unix\n",
|
|
" curr_unix = rhist.loc[1, 'start_unix'] # current start_unix\n",
|
|
"\n",
|
|
" # rhist의 마지막 행에 도달할 때까지 반복\n",
|
|
" while True:\n",
|
|
" n = rhist[rhist.start_unix==curr_unix].index[0]\n",
|
|
" cycle = rhist.loc[n, 'cycle']\n",
|
|
" D_n = rhist.loc[n, 'D_n']\n",
|
|
" S_n = rhist.loc[n, 'S_n']\n",
|
|
" # 참값인 경우\n",
|
|
" if (abs(D_n - S_n) <= 5):\n",
|
|
" pass\n",
|
|
" # 참값이 아닌 경우\n",
|
|
" else:\n",
|
|
" # 2-1-1. 결측치 처리 : 인접한 두 start_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단, 신호계획의 현시시간으로 \"대체\"\n",
|
|
" if curr_unix - prev_unix >= 2 * cycle:\n",
|
|
" # prev_unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n",
|
|
" # (curr_unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n",
|
|
" new_rows = []\n",
|
|
" while curr_unix - prev_unix > cycle:\n",
|
|
" prev_unix += cycle\n",
|
|
" # 신호 계획(prow) 불러오기\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= prev_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan.copy()[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n",
|
|
" # prow에서 필요한 부분을 rhist에 추가\n",
|
|
" prow['start_unix'] = prev_unix\n",
|
|
" prow = prow.drop(['start_hour', 'start_minute', 'offset'], axis=1)\n",
|
|
" cycle = prow.iloc[0].cycle\n",
|
|
" rhist = pd.concat([rhist, prow])\n",
|
|
" rhist = rhist.sort_values(by='start_unix').reset_index(drop=True)\n",
|
|
" n += 1\n",
|
|
"\n",
|
|
" # 2-1-2. 이상치 처리 : 비율에 따라 해당 행을 \"삭제\"(R_n <= 0.5) 또는 \"조정\"(R_n > 0.5)한다\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n",
|
|
" # R_n이 0.5보다 작거나 같으면 해당 행을 삭제\n",
|
|
" if R_n <= 0.5:\n",
|
|
" rhist = rhist.drop(index=n).reset_index(drop=True)\n",
|
|
" # 행삭제에 따른 curr_unix, R_n 재정의\n",
|
|
" curr_unix = rhist.loc[n, 'start_unix']\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n",
|
|
"\n",
|
|
" # R_n이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n",
|
|
" if R_n > 0.5:\n",
|
|
" # 신호 계획(prow) 불러오기\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n",
|
|
" # 조정된 현시시간 (prow에 R_n을 곱하고 정수로 바꿈)\n",
|
|
" adjusted_dur = prow.copy()[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n",
|
|
" int_parts = adjusted_dur.iloc[0].apply(lambda x: int(x))\n",
|
|
" frac_parts = adjusted_dur.iloc[0] - int_parts\n",
|
|
" difference = round(adjusted_dur.iloc[0].sum()) - int_parts.sum()\n",
|
|
" for _ in range(difference): # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n",
|
|
" max_frac_index = frac_parts.idxmax()\n",
|
|
" int_parts[max_frac_index] += 1\n",
|
|
" frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n",
|
|
" # rhist에 조정된 현시시간을 반영\n",
|
|
" rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n",
|
|
" rhist.loc[n, 'cycle'] = int_parts.sum().sum() // 2\n",
|
|
"\n",
|
|
" if n == rhist.index[-1]:\n",
|
|
" break\n",
|
|
" prev_unix = curr_unix\n",
|
|
" curr_unix = rhist.loc[n+1, 'start_unix']\n",
|
|
" # rhist['start_dt'] = rhist['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n",
|
|
"\n",
|
|
" # 생략해도 무방할 코드\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
" rhist = rhist.sort_values(by=['start_unix'])\n",
|
|
"\n",
|
|
" # D_n 및 S_n 값 재정의\n",
|
|
" for n in range(len(rhist)):\n",
|
|
" curr_unix = rhist.iloc[n].start_unix # current start_unix\n",
|
|
" rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n",
|
|
" rhists.append(rhist)\n",
|
|
"rhists = pd.concat(rhists).sort_values(by=['start_unix','inter_no'])\n",
|
|
"rhists = rhists[rhists.start_unix >= present_time - 3600]\n",
|
|
"rhists = rhists.drop(columns=['D_n', 'S_n'])\n",
|
|
"rhists"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 34,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" 0%| | 0/17280 [00:00<?, ?it/s]"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 17280/17280 [00:18<00:00, 929.46it/s] \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"file_path = '../../Data/tables/movements/'\n",
|
|
"movements = [pd.read_csv(file_path + file, index_col=0) for file in tqdm(os.listdir(file_path))]\n",
|
|
"movements = pd.concat(movements).drop_duplicates()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>move_A</th>\n",
|
|
" <th>move_B</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>4</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phas_A phas_B move_A move_B\n",
|
|
"8 175 1 1 8 4\n",
|
|
"15 175 2 2 7 3\n",
|
|
"20 175 3 3 6 1\n",
|
|
"24 175 3 4 6 2\n",
|
|
"26 175 4 4 5 2"
|
|
]
|
|
},
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"movements_wo_start_unix_list = [] # movements without start_unix\n",
|
|
"for inter_no in sorted(movements.inter_no.unique()):\n",
|
|
" movements_wo_start_unix = movements[movements_wo_start_unix.inter_no==inter_no]\n",
|
|
" movements_wo_start_unix = movements_wo_start_unix[['inter_no', 'phas_A', 'phas_B', 'move_A', 'move_B']]\n",
|
|
" movements_wo_start_unix = movements_wo_start_unix.drop_duplicates().sort_values(by=['phas_A','phas_B'])\n",
|
|
" movements_wo_start_unix_list.append(movements_wo_start_unix)\n",
|
|
"movements_wo_start_unix = pd.concat(movements_wo_start_unix_list)\n",
|
|
"movements_wo_start_unix.head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 67,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>duration</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>38</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>39</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>40</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>23</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1704388800</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>24</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>767</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>35</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>768</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>26</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>769</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>26</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>770</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704392211</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>39</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>771</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704392211</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>101</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>772 rows × 5 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no start_unix phas_A phas_B duration\n",
|
|
"0 178 1704388800 1 1 38\n",
|
|
"1 178 1704388800 2 2 39\n",
|
|
"2 178 1704388800 3 3 40\n",
|
|
"3 178 1704388800 4 4 23\n",
|
|
"4 201 1704388800 1 1 24\n",
|
|
".. ... ... ... ... ...\n",
|
|
"767 206 1704392160 2 2 35\n",
|
|
"768 206 1704392160 3 3 26\n",
|
|
"769 206 1704392160 4 4 26\n",
|
|
"770 202 1704392211 1 1 39\n",
|
|
"771 202 1704392211 2 2 101\n",
|
|
"\n",
|
|
"[772 rows x 5 columns]"
|
|
]
|
|
},
|
|
"execution_count": 67,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# 계층화된 형태로 변환\n",
|
|
"hrhists = [] # hierarchied recent history\n",
|
|
"for i, row in rhists.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" start_unix = row.start_unix\n",
|
|
"\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",
|
|
" phas_As = [isplit[j][0] for j in isplit.keys()]\n",
|
|
" phas_Bs = [isplit[j][1] for j in isplit.keys()]\n",
|
|
" durs_A = row[[f'dura_A{j}' for j in range(1,9)]]\n",
|
|
" durs_B = row[[f'dura_B{j}' for j in range(1,9)]]\n",
|
|
" durations = []\n",
|
|
" for j in range(1, len(isplit)+1):\n",
|
|
" ja = isplit[j][0]\n",
|
|
" jb = isplit[j][1]\n",
|
|
" if ja == jb:\n",
|
|
" durations.append(min(durs_A[ja-1], durs_B[jb-1]))\n",
|
|
" else:\n",
|
|
" durations.append(abs(durs_A[ja-1] - durs_B[ja-1]))\n",
|
|
" new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations),\n",
|
|
" 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations})\n",
|
|
" hrhists.append(new_rows)\n",
|
|
"hrhists = pd.concat(hrhists)\n",
|
|
"hrhists = hrhists.sort_values(by = ['start_unix', 'inter_no', 'phas_A', 'phas_B']).reset_index(drop=True)\n",
|
|
"hrhists"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 133,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"movement = time2movement[present_time]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 138,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# 중복을 제거하고 (inter_no, start_unix) 쌍을 만듭니다.\n",
|
|
"hrhists_inter_unix = set(hrhists[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None))\n",
|
|
"movement_inter_unix = set(movement[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None))\n",
|
|
"\n",
|
|
"# hrhists에는 있지만 movement에는 없는 (inter_no, start_unix) 쌍을 찾습니다.\n",
|
|
"missing_in_movement = hrhists_inter_unix - movement_inter_unix\n",
|
|
"\n",
|
|
"# 새로운 행들을 생성합니다.\n",
|
|
"new_rows = []\n",
|
|
"for inter_no, start_unix in missing_in_movement:\n",
|
|
" # movements_wo_start_unix에서 해당 inter_no의 데이터를 찾습니다.\n",
|
|
" new_row = movements_wo_start_unix[movements_wo_start_unix['inter_no'] == inter_no].copy()\n",
|
|
" # start_unix 값을 설정합니다.\n",
|
|
" new_row['start_unix'] = start_unix\n",
|
|
" new_rows.append(new_row)\n",
|
|
"\n",
|
|
"# 새로운 데이터프레임을 생성하고 기존 movement 데이터프레임과 합칩니다.\n",
|
|
"new_movement = pd.concat(new_rows, ignore_index=True)\n",
|
|
"movement_updated = pd.concat([movement, new_movement], ignore_index=True)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 143,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>duration</th>\n",
|
|
" <th>inc_edge_A</th>\n",
|
|
" <th>out_edge_A</th>\n",
|
|
" <th>inc_edge_B</th>\n",
|
|
" <th>out_edge_B</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704388801</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704388801</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>20</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542107_01</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704388801</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>68</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704388801</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>571542107_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704388850</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>571542797_02.99</td>\n",
|
|
" <td>571542810_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>748</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>35</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>749</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>-571511538_02</td>\n",
|
|
" <td>571542073_02</td>\n",
|
|
" <td>571542073_01</td>\n",
|
|
" <td>571511538_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>750</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704392160</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>751</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704392211</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>571510152_02</td>\n",
|
|
" <td>-571510152_01</td>\n",
|
|
" <td>571510152_01</td>\n",
|
|
" <td>571510152_01.65</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>752</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704392211</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>757 rows × 10 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
|
|
"0 177 i2 1704388801 1 1 36 -571542809_01 \n",
|
|
"1 177 i2 1704388801 2 2 20 571542811_02 \n",
|
|
"2 177 i2 1704388801 3 3 68 NaN \n",
|
|
"3 177 i2 1704388801 4 4 26 -571542809_01 \n",
|
|
"4 176 i1 1704388850 1 1 37 -571542810_01 \n",
|
|
".. ... ... ... ... ... ... ... \n",
|
|
"748 206 i7 1704392160 2 2 35 NaN \n",
|
|
"749 206 i7 1704392160 3 3 26 -571511538_02 \n",
|
|
"750 206 i7 1704392160 4 4 26 NaN \n",
|
|
"751 202 i9 1704392211 1 1 39 571510152_02 \n",
|
|
"752 202 i9 1704392211 2 2 101 NaN \n",
|
|
"\n",
|
|
" out_edge_A inc_edge_B out_edge_B \n",
|
|
"0 571542811_01 571542811_02 571542809_01 \n",
|
|
"1 571542107_01 -571542809_01 571542809_01 \n",
|
|
"2 NaN NaN NaN \n",
|
|
"3 571542811_01 571542107_02 571542809_01 \n",
|
|
"4 -571542797_02.99 571542797_02.99 571542810_01 \n",
|
|
".. ... ... ... \n",
|
|
"748 NaN NaN NaN \n",
|
|
"749 571542073_02 571542073_01 571511538_02 \n",
|
|
"750 NaN NaN NaN \n",
|
|
"751 -571510152_01 571510152_01 571510152_01.65 \n",
|
|
"752 NaN NaN NaN \n",
|
|
"\n",
|
|
"[757 rows x 10 columns]"
|
|
]
|
|
},
|
|
"execution_count": 143,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"movedur = pd.merge(movement_updated, hrhists, how='inner', on=['inter_no', 'start_unix', 'phas_A', 'phas_B']) # 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",
|
|
"\n",
|
|
"# 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n",
|
|
"for i, row in movedur.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" start_unix = row.start_unix\n",
|
|
" # incoming and outgoing edges A\n",
|
|
" move_A = row.move_A\n",
|
|
" if move_A in [17, 18]:\n",
|
|
" inc_edge_A = np.nan\n",
|
|
" out_edge_A = np.nan\n",
|
|
" else:\n",
|
|
" match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
|
|
" inc_edge_A = match_A.inc_edge\n",
|
|
" out_edge_A = match_A.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_A', 'out_edge_A']] = [inc_edge_A, out_edge_A]\n",
|
|
" # incoming and outgoing edges B\n",
|
|
" move_B = row.move_B\n",
|
|
" if move_B in [17, 18]:\n",
|
|
" inc_edge_B = np.nan\n",
|
|
" out_edge_B = np.nan\n",
|
|
" else:\n",
|
|
" match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
|
|
" inc_edge_B = match_B.inc_edge\n",
|
|
" out_edge_B = match_B.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_B', 'out_edge_B']] = [inc_edge_B, out_edge_B]\n",
|
|
"\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",
|
|
"histid['node_id'] = histid['inter_no'].map(inter2node)\n",
|
|
"histid = histid[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'duration', 'inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']]\n",
|
|
"histid = histid[histid.start_unix > present_time - 3600]\n",
|
|
"histid"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 71,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-01-05 16:40:00\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>duration</th>\n",
|
|
" <th>inc_edge_A</th>\n",
|
|
" <th>out_edge_A</th>\n",
|
|
" <th>inc_edge_B</th>\n",
|
|
" <th>out_edge_B</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704436810</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>571510152_02</td>\n",
|
|
" <td>-571510152_01</td>\n",
|
|
" <td>571510152_01</td>\n",
|
|
" <td>571510152_01.65</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704436810</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704436860</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571540304_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704436860</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571540303_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704436860</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>43</td>\n",
|
|
" <td>571540303_02.21</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>571540303_02.21</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>477</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704440171</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>478</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704440171</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>45</td>\n",
|
|
" <td>-571511538_02</td>\n",
|
|
" <td>571542073_02</td>\n",
|
|
" <td>571542073_01</td>\n",
|
|
" <td>571511538_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>479</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704440171</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>53</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>480</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704440171</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>-571511538_02</td>\n",
|
|
" <td>571542073_02</td>\n",
|
|
" <td>571542073_01</td>\n",
|
|
" <td>571511538_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>481</th>\n",
|
|
" <td>206</td>\n",
|
|
" <td>i7</td>\n",
|
|
" <td>1704440171</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>482 rows × 10 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
|
|
"0 202 i9 1704436810 1 1 46 571510152_02 \n",
|
|
"1 202 i9 1704436810 2 2 114 NaN \n",
|
|
"2 178 i3 1704436860 1 1 38 571540304_02 \n",
|
|
"3 178 i3 1704436860 2 2 39 571556450_02 \n",
|
|
"4 178 i3 1704436860 3 3 43 571540303_02.21 \n",
|
|
".. ... ... ... ... ... ... ... \n",
|
|
"477 202 i9 1704440171 2 2 114 NaN \n",
|
|
"478 206 i7 1704440171 1 1 45 -571511538_02 \n",
|
|
"479 206 i7 1704440171 2 2 53 NaN \n",
|
|
"480 206 i7 1704440171 3 3 26 -571511538_02 \n",
|
|
"481 206 i7 1704440171 4 4 26 NaN \n",
|
|
"\n",
|
|
" out_edge_A inc_edge_B out_edge_B \n",
|
|
"0 -571510152_01 571510152_01 571510152_01.65 \n",
|
|
"1 NaN NaN NaN \n",
|
|
"2 571556450_01 571556450_02 571540304_01 \n",
|
|
"3 571500475_01 571540304_02 571540303_01 \n",
|
|
"4 571556450_01 571540303_02.21 571500475_01 \n",
|
|
".. ... ... ... \n",
|
|
"477 NaN NaN NaN \n",
|
|
"478 571542073_02 571542073_01 571511538_02 \n",
|
|
"479 NaN NaN NaN \n",
|
|
"480 571542073_02 571542073_01 571511538_02 \n",
|
|
"481 NaN NaN NaN \n",
|
|
"\n",
|
|
"[482 rows x 10 columns]"
|
|
]
|
|
},
|
|
"execution_count": 71,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"m = 200\n",
|
|
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
"present_time = fmins[m] # 현재시점\n",
|
|
"print(datetime.fromtimestamp(present_time))\n",
|
|
"\n",
|
|
"# (구) make_rhistory\n",
|
|
"Rhists = [] # Recent history (1시간 이내)\n",
|
|
"for inter_no in history.inter_no.unique():\n",
|
|
" # - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n",
|
|
" # 1. 조회시점의 유닉스 타임 이전의 신호이력 수집\n",
|
|
" rhistory = history.copy() # recent history\n",
|
|
" rhistory = rhistory[(rhistory.end_unix < present_time)]\n",
|
|
" hours = np.array(range(midnight, next_day + 1, 3600))\n",
|
|
" rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
" new_rows = []\n",
|
|
" # 1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n",
|
|
" for n in range(len(rhist) - 1):\n",
|
|
" curr_unix = rhist.iloc[n].end_unix # current end_unix\n",
|
|
" next_unix = rhist.iloc[n+1].end_unix # next end_unix\n",
|
|
" cycle = rhist.iloc[n].cycle\n",
|
|
" if next_unix - curr_unix >= 2 * cycle:\n",
|
|
" # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n",
|
|
" #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n",
|
|
" while next_unix - curr_unix > cycle:\n",
|
|
" curr_unix += cycle\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n",
|
|
" prow = prow.drop(['start_hour', 'start_minute'], axis=1)\n",
|
|
" prow['end_unix'] = curr_unix\n",
|
|
" cycle = prow.iloc[0].cycle\n",
|
|
" new_rows.append(prow)\n",
|
|
" rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
"\n",
|
|
" # 1-2. 이상치 처리 : 기준유닉스로부터의 시간차이와 현시시간합이 11 이상 차이나면 이상치가 발생했다고 판단\n",
|
|
" Rhist = rhist.copy() # recent history 1704393231\n",
|
|
" Rhist = Rhist[(Rhist.end_unix >= present_time - 3600)] # Recent history (1시간 이내)\n",
|
|
" Rhist = Rhist.reset_index(drop=True)\n",
|
|
" Rhist['D_n'] = 0\n",
|
|
" Rhist['S_n'] = 0\n",
|
|
" for n in range(len(Rhist)):\n",
|
|
" curr_unix = Rhist.iloc[n].end_unix # current end_unix\n",
|
|
" cycle = Rhist.iloc[n].cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이 \n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" # S_n : 현시시간합\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" Rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n",
|
|
" n = 1\n",
|
|
" while n < len(Rhist):\n",
|
|
" prev_unix = Rhist[Rhist.index==n-1]['end_unix'].iloc[0] # previous end_unix\n",
|
|
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" # S_n : 현시시간합\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" # 비율이 0.5보다 작거나 같으면 해당 행을 삭제\n",
|
|
" if (abs(D_n - S_n) > 10) & (R_n <= 0.5):\n",
|
|
" Rhist = Rhist.drop(index=n)\n",
|
|
" n += 1\n",
|
|
" # 행삭제에 따른 curr_unix, D_n, S_n 등 재정의\n",
|
|
" if not Rhist[Rhist.index==n]['end_unix'].empty: # 마지막 행을 삭제하여 뒤의 행이 없을 때를 대비\n",
|
|
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" # S_n : 현시시간합\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" # 비율이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n",
|
|
" if (abs(D_n - S_n) > 10) & (R_n > 0.5):\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n",
|
|
" adjusted_dur = prow[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n",
|
|
" # 조정된 현시시간을 정수로 바꿈\n",
|
|
" int_parts = adjusted_dur.apply(lambda x: int(x))\n",
|
|
" frac_parts = adjusted_dur - int_parts\n",
|
|
" difference = int(round(adjusted_dur.sum())) - int_parts.sum()\n",
|
|
" # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n",
|
|
" for _ in range(difference):\n",
|
|
" max_frac_index = frac_parts.idxmax()\n",
|
|
" int_parts[max_frac_index] += 1\n",
|
|
" frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n",
|
|
" Rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n",
|
|
" Rhist.loc[n, 'cycle'] = int_parts.sum() // 2\n",
|
|
" n += 1\n",
|
|
" Rhist = Rhist.drop(columns=['offset', 'D_n', 'S_n'])\n",
|
|
" Rhists.append(Rhist)\n",
|
|
"Rhists = pd.concat(Rhists)\n",
|
|
"Rhists = Rhists.sort_values(by=['end_unix', 'inter_no']).reset_index(drop=True)\n",
|
|
"\n",
|
|
"# (구) make_histid\n",
|
|
"# 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력\n",
|
|
"# - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정\n",
|
|
"for i, row in rhistory.iterrows():\n",
|
|
" # 이전 유닉스 존재하지 않음 => 현시시간 합의 차\n",
|
|
" # 이전 유닉스 존재, abs < 10 => 이전 유닉스\n",
|
|
" # 이전 유닉스 존재, abs >=10 => 현시시간 합의 차\n",
|
|
" inter_no = row.inter_no\n",
|
|
" end_unix = row.end_unix\n",
|
|
" elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합\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",
|
|
"rhistory = rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n",
|
|
"\n",
|
|
"# 계층화된 형태로 변환\n",
|
|
"hrhistory = [] # hierarchized recent history\n",
|
|
"for i, row in rhistory.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" start_unix = row.start_unix\n",
|
|
"\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",
|
|
" phas_As = [isplit[j][0] for j in isplit.keys()]\n",
|
|
" phas_Bs = [isplit[j][1] for j in isplit.keys()]\n",
|
|
" durs_A = row[[f'dura_A{j}' for j in range(1,9)]]\n",
|
|
" durs_B = row[[f'dura_B{j}' for j in range(1,9)]]\n",
|
|
" durations = []\n",
|
|
" for j in range(1, len(isplit)+1):\n",
|
|
" ja = isplit[j][0]\n",
|
|
" jb = isplit[j][1]\n",
|
|
" if ja == jb:\n",
|
|
" durations.append(min(durs_A[ja-1], durs_B[jb-1]))\n",
|
|
" else:\n",
|
|
" durations.append(abs(durs_A[ja-1] - durs_B[ja-1]))\n",
|
|
" new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations),\n",
|
|
" 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations})\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']) # 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",
|
|
"\n",
|
|
"# 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n",
|
|
"for i, row in movedur.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" start_unix = row.start_unix\n",
|
|
" # incoming and outgoing edges A\n",
|
|
" move_A = row.move_A\n",
|
|
" if move_A in [17, 18]:\n",
|
|
" inc_edge_A = np.nan\n",
|
|
" out_edge_A = np.nan\n",
|
|
" else:\n",
|
|
" match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
|
|
" inc_edge_A = match_A.inc_edge\n",
|
|
" out_edge_A = match_A.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_A', 'out_edge_A']] = [inc_edge_A, out_edge_A]\n",
|
|
" # incoming and outgoing edges B\n",
|
|
" move_B = row.move_B\n",
|
|
" if move_B in [17, 18]:\n",
|
|
" inc_edge_B = np.nan\n",
|
|
" out_edge_B = np.nan\n",
|
|
" else:\n",
|
|
" match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
|
|
" inc_edge_B = match_B.inc_edge\n",
|
|
" out_edge_B = match_B.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_B', 'out_edge_B']] = [inc_edge_B, out_edge_B]\n",
|
|
"\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",
|
|
"histid['node_id'] = histid['inter_no'].map(inter2node)\n",
|
|
"histid = histid[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'duration', 'inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']]\n",
|
|
"histid = histid[histid.start_unix > present_time - 3600]\n",
|
|
"# 시뮬레이션 시작시각 : 현재시각 - 600\n",
|
|
"# 시뮬레이션 종료시각 : 현재시각 - 300\n",
|
|
"# 현재시각 : present_time, PT\n",
|
|
"# PT-900 ... PT-600 ... PT-300 ... PT\n",
|
|
"histid"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-01-05 04:10:00\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>duration</th>\n",
|
|
" <th>inc_edge_A</th>\n",
|
|
" <th>out_edge_A</th>\n",
|
|
" <th>inc_edge_B</th>\n",
|
|
" <th>out_edge_B</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704391850</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>571542797_02.99</td>\n",
|
|
" <td>571542810_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704391850</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>73</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>571543469_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704391850</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>571543469_02</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704391880</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571540304_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704391880</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571540303_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>528</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>i8</td>\n",
|
|
" <td>1704395250</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>-571500569_01</td>\n",
|
|
" <td>571500583_02</td>\n",
|
|
" <td>-571500569_01</td>\n",
|
|
" <td>571500618_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>529</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>i8</td>\n",
|
|
" <td>1704395250</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>571500618_02</td>\n",
|
|
" <td>571500583_02</td>\n",
|
|
" <td>571500618_02</td>\n",
|
|
" <td>571500617_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>530</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>i8</td>\n",
|
|
" <td>1704395250</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>571500617_02</td>\n",
|
|
" <td>571500618_01</td>\n",
|
|
" <td>571500618_02</td>\n",
|
|
" <td>571500617_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>531</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>i8</td>\n",
|
|
" <td>1704395250</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>571500617_02</td>\n",
|
|
" <td>571500618_01</td>\n",
|
|
" <td>571500617_02</td>\n",
|
|
" <td>571500569_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>532</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>i8</td>\n",
|
|
" <td>1704395250</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>571500583_01</td>\n",
|
|
" <td>571500617_01</td>\n",
|
|
" <td>571500583_01</td>\n",
|
|
" <td>571500569_01</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>533 rows × 10 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
|
|
"0 176 i1 1704391850 1 1 37 -571542810_01 \n",
|
|
"1 176 i1 1704391850 2 2 73 -571542810_01 \n",
|
|
"2 176 i1 1704391850 3 3 40 571543469_02 \n",
|
|
"3 178 i3 1704391880 1 1 38 571540304_02 \n",
|
|
"4 178 i3 1704391880 2 2 39 571556450_02 \n",
|
|
".. ... ... ... ... ... ... ... \n",
|
|
"528 201 i8 1704395250 1 1 24 -571500569_01 \n",
|
|
"529 201 i8 1704395250 2 2 24 571500618_02 \n",
|
|
"530 201 i8 1704395250 3 3 17 571500617_02 \n",
|
|
"531 201 i8 1704395250 4 4 58 571500617_02 \n",
|
|
"532 201 i8 1704395250 5 5 17 571500583_01 \n",
|
|
"\n",
|
|
" out_edge_A inc_edge_B out_edge_B \n",
|
|
"0 -571542797_02.99 571542797_02.99 571542810_01 \n",
|
|
"1 -571542797_02.99 -571542810_01 571543469_01 \n",
|
|
"2 -571542797_02.99 NaN NaN \n",
|
|
"3 571556450_01 571556450_02 571540304_01 \n",
|
|
"4 571500475_01 571540304_02 571540303_01 \n",
|
|
".. ... ... ... \n",
|
|
"528 571500583_02 -571500569_01 571500618_01 \n",
|
|
"529 571500583_02 571500618_02 571500617_01 \n",
|
|
"530 571500618_01 571500618_02 571500617_01 \n",
|
|
"531 571500618_01 571500617_02 571500569_01 \n",
|
|
"532 571500617_01 571500583_01 571500569_01 \n",
|
|
"\n",
|
|
"[533 rows x 10 columns]"
|
|
]
|
|
},
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"make_histid(50)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>end_unix</th>\n",
|
|
" <th>dura_A1</th>\n",
|
|
" <th>dura_A2</th>\n",
|
|
" <th>dura_A3</th>\n",
|
|
" <th>dura_A4</th>\n",
|
|
" <th>dura_A5</th>\n",
|
|
" <th>dura_A6</th>\n",
|
|
" <th>dura_A7</th>\n",
|
|
" <th>dura_A8</th>\n",
|
|
" <th>...</th>\n",
|
|
" <th>dura_B3</th>\n",
|
|
" <th>dura_B4</th>\n",
|
|
" <th>dura_B5</th>\n",
|
|
" <th>dura_B6</th>\n",
|
|
" <th>dura_B7</th>\n",
|
|
" <th>dura_B8</th>\n",
|
|
" <th>cycle</th>\n",
|
|
" <th>offset</th>\n",
|
|
" <th>D_n</th>\n",
|
|
" <th>S_n</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704380540</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704380680</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704380820</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704380960</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704381100</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>101</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>140</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>200</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704409679</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>201</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704409840</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>202</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704410000</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>203</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704410160</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>204</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704410320</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" <td>103</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>205 rows × 22 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no end_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n",
|
|
"0 202 1704380540 39 101 0 0 0 \n",
|
|
"1 202 1704380680 39 101 0 0 0 \n",
|
|
"2 202 1704380820 39 101 0 0 0 \n",
|
|
"3 202 1704380960 39 101 0 0 0 \n",
|
|
"4 202 1704381100 39 101 0 0 0 \n",
|
|
".. ... ... ... ... ... ... ... \n",
|
|
"200 202 1704409679 46 114 0 0 0 \n",
|
|
"201 202 1704409840 46 114 0 0 0 \n",
|
|
"202 202 1704410000 46 114 0 0 0 \n",
|
|
"203 202 1704410160 46 114 0 0 0 \n",
|
|
"204 202 1704410320 46 114 0 0 0 \n",
|
|
"\n",
|
|
" dura_A6 dura_A7 dura_A8 ... dura_B3 dura_B4 dura_B5 dura_B6 \\\n",
|
|
"0 0 0 0 ... 0 0 0 0 \n",
|
|
"1 0 0 0 ... 0 0 0 0 \n",
|
|
"2 0 0 0 ... 0 0 0 0 \n",
|
|
"3 0 0 0 ... 0 0 0 0 \n",
|
|
"4 0 0 0 ... 0 0 0 0 \n",
|
|
".. ... ... ... ... ... ... ... ... \n",
|
|
"200 0 0 0 ... 0 0 0 0 \n",
|
|
"201 0 0 0 ... 0 0 0 0 \n",
|
|
"202 0 0 0 ... 0 0 0 0 \n",
|
|
"203 0 0 0 ... 0 0 0 0 \n",
|
|
"204 0 0 0 ... 0 0 0 0 \n",
|
|
"\n",
|
|
" dura_B7 dura_B8 cycle offset D_n S_n \n",
|
|
"0 0 0 140 103 0 0 \n",
|
|
"1 0 0 140 103 0 0 \n",
|
|
"2 0 0 140 103 0 0 \n",
|
|
"3 0 0 140 103 0 0 \n",
|
|
"4 0 0 140 103 0 0 \n",
|
|
".. ... ... ... ... ... ... \n",
|
|
"200 0 0 160 103 0 0 \n",
|
|
"201 0 0 160 103 0 0 \n",
|
|
"202 0 0 160 103 0 0 \n",
|
|
"203 0 0 160 103 0 0 \n",
|
|
"204 0 0 160 103 0 0 \n",
|
|
"\n",
|
|
"[205 rows x 22 columns]"
|
|
]
|
|
},
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"m = 100\n",
|
|
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
"present_time = fmins[m] # 현재시점\n",
|
|
"\n",
|
|
"# 1. 신호이력 데이터 수집\n",
|
|
"rhistory = history.copy()[(history.end_unix < present_time)]\n",
|
|
"rhistory = rhistory.reset_index(drop=True)\n",
|
|
"hours = np.array(range(midnight, next_day + 1, 3600))\n",
|
|
"rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n",
|
|
"rhist = rhist.reset_index(drop=True)\n",
|
|
"rhist['D_n'] = 0 # D_n : 시간차이\n",
|
|
"rhist['S_n'] = 0 # S_n : 현시시간합\n",
|
|
"rhist"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 43,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-01-05 08:19:00\n",
|
|
"2024-01-05 07:20:20\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"movement = time2movement[present_time]\n",
|
|
"max_unix = movement.start_unix.max()\n",
|
|
"min_unix = movement.start_unix.min()\n",
|
|
"print(datetime.fromtimestamp(max_unix))\n",
|
|
"print(datetime.fromtimestamp(min_unix))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 25,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>move_A</th>\n",
|
|
" <th>move_B</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>1704406820</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>1704406820</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>1704406820</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1704406820</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>1704406820</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>598</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>1704410320</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>599</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>17</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>1704410320</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>600</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>1704410340</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>601</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>1704410340</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>602</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>1704410340</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>603 rows × 6 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no phas_A phas_B move_A move_B start_unix\n",
|
|
"0 201 1 1 8 3 1704406820\n",
|
|
"1 201 2 2 5 2 1704406820\n",
|
|
"2 201 3 3 6 2 1704406820\n",
|
|
"3 201 4 4 6 1 1704406820\n",
|
|
"4 201 5 5 7 4 1704406820\n",
|
|
".. ... ... ... ... ... ...\n",
|
|
"598 202 1 1 6 2 1704410320\n",
|
|
"599 202 2 2 17 18 1704410320\n",
|
|
"600 201 1 1 8 3 1704410340\n",
|
|
"601 201 2 2 5 2 1704410340\n",
|
|
"602 201 5 5 7 4 1704410340\n",
|
|
"\n",
|
|
"[603 rows x 6 columns]"
|
|
]
|
|
},
|
|
"execution_count": 25,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
"present_time = fmins[m] # 현재시점\n",
|
|
"print(datetime.fromtimestamp(present_time))\n",
|
|
"\n",
|
|
"Rhists = [] # Recent history (1시간 이내)\n",
|
|
"for inter_no in history.inter_no.unique():\n",
|
|
" # - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n",
|
|
" # 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 1시간 이내인(Rhist) 데이터 수집\n",
|
|
" rhistory = history.copy() # recent history\n",
|
|
" rhistory = rhistory[(rhistory.end_unix < present_time)]\n",
|
|
" hours = np.array(range(midnight, next_day + 1, 3600))\n",
|
|
" rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
" new_rows = []\n",
|
|
" # 1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n",
|
|
" for n in range(len(rhist) - 1):\n",
|
|
" curr_unix = rhist.iloc[n].end_unix # current end_unix\n",
|
|
" next_unix = rhist.iloc[n+1].end_unix # next end_unix\n",
|
|
" cycle = rhist.iloc[n].cycle\n",
|
|
" if next_unix - curr_unix >= 2 * cycle:\n",
|
|
" # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n",
|
|
" #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n",
|
|
" while next_unix - curr_unix > cycle:\n",
|
|
" curr_unix += cycle \n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n",
|
|
" prow = prow.drop(['start_hour', 'start_minute'], axis=1)\n",
|
|
" prow['end_unix'] = curr_unix\n",
|
|
" cycle = prow.iloc[0].cycle\n",
|
|
" new_rows.append(prow)\n",
|
|
" rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
"\n",
|
|
" # 1-2. 이상치 처리 : 기준유닉스로부터의 시간차이와 현시시간합이 11 이상 차이나면 이상치가 발생했다고 판단\n",
|
|
" Rhist = rhist.copy() # recent history 1704393231\n",
|
|
" Rhist = Rhist[(Rhist.end_unix >= present_time - 3600)] # Recent history (1시간 이내)\n",
|
|
" Rhist = Rhist.reset_index(drop=True)\n",
|
|
" Rhist['D_n'] = 0\n",
|
|
" Rhist['S_n'] = 0\n",
|
|
" for n in range(len(Rhist)):\n",
|
|
" curr_unix = Rhist.iloc[n].end_unix # current end_unix\n",
|
|
" cycle = Rhist.iloc[n].cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" # S_n : 현시시간합\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" Rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n",
|
|
" n = 1\n",
|
|
" while n < len(Rhist):\n",
|
|
" prev_unix = Rhist[Rhist.index==n-1]['end_unix'].iloc[0] # previous end_unix\n",
|
|
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" # S_n : 현시시간합\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" # 비율이 0.5보다 작거나 같으면 해당 행을 삭제\n",
|
|
" if (abs(D_n - S_n) > 10) & (R_n <= 0.5):\n",
|
|
" # print(\"lt\", inter_no, curr_unix, round(R_n,2), D_n, S_n)\n",
|
|
" # display(Rhist.iloc[n])\n",
|
|
" Rhist = Rhist.drop(index=n)\n",
|
|
" n += 1\n",
|
|
" # 행삭제에 따른 curr_unix, D_n, S_n 등 재정의\n",
|
|
" if not Rhist[Rhist.index==n]['end_unix'].empty: # 마지막 행을 삭제하여 뒤의 행이 없을 때를 대비\n",
|
|
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" # S_n : 현시시간합\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" # 비율이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n",
|
|
" if (abs(D_n - S_n) > 10) & (R_n > 0.5):\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n",
|
|
" adjusted_dur = prow[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n",
|
|
" # 조정된 현시시간을 정수로 바꿈\n",
|
|
" int_parts = adjusted_dur.apply(lambda x: int(x))\n",
|
|
" frac_parts = adjusted_dur - int_parts\n",
|
|
" difference = int(round(adjusted_dur.sum())) - int_parts.sum()\n",
|
|
" # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n",
|
|
" for _ in range(difference):\n",
|
|
" max_frac_index = frac_parts.idxmax()\n",
|
|
" int_parts[max_frac_index] += 1\n",
|
|
" frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n",
|
|
" Rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n",
|
|
" Rhist.loc[n, 'cycle'] = int_parts.sum() // 2\n",
|
|
" # print(\"gt\", inter_no, curr_unix, round(R_n,2), D_n, S_n)\n",
|
|
" n += 1\n",
|
|
" Rhist = Rhist.drop(columns=['offset', 'D_n', 'S_n'])\n",
|
|
" Rhists.append(Rhist)\n",
|
|
"Rhists = pd.concat(Rhists)\n",
|
|
"Rhists = Rhists.sort_values(by=['end_unix', 'inter_no']).reset_index(drop=True)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>start_hour</th>\n",
|
|
" <th>start_minute</th>\n",
|
|
" <th>start_seconds</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1704380400</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>7</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1704405600</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>9</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>1704412800</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>18</td>\n",
|
|
" <td>30</td>\n",
|
|
" <td>1704447000</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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": 16,
|
|
"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": 11,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def make_rhistory(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",
|
|
" + fmins[m-2] : 시뮬레이션 시작시점\n",
|
|
" + fmins[m-1] : 시뮬레이션 종료시점\n",
|
|
" output : rhistory\n",
|
|
" - recent history\n",
|
|
" - 현재시각(present_time) 이전 1시간 동안의 신호이력에 대하여 결측치 및 이상치를 처리한 결과\n",
|
|
" - 교차로번호(inter_no), 종료유닉스(end_unix), 현시시간(dur_Aj, dur_Bj), 주기(cycle), 옵셋(offset)\n",
|
|
" '''\n",
|
|
" fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
" present_time = fmins[m] # 현재시점\n",
|
|
" print(datetime.fromtimestamp(present_time))\n",
|
|
"\n",
|
|
" Rhists = [] # Recent history (1시간 이내)\n",
|
|
" for inter_no in history.inter_no.unique():\n",
|
|
" # - 5분마다 신호이력 데이터 수집해서 통합테이블 생성할때\n",
|
|
" # 1. 조회시점의 유닉스 타임을 기준으로 신호이력의 유닉스 타임이 1시간 이내인(Rhist) 데이터 수집\n",
|
|
" rhistory = history.copy() # recent history\n",
|
|
" rhistory = rhistory[(rhistory.end_unix < present_time)]\n",
|
|
" hours = np.array(range(midnight, next_day + 1, 3600))\n",
|
|
" rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
" new_rows = []\n",
|
|
" # 1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n",
|
|
" for n in range(len(rhist) - 1):\n",
|
|
" curr_unix = rhist.iloc[n].end_unix # current end_unix\n",
|
|
" next_unix = rhist.iloc[n+1].end_unix # next end_unix\n",
|
|
" cycle = rhist.iloc[n].cycle\n",
|
|
" if next_unix - curr_unix >= 2 * cycle:\n",
|
|
" # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n",
|
|
" #(다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n",
|
|
" while next_unix - curr_unix > cycle:\n",
|
|
" curr_unix += cycle\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n",
|
|
" prow = prow.drop(['start_hour', 'start_minute'], axis=1)\n",
|
|
" prow['end_unix'] = curr_unix\n",
|
|
" cycle = prow.iloc[0].cycle\n",
|
|
" new_rows.append(prow)\n",
|
|
" rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n",
|
|
" rhist = rhist.reset_index(drop=True)\n",
|
|
"\n",
|
|
" # 1-2. 이상치 처리 : 기준유닉스로부터의 시간차이와 현시시간합이 11 이상 차이나면 이상치가 발생했다고 판단\n",
|
|
" Rhist = rhist.copy() # recent history 1704393231\n",
|
|
" Rhist = Rhist[(Rhist.end_unix >= present_time - 3600)] # Recent history (1시간 이내)\n",
|
|
" Rhist = Rhist.reset_index(drop=True)\n",
|
|
" Rhist['D_n'] = 0\n",
|
|
" Rhist['S_n'] = 0\n",
|
|
" for n in range(len(Rhist)):\n",
|
|
" curr_unix = Rhist.iloc[n].end_unix # current end_unix\n",
|
|
" cycle = Rhist.iloc[n].cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" # S_n : 현시시간합\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" Rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n",
|
|
" n = 1\n",
|
|
" while n < len(Rhist):\n",
|
|
" prev_unix = Rhist[Rhist.index==n-1]['end_unix'].iloc[0] # previous end_unix\n",
|
|
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" # S_n : 현시시간합\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" # 비율이 0.5보다 작거나 같으면 해당 행을 삭제\n",
|
|
" if (abs(D_n - S_n) > 10) & (R_n <= 0.5):\n",
|
|
" Rhist = Rhist.drop(index=n)\n",
|
|
" n += 1\n",
|
|
" # 행삭제에 따른 curr_unix, D_n, S_n 등 재정의\n",
|
|
" if not Rhist[Rhist.index==n]['end_unix'].empty: # 마지막 행을 삭제하여 뒤의 행이 없을 때를 대비\n",
|
|
" curr_unix = Rhist[Rhist.index==n]['end_unix'].iloc[0] # current end_unix\n",
|
|
" R_n = (curr_unix - prev_unix) / cycle\n",
|
|
" ghour_lt_curr_unix = hours[hours < curr_unix].max() # the greatest hour less than curr_unix\n",
|
|
" end_unixes = rhist.end_unix.unique()\n",
|
|
" end_unixes_lt_ghour = np.sort(end_unixes[end_unixes < ghour_lt_curr_unix]) # end unixes less than ghour_lt_end_unix\n",
|
|
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
|
|
" # D_n : 시간차이\n",
|
|
" D_n = curr_unix - base_unix\n",
|
|
" # S_n : 현시시간합\n",
|
|
" ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n",
|
|
" S_n = ddurations.values.sum() // 2\n",
|
|
" # 비율이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n",
|
|
" if (abs(D_n - S_n) > 10) & (R_n > 0.5):\n",
|
|
" start_seconds = np.array(timetable.start_seconds)\n",
|
|
" idx = (start_seconds <= curr_unix).sum() - 1\n",
|
|
" start_hour = timetable.iloc[idx].start_hour\n",
|
|
" start_minute = timetable.iloc[idx].start_minute\n",
|
|
" prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n",
|
|
" adjusted_dur = prow[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n",
|
|
" # 조정된 현시시간을 정수로 바꿈\n",
|
|
" int_parts = adjusted_dur.apply(lambda x: int(x))\n",
|
|
" frac_parts = adjusted_dur - int_parts\n",
|
|
" difference = int(round(adjusted_dur.sum())) - int_parts.sum()\n",
|
|
" # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n",
|
|
" for _ in range(difference):\n",
|
|
" max_frac_index = frac_parts.idxmax()\n",
|
|
" int_parts[max_frac_index] += 1\n",
|
|
" frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n",
|
|
" Rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n",
|
|
" Rhist.loc[n, 'cycle'] = int_parts.sum() // 2\n",
|
|
" n += 1\n",
|
|
" Rhist = Rhist.drop(columns=['offset', 'D_n', 'S_n'])\n",
|
|
" Rhists.append(Rhist)\n",
|
|
" Rhists = pd.concat(Rhists)\n",
|
|
" Rhists = Rhists.sort_values(by=['end_unix', 'inter_no']).reset_index(drop=True)\n",
|
|
" return Rhists"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-01-05 08:20:00\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>end_unix</th>\n",
|
|
" <th>dura_A1</th>\n",
|
|
" <th>dura_A2</th>\n",
|
|
" <th>dura_A3</th>\n",
|
|
" <th>dura_A4</th>\n",
|
|
" <th>dura_A5</th>\n",
|
|
" <th>dura_A6</th>\n",
|
|
" <th>dura_A7</th>\n",
|
|
" <th>dura_A8</th>\n",
|
|
" <th>dura_B1</th>\n",
|
|
" <th>dura_B2</th>\n",
|
|
" <th>dura_B3</th>\n",
|
|
" <th>dura_B4</th>\n",
|
|
" <th>dura_B5</th>\n",
|
|
" <th>dura_B6</th>\n",
|
|
" <th>dura_B7</th>\n",
|
|
" <th>dura_B8</th>\n",
|
|
" <th>cycle</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1704406820</td>\n",
|
|
" <td>30</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>30</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>1704406830</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>25</td>\n",
|
|
" <td>71</td>\n",
|
|
" <td>34</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>25</td>\n",
|
|
" <td>71</td>\n",
|
|
" <td>34</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>210</td>\n",
|
|
" <td>1704406850</td>\n",
|
|
" <td>43</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>65</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>65</td>\n",
|
|
" <td>23</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1704406870</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>55</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>29</td>\n",
|
|
" <td>59</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1704406910</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>93</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>93</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>...</th>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" <td>...</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>146</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>1704410269</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>55</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>29</td>\n",
|
|
" <td>59</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>147</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>1704410310</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>93</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>93</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>148</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>1704410310</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>41</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>62</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>149</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>1704410320</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>150</th>\n",
|
|
" <td>201</td>\n",
|
|
" <td>1704410340</td>\n",
|
|
" <td>30</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>30</td>\n",
|
|
" <td>36</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>58</td>\n",
|
|
" <td>18</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>160</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"<p>151 rows × 19 columns</p>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no end_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n",
|
|
"0 201 1704406820 30 36 18 58 18 \n",
|
|
"1 177 1704406830 40 25 71 34 0 \n",
|
|
"2 210 1704406850 43 39 65 23 0 \n",
|
|
"3 175 1704406870 40 42 55 33 0 \n",
|
|
"4 176 1704406910 37 93 40 0 0 \n",
|
|
".. ... ... ... ... ... ... ... \n",
|
|
"146 175 1704410269 40 42 55 33 0 \n",
|
|
"147 176 1704410310 37 93 40 0 0 \n",
|
|
"148 178 1704410310 38 39 42 41 0 \n",
|
|
"149 202 1704410320 46 114 0 0 0 \n",
|
|
"150 201 1704410340 30 36 18 58 18 \n",
|
|
"\n",
|
|
" dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n",
|
|
"0 0 0 0 30 36 18 58 18 \n",
|
|
"1 0 0 0 40 25 71 34 0 \n",
|
|
"2 0 0 0 24 58 65 23 0 \n",
|
|
"3 0 0 0 40 42 29 59 0 \n",
|
|
"4 0 0 0 37 93 40 0 0 \n",
|
|
".. ... ... ... ... ... ... ... ... \n",
|
|
"146 0 0 0 40 42 29 59 0 \n",
|
|
"147 0 0 0 37 93 40 0 0 \n",
|
|
"148 0 0 0 38 39 62 21 0 \n",
|
|
"149 0 0 0 46 114 0 0 0 \n",
|
|
"150 0 0 0 30 36 18 58 18 \n",
|
|
"\n",
|
|
" dura_B6 dura_B7 dura_B8 cycle \n",
|
|
"0 0 0 0 160 \n",
|
|
"1 0 0 0 170 \n",
|
|
"2 0 0 0 170 \n",
|
|
"3 0 0 0 170 \n",
|
|
"4 0 0 0 170 \n",
|
|
".. ... ... ... ... \n",
|
|
"146 0 0 0 170 \n",
|
|
"147 0 0 0 170 \n",
|
|
"148 0 0 0 160 \n",
|
|
"149 0 0 0 160 \n",
|
|
"150 0 0 0 160 \n",
|
|
"\n",
|
|
"[151 rows x 19 columns]"
|
|
]
|
|
},
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"Rhists = make_rhistory(100)\n",
|
|
"Rhists"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def make_histid(m):\n",
|
|
" fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
" present_time = fmins[m]\n",
|
|
" rhistory = make_rhistory(m)\n",
|
|
" # 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력\n",
|
|
" # - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정\n",
|
|
" for i, row in rhistory.iterrows():\n",
|
|
" # 이전 유닉스 존재하지 않음 => 현시시간 합의 차\n",
|
|
" # 이전 유닉스 존재, abs < 10 => 이전 유닉스\n",
|
|
" # 이전 유닉스 존재, abs >=10 => 현시시간 합의 차\n",
|
|
" inter_no = row.inter_no\n",
|
|
" end_unix = row.end_unix\n",
|
|
" elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합\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'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['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",
|
|
"\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",
|
|
" phas_As = [isplit[j][0] for j in isplit.keys()]\n",
|
|
" phas_Bs = [isplit[j][1] for j in isplit.keys()]\n",
|
|
" durs_A = row[[f'dura_A{j}' for j in range(1,9)]]\n",
|
|
" durs_B = row[[f'dura_B{j}' for j in range(1,9)]]\n",
|
|
" durations = []\n",
|
|
" for j in range(1, len(isplit)+1):\n",
|
|
" ja = isplit[j][0]\n",
|
|
" jb = isplit[j][1]\n",
|
|
" if ja == jb:\n",
|
|
" durations.append(min(durs_A[ja-1], durs_B[jb-1]))\n",
|
|
" else:\n",
|
|
" durations.append(abs(durs_A[ja-1] - durs_B[ja-1]))\n",
|
|
" new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations),\n",
|
|
" 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations})\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']) # 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",
|
|
"\n",
|
|
" # 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n",
|
|
" for i, row in movedur.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" start_unix = row.start_unix\n",
|
|
" # incoming and outgoing edges A\n",
|
|
" move_A = row.move_A\n",
|
|
" if move_A in [17, 18]:\n",
|
|
" inc_edge_A = np.nan\n",
|
|
" out_edge_A = np.nan\n",
|
|
" else:\n",
|
|
" match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
|
|
" inc_edge_A = match_A.inc_edge\n",
|
|
" out_edge_A = match_A.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_A', 'out_edge_A']] = [inc_edge_A, out_edge_A]\n",
|
|
" # incoming and outgoing edges B\n",
|
|
" move_B = row.move_B\n",
|
|
" if move_B in [17, 18]:\n",
|
|
" inc_edge_B = np.nan\n",
|
|
" out_edge_B = np.nan\n",
|
|
" else:\n",
|
|
" match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
|
|
" inc_edge_B = match_B.inc_edge\n",
|
|
" out_edge_B = match_B.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_B', 'out_edge_B']] = [inc_edge_B, out_edge_B]\n",
|
|
"\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",
|
|
" histid['node_id'] = histid['inter_no'].map(inter2node)\n",
|
|
" histid = histid[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'duration', 'inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']]\n",
|
|
" histid = histid[histid.start_unix > present_time - 3600]\n",
|
|
" # 시뮬레이션 시작시각 : 현재시각 - 600\n",
|
|
" # 시뮬레이션 종료시각 : 현재시각 - 300\n",
|
|
" # 현재시각 : present_time, PT\n",
|
|
" # PT-900 ... PT-600 ... PT-300 ... PT\n",
|
|
" return histid"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"m = 120\n",
|
|
"fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n",
|
|
"present_time = fmins[m]\n",
|
|
"rhistory = make_rhistory(m)\n",
|
|
"# 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력\n",
|
|
"# - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정\n",
|
|
"for i, row in rhistory.iterrows():\n",
|
|
" # 이전 유닉스 존재하지 않음 => 현시시간 합의 차\n",
|
|
" # 이전 유닉스 존재, abs < 10 => 이전 유닉스\n",
|
|
" # 이전 유닉스 존재, abs >=10 => 현시시간 합의 차\n",
|
|
" inter_no = row.inter_no\n",
|
|
" end_unix = row.end_unix\n",
|
|
" elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합\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'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n",
|
|
"\n",
|
|
"# rhistoryy = rhistory.copy()[rhistory.inter_no==175]\n",
|
|
"# rhistoryy['diff'] = rhistoryy['start_unix'].diff()\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",
|
|
"\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",
|
|
" phas_As = [isplit[j][0] for j in isplit.keys()]\n",
|
|
" phas_Bs = [isplit[j][1] for j in isplit.keys()]\n",
|
|
" durs_A = row[[f'dura_A{j}' for j in range(1,9)]]\n",
|
|
" durs_B = row[[f'dura_B{j}' for j in range(1,9)]]\n",
|
|
" durations = []\n",
|
|
" for j in range(1, len(isplit)+1):\n",
|
|
" ja = isplit[j][0]\n",
|
|
" jb = isplit[j][1]\n",
|
|
" if ja == jb:\n",
|
|
" durations.append(min(durs_A[ja-1], durs_B[jb-1]))\n",
|
|
" else:\n",
|
|
" durations.append(abs(durs_A[ja-1] - durs_B[ja-1]))\n",
|
|
" new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations),\n",
|
|
" 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations})\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",
|
|
"hrhistoryy = rhistory.copy()[rhistory.inter_no==175]\n",
|
|
"hrhistoryy['diff'] = hrhistoryy['start_unix'].diff()\n",
|
|
"\n",
|
|
"# display(hrhistoryy[:60])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"for inter_no in sorted(plan.inter_no.unique()):\n",
|
|
" print(inter_no)\n",
|
|
" movement = time2movement[present_time]\n",
|
|
" movementt = movement.copy()[movement.inter_no==inter_no]\n",
|
|
" hrhistoryy = rhistory.copy()[rhistory.inter_no==inter_no]\n",
|
|
" mdts = sorted(movementt.start_unix.unique())\n",
|
|
" hdts = sorted(hrhistoryy.start_unix.unique())\n",
|
|
" import matplotlib.pyplot as plt\n",
|
|
" plt.scatter(mdts, [0]*len(mdts), c='b')\n",
|
|
" plt.scatter(hdts, [1]*len(hdts), c='r')\n",
|
|
" plt.show()\n",
|
|
" # display(movementt)\n",
|
|
" # display(hrhistoryy)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# 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']) # 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",
|
|
"\n",
|
|
"# 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n",
|
|
"for i, row in movedur.iterrows():\n",
|
|
" inter_no = row.inter_no\n",
|
|
" start_unix = row.start_unix\n",
|
|
" # incoming and outgoing edges A\n",
|
|
" move_A = row.move_A\n",
|
|
" if move_A in [17, 18]:\n",
|
|
" inc_edge_A = np.nan\n",
|
|
" out_edge_A = np.nan\n",
|
|
" else:\n",
|
|
" match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
|
|
" inc_edge_A = match_A.inc_edge\n",
|
|
" out_edge_A = match_A.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_A', 'out_edge_A']] = [inc_edge_A, out_edge_A]\n",
|
|
" # incoming and outgoing edges B\n",
|
|
" move_B = row.move_B\n",
|
|
" if move_B in [17, 18]:\n",
|
|
" inc_edge_B = np.nan\n",
|
|
" out_edge_B = np.nan\n",
|
|
" else:\n",
|
|
" match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
|
|
" inc_edge_B = match_B.inc_edge\n",
|
|
" out_edge_B = match_B.out_edge\n",
|
|
" movedur.loc[i, ['inc_edge_B', 'out_edge_B']] = [inc_edge_B, out_edge_B]\n",
|
|
"\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",
|
|
"histid['node_id'] = histid['inter_no'].map(inter2node)\n",
|
|
"histid = histid[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'duration', 'inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']]\n",
|
|
"histid = histid[histid.start_unix > present_time - 3600]\n",
|
|
"# 시뮬레이션 시작시각 : 현재시각 - 600\n",
|
|
"# 시뮬레이션 종료시각 : 현재시각 - 300\n",
|
|
"# 현재시각 : present_time, PT\n",
|
|
"# PT-900 ... PT-600 ... PT-300 ... PT\n",
|
|
"\n",
|
|
"histidd = histid.copy()[histid.inter_no==175]\n",
|
|
"histidd['diff'] = histidd['start_unix'].diff()\n",
|
|
"histidd[:60]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-01-05 08:20:00\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>inter_no</th>\n",
|
|
" <th>node_id</th>\n",
|
|
" <th>start_unix</th>\n",
|
|
" <th>phas_A</th>\n",
|
|
" <th>phas_B</th>\n",
|
|
" <th>duration</th>\n",
|
|
" <th>inc_edge_A</th>\n",
|
|
" <th>out_edge_A</th>\n",
|
|
" <th>inc_edge_B</th>\n",
|
|
" <th>out_edge_B</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704406830</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704406830</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>25</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542107_01</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704406830</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>71</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704406830</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>34</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>571542107_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704406870</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704406870</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704406870</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>29</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704406870</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704406870</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704406910</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>571542797_02.99</td>\n",
|
|
" <td>571542810_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704406910</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>93</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>571543469_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704406910</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>571543469_02</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704406950</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571540304_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704406950</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>571556450_02</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" <td>571540304_02</td>\n",
|
|
" <td>571540303_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704406950</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>571540303_02.21</td>\n",
|
|
" <td>571556450_01</td>\n",
|
|
" <td>571540303_02.21</td>\n",
|
|
" <td>571500475_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>178</td>\n",
|
|
" <td>i3</td>\n",
|
|
" <td>1704406950</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>-571500475_01</td>\n",
|
|
" <td>571540303_01</td>\n",
|
|
" <td>-571500475_01</td>\n",
|
|
" <td>571540304_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704406950</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>46</td>\n",
|
|
" <td>571510152_02</td>\n",
|
|
" <td>-571510152_01</td>\n",
|
|
" <td>571510152_01</td>\n",
|
|
" <td>571510152_01.65</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>202</td>\n",
|
|
" <td>i9</td>\n",
|
|
" <td>1704406950</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>114</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704407000</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704407000</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>25</td>\n",
|
|
" <td>571542811_02</td>\n",
|
|
" <td>571542107_01</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704407000</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>71</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>177</td>\n",
|
|
" <td>i2</td>\n",
|
|
" <td>1704407000</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>34</td>\n",
|
|
" <td>-571542809_01</td>\n",
|
|
" <td>571542811_01</td>\n",
|
|
" <td>571542107_02</td>\n",
|
|
" <td>571542809_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704407040</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704407040</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>42</td>\n",
|
|
" <td>-571500487_01</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" <td>-571542797_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704407040</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>29</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571542797_02</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>25</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704407040</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>26</td>\n",
|
|
" <td>571545870_02</td>\n",
|
|
" <td>571510153_01</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>175</td>\n",
|
|
" <td>i0</td>\n",
|
|
" <td>1704407040</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>33</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571500487_01</td>\n",
|
|
" <td>571510153_02</td>\n",
|
|
" <td>571545870_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>27</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704407080</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>37</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>571542797_02.99</td>\n",
|
|
" <td>571542810_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>28</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704407080</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>93</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>-571542810_01</td>\n",
|
|
" <td>571543469_01</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>176</td>\n",
|
|
" <td>i1</td>\n",
|
|
" <td>1704407080</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>571543469_02</td>\n",
|
|
" <td>-571542797_02.99</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
|
|
"0 177 i2 1704406830 1 1 40 -571542809_01 \n",
|
|
"1 177 i2 1704406830 2 2 25 571542811_02 \n",
|
|
"2 177 i2 1704406830 3 3 71 NaN \n",
|
|
"3 177 i2 1704406830 4 4 34 -571542809_01 \n",
|
|
"4 175 i0 1704406870 1 1 40 -571542797_02 \n",
|
|
"5 175 i0 1704406870 2 2 42 -571500487_01 \n",
|
|
"6 175 i0 1704406870 3 3 29 571545870_02 \n",
|
|
"7 175 i0 1704406870 3 4 26 571545870_02 \n",
|
|
"8 175 i0 1704406870 4 4 33 571510153_02 \n",
|
|
"9 176 i1 1704406910 1 1 37 -571542810_01 \n",
|
|
"10 176 i1 1704406910 2 2 93 -571542810_01 \n",
|
|
"11 176 i1 1704406910 3 3 40 571543469_02 \n",
|
|
"12 178 i3 1704406950 1 1 38 571540304_02 \n",
|
|
"13 178 i3 1704406950 2 2 39 571556450_02 \n",
|
|
"14 178 i3 1704406950 3 3 42 571540303_02.21 \n",
|
|
"15 178 i3 1704406950 4 4 21 -571500475_01 \n",
|
|
"16 202 i9 1704406950 1 1 46 571510152_02 \n",
|
|
"17 202 i9 1704406950 2 2 114 NaN \n",
|
|
"18 177 i2 1704407000 1 1 40 -571542809_01 \n",
|
|
"19 177 i2 1704407000 2 2 25 571542811_02 \n",
|
|
"20 177 i2 1704407000 3 3 71 NaN \n",
|
|
"21 177 i2 1704407000 4 4 34 -571542809_01 \n",
|
|
"22 175 i0 1704407040 1 1 40 -571542797_02 \n",
|
|
"23 175 i0 1704407040 2 2 42 -571500487_01 \n",
|
|
"24 175 i0 1704407040 3 3 29 571545870_02 \n",
|
|
"25 175 i0 1704407040 3 4 26 571545870_02 \n",
|
|
"26 175 i0 1704407040 4 4 33 571510153_02 \n",
|
|
"27 176 i1 1704407080 1 1 37 -571542810_01 \n",
|
|
"28 176 i1 1704407080 2 2 93 -571542810_01 \n",
|
|
"29 176 i1 1704407080 3 3 40 571543469_02 \n",
|
|
"\n",
|
|
" out_edge_A inc_edge_B out_edge_B \n",
|
|
"0 571542811_01 571542811_02 571542809_01 \n",
|
|
"1 571542107_01 -571542809_01 571542809_01 \n",
|
|
"2 NaN NaN NaN \n",
|
|
"3 571542811_01 571542107_02 571542809_01 \n",
|
|
"4 571500487_01 -571500487_01 571542797_02 \n",
|
|
"5 571545870_01 -571542797_02 571510153_01 \n",
|
|
"6 571510153_01 571545870_02 571542797_02 \n",
|
|
"7 571510153_01 571510153_02 571545870_01 \n",
|
|
"8 571500487_01 571510153_02 571545870_01 \n",
|
|
"9 -571542797_02.99 571542797_02.99 571542810_01 \n",
|
|
"10 -571542797_02.99 -571542810_01 571543469_01 \n",
|
|
"11 -571542797_02.99 NaN NaN \n",
|
|
"12 571556450_01 571556450_02 571540304_01 \n",
|
|
"13 571500475_01 571540304_02 571540303_01 \n",
|
|
"14 571556450_01 571540303_02.21 571500475_01 \n",
|
|
"15 571540303_01 -571500475_01 571540304_01 \n",
|
|
"16 -571510152_01 571510152_01 571510152_01.65 \n",
|
|
"17 NaN NaN NaN \n",
|
|
"18 571542811_01 571542811_02 571542809_01 \n",
|
|
"19 571542107_01 -571542809_01 571542809_01 \n",
|
|
"20 NaN NaN NaN \n",
|
|
"21 571542811_01 571542107_02 571542809_01 \n",
|
|
"22 571500487_01 -571500487_01 571542797_02 \n",
|
|
"23 571545870_01 -571542797_02 571510153_01 \n",
|
|
"24 571510153_01 571545870_02 571542797_02 \n",
|
|
"25 571510153_01 571510153_02 571545870_01 \n",
|
|
"26 571500487_01 571510153_02 571545870_01 \n",
|
|
"27 -571542797_02.99 571542797_02.99 571542810_01 \n",
|
|
"28 -571542797_02.99 -571542810_01 571543469_01 \n",
|
|
"29 -571542797_02.99 NaN NaN "
|
|
]
|
|
},
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"make_histid(100)[:30]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"inter_no = 175\n",
|
|
"rhist = make_histid(100)\n",
|
|
"rhis = rhist.copy()[rhist.inter_no==inter_no]\n",
|
|
"rhis['diff'] = rhis['start_unix'].diff()\n",
|
|
"rhis[:60]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"inter_no = 175\n",
|
|
"histid = make_histid(100)\n",
|
|
"his = histid.copy()[histid.inter_no==inter_no]\n",
|
|
"his['diff'] = his['start_unix'].diff()\n",
|
|
"his[:60]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"for m in range(30, 288):\n",
|
|
" print(m)\n",
|
|
" make_histid(m).to_csv(f'../../Data/tables/histids/histids_{fmins[m]}.csv')"
|
|
]
|
|
}
|
|
],
|
|
"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
|
|
}
|