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

11446 lines
410 KiB

{
"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%| | 15/17280 [00:00<01:56, 148.29it/s]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17280/17280 [01:11<00:00, 242.06it/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%| | 8/17280 [00:00<04:13, 68.11it/s]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17280/17280 [04:19<00:00, 66.61it/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 16:40:00\n"
]
}
],
"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",
"# 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",
"inter_no = 201"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"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"
]
},
{
"cell_type": "code",
"execution_count": 15,
"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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" <th>diff</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>202</td>\n",
" <td>1704389500</td>\n",
" <td>140</td>\n",
" <td>2520</td>\n",
" <td>2520</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66</th>\n",
" <td>202</td>\n",
" <td>1704389640</td>\n",
" <td>140</td>\n",
" <td>2660</td>\n",
" <td>2660</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67</th>\n",
" <td>202</td>\n",
" <td>1704389780</td>\n",
" <td>140</td>\n",
" <td>2800</td>\n",
" <td>2800</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68</th>\n",
" <td>202</td>\n",
" <td>1704389920</td>\n",
" <td>140</td>\n",
" <td>2940</td>\n",
" <td>2940</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>202</td>\n",
" <td>1704390389</td>\n",
" <td>140</td>\n",
" <td>3409</td>\n",
" <td>3080</td>\n",
" <td>469.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>202</td>\n",
" <td>1704390529</td>\n",
" <td>140</td>\n",
" <td>3549</td>\n",
" <td>3220</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>71</th>\n",
" <td>202</td>\n",
" <td>1704390670</td>\n",
" <td>140</td>\n",
" <td>3690</td>\n",
" <td>3360</td>\n",
" <td>141.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>72</th>\n",
" <td>202</td>\n",
" <td>1704390810</td>\n",
" <td>140</td>\n",
" <td>3830</td>\n",
" <td>3500</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73</th>\n",
" <td>202</td>\n",
" <td>1704390950</td>\n",
" <td>140</td>\n",
" <td>3970</td>\n",
" <td>3640</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>74</th>\n",
" <td>202</td>\n",
" <td>1704391090</td>\n",
" <td>140</td>\n",
" <td>4110</td>\n",
" <td>3780</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75</th>\n",
" <td>202</td>\n",
" <td>1704391230</td>\n",
" <td>140</td>\n",
" <td>701</td>\n",
" <td>700</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>76</th>\n",
" <td>202</td>\n",
" <td>1704391370</td>\n",
" <td>140</td>\n",
" <td>841</td>\n",
" <td>840</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>202</td>\n",
" <td>1704391509</td>\n",
" <td>140</td>\n",
" <td>980</td>\n",
" <td>980</td>\n",
" <td>139.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td>202</td>\n",
" <td>1704391650</td>\n",
" <td>140</td>\n",
" <td>1121</td>\n",
" <td>1120</td>\n",
" <td>141.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>202</td>\n",
" <td>1704391790</td>\n",
" <td>140</td>\n",
" <td>1261</td>\n",
" <td>1260</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td>202</td>\n",
" <td>1704391930</td>\n",
" <td>140</td>\n",
" <td>1401</td>\n",
" <td>1400</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>202</td>\n",
" <td>1704392070</td>\n",
" <td>140</td>\n",
" <td>1541</td>\n",
" <td>1540</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>82</th>\n",
" <td>202</td>\n",
" <td>1704392211</td>\n",
" <td>140</td>\n",
" <td>1682</td>\n",
" <td>1680</td>\n",
" <td>141.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>83</th>\n",
" <td>202</td>\n",
" <td>1704392350</td>\n",
" <td>140</td>\n",
" <td>1821</td>\n",
" <td>1820</td>\n",
" <td>139.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>202</td>\n",
" <td>1704392490</td>\n",
" <td>140</td>\n",
" <td>1961</td>\n",
" <td>1960</td>\n",
" <td>140.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix cycle D_n S_n diff\n",
"65 202 1704389500 140 2520 2520 140.0\n",
"66 202 1704389640 140 2660 2660 140.0\n",
"67 202 1704389780 140 2800 2800 140.0\n",
"68 202 1704389920 140 2940 2940 140.0\n",
"69 202 1704390389 140 3409 3080 469.0\n",
"70 202 1704390529 140 3549 3220 140.0\n",
"71 202 1704390670 140 3690 3360 141.0\n",
"72 202 1704390810 140 3830 3500 140.0\n",
"73 202 1704390950 140 3970 3640 140.0\n",
"74 202 1704391090 140 4110 3780 140.0\n",
"75 202 1704391230 140 701 700 140.0\n",
"76 202 1704391370 140 841 840 140.0\n",
"77 202 1704391509 140 980 980 139.0\n",
"78 202 1704391650 140 1121 1120 141.0\n",
"79 202 1704391790 140 1261 1260 140.0\n",
"80 202 1704391930 140 1401 1400 140.0\n",
"81 202 1704392070 140 1541 1540 140.0\n",
"82 202 1704392211 140 1682 1680 141.0\n",
"83 202 1704392350 140 1821 1820 139.0\n",
"84 202 1704392490 140 1961 1960 140.0"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"inter_no = 202\n",
"# 2-1. 참값 판단 프로세스\n",
"hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n",
"\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",
"fina_unix = rhist.start_unix.max() # final start_unix\n",
"rhist_diff = rhist.copy()\n",
"rhist_diff['diff'] = rhist['start_unix'].diff()\n",
"rhist_diff[list(rhist_diff.columns)[:2]+list(rhist_diff.columns)[-4:]][65:85]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([175, 176, 177, 178, 201, 202, 206, 210], dtype=int64)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plan.inter_no.unique()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"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>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>11</td>\n",
" <td>111</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>222</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>33</td>\n",
" <td>333</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" a b c\n",
"0 1 11 111\n",
"1 2 22 222\n",
"2 3 33 333"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"22"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame({'a':[1,2,3],'b':[11,22,33], 'c':[111,222,333]})\n",
"display(df)\n",
"# curr_unix = rhist.loc[n, 'start_unix']\n",
"df.loc[1,'b']\n"
]
},
{
"cell_type": "code",
"execution_count": 91,
"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>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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" <th>diff</th>\n",
" <th>start_dt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>176</td>\n",
" <td>1704384054</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>804</td>\n",
" <td>750</td>\n",
" <td>204.0</td>\n",
" <td>2024-01-05 01:00:54</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>176</td>\n",
" <td>1704392578</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2078</td>\n",
" <td>2100</td>\n",
" <td>128.0</td>\n",
" <td>2024-01-05 03:22:58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>143</th>\n",
" <td>176</td>\n",
" <td>1704402004</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>874</td>\n",
" <td>750</td>\n",
" <td>274.0</td>\n",
" <td>2024-01-05 06:00:04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>144</th>\n",
" <td>176</td>\n",
" <td>1704402240</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1110</td>\n",
" <td>900</td>\n",
" <td>236.0</td>\n",
" <td>2024-01-05 06:04:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>167</th>\n",
" <td>176</td>\n",
" <td>1704405690</td>\n",
" <td>37</td>\n",
" <td>93</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>750</td>\n",
" <td>770</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 07:01:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>171</th>\n",
" <td>176</td>\n",
" <td>1704406231</td>\n",
" <td>37</td>\n",
" <td>93</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>1291</td>\n",
" <td>1450</td>\n",
" <td>31.0</td>\n",
" <td>2024-01-05 07:10:31</td>\n",
" </tr>\n",
" <tr>\n",
" <th>210</th>\n",
" <td>176</td>\n",
" <td>1704412860</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>851</td>\n",
" <td>860</td>\n",
" <td>169.0</td>\n",
" <td>2024-01-05 09:01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>253</th>\n",
" <td>176</td>\n",
" <td>1704420442</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1283</td>\n",
" <td>1440</td>\n",
" <td>22.0</td>\n",
" <td>2024-01-05 11:07:22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>277</th>\n",
" <td>176</td>\n",
" <td>1704424600</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1820</td>\n",
" <td>1980</td>\n",
" <td>20.0</td>\n",
" <td>2024-01-05 12:16:40</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n",
"24 176 1704384054 37 73 40 0 0 150 \n",
"81 176 1704392578 37 73 40 0 0 150 \n",
"143 176 1704402004 37 73 40 0 0 150 \n",
"144 176 1704402240 37 73 40 0 0 150 \n",
"167 176 1704405690 37 93 40 0 0 170 \n",
"171 176 1704406231 37 93 40 0 0 170 \n",
"210 176 1704412860 37 103 40 0 0 180 \n",
"253 176 1704420442 37 103 40 0 0 180 \n",
"277 176 1704424600 37 103 40 0 0 180 \n",
"\n",
" D_n S_n diff start_dt \n",
"24 804 750 204.0 2024-01-05 01:00:54 \n",
"81 2078 2100 128.0 2024-01-05 03:22:58 \n",
"143 874 750 274.0 2024-01-05 06:00:04 \n",
"144 1110 900 236.0 2024-01-05 06:04:00 \n",
"167 750 770 150.0 2024-01-05 07:01:30 \n",
"171 1291 1450 31.0 2024-01-05 07:10:31 \n",
"210 851 860 169.0 2024-01-05 09:01:00 \n",
"253 1283 1440 22.0 2024-01-05 11:07:22 \n",
"277 1820 1980 20.0 2024-01-05 12:16:40 "
]
},
"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>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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" <th>diff</th>\n",
" <th>start_dt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>176</td>\n",
" <td>1704390950</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>4050</td>\n",
" <td>4050</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 02:55:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>71</th>\n",
" <td>176</td>\n",
" <td>1704391100</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>4200</td>\n",
" <td>4200</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 02:58:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>72</th>\n",
" <td>176</td>\n",
" <td>1704391250</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>750</td>\n",
" <td>750</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:00:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73</th>\n",
" <td>176</td>\n",
" <td>1704391399</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>899</td>\n",
" <td>900</td>\n",
" <td>149.0</td>\n",
" <td>2024-01-05 03:03:19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>74</th>\n",
" <td>176</td>\n",
" <td>1704391550</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1050</td>\n",
" <td>1050</td>\n",
" <td>151.0</td>\n",
" <td>2024-01-05 03:05:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75</th>\n",
" <td>176</td>\n",
" <td>1704391700</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1200</td>\n",
" <td>1200</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:08:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>76</th>\n",
" <td>176</td>\n",
" <td>1704391850</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1350</td>\n",
" <td>1350</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:10:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>176</td>\n",
" <td>1704392000</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1500</td>\n",
" <td>1500</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:13:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td>176</td>\n",
" <td>1704392151</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1651</td>\n",
" <td>1650</td>\n",
" <td>151.0</td>\n",
" <td>2024-01-05 03:15:51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>176</td>\n",
" <td>1704392300</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1800</td>\n",
" <td>1800</td>\n",
" <td>149.0</td>\n",
" <td>2024-01-05 03:18:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td>176</td>\n",
" <td>1704392450</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1950</td>\n",
" <td>1950</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:20:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>176</td>\n",
" <td>1704392578</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2078</td>\n",
" <td>2100</td>\n",
" <td>128.0</td>\n",
" <td>2024-01-05 03:22:58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>82</th>\n",
" <td>176</td>\n",
" <td>1704392728</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2228</td>\n",
" <td>2250</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:25:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>83</th>\n",
" <td>176</td>\n",
" <td>1704392880</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2380</td>\n",
" <td>2400</td>\n",
" <td>152.0</td>\n",
" <td>2024-01-05 03:28:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>176</td>\n",
" <td>1704393030</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2530</td>\n",
" <td>2550</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:30:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>85</th>\n",
" <td>176</td>\n",
" <td>1704393180</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2680</td>\n",
" <td>2700</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:33:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>86</th>\n",
" <td>176</td>\n",
" <td>1704393330</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2830</td>\n",
" <td>2850</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:35:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>87</th>\n",
" <td>176</td>\n",
" <td>1704393480</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2980</td>\n",
" <td>3000</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:38:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>88</th>\n",
" <td>176</td>\n",
" <td>1704393630</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>3130</td>\n",
" <td>3150</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:40:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>89</th>\n",
" <td>176</td>\n",
" <td>1704393780</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>3280</td>\n",
" <td>3300</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:43:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n",
"70 176 1704390950 37 73 40 0 0 150 \n",
"71 176 1704391100 37 73 40 0 0 150 \n",
"72 176 1704391250 37 73 40 0 0 150 \n",
"73 176 1704391399 37 73 40 0 0 150 \n",
"74 176 1704391550 37 73 40 0 0 150 \n",
"75 176 1704391700 37 73 40 0 0 150 \n",
"76 176 1704391850 37 73 40 0 0 150 \n",
"77 176 1704392000 37 73 40 0 0 150 \n",
"78 176 1704392151 37 73 40 0 0 150 \n",
"79 176 1704392300 37 73 40 0 0 150 \n",
"80 176 1704392450 37 73 40 0 0 150 \n",
"81 176 1704392578 37 73 40 0 0 150 \n",
"82 176 1704392728 37 73 40 0 0 150 \n",
"83 176 1704392880 37 73 40 0 0 150 \n",
"84 176 1704393030 37 73 40 0 0 150 \n",
"85 176 1704393180 37 73 40 0 0 150 \n",
"86 176 1704393330 37 73 40 0 0 150 \n",
"87 176 1704393480 37 73 40 0 0 150 \n",
"88 176 1704393630 37 73 40 0 0 150 \n",
"89 176 1704393780 37 73 40 0 0 150 \n",
"\n",
" D_n S_n diff start_dt \n",
"70 4050 4050 150.0 2024-01-05 02:55:50 \n",
"71 4200 4200 150.0 2024-01-05 02:58:20 \n",
"72 750 750 150.0 2024-01-05 03:00:50 \n",
"73 899 900 149.0 2024-01-05 03:03:19 \n",
"74 1050 1050 151.0 2024-01-05 03:05:50 \n",
"75 1200 1200 150.0 2024-01-05 03:08:20 \n",
"76 1350 1350 150.0 2024-01-05 03:10:50 \n",
"77 1500 1500 150.0 2024-01-05 03:13:20 \n",
"78 1651 1650 151.0 2024-01-05 03:15:51 \n",
"79 1800 1800 149.0 2024-01-05 03:18:20 \n",
"80 1950 1950 150.0 2024-01-05 03:20:50 \n",
"81 2078 2100 128.0 2024-01-05 03:22:58 \n",
"82 2228 2250 150.0 2024-01-05 03:25:28 \n",
"83 2380 2400 152.0 2024-01-05 03:28:00 \n",
"84 2530 2550 150.0 2024-01-05 03:30:30 \n",
"85 2680 2700 150.0 2024-01-05 03:33:00 \n",
"86 2830 2850 150.0 2024-01-05 03:35:30 \n",
"87 2980 3000 150.0 2024-01-05 03:38:00 \n",
"88 3130 3150 150.0 2024-01-05 03:40:30 \n",
"89 3280 3300 150.0 2024-01-05 03:43:00 "
]
},
"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>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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" <th>diff</th>\n",
" <th>start_dt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>176</td>\n",
" <td>1704390950</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>4050</td>\n",
" <td>4050</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 02:55:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>71</th>\n",
" <td>176</td>\n",
" <td>1704391100</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>4200</td>\n",
" <td>4200</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 02:58:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>72</th>\n",
" <td>176</td>\n",
" <td>1704391250</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>750</td>\n",
" <td>750</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:00:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73</th>\n",
" <td>176</td>\n",
" <td>1704391399</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>899</td>\n",
" <td>900</td>\n",
" <td>149.0</td>\n",
" <td>2024-01-05 03:03:19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>74</th>\n",
" <td>176</td>\n",
" <td>1704391550</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1050</td>\n",
" <td>1050</td>\n",
" <td>151.0</td>\n",
" <td>2024-01-05 03:05:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75</th>\n",
" <td>176</td>\n",
" <td>1704391700</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1200</td>\n",
" <td>1200</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:08:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>76</th>\n",
" <td>176</td>\n",
" <td>1704391850</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1350</td>\n",
" <td>1350</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:10:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>176</td>\n",
" <td>1704392000</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1500</td>\n",
" <td>1500</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:13:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td>176</td>\n",
" <td>1704392151</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1651</td>\n",
" <td>1650</td>\n",
" <td>151.0</td>\n",
" <td>2024-01-05 03:15:51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>176</td>\n",
" <td>1704392300</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1800</td>\n",
" <td>1800</td>\n",
" <td>149.0</td>\n",
" <td>2024-01-05 03:18:20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td>176</td>\n",
" <td>1704392450</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>1950</td>\n",
" <td>1950</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:20:50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>176</td>\n",
" <td>1704392578</td>\n",
" <td>32</td>\n",
" <td>62</td>\n",
" <td>34</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>128</td>\n",
" <td>2078</td>\n",
" <td>2078</td>\n",
" <td>128.0</td>\n",
" <td>2024-01-05 03:22:58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>82</th>\n",
" <td>176</td>\n",
" <td>1704392728</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2228</td>\n",
" <td>2228</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:25:28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>83</th>\n",
" <td>176</td>\n",
" <td>1704392880</td>\n",
" <td>37</td>\n",
" <td>74</td>\n",
" <td>41</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>152</td>\n",
" <td>2380</td>\n",
" <td>2380</td>\n",
" <td>152.0</td>\n",
" <td>2024-01-05 03:28:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>176</td>\n",
" <td>1704393030</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2530</td>\n",
" <td>2530</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:30:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>85</th>\n",
" <td>176</td>\n",
" <td>1704393180</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2680</td>\n",
" <td>2680</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:33:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>86</th>\n",
" <td>176</td>\n",
" <td>1704393330</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2830</td>\n",
" <td>2830</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:35:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>87</th>\n",
" <td>176</td>\n",
" <td>1704393480</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>2980</td>\n",
" <td>2980</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:38:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>88</th>\n",
" <td>176</td>\n",
" <td>1704393630</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>3130</td>\n",
" <td>3130</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:40:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>89</th>\n",
" <td>176</td>\n",
" <td>1704393780</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>3280</td>\n",
" <td>3280</td>\n",
" <td>150.0</td>\n",
" <td>2024-01-05 03:43:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n",
"70 176 1704390950 37 73 40 0 0 150 \n",
"71 176 1704391100 37 73 40 0 0 150 \n",
"72 176 1704391250 37 73 40 0 0 150 \n",
"73 176 1704391399 37 73 40 0 0 150 \n",
"74 176 1704391550 37 73 40 0 0 150 \n",
"75 176 1704391700 37 73 40 0 0 150 \n",
"76 176 1704391850 37 73 40 0 0 150 \n",
"77 176 1704392000 37 73 40 0 0 150 \n",
"78 176 1704392151 37 73 40 0 0 150 \n",
"79 176 1704392300 37 73 40 0 0 150 \n",
"80 176 1704392450 37 73 40 0 0 150 \n",
"81 176 1704392578 32 62 34 0 0 128 \n",
"82 176 1704392728 37 73 40 0 0 150 \n",
"83 176 1704392880 37 74 41 0 0 152 \n",
"84 176 1704393030 37 73 40 0 0 150 \n",
"85 176 1704393180 37 73 40 0 0 150 \n",
"86 176 1704393330 37 73 40 0 0 150 \n",
"87 176 1704393480 37 73 40 0 0 150 \n",
"88 176 1704393630 37 73 40 0 0 150 \n",
"89 176 1704393780 37 73 40 0 0 150 \n",
"\n",
" D_n S_n diff start_dt \n",
"70 4050 4050 150.0 2024-01-05 02:55:50 \n",
"71 4200 4200 150.0 2024-01-05 02:58:20 \n",
"72 750 750 150.0 2024-01-05 03:00:50 \n",
"73 899 900 149.0 2024-01-05 03:03:19 \n",
"74 1050 1050 151.0 2024-01-05 03:05:50 \n",
"75 1200 1200 150.0 2024-01-05 03:08:20 \n",
"76 1350 1350 150.0 2024-01-05 03:10:50 \n",
"77 1500 1500 150.0 2024-01-05 03:13:20 \n",
"78 1651 1650 151.0 2024-01-05 03:15:51 \n",
"79 1800 1800 149.0 2024-01-05 03:18:20 \n",
"80 1950 1950 150.0 2024-01-05 03:20:50 \n",
"81 2078 2078 128.0 2024-01-05 03:22:58 \n",
"82 2228 2228 150.0 2024-01-05 03:25:28 \n",
"83 2380 2380 152.0 2024-01-05 03:28:00 \n",
"84 2530 2530 150.0 2024-01-05 03:30:30 \n",
"85 2680 2680 150.0 2024-01-05 03:33:00 \n",
"86 2830 2830 150.0 2024-01-05 03:35:30 \n",
"87 2980 2980 150.0 2024-01-05 03:38:00 \n",
"88 3130 3130 150.0 2024-01-05 03:40:30 \n",
"89 3280 3280 150.0 2024-01-05 03:43:00 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"inter_no = 176\n",
"a, b = 70, 90\n",
"# 2-1. 참값 판단 프로세스\n",
"hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n",
"\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",
"rhist_diff = rhist.copy()\n",
"rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n",
"rhist_diff = rhist_diff[list(rhist_diff.columns)[:7] + list(rhist_diff.columns)[-4:]]\n",
"rhist_diff['start_dt'] = rhist_diff['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n",
"display(rhist_diff[abs(rhist_diff['diff'] - rhist_diff['cycle'])>10])\n",
"display(rhist_diff[a:b])\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",
"\n",
"rhist_diff = rhist.copy()\n",
"rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n",
"rhist_diff = rhist_diff[list(rhist_diff.columns)[:7] + list(rhist_diff.columns)[-4:]]\n",
"rhist_diff['start_dt'] = rhist_diff['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n",
"display(rhist_diff[a:b])"
]
},
{
"cell_type": "code",
"execution_count": 237,
"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>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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>260</th>\n",
" <td>177</td>\n",
" <td>1704421770</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2520</td>\n",
" <td>2520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>261</th>\n",
" <td>177</td>\n",
" <td>1704421950</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2700</td>\n",
" <td>2700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>262</th>\n",
" <td>177</td>\n",
" <td>1704422130</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2880</td>\n",
" <td>2880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>263</th>\n",
" <td>177</td>\n",
" <td>1704422310</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3060</td>\n",
" <td>3060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>264</th>\n",
" <td>177</td>\n",
" <td>1704422490</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3240</td>\n",
" <td>3240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>265</th>\n",
" <td>177</td>\n",
" <td>1704422670</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3420</td>\n",
" <td>3420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>266</th>\n",
" <td>177</td>\n",
" <td>1704422849</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3599</td>\n",
" <td>3600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>267</th>\n",
" <td>177</td>\n",
" <td>1704423030</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3780</td>\n",
" <td>3780</td>\n",
" </tr>\n",
" <tr>\n",
" <th>268</th>\n",
" <td>177</td>\n",
" <td>1704423210</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3960</td>\n",
" <td>3960</td>\n",
" </tr>\n",
" <tr>\n",
" <th>269</th>\n",
" <td>177</td>\n",
" <td>1704423390</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4140</td>\n",
" <td>4140</td>\n",
" </tr>\n",
" <tr>\n",
" <th>270</th>\n",
" <td>177</td>\n",
" <td>1704423570</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4320</td>\n",
" <td>4320</td>\n",
" </tr>\n",
" <tr>\n",
" <th>271</th>\n",
" <td>177</td>\n",
" <td>1704423750</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>901</td>\n",
" <td>900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>272</th>\n",
" <td>177</td>\n",
" <td>1704423929</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1080</td>\n",
" <td>1080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>273</th>\n",
" <td>177</td>\n",
" <td>1704424110</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1261</td>\n",
" <td>1260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>274</th>\n",
" <td>177</td>\n",
" <td>1704424290</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1441</td>\n",
" <td>1440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>275</th>\n",
" <td>177</td>\n",
" <td>1704424469</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1620</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704424649</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1800</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704424829</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1980</td>\n",
" <td>1800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704425009</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2160</td>\n",
" <td>1980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704425189</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2340</td>\n",
" <td>2160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704425369</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2520</td>\n",
" <td>2340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704425549</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2700</td>\n",
" <td>2520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704425729</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2880</td>\n",
" <td>2700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704425909</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3060</td>\n",
" <td>2880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704426089</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3240</td>\n",
" <td>3060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704426269</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3420</td>\n",
" <td>3240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704426449</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3600</td>\n",
" <td>3420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704426629</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3780</td>\n",
" <td>3600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704426809</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3960</td>\n",
" <td>3780</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>1704426989</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4140</td>\n",
" <td>3960</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n",
"260 177 1704421770 43 27 70 40 0 180 \n",
"261 177 1704421950 43 27 70 40 0 180 \n",
"262 177 1704422130 43 27 70 40 0 180 \n",
"263 177 1704422310 43 27 70 40 0 180 \n",
"264 177 1704422490 43 27 70 40 0 180 \n",
"265 177 1704422670 43 27 70 40 0 180 \n",
"266 177 1704422849 43 27 70 40 0 180 \n",
"267 177 1704423030 43 27 70 40 0 180 \n",
"268 177 1704423210 43 27 70 40 0 180 \n",
"269 177 1704423390 43 27 70 40 0 180 \n",
"270 177 1704423570 43 27 70 40 0 180 \n",
"271 177 1704423750 43 27 70 40 0 180 \n",
"272 177 1704423929 43 27 70 40 0 180 \n",
"273 177 1704424110 43 27 70 40 0 180 \n",
"274 177 1704424290 43 27 70 40 0 180 \n",
"275 177 1704424469 43 27 70 40 0 180 \n",
"10 177 1704424649 43 27 70 40 0 180 \n",
"10 177 1704424829 43 27 70 40 0 180 \n",
"10 177 1704425009 43 27 70 40 0 180 \n",
"10 177 1704425189 43 27 70 40 0 180 \n",
"10 177 1704425369 43 27 70 40 0 180 \n",
"10 177 1704425549 43 27 70 40 0 180 \n",
"10 177 1704425729 43 27 70 40 0 180 \n",
"10 177 1704425909 43 27 70 40 0 180 \n",
"10 177 1704426089 43 27 70 40 0 180 \n",
"10 177 1704426269 43 27 70 40 0 180 \n",
"10 177 1704426449 43 27 70 40 0 180 \n",
"10 177 1704426629 43 27 70 40 0 180 \n",
"10 177 1704426809 43 27 70 40 0 180 \n",
"10 177 1704426989 43 27 70 40 0 180 \n",
"\n",
" D_n S_n \n",
"260 2520 2520 \n",
"261 2700 2700 \n",
"262 2880 2880 \n",
"263 3060 3060 \n",
"264 3240 3240 \n",
"265 3420 3420 \n",
"266 3599 3600 \n",
"267 3780 3780 \n",
"268 3960 3960 \n",
"269 4140 4140 \n",
"270 4320 4320 \n",
"271 901 900 \n",
"272 1080 1080 \n",
"273 1261 1260 \n",
"274 1441 1440 \n",
"275 1620 1620 \n",
"10 1800 1620 \n",
"10 1980 1800 \n",
"10 2160 1980 \n",
"10 2340 2160 \n",
"10 2520 2340 \n",
"10 2700 2520 \n",
"10 2880 2700 \n",
"10 3060 2880 \n",
"10 3240 3060 \n",
"10 3420 3240 \n",
"10 3600 3420 \n",
"10 3780 3600 \n",
"10 3960 3780 \n",
"10 4140 3960 "
]
},
"execution_count": 237,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rhist[list(rhist.columns)[:7] + list(rhist.columns)[-3:]].sort_values(by=['start_unix'])[260:290]"
]
},
{
"cell_type": "code",
"execution_count": 174,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['inter_no', 'start_unix', 'dura_A1', 'dura_A2', 'dura_A3', 'dura_A4', 'dura_A5', 'dura_A6', 'dura_A7', 'dura_A8', 'dura_B1', 'dura_B2', 'dura_B3', 'dura_B4', 'dura_B5', 'dura_B6', 'dura_B7', 'dura_B8', 'cycle', 'D_n', 'S_n', 'offset']\n",
"['inter_no', 'dura_A1', 'dura_A2', 'dura_A3', 'dura_A4', 'dura_A5', 'dura_A6', 'dura_A7', 'dura_A8', 'dura_B1', 'dura_B2', 'dura_B3', 'dura_B4', 'dura_B5', 'dura_B6', 'dura_B7', 'dura_B8', 'cycle', 'offset', 'start_unix']\n"
]
}
],
"source": [
"print(list(rhist.columns))\n",
"print(list(new_rows[0].columns))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 2-1. 참값 판단 프로세스\n",
"hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n",
"\n",
"rhist = rhistory.copy()[rhistory.inter_no==inter_no].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",
" 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",
" rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n",
"rhist[list(rhist.columns[:10]) + list(rhist.columns[-2:])]\n",
"\n",
"new_rows = []\n",
"# 결측 및 이상치 처리\n",
"prev_unix = rhist.loc[0, 'start_unix'] # previous start_unix\n",
"curr_unix = rhist.loc[1, 'start_unix'] # current start_unix\n",
"fina_unix = rhist.loc[-1, 'start_unix'] # final start_unix\n",
"n = rhist[rhist.start_unix==curr_unix].index\n",
"print(n)\n",
"while curr_unix <= fina_unix:\n",
" prev_unix = rhist.loc[n-1, 'start_unix'] # current start_unix\n",
" curr_unix = rhist.loc[n, 'start_unix'] # previous start_unix\n",
" cycle = rhist.iloc[n].cycle\n",
" R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n",
" # 매 반복마다 D_n 및 S_n을 다시 정의\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",
"\n",
" # 참값인 경우\n",
" if (abs(D_n - S_n) <= 5):\n",
" print(n, 'true', D_n, S_n, curr_unix - prev_unix)\n",
" pass\n",
"\n",
" # 참값이 아닌 경우\n",
" else:\n",
" # print(n, 'false', D_n, S_n, curr_unix - prev_unix)\n",
" # 2-1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n",
" if curr_unix - prev_unix >= 2 * cycle:\n",
" # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n",
" # (다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n",
" while curr_unix - prev_unix > cycle:\n",
" # print(n, 'missing_values', curr_unix - prev_unix)\n",
" prev_unix += cycle\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 = prow.drop(['start_hour', 'start_minute'], axis=1)\n",
" prow['start_unix'] = prev_unix\n",
" cycle = prow.iloc[0].cycle\n",
" new_rows.append(prow)\n",
"\n",
" n += 1\n",
"new_rows = pd.concat(new_rows)\n",
"new_rows[list(new_rows.columns)[:6] + list(new_rows.columns)[-2:]]"
]
},
{
"cell_type": "code",
"execution_count": 117,
"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>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>D_n</th>\n",
" <th>S_n</th>\n",
" <th>diff</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>155</th>\n",
" <td>177</td>\n",
" <td>1704403768</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>...</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",
" <td>2518</td>\n",
" <td>2400</td>\n",
" <td>268.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276</th>\n",
" <td>177</td>\n",
" <td>1704432930</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>9180</td>\n",
" <td>900</td>\n",
" <td>8461.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>2 rows × 22 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n",
"155 177 1704403768 36 20 68 26 0 \n",
"276 177 1704432930 43 27 70 40 0 \n",
"\n",
" dura_A6 dura_A7 dura_A8 ... dura_B3 dura_B4 dura_B5 dura_B6 \\\n",
"155 0 0 0 ... 68 26 0 0 \n",
"276 0 0 0 ... 70 40 0 0 \n",
"\n",
" dura_B7 dura_B8 cycle D_n S_n diff \n",
"155 0 0 150 2518 2400 268.0 \n",
"276 0 0 180 9180 900 8461.0 \n",
"\n",
"[2 rows x 22 columns]"
]
},
"execution_count": 117,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rhist_diff = rhist.copy()\n",
"rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n",
"rhist_diff[rhist_diff['diff'] - rhist_diff['cycle'] > 10]"
]
},
{
"cell_type": "code",
"execution_count": 130,
"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>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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>270</th>\n",
" <td>177</td>\n",
" <td>1704423570</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4320</td>\n",
" <td>4320</td>\n",
" </tr>\n",
" <tr>\n",
" <th>271</th>\n",
" <td>177</td>\n",
" <td>1704423750</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>901</td>\n",
" <td>900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>272</th>\n",
" <td>177</td>\n",
" <td>1704423929</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1080</td>\n",
" <td>1080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>273</th>\n",
" <td>177</td>\n",
" <td>1704424110</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1261</td>\n",
" <td>1260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>274</th>\n",
" <td>177</td>\n",
" <td>1704424290</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1441</td>\n",
" <td>1440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>275</th>\n",
" <td>177</td>\n",
" <td>1704424469</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1620</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276</th>\n",
" <td>177</td>\n",
" <td>1704432930</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>9180</td>\n",
" <td>900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>277</th>\n",
" <td>177</td>\n",
" <td>1704433110</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>9360</td>\n",
" <td>1080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>278</th>\n",
" <td>177</td>\n",
" <td>1704433290</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>9540</td>\n",
" <td>1260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>279</th>\n",
" <td>177</td>\n",
" <td>1704433470</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>9720</td>\n",
" <td>1440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>280</th>\n",
" <td>177</td>\n",
" <td>1704433650</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>9900</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>281</th>\n",
" <td>177</td>\n",
" <td>1704433830</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>10080</td>\n",
" <td>1800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>282</th>\n",
" <td>177</td>\n",
" <td>1704434011</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>10261</td>\n",
" <td>1980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>283</th>\n",
" <td>177</td>\n",
" <td>1704434190</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>10440</td>\n",
" <td>2160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>284</th>\n",
" <td>177</td>\n",
" <td>1704434370</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>10620</td>\n",
" <td>2340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>285</th>\n",
" <td>177</td>\n",
" <td>1704434550</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>900</td>\n",
" <td>900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>286</th>\n",
" <td>177</td>\n",
" <td>1704434729</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1079</td>\n",
" <td>1080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>287</th>\n",
" <td>177</td>\n",
" <td>1704434910</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1260</td>\n",
" <td>1260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>288</th>\n",
" <td>177</td>\n",
" <td>1704435090</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1440</td>\n",
" <td>1440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>289</th>\n",
" <td>177</td>\n",
" <td>1704435270</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1620</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>290</th>\n",
" <td>177</td>\n",
" <td>1704435450</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1800</td>\n",
" <td>1800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>291</th>\n",
" <td>177</td>\n",
" <td>1704435630</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1980</td>\n",
" <td>1980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>292</th>\n",
" <td>177</td>\n",
" <td>1704435810</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2160</td>\n",
" <td>2160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>293</th>\n",
" <td>177</td>\n",
" <td>1704435990</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2340</td>\n",
" <td>2340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>294</th>\n",
" <td>177</td>\n",
" <td>1704436170</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2520</td>\n",
" <td>2520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>295</th>\n",
" <td>177</td>\n",
" <td>1704436351</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2701</td>\n",
" <td>2700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>296</th>\n",
" <td>177</td>\n",
" <td>1704436530</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2880</td>\n",
" <td>2880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>297</th>\n",
" <td>177</td>\n",
" <td>1704436710</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3060</td>\n",
" <td>3060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>298</th>\n",
" <td>177</td>\n",
" <td>1704436890</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3240</td>\n",
" <td>3240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>299</th>\n",
" <td>177</td>\n",
" <td>1704437070</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3420</td>\n",
" <td>3420</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n",
"270 177 1704423570 43 27 70 40 0 180 \n",
"271 177 1704423750 43 27 70 40 0 180 \n",
"272 177 1704423929 43 27 70 40 0 180 \n",
"273 177 1704424110 43 27 70 40 0 180 \n",
"274 177 1704424290 43 27 70 40 0 180 \n",
"275 177 1704424469 43 27 70 40 0 180 \n",
"276 177 1704432930 43 27 70 40 0 180 \n",
"277 177 1704433110 43 27 70 40 0 180 \n",
"278 177 1704433290 43 27 70 40 0 180 \n",
"279 177 1704433470 43 27 70 40 0 180 \n",
"280 177 1704433650 43 27 70 40 0 180 \n",
"281 177 1704433830 43 27 70 40 0 180 \n",
"282 177 1704434011 43 27 70 40 0 180 \n",
"283 177 1704434190 43 27 70 40 0 180 \n",
"284 177 1704434370 43 27 70 40 0 180 \n",
"285 177 1704434550 43 27 70 40 0 180 \n",
"286 177 1704434729 43 27 70 40 0 180 \n",
"287 177 1704434910 43 27 70 40 0 180 \n",
"288 177 1704435090 43 27 70 40 0 180 \n",
"289 177 1704435270 43 27 70 40 0 180 \n",
"290 177 1704435450 43 27 70 40 0 180 \n",
"291 177 1704435630 43 27 70 40 0 180 \n",
"292 177 1704435810 43 27 70 40 0 180 \n",
"293 177 1704435990 43 27 70 40 0 180 \n",
"294 177 1704436170 43 27 70 40 0 180 \n",
"295 177 1704436351 43 27 70 40 0 180 \n",
"296 177 1704436530 43 27 70 40 0 180 \n",
"297 177 1704436710 43 27 70 40 0 180 \n",
"298 177 1704436890 43 27 70 40 0 180 \n",
"299 177 1704437070 43 27 70 40 0 180 \n",
"\n",
" D_n S_n \n",
"270 4320 4320 \n",
"271 901 900 \n",
"272 1080 1080 \n",
"273 1261 1260 \n",
"274 1441 1440 \n",
"275 1620 1620 \n",
"276 9180 900 \n",
"277 9360 1080 \n",
"278 9540 1260 \n",
"279 9720 1440 \n",
"280 9900 1620 \n",
"281 10080 1800 \n",
"282 10261 1980 \n",
"283 10440 2160 \n",
"284 10620 2340 \n",
"285 900 900 \n",
"286 1079 1080 \n",
"287 1260 1260 \n",
"288 1440 1440 \n",
"289 1620 1620 \n",
"290 1800 1800 \n",
"291 1980 1980 \n",
"292 2160 2160 \n",
"293 2340 2340 \n",
"294 2520 2520 \n",
"295 2701 2700 \n",
"296 2880 2880 \n",
"297 3060 3060 \n",
"298 3240 3240 \n",
"299 3420 3420 "
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rhist[list(rhist.columns)[:7] + list(rhist.columns)[-3:]][270:300]"
]
},
{
"cell_type": "code",
"execution_count": 109,
"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>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>cycle</th>\n",
" <th>D_n</th>\n",
" <th>S_n</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>210</th>\n",
" <td>177</td>\n",
" <td>1704412780</td>\n",
" <td>40</td>\n",
" <td>25</td>\n",
" <td>71</td>\n",
" <td>34</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>4420</td>\n",
" <td>4420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>211</th>\n",
" <td>177</td>\n",
" <td>1704412950</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>850</td>\n",
" <td>860</td>\n",
" </tr>\n",
" <tr>\n",
" <th>212</th>\n",
" <td>177</td>\n",
" <td>1704413130</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1030</td>\n",
" <td>1040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>213</th>\n",
" <td>177</td>\n",
" <td>1704413310</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1210</td>\n",
" <td>1220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>214</th>\n",
" <td>177</td>\n",
" <td>1704413489</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1389</td>\n",
" <td>1400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>215</th>\n",
" <td>177</td>\n",
" <td>1704413670</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1570</td>\n",
" <td>1580</td>\n",
" </tr>\n",
" <tr>\n",
" <th>216</th>\n",
" <td>177</td>\n",
" <td>1704413850</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1750</td>\n",
" <td>1760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>217</th>\n",
" <td>177</td>\n",
" <td>1704414030</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1930</td>\n",
" <td>1940</td>\n",
" </tr>\n",
" <tr>\n",
" <th>218</th>\n",
" <td>177</td>\n",
" <td>1704414210</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2110</td>\n",
" <td>2120</td>\n",
" </tr>\n",
" <tr>\n",
" <th>219</th>\n",
" <td>177</td>\n",
" <td>1704414390</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2290</td>\n",
" <td>2300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>220</th>\n",
" <td>177</td>\n",
" <td>1704414570</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2470</td>\n",
" <td>2480</td>\n",
" </tr>\n",
" <tr>\n",
" <th>221</th>\n",
" <td>177</td>\n",
" <td>1704414750</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2650</td>\n",
" <td>2660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>222</th>\n",
" <td>177</td>\n",
" <td>1704414930</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2830</td>\n",
" <td>2840</td>\n",
" </tr>\n",
" <tr>\n",
" <th>223</th>\n",
" <td>177</td>\n",
" <td>1704415110</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3010</td>\n",
" <td>3020</td>\n",
" </tr>\n",
" <tr>\n",
" <th>224</th>\n",
" <td>177</td>\n",
" <td>1704415290</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3190</td>\n",
" <td>3200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>225</th>\n",
" <td>177</td>\n",
" <td>1704415470</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3370</td>\n",
" <td>3380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>226</th>\n",
" <td>177</td>\n",
" <td>1704415650</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3550</td>\n",
" <td>3560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>227</th>\n",
" <td>177</td>\n",
" <td>1704415830</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3730</td>\n",
" <td>3740</td>\n",
" </tr>\n",
" <tr>\n",
" <th>228</th>\n",
" <td>177</td>\n",
" <td>1704416010</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3910</td>\n",
" <td>3920</td>\n",
" </tr>\n",
" <tr>\n",
" <th>229</th>\n",
" <td>177</td>\n",
" <td>1704416190</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4090</td>\n",
" <td>4100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>230</th>\n",
" <td>177</td>\n",
" <td>1704416370</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4270</td>\n",
" <td>4280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>231</th>\n",
" <td>177</td>\n",
" <td>1704416551</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>901</td>\n",
" <td>900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>232</th>\n",
" <td>177</td>\n",
" <td>1704416730</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1080</td>\n",
" <td>1080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>233</th>\n",
" <td>177</td>\n",
" <td>1704416911</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1261</td>\n",
" <td>1260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234</th>\n",
" <td>177</td>\n",
" <td>1704417090</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1440</td>\n",
" <td>1440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>235</th>\n",
" <td>177</td>\n",
" <td>1704417270</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1620</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>236</th>\n",
" <td>177</td>\n",
" <td>1704417449</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1799</td>\n",
" <td>1800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>177</td>\n",
" <td>1704417630</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1980</td>\n",
" <td>1980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>238</th>\n",
" <td>177</td>\n",
" <td>1704417810</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2160</td>\n",
" <td>2160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>239</th>\n",
" <td>177</td>\n",
" <td>1704417990</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2340</td>\n",
" <td>2340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>240</th>\n",
" <td>177</td>\n",
" <td>1704418169</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2519</td>\n",
" <td>2520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>241</th>\n",
" <td>177</td>\n",
" <td>1704418350</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2700</td>\n",
" <td>2700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>242</th>\n",
" <td>177</td>\n",
" <td>1704418530</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2880</td>\n",
" <td>2880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>243</th>\n",
" <td>177</td>\n",
" <td>1704418710</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3060</td>\n",
" <td>3060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>244</th>\n",
" <td>177</td>\n",
" <td>1704418890</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3240</td>\n",
" <td>3240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>245</th>\n",
" <td>177</td>\n",
" <td>1704419070</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3420</td>\n",
" <td>3420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>246</th>\n",
" <td>177</td>\n",
" <td>1704419250</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3600</td>\n",
" <td>3600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>247</th>\n",
" <td>177</td>\n",
" <td>1704419430</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3780</td>\n",
" <td>3780</td>\n",
" </tr>\n",
" <tr>\n",
" <th>248</th>\n",
" <td>177</td>\n",
" <td>1704419610</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3960</td>\n",
" <td>3960</td>\n",
" </tr>\n",
" <tr>\n",
" <th>249</th>\n",
" <td>177</td>\n",
" <td>1704419790</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4140</td>\n",
" <td>4140</td>\n",
" </tr>\n",
" <tr>\n",
" <th>250</th>\n",
" <td>177</td>\n",
" <td>1704419969</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4319</td>\n",
" <td>4320</td>\n",
" </tr>\n",
" <tr>\n",
" <th>251</th>\n",
" <td>177</td>\n",
" <td>1704420150</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>900</td>\n",
" <td>900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>252</th>\n",
" <td>177</td>\n",
" <td>1704420330</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1080</td>\n",
" <td>1080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>253</th>\n",
" <td>177</td>\n",
" <td>1704420510</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1260</td>\n",
" <td>1260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>254</th>\n",
" <td>177</td>\n",
" <td>1704420690</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1440</td>\n",
" <td>1440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>255</th>\n",
" <td>177</td>\n",
" <td>1704420870</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1620</td>\n",
" <td>1620</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256</th>\n",
" <td>177</td>\n",
" <td>1704421050</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1800</td>\n",
" <td>1800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>257</th>\n",
" <td>177</td>\n",
" <td>1704421230</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>1980</td>\n",
" <td>1980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>258</th>\n",
" <td>177</td>\n",
" <td>1704421411</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2161</td>\n",
" <td>2160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>259</th>\n",
" <td>177</td>\n",
" <td>1704421590</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2340</td>\n",
" <td>2340</td>\n",
" </tr>\n",
" <tr>\n",
" <th>260</th>\n",
" <td>177</td>\n",
" <td>1704421770</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2520</td>\n",
" <td>2520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>261</th>\n",
" <td>177</td>\n",
" <td>1704421950</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2700</td>\n",
" <td>2700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>262</th>\n",
" <td>177</td>\n",
" <td>1704422130</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>2880</td>\n",
" <td>2880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>263</th>\n",
" <td>177</td>\n",
" <td>1704422310</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3060</td>\n",
" <td>3060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>264</th>\n",
" <td>177</td>\n",
" <td>1704422490</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3240</td>\n",
" <td>3240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>265</th>\n",
" <td>177</td>\n",
" <td>1704422670</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3420</td>\n",
" <td>3420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>266</th>\n",
" <td>177</td>\n",
" <td>1704422849</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3599</td>\n",
" <td>3600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>267</th>\n",
" <td>177</td>\n",
" <td>1704423030</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3780</td>\n",
" <td>3780</td>\n",
" </tr>\n",
" <tr>\n",
" <th>268</th>\n",
" <td>177</td>\n",
" <td>1704423210</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>3960</td>\n",
" <td>3960</td>\n",
" </tr>\n",
" <tr>\n",
" <th>269</th>\n",
" <td>177</td>\n",
" <td>1704423390</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>4140</td>\n",
" <td>4140</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n",
"210 177 1704412780 40 25 71 34 0 170 \n",
"211 177 1704412950 43 27 70 40 0 180 \n",
"212 177 1704413130 43 27 70 40 0 180 \n",
"213 177 1704413310 43 27 70 40 0 180 \n",
"214 177 1704413489 43 27 70 40 0 180 \n",
"215 177 1704413670 43 27 70 40 0 180 \n",
"216 177 1704413850 43 27 70 40 0 180 \n",
"217 177 1704414030 43 27 70 40 0 180 \n",
"218 177 1704414210 43 27 70 40 0 180 \n",
"219 177 1704414390 43 27 70 40 0 180 \n",
"220 177 1704414570 43 27 70 40 0 180 \n",
"221 177 1704414750 43 27 70 40 0 180 \n",
"222 177 1704414930 43 27 70 40 0 180 \n",
"223 177 1704415110 43 27 70 40 0 180 \n",
"224 177 1704415290 43 27 70 40 0 180 \n",
"225 177 1704415470 43 27 70 40 0 180 \n",
"226 177 1704415650 43 27 70 40 0 180 \n",
"227 177 1704415830 43 27 70 40 0 180 \n",
"228 177 1704416010 43 27 70 40 0 180 \n",
"229 177 1704416190 43 27 70 40 0 180 \n",
"230 177 1704416370 43 27 70 40 0 180 \n",
"231 177 1704416551 43 27 70 40 0 180 \n",
"232 177 1704416730 43 27 70 40 0 180 \n",
"233 177 1704416911 43 27 70 40 0 180 \n",
"234 177 1704417090 43 27 70 40 0 180 \n",
"235 177 1704417270 43 27 70 40 0 180 \n",
"236 177 1704417449 43 27 70 40 0 180 \n",
"237 177 1704417630 43 27 70 40 0 180 \n",
"238 177 1704417810 43 27 70 40 0 180 \n",
"239 177 1704417990 43 27 70 40 0 180 \n",
"240 177 1704418169 43 27 70 40 0 180 \n",
"241 177 1704418350 43 27 70 40 0 180 \n",
"242 177 1704418530 43 27 70 40 0 180 \n",
"243 177 1704418710 43 27 70 40 0 180 \n",
"244 177 1704418890 43 27 70 40 0 180 \n",
"245 177 1704419070 43 27 70 40 0 180 \n",
"246 177 1704419250 43 27 70 40 0 180 \n",
"247 177 1704419430 43 27 70 40 0 180 \n",
"248 177 1704419610 43 27 70 40 0 180 \n",
"249 177 1704419790 43 27 70 40 0 180 \n",
"250 177 1704419969 43 27 70 40 0 180 \n",
"251 177 1704420150 43 27 70 40 0 180 \n",
"252 177 1704420330 43 27 70 40 0 180 \n",
"253 177 1704420510 43 27 70 40 0 180 \n",
"254 177 1704420690 43 27 70 40 0 180 \n",
"255 177 1704420870 43 27 70 40 0 180 \n",
"256 177 1704421050 43 27 70 40 0 180 \n",
"257 177 1704421230 43 27 70 40 0 180 \n",
"258 177 1704421411 43 27 70 40 0 180 \n",
"259 177 1704421590 43 27 70 40 0 180 \n",
"260 177 1704421770 43 27 70 40 0 180 \n",
"261 177 1704421950 43 27 70 40 0 180 \n",
"262 177 1704422130 43 27 70 40 0 180 \n",
"263 177 1704422310 43 27 70 40 0 180 \n",
"264 177 1704422490 43 27 70 40 0 180 \n",
"265 177 1704422670 43 27 70 40 0 180 \n",
"266 177 1704422849 43 27 70 40 0 180 \n",
"267 177 1704423030 43 27 70 40 0 180 \n",
"268 177 1704423210 43 27 70 40 0 180 \n",
"269 177 1704423390 43 27 70 40 0 180 \n",
"\n",
" D_n S_n \n",
"210 4420 4420 \n",
"211 850 860 \n",
"212 1030 1040 \n",
"213 1210 1220 \n",
"214 1389 1400 \n",
"215 1570 1580 \n",
"216 1750 1760 \n",
"217 1930 1940 \n",
"218 2110 2120 \n",
"219 2290 2300 \n",
"220 2470 2480 \n",
"221 2650 2660 \n",
"222 2830 2840 \n",
"223 3010 3020 \n",
"224 3190 3200 \n",
"225 3370 3380 \n",
"226 3550 3560 \n",
"227 3730 3740 \n",
"228 3910 3920 \n",
"229 4090 4100 \n",
"230 4270 4280 \n",
"231 901 900 \n",
"232 1080 1080 \n",
"233 1261 1260 \n",
"234 1440 1440 \n",
"235 1620 1620 \n",
"236 1799 1800 \n",
"237 1980 1980 \n",
"238 2160 2160 \n",
"239 2340 2340 \n",
"240 2519 2520 \n",
"241 2700 2700 \n",
"242 2880 2880 \n",
"243 3060 3060 \n",
"244 3240 3240 \n",
"245 3420 3420 \n",
"246 3600 3600 \n",
"247 3780 3780 \n",
"248 3960 3960 \n",
"249 4140 4140 \n",
"250 4319 4320 \n",
"251 900 900 \n",
"252 1080 1080 \n",
"253 1260 1260 \n",
"254 1440 1440 \n",
"255 1620 1620 \n",
"256 1800 1800 \n",
"257 1980 1980 \n",
"258 2161 2160 \n",
"259 2340 2340 \n",
"260 2520 2520 \n",
"261 2700 2700 \n",
"262 2880 2880 \n",
"263 3060 3060 \n",
"264 3240 3240 \n",
"265 3420 3420 \n",
"266 3599 3600 \n",
"267 3780 3780 \n",
"268 3960 3960 \n",
"269 4140 4140 "
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rhist[210:210+60][list(rhist.columns)[:7] + list(rhist.columns)[-3:]]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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 = [] # 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",
"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
}