{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from datetime import datetime\n",
"import os\n",
"import random\n",
"from tqdm import tqdm"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" inter_name | \n",
" inter_lat | \n",
" inter_lon | \n",
" group_no | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 한솔삼거리(한솔마을3거리) | \n",
" 37.36857 | \n",
" 127.11478 | \n",
" 3 | \n",
"
\n",
" \n",
" 1 | \n",
" 176 | \n",
" 느티마을4단지 | \n",
" 37.36724 | \n",
" 127.11480 | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 177 | \n",
" 한솔6단지(정자동사무소) | \n",
" 37.36619 | \n",
" 127.11480 | \n",
" 3 | \n",
"
\n",
" \n",
" 3 | \n",
" 178 | \n",
" 신기4거리 | \n",
" 37.36346 | \n",
" 127.11480 | \n",
" 3 | \n",
"
\n",
" \n",
" 4 | \n",
" 201 | \n",
" 느티마을4거리 | \n",
" 37.36854 | \n",
" 127.10984 | \n",
" 3 | \n",
"
\n",
" \n",
" 5 | \n",
" 202 | \n",
" 느티마을 안촌유치원 | \n",
" 37.36855 | \n",
" 127.11241 | \n",
" 3 | \n",
"
\n",
" \n",
" 6 | \n",
" 206 | \n",
" 상록마을 321동 | \n",
" 37.36483 | \n",
" 127.10981 | \n",
" 3 | \n",
"
\n",
" \n",
" 7 | \n",
" 210 | \n",
" 상록4거리(상록마을입구4거리) | \n",
" 37.36347 | \n",
" 127.10982 | \n",
" 3 | \n",
"
\n",
" \n",
" 8 | \n",
" 211 | \n",
" 상록마을단일로 | \n",
" 37.36346 | \n",
" 127.11237 | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no inter_name inter_lat inter_lon group_no\n",
"0 175 한솔삼거리(한솔마을3거리) 37.36857 127.11478 3\n",
"1 176 느티마을4단지 37.36724 127.11480 3\n",
"2 177 한솔6단지(정자동사무소) 37.36619 127.11480 3\n",
"3 178 신기4거리 37.36346 127.11480 3\n",
"4 201 느티마을4거리 37.36854 127.10984 3\n",
"5 202 느티마을 안촌유치원 37.36855 127.11241 3\n",
"6 206 상록마을 321동 37.36483 127.10981 3\n",
"7 210 상록4거리(상록마을입구4거리) 37.36347 127.10982 3\n",
"8 211 상록마을단일로 37.36346 127.11237 3"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 교차로정보\n",
"inter_info = pd.read_csv(\"inter_info.csv\")\n",
"inter_info['group_no'] = 3\n",
"display(inter_info)\n",
"inter_info.to_csv('../inter_info.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" main_phase | \n",
" mg1A | \n",
" mg1B | \n",
" mg2A | \n",
" mg2B | \n",
" mg3A | \n",
" mg3B | \n",
" mg4A | \n",
" mg4B | \n",
" mg5A | \n",
" mg5B | \n",
" mg6A | \n",
" mg6B | \n",
" mg7A | \n",
" mg7B | \n",
" mg8A | \n",
" mg8B | \n",
" r1A | \n",
" r1B | \n",
" r2A | \n",
" r2B | \n",
" r3A | \n",
" r3B | \n",
" r4A | \n",
" r4B | \n",
" r5A | \n",
" r5B | \n",
" r6A | \n",
" r6B | \n",
" r7A | \n",
" r7B | \n",
" r8A | \n",
" r8B | \n",
" y1A | \n",
" y1B | \n",
" y2A | \n",
" y2B | \n",
" y3A | \n",
" y3B | \n",
" y4A | \n",
" y4B | \n",
" y5A | \n",
" y5B | \n",
" y6A | \n",
" y6B | \n",
" y7A | \n",
" y7B | \n",
" y8A | \n",
" y8B | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 2 | \n",
" 24 | \n",
" 27 | \n",
" 33 | \n",
" 12 | \n",
" 15 | \n",
" 39 | \n",
" 15 | \n",
" 19 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 176 | \n",
" 2 | \n",
" 21 | \n",
" 31 | \n",
" 33 | \n",
" 30 | \n",
" 16 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 177 | \n",
" 2 | \n",
" 35 | \n",
" 18 | \n",
" 36 | \n",
" 36 | \n",
" 0 | \n",
" 0 | \n",
" 38 | \n",
" 13 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 178 | \n",
" 2 | \n",
" 18 | \n",
" 19 | \n",
" 35 | \n",
" 26 | \n",
" 36 | \n",
" 29 | \n",
" 17 | \n",
" 37 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 201 | \n",
" 2 | \n",
" 25 | \n",
" 20 | \n",
" 21 | \n",
" 32 | \n",
" 31 | \n",
" 28 | \n",
" 31 | \n",
" 17 | \n",
" 27 | \n",
" 27 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 5 | \n",
" 202 | \n",
" 2 | \n",
" 12 | \n",
" 30 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 6 | \n",
" 206 | \n",
" 2 | \n",
" 36 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 31 | \n",
" 31 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 7 | \n",
" 210 | \n",
" 2 | \n",
" 19 | \n",
" 0 | \n",
" 12 | \n",
" 13 | \n",
" 21 | \n",
" 37 | \n",
" 12 | \n",
" 22 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 8 | \n",
" 211 | \n",
" 2 | \n",
" 32 | \n",
" 35 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no main_phase mg1A mg1B mg2A mg2B mg3A mg3B mg4A mg4B mg5A \\\n",
"0 175 2 24 27 33 12 15 39 15 19 0 \n",
"1 176 2 21 31 33 30 16 0 0 0 0 \n",
"2 177 2 35 18 36 36 0 0 38 13 0 \n",
"3 178 2 18 19 35 26 36 29 17 37 0 \n",
"4 201 2 25 20 21 32 31 28 31 17 27 \n",
"5 202 2 12 30 0 0 0 0 0 0 0 \n",
"6 206 2 36 29 0 0 31 31 0 0 0 \n",
"7 210 2 19 0 12 13 21 37 12 22 0 \n",
"8 211 2 32 35 0 0 0 0 0 0 0 \n",
"\n",
" mg5B mg6A mg6B mg7A mg7B mg8A mg8B r1A r1B r2A r2B r3A r3B \\\n",
"0 0 0 0 0 0 0 0 1 1 1 1 1 1 \n",
"1 0 0 0 0 0 0 0 1 1 1 1 1 0 \n",
"2 0 0 0 0 0 0 0 1 1 1 1 1 0 \n",
"3 0 0 0 0 0 0 0 1 1 1 1 1 1 \n",
"4 27 0 0 0 0 0 0 1 1 1 1 1 1 \n",
"5 0 0 0 0 0 0 0 1 1 1 0 0 0 \n",
"6 0 0 0 0 0 0 0 1 1 1 0 1 1 \n",
"7 0 0 0 0 0 0 0 1 0 1 1 1 1 \n",
"8 0 0 0 0 0 0 0 1 1 1 0 0 0 \n",
"\n",
" r4A r4B r5A r5B r6A r6B r7A r7B r8A r8B y1A y1B y2A y2B y3A \\\n",
"0 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 \n",
"1 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 \n",
"2 1 1 0 0 0 0 0 0 0 0 4 4 4 4 0 \n",
"3 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 \n",
"4 1 1 1 1 0 0 0 0 0 0 4 4 4 4 4 \n",
"5 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 \n",
"6 1 0 0 0 0 0 0 0 0 0 4 4 0 0 4 \n",
"7 1 1 0 0 0 0 0 0 0 0 4 0 4 4 4 \n",
"8 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 \n",
"\n",
" y3B y4A y4B y5A y5B y6A y6B y7A y7B y8A y8B \n",
"0 4 4 4 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 0 0 \n",
"2 0 4 4 0 0 0 0 0 0 0 0 \n",
"3 4 4 4 0 0 0 0 0 0 0 0 \n",
"4 4 4 4 4 4 0 0 0 0 0 0 \n",
"5 0 0 0 0 0 0 0 0 0 0 0 \n",
"6 4 0 0 0 0 0 0 0 0 0 0 \n",
"7 4 4 4 0 0 0 0 0 0 0 0 \n",
"8 0 0 0 0 0 0 0 0 0 0 0 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 현시구성\n",
"phase_info = pd.read_csv(\"phase_info.csv\")\n",
"phase_info.drop('flow_no', axis=1, inplace=True)\n",
"# display(phase_info)\n",
"mg = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='min_green_dur').fillna(0).astype(int)\n",
"y = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='yellow_dur').fillna(0).astype(int)\n",
"r = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='red_dur').fillna(0).astype(int)\n",
"max_phase_no = phase_info['phase_no'].max()\n",
"new_columns = [f'{col}{phase}{ring}' for col in ['mg', 'y', 'r'] for phase in range(1, max_phase_no + 1) for ring in ['A', 'B']]\n",
"phase_info = pd.concat([mg, y, r], axis=1)\n",
"phase_info.columns = new_columns\n",
"phase_info['main_phase'] = 2\n",
"phase_info['mg6A'] = phase_info['mg6B'] = phase_info['mg7A'] = phase_info['mg7B'] = phase_info['mg8A'] = phase_info['mg8B']= 0\n",
"phase_info['y6A'] = phase_info['y6B'] = phase_info['y7A'] = phase_info['y7B'] = phase_info['y8A'] = phase_info['y8B']= 0\n",
"phase_info['r6A'] = phase_info['r6B'] = phase_info['r7A'] = phase_info['r7B'] = phase_info['r8A'] = phase_info['r8B']= 0\n",
"phase_info = phase_info[sorted(phase_info.columns)]\n",
"phase_info.reset_index(inplace=True)\n",
"with pd.option_context('display.max_rows', None, 'display.max_columns', None): \n",
" display(phase_info)\n",
"phase_info.to_csv('../phase_info.csv')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" angle_A1 | \n",
" angle_A2 | \n",
" angle_A3 | \n",
" angle_A4 | \n",
" angle_A5 | \n",
" angle_A6 | \n",
" angle_A7 | \n",
" angle_A8 | \n",
" angle_B1 | \n",
" angle_B2 | \n",
" angle_B3 | \n",
" angle_B4 | \n",
" angle_B5 | \n",
" angle_B6 | \n",
" angle_B7 | \n",
" angle_B8 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 179004 | \n",
" 001095 | \n",
" 090270 | \n",
" 268000 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 003176 | \n",
" 179270 | \n",
" 090180 | \n",
" 270090 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" 176 | \n",
" 180000 | \n",
" 180000 | \n",
" 270356 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 359180 | \n",
" 180270 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2 | \n",
" 177 | \n",
" 180000 | \n",
" 000090 | \n",
" stop | \n",
" 268000 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 001176 | \n",
" 179270 | \n",
" NaN | \n",
" 090180 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" 178 | \n",
" 180000 | \n",
" 000090 | \n",
" 270000 | \n",
" 090270 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 000180 | \n",
" 180270 | \n",
" 270090 | \n",
" 090180 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 4 | \n",
" 201 | \n",
" 180000 | \n",
" 270000 | \n",
" 090270 | \n",
" 090270 | \n",
" 000090 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 180270 | \n",
" 270090 | \n",
" 270090 | \n",
" 090180 | \n",
" 000180 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 5 | \n",
" 202 | \n",
" 090270 | \n",
" stop | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 270090 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 6 | \n",
" 206 | \n",
" 180000 | \n",
" stop | \n",
" 180000 | \n",
" stop | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 000180 | \n",
" NaN | \n",
" 000180 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 7 | \n",
" 210 | \n",
" 090270 | \n",
" 268000 | \n",
" 359090 | \n",
" 180000 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 270090 | \n",
" 000180 | \n",
" 180270 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 8 | \n",
" 211 | \n",
" 090270 | \n",
" stop | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 270090 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no angle_A1 angle_A2 angle_A3 angle_A4 angle_A5 angle_A6 angle_A7 \\\n",
"0 175 179004 001095 090270 268000 NaN NaN NaN \n",
"1 176 180000 180000 270356 NaN NaN NaN NaN \n",
"2 177 180000 000090 stop 268000 NaN NaN NaN \n",
"3 178 180000 000090 270000 090270 NaN NaN NaN \n",
"4 201 180000 270000 090270 090270 000090 NaN NaN \n",
"5 202 090270 stop NaN NaN NaN NaN NaN \n",
"6 206 180000 stop 180000 stop NaN NaN NaN \n",
"7 210 090270 268000 359090 180000 NaN NaN NaN \n",
"8 211 090270 stop NaN NaN NaN NaN NaN \n",
"\n",
" angle_A8 angle_B1 angle_B2 angle_B3 angle_B4 angle_B5 angle_B6 angle_B7 \\\n",
"0 NaN 003176 179270 090180 270090 NaN NaN NaN \n",
"1 NaN 359180 180270 NaN NaN NaN NaN NaN \n",
"2 NaN 001176 179270 NaN 090180 NaN NaN NaN \n",
"3 NaN 000180 180270 270090 090180 NaN NaN NaN \n",
"4 NaN 180270 270090 270090 090180 000180 NaN NaN \n",
"5 NaN 270090 NaN NaN NaN NaN NaN NaN \n",
"6 NaN 000180 NaN 000180 NaN NaN NaN NaN \n",
"7 NaN NaN 270090 000180 180270 NaN NaN NaN \n",
"8 NaN 270090 NaN NaN NaN NaN NaN NaN \n",
"\n",
" angle_B8 \n",
"0 NaN \n",
"1 NaN \n",
"2 NaN \n",
"3 NaN \n",
"4 NaN \n",
"5 NaN \n",
"6 NaN \n",
"7 NaN \n",
"8 NaN "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 방위각정보\n",
"flow_angle = pd.read_csv(\"flow_angle.csv\")\n",
"angle = flow_angle.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='angle_code', aggfunc='first').fillna('NaN')\n",
"new_columns = [f'angle_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n",
"angle.columns = new_columns\n",
"angle['angle_A6'] = angle['angle_A7'] = angle['angle_A8'] = np.nan\n",
"angle['angle_B6'] = angle['angle_B7'] = angle['angle_B8'] = np.nan\n",
"angle = angle[sorted(angle.columns)]\n",
"angle = angle.reset_index()\n",
"display(angle)\n",
"angle.to_csv('../angle.csv')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17280/17280 [04:21<00:00, 66.16it/s]\n"
]
}
],
"source": [
"# 이동류번호\n",
"plan = pd.read_csv(\"time_plan.csv\")\n",
"phase = pd.read_csv('phase_info.csv')\n",
"plan = plan[plan.ID.isin([1, 5, 8, 11])]\n",
"ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n",
"plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n",
"plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n",
"plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle']]\n",
"plan_ = pd.merge(plan, phase[['inter_no', 'phase_no', 'ring_type', 'flow_no']], on=['inter_no', 'phase_no', 'ring_type'], how='left')\n",
"plan_['flow_no'] = plan_['flow_no'].fillna(18).astype(int)\n",
"plan_['start_second'] = plan_.start_hour.astype(int)*3600 + plan_.start_minute.astype(int)*60\n",
"plan_ = plan_[['inter_no', 'start_second', 'phase_no', 'ring_type', 'duration', 'flow_no', 'cycle']]\n",
"cycle_dict = dict(zip(zip(plan_['inter_no'], plan_['start_second']), plan_['cycle']))\n",
"df = plan_[['inter_no','start_second','cycle']].drop_duplicates()\n",
"df = df.reset_index(drop=True)\n",
"df['start_second_exact'] = 0\n",
"for i in range(1, len(df)):\n",
" if i % 4 != 0:\n",
" prev = df.loc[i-1, 'start_second_exact']\n",
" start_second = df.loc[i, 'start_second']\n",
" cycle = df.loc[i-1, 'cycle']\n",
" df.loc[i, 'start_second_exact'] = (start_second - prev) % cycle + start_second\n",
"inter2start = {inter_no:list(df[df.inter_no==inter_no]['start_second_exact']) for inter_no in df.inter_no}\n",
"plan_ = plan_.pivot_table(index=['inter_no', 'start_second', 'phase_no'],\n",
" columns='ring_type',\n",
" values=['duration', 'flow_no'],\n",
" aggfunc='first').reset_index()\n",
"plan_.columns = ['inter_no', 'start_second', 'phase_no', 'dura_A', 'dura_B', 'move_A', 'move_B']\n",
"inter2no_phase = {inter_no:group.phase_no.unique().max() for (inter_no, group) in plan.groupby('inter_no')}\n",
"\n",
"midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n",
"for current_time in tqdm(range(midnight, next_day, 5)):\n",
" sec = current_time - midnight\n",
" the_start_second = np.max(df.start_second[df.start_second <= sec])\n",
" move = []\n",
" for inter_no in plan_.inter_no.unique():\n",
" cycle = cycle_dict[(inter_no, the_start_second)]\n",
" df = plan_[(plan_.inter_no==inter_no)&(plan_.start_second==the_start_second)].reset_index(drop=True)\n",
" remainder = sec % cycle\n",
" df['cums_A'] = df.copy().dura_A.cumsum()\n",
" df['cums_B'] = df.copy().dura_B.cumsum()\n",
" ind_A = len(df.cums_A[df.cums_A <= remainder]) % inter2no_phase[inter_no]\n",
" ind_B = len(df.cums_B[df.cums_B <= remainder]) % inter2no_phase[inter_no]\n",
" dura_A = df.loc[ind_A, 'dura_A']\n",
" dura_B = df.loc[ind_B, 'dura_B']\n",
" phas_A = df.loc[ind_A, 'phase_no']\n",
" phas_B = df.loc[ind_B, 'phase_no']\n",
" move_A = df.loc[ind_A, 'move_A']\n",
" move_B = df.loc[ind_B, 'move_B']\n",
" move.append(pd.DataFrame({'inter_no':[inter_no], 'phas_A':[phas_A], 'phas_B':[phas_B], 'move_A':[move_A], 'move_B':[move_B]}))\n",
" move = pd.concat(move)\n",
" move.to_csv(f'../moves/move_{current_time}.csv')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" start_hour | \n",
" start_minute | \n",
" dura_A1 | \n",
" dura_A2 | \n",
" dura_A3 | \n",
" dura_A4 | \n",
" dura_A5 | \n",
" dura_A6 | \n",
" dura_A7 | \n",
" ... | \n",
" dura_B1 | \n",
" dura_B2 | \n",
" dura_B3 | \n",
" dura_B4 | \n",
" dura_B5 | \n",
" dura_B6 | \n",
" dura_B7 | \n",
" dura_B8 | \n",
" cycle | \n",
" offset | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 00 | \n",
" 00 | \n",
" 37 | \n",
" 39 | \n",
" 55 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 59 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 07 | \n",
" 00 | \n",
" 40 | \n",
" 42 | \n",
" 55 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 59 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 09 | \n",
" 00 | \n",
" 43 | \n",
" 45 | \n",
" 55 | \n",
" 37 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 43 | \n",
" 45 | \n",
" 33 | \n",
" 59 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 28 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 18 | \n",
" 30 | \n",
" 46 | \n",
" 48 | \n",
" 55 | \n",
" 41 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 46 | \n",
" 48 | \n",
" 37 | \n",
" 59 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 18 | \n",
"
\n",
" \n",
" 4 | \n",
" 176 | \n",
" 00 | \n",
" 00 | \n",
" 37 | \n",
" 73 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 37 | \n",
" 73 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 131 | \n",
"
\n",
" \n",
" 5 | \n",
" 176 | \n",
" 07 | \n",
" 00 | \n",
" 37 | \n",
" 93 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 37 | \n",
" 93 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 153 | \n",
"
\n",
" \n",
" 6 | \n",
" 176 | \n",
" 09 | \n",
" 00 | \n",
" 37 | \n",
" 103 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 37 | \n",
" 103 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 169 | \n",
"
\n",
" \n",
" 7 | \n",
" 176 | \n",
" 18 | \n",
" 30 | \n",
" 37 | \n",
" 113 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 37 | \n",
" 113 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 185 | \n",
"
\n",
" \n",
" 8 | \n",
" 177 | \n",
" 00 | \n",
" 00 | \n",
" 36 | \n",
" 20 | \n",
" 68 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 36 | \n",
" 20 | \n",
" 68 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 35 | \n",
"
\n",
" \n",
" 9 | \n",
" 177 | \n",
" 07 | \n",
" 00 | \n",
" 40 | \n",
" 25 | \n",
" 71 | \n",
" 34 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 40 | \n",
" 25 | \n",
" 71 | \n",
" 34 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 33 | \n",
"
\n",
" \n",
" 10 | \n",
" 177 | \n",
" 09 | \n",
" 00 | \n",
" 43 | \n",
" 27 | \n",
" 70 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 43 | \n",
" 27 | \n",
" 70 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 41 | \n",
"
\n",
" \n",
" 11 | \n",
" 177 | \n",
" 18 | \n",
" 30 | \n",
" 45 | \n",
" 32 | \n",
" 77 | \n",
" 36 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 45 | \n",
" 32 | \n",
" 77 | \n",
" 36 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 49 | \n",
"
\n",
" \n",
" 12 | \n",
" 178 | \n",
" 00 | \n",
" 00 | \n",
" 38 | \n",
" 39 | \n",
" 40 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 38 | \n",
" 39 | \n",
" 40 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 50 | \n",
"
\n",
" \n",
" 13 | \n",
" 178 | \n",
" 07 | \n",
" 00 | \n",
" 38 | \n",
" 39 | \n",
" 42 | \n",
" 41 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 38 | \n",
" 39 | \n",
" 62 | \n",
" 21 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 90 | \n",
"
\n",
" \n",
" 14 | \n",
" 178 | \n",
" 09 | \n",
" 00 | \n",
" 38 | \n",
" 39 | \n",
" 43 | \n",
" 50 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 38 | \n",
" 39 | \n",
" 71 | \n",
" 22 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 80 | \n",
"
\n",
" \n",
" 15 | \n",
" 178 | \n",
" 18 | \n",
" 30 | \n",
" 38 | \n",
" 39 | \n",
" 44 | \n",
" 59 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 38 | \n",
" 39 | \n",
" 80 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 75 | \n",
"
\n",
" \n",
" 16 | \n",
" 201 | \n",
" 00 | \n",
" 00 | \n",
" 24 | \n",
" 24 | \n",
" 17 | \n",
" 58 | \n",
" 17 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 24 | \n",
" 24 | \n",
" 17 | \n",
" 58 | \n",
" 17 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 133 | \n",
"
\n",
" \n",
" 17 | \n",
" 201 | \n",
" 07 | \n",
" 00 | \n",
" 30 | \n",
" 36 | \n",
" 18 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 30 | \n",
" 36 | \n",
" 18 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 132 | \n",
"
\n",
" \n",
" 18 | \n",
" 201 | \n",
" 09 | \n",
" 00 | \n",
" 33 | \n",
" 36 | \n",
" 25 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 33 | \n",
" 36 | \n",
" 25 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 134 | \n",
"
\n",
" \n",
" 19 | \n",
" 201 | \n",
" 18 | \n",
" 30 | \n",
" 36 | \n",
" 50 | \n",
" 18 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 36 | \n",
" 50 | \n",
" 18 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 137 | \n",
"
\n",
" \n",
" 20 | \n",
" 202 | \n",
" 00 | \n",
" 00 | \n",
" 39 | \n",
" 101 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 39 | \n",
" 101 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 103 | \n",
"
\n",
" \n",
" 21 | \n",
" 202 | \n",
" 07 | \n",
" 00 | \n",
" 46 | \n",
" 114 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 46 | \n",
" 114 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 103 | \n",
"
\n",
" \n",
" 22 | \n",
" 202 | \n",
" 09 | \n",
" 00 | \n",
" 46 | \n",
" 114 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 46 | \n",
" 114 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 103 | \n",
"
\n",
" \n",
" 23 | \n",
" 202 | \n",
" 18 | \n",
" 30 | \n",
" 48 | \n",
" 122 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 48 | \n",
" 122 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 103 | \n",
"
\n",
" \n",
" 24 | \n",
" 206 | \n",
" 00 | \n",
" 00 | \n",
" 33 | \n",
" 35 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 33 | \n",
" 35 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 10 | \n",
"
\n",
" \n",
" 25 | \n",
" 206 | \n",
" 07 | \n",
" 00 | \n",
" 44 | \n",
" 44 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 44 | \n",
" 44 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 7 | \n",
"
\n",
" \n",
" 26 | \n",
" 206 | \n",
" 09 | \n",
" 00 | \n",
" 45 | \n",
" 53 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 45 | \n",
" 53 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 17 | \n",
"
\n",
" \n",
" 27 | \n",
" 206 | \n",
" 18 | \n",
" 30 | \n",
" 46 | \n",
" 62 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 46 | \n",
" 62 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 10 | \n",
"
\n",
" \n",
" 28 | \n",
" 210 | \n",
" 00 | \n",
" 00 | \n",
" 43 | \n",
" 29 | \n",
" 56 | \n",
" 22 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 24 | \n",
" 48 | \n",
" 56 | \n",
" 22 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 115 | \n",
"
\n",
" \n",
" 29 | \n",
" 210 | \n",
" 07 | \n",
" 00 | \n",
" 43 | \n",
" 39 | \n",
" 65 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 24 | \n",
" 58 | \n",
" 65 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 131 | \n",
"
\n",
" \n",
" 30 | \n",
" 210 | \n",
" 09 | \n",
" 00 | \n",
" 43 | \n",
" 43 | \n",
" 70 | \n",
" 24 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 28 | \n",
" 58 | \n",
" 70 | \n",
" 24 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 137 | \n",
"
\n",
" \n",
" 31 | \n",
" 210 | \n",
" 18 | \n",
" 30 | \n",
" 43 | \n",
" 47 | \n",
" 75 | \n",
" 25 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 24 | \n",
" 66 | \n",
" 75 | \n",
" 25 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 143 | \n",
"
\n",
" \n",
" 32 | \n",
" 211 | \n",
" 00 | \n",
" 00 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 33 | \n",
" 211 | \n",
" 07 | \n",
" 00 | \n",
" 28 | \n",
" 107 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 28 | \n",
" 107 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 135 | \n",
" 45 | \n",
"
\n",
" \n",
" 34 | \n",
" 211 | \n",
" 09 | \n",
" 00 | \n",
" 28 | \n",
" 112 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 28 | \n",
" 112 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 55 | \n",
"
\n",
" \n",
" 35 | \n",
" 211 | \n",
" 18 | \n",
" 30 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
"
\n",
"
36 rows × 21 columns
\n",
"
"
],
"text/plain": [
" inter_no start_hour start_minute dura_A1 dura_A2 dura_A3 dura_A4 \\\n",
"0 175 00 00 37 39 55 29 \n",
"1 175 07 00 40 42 55 33 \n",
"2 175 09 00 43 45 55 37 \n",
"3 175 18 30 46 48 55 41 \n",
"4 176 00 00 37 73 40 0 \n",
"5 176 07 00 37 93 40 0 \n",
"6 176 09 00 37 103 40 0 \n",
"7 176 18 30 37 113 40 0 \n",
"8 177 00 00 36 20 68 26 \n",
"9 177 07 00 40 25 71 34 \n",
"10 177 09 00 43 27 70 40 \n",
"11 177 18 30 45 32 77 36 \n",
"12 178 00 00 38 39 40 23 \n",
"13 178 07 00 38 39 42 41 \n",
"14 178 09 00 38 39 43 50 \n",
"15 178 18 30 38 39 44 59 \n",
"16 201 00 00 24 24 17 58 \n",
"17 201 07 00 30 36 18 58 \n",
"18 201 09 00 33 36 25 58 \n",
"19 201 18 30 36 50 18 58 \n",
"20 202 00 00 39 101 0 0 \n",
"21 202 07 00 46 114 0 0 \n",
"22 202 09 00 46 114 0 0 \n",
"23 202 18 30 48 122 0 0 \n",
"24 206 00 00 33 35 26 26 \n",
"25 206 07 00 44 44 26 26 \n",
"26 206 09 00 45 53 26 26 \n",
"27 206 18 30 46 62 26 26 \n",
"28 210 00 00 43 29 56 22 \n",
"29 210 07 00 43 39 65 23 \n",
"30 210 09 00 43 43 70 24 \n",
"31 210 18 30 43 47 75 25 \n",
"32 211 00 00 28 97 0 0 \n",
"33 211 07 00 28 107 0 0 \n",
"34 211 09 00 28 112 0 0 \n",
"35 211 18 30 28 117 0 0 \n",
"\n",
" dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n",
"0 0 0 0 ... 37 39 25 59 \n",
"1 0 0 0 ... 40 42 29 59 \n",
"2 0 0 0 ... 43 45 33 59 \n",
"3 0 0 0 ... 46 48 37 59 \n",
"4 0 0 0 ... 37 73 40 0 \n",
"5 0 0 0 ... 37 93 40 0 \n",
"6 0 0 0 ... 37 103 40 0 \n",
"7 0 0 0 ... 37 113 40 0 \n",
"8 0 0 0 ... 36 20 68 26 \n",
"9 0 0 0 ... 40 25 71 34 \n",
"10 0 0 0 ... 43 27 70 40 \n",
"11 0 0 0 ... 45 32 77 36 \n",
"12 0 0 0 ... 38 39 40 23 \n",
"13 0 0 0 ... 38 39 62 21 \n",
"14 0 0 0 ... 38 39 71 22 \n",
"15 0 0 0 ... 38 39 80 23 \n",
"16 17 0 0 ... 24 24 17 58 \n",
"17 18 0 0 ... 30 36 18 58 \n",
"18 18 0 0 ... 33 36 25 58 \n",
"19 18 0 0 ... 36 50 18 58 \n",
"20 0 0 0 ... 39 101 0 0 \n",
"21 0 0 0 ... 46 114 0 0 \n",
"22 0 0 0 ... 46 114 0 0 \n",
"23 0 0 0 ... 48 122 0 0 \n",
"24 0 0 0 ... 33 35 26 26 \n",
"25 0 0 0 ... 44 44 26 26 \n",
"26 0 0 0 ... 45 53 26 26 \n",
"27 0 0 0 ... 46 62 26 26 \n",
"28 0 0 0 ... 24 48 56 22 \n",
"29 0 0 0 ... 24 58 65 23 \n",
"30 0 0 0 ... 28 58 70 24 \n",
"31 0 0 0 ... 24 66 75 25 \n",
"32 0 0 0 ... 28 97 0 0 \n",
"33 0 0 0 ... 28 107 0 0 \n",
"34 0 0 0 ... 28 112 0 0 \n",
"35 0 0 0 ... 28 117 0 0 \n",
"\n",
" dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n",
"0 0 0 0 0 160 57 \n",
"1 0 0 0 0 170 40 \n",
"2 0 0 0 0 180 28 \n",
"3 0 0 0 0 190 18 \n",
"4 0 0 0 0 150 131 \n",
"5 0 0 0 0 170 153 \n",
"6 0 0 0 0 180 169 \n",
"7 0 0 0 0 190 185 \n",
"8 0 0 0 0 150 35 \n",
"9 0 0 0 0 170 33 \n",
"10 0 0 0 0 180 41 \n",
"11 0 0 0 0 190 49 \n",
"12 0 0 0 0 140 50 \n",
"13 0 0 0 0 160 90 \n",
"14 0 0 0 0 170 80 \n",
"15 0 0 0 0 180 75 \n",
"16 17 0 0 0 140 133 \n",
"17 18 0 0 0 160 132 \n",
"18 18 0 0 0 170 134 \n",
"19 18 0 0 0 180 137 \n",
"20 0 0 0 0 140 103 \n",
"21 0 0 0 0 160 103 \n",
"22 0 0 0 0 160 103 \n",
"23 0 0 0 0 170 103 \n",
"24 0 0 0 0 120 10 \n",
"25 0 0 0 0 140 7 \n",
"26 0 0 0 0 150 17 \n",
"27 0 0 0 0 160 10 \n",
"28 0 0 0 0 150 115 \n",
"29 0 0 0 0 170 131 \n",
"30 0 0 0 0 180 137 \n",
"31 0 0 0 0 190 143 \n",
"32 0 0 0 0 125 45 \n",
"33 0 0 0 0 135 45 \n",
"34 0 0 0 0 140 55 \n",
"35 0 0 0 0 145 55 \n",
"\n",
"[36 rows x 21 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" start_hour | \n",
" start_minute | \n",
" ddur_1 | \n",
" ddur_2 | \n",
" ddur_3 | \n",
" ddur_4 | \n",
" ddur_5 | \n",
" ddur_6 | \n",
" ddur_7 | \n",
" ddur_8 | \n",
" cycle | \n",
" offset | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" 00 | \n",
" 00 | \n",
" 37 | \n",
" 39 | \n",
" 25 | \n",
" 30 | \n",
" 29 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 57 | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" 07 | \n",
" 00 | \n",
" 40 | \n",
" 42 | \n",
" 29 | \n",
" 26 | \n",
" 33 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 40 | \n",
"
\n",
" \n",
" 2 | \n",
" 175 | \n",
" 09 | \n",
" 00 | \n",
" 43 | \n",
" 45 | \n",
" 33 | \n",
" 22 | \n",
" 37 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 28 | \n",
"
\n",
" \n",
" 3 | \n",
" 175 | \n",
" 18 | \n",
" 30 | \n",
" 46 | \n",
" 48 | \n",
" 37 | \n",
" 18 | \n",
" 41 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 18 | \n",
"
\n",
" \n",
" 4 | \n",
" 176 | \n",
" 00 | \n",
" 00 | \n",
" 37 | \n",
" 73 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 131 | \n",
"
\n",
" \n",
" 5 | \n",
" 176 | \n",
" 07 | \n",
" 00 | \n",
" 37 | \n",
" 93 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 153 | \n",
"
\n",
" \n",
" 6 | \n",
" 176 | \n",
" 09 | \n",
" 00 | \n",
" 37 | \n",
" 103 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 169 | \n",
"
\n",
" \n",
" 7 | \n",
" 176 | \n",
" 18 | \n",
" 30 | \n",
" 37 | \n",
" 113 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 185 | \n",
"
\n",
" \n",
" 8 | \n",
" 177 | \n",
" 00 | \n",
" 00 | \n",
" 36 | \n",
" 20 | \n",
" 68 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 35 | \n",
"
\n",
" \n",
" 9 | \n",
" 177 | \n",
" 07 | \n",
" 00 | \n",
" 40 | \n",
" 25 | \n",
" 71 | \n",
" 34 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 33 | \n",
"
\n",
" \n",
" 10 | \n",
" 177 | \n",
" 09 | \n",
" 00 | \n",
" 43 | \n",
" 27 | \n",
" 70 | \n",
" 40 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 41 | \n",
"
\n",
" \n",
" 11 | \n",
" 177 | \n",
" 18 | \n",
" 30 | \n",
" 45 | \n",
" 32 | \n",
" 77 | \n",
" 36 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 49 | \n",
"
\n",
" \n",
" 12 | \n",
" 178 | \n",
" 00 | \n",
" 00 | \n",
" 38 | \n",
" 39 | \n",
" 40 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 50 | \n",
"
\n",
" \n",
" 13 | \n",
" 178 | \n",
" 07 | \n",
" 00 | \n",
" 38 | \n",
" 39 | \n",
" 42 | \n",
" 20 | \n",
" 21 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 90 | \n",
"
\n",
" \n",
" 14 | \n",
" 178 | \n",
" 09 | \n",
" 00 | \n",
" 38 | \n",
" 39 | \n",
" 43 | \n",
" 28 | \n",
" 22 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 80 | \n",
"
\n",
" \n",
" 15 | \n",
" 178 | \n",
" 18 | \n",
" 30 | \n",
" 38 | \n",
" 39 | \n",
" 44 | \n",
" 36 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 75 | \n",
"
\n",
" \n",
" 16 | \n",
" 201 | \n",
" 00 | \n",
" 00 | \n",
" 24 | \n",
" 24 | \n",
" 17 | \n",
" 58 | \n",
" 17 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 133 | \n",
"
\n",
" \n",
" 17 | \n",
" 201 | \n",
" 07 | \n",
" 00 | \n",
" 30 | \n",
" 36 | \n",
" 18 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 132 | \n",
"
\n",
" \n",
" 18 | \n",
" 201 | \n",
" 09 | \n",
" 00 | \n",
" 33 | \n",
" 36 | \n",
" 25 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 134 | \n",
"
\n",
" \n",
" 19 | \n",
" 201 | \n",
" 18 | \n",
" 30 | \n",
" 36 | \n",
" 50 | \n",
" 18 | \n",
" 58 | \n",
" 18 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 137 | \n",
"
\n",
" \n",
" 20 | \n",
" 202 | \n",
" 00 | \n",
" 00 | \n",
" 39 | \n",
" 101 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 103 | \n",
"
\n",
" \n",
" 21 | \n",
" 202 | \n",
" 07 | \n",
" 00 | \n",
" 46 | \n",
" 114 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 103 | \n",
"
\n",
" \n",
" 22 | \n",
" 202 | \n",
" 09 | \n",
" 00 | \n",
" 46 | \n",
" 114 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 103 | \n",
"
\n",
" \n",
" 23 | \n",
" 202 | \n",
" 18 | \n",
" 30 | \n",
" 48 | \n",
" 122 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 103 | \n",
"
\n",
" \n",
" 24 | \n",
" 206 | \n",
" 00 | \n",
" 00 | \n",
" 33 | \n",
" 35 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 120 | \n",
" 10 | \n",
"
\n",
" \n",
" 25 | \n",
" 206 | \n",
" 07 | \n",
" 00 | \n",
" 44 | \n",
" 44 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 7 | \n",
"
\n",
" \n",
" 26 | \n",
" 206 | \n",
" 09 | \n",
" 00 | \n",
" 45 | \n",
" 53 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 17 | \n",
"
\n",
" \n",
" 27 | \n",
" 206 | \n",
" 18 | \n",
" 30 | \n",
" 46 | \n",
" 62 | \n",
" 26 | \n",
" 26 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 160 | \n",
" 10 | \n",
"
\n",
" \n",
" 28 | \n",
" 210 | \n",
" 00 | \n",
" 00 | \n",
" 24 | \n",
" 19 | \n",
" 29 | \n",
" 56 | \n",
" 22 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 150 | \n",
" 115 | \n",
"
\n",
" \n",
" 29 | \n",
" 210 | \n",
" 07 | \n",
" 00 | \n",
" 24 | \n",
" 19 | \n",
" 39 | \n",
" 65 | \n",
" 23 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 170 | \n",
" 131 | \n",
"
\n",
" \n",
" 30 | \n",
" 210 | \n",
" 09 | \n",
" 00 | \n",
" 28 | \n",
" 15 | \n",
" 43 | \n",
" 70 | \n",
" 24 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 180 | \n",
" 137 | \n",
"
\n",
" \n",
" 31 | \n",
" 210 | \n",
" 18 | \n",
" 30 | \n",
" 24 | \n",
" 19 | \n",
" 47 | \n",
" 75 | \n",
" 25 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 190 | \n",
" 143 | \n",
"
\n",
" \n",
" 32 | \n",
" 211 | \n",
" 00 | \n",
" 00 | \n",
" 28 | \n",
" 97 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 125 | \n",
" 45 | \n",
"
\n",
" \n",
" 33 | \n",
" 211 | \n",
" 07 | \n",
" 00 | \n",
" 28 | \n",
" 107 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 135 | \n",
" 45 | \n",
"
\n",
" \n",
" 34 | \n",
" 211 | \n",
" 09 | \n",
" 00 | \n",
" 28 | \n",
" 112 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 140 | \n",
" 55 | \n",
"
\n",
" \n",
" 35 | \n",
" 211 | \n",
" 18 | \n",
" 30 | \n",
" 28 | \n",
" 117 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 145 | \n",
" 55 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no start_hour start_minute ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 \\\n",
"0 175 00 00 37 39 25 30 29 \n",
"1 175 07 00 40 42 29 26 33 \n",
"2 175 09 00 43 45 33 22 37 \n",
"3 175 18 30 46 48 37 18 41 \n",
"4 176 00 00 37 73 40 0 0 \n",
"5 176 07 00 37 93 40 0 0 \n",
"6 176 09 00 37 103 40 0 0 \n",
"7 176 18 30 37 113 40 0 0 \n",
"8 177 00 00 36 20 68 26 0 \n",
"9 177 07 00 40 25 71 34 0 \n",
"10 177 09 00 43 27 70 40 0 \n",
"11 177 18 30 45 32 77 36 0 \n",
"12 178 00 00 38 39 40 23 0 \n",
"13 178 07 00 38 39 42 20 21 \n",
"14 178 09 00 38 39 43 28 22 \n",
"15 178 18 30 38 39 44 36 23 \n",
"16 201 00 00 24 24 17 58 17 \n",
"17 201 07 00 30 36 18 58 18 \n",
"18 201 09 00 33 36 25 58 18 \n",
"19 201 18 30 36 50 18 58 18 \n",
"20 202 00 00 39 101 0 0 0 \n",
"21 202 07 00 46 114 0 0 0 \n",
"22 202 09 00 46 114 0 0 0 \n",
"23 202 18 30 48 122 0 0 0 \n",
"24 206 00 00 33 35 26 26 0 \n",
"25 206 07 00 44 44 26 26 0 \n",
"26 206 09 00 45 53 26 26 0 \n",
"27 206 18 30 46 62 26 26 0 \n",
"28 210 00 00 24 19 29 56 22 \n",
"29 210 07 00 24 19 39 65 23 \n",
"30 210 09 00 28 15 43 70 24 \n",
"31 210 18 30 24 19 47 75 25 \n",
"32 211 00 00 28 97 0 0 0 \n",
"33 211 07 00 28 107 0 0 0 \n",
"34 211 09 00 28 112 0 0 0 \n",
"35 211 18 30 28 117 0 0 0 \n",
"\n",
" ddur_6 ddur_7 ddur_8 cycle offset \n",
"0 0 0 0 160 57 \n",
"1 0 0 0 170 40 \n",
"2 0 0 0 180 28 \n",
"3 0 0 0 190 18 \n",
"4 0 0 0 150 131 \n",
"5 0 0 0 170 153 \n",
"6 0 0 0 180 169 \n",
"7 0 0 0 190 185 \n",
"8 0 0 0 150 35 \n",
"9 0 0 0 170 33 \n",
"10 0 0 0 180 41 \n",
"11 0 0 0 190 49 \n",
"12 0 0 0 140 50 \n",
"13 0 0 0 160 90 \n",
"14 0 0 0 170 80 \n",
"15 0 0 0 180 75 \n",
"16 0 0 0 140 133 \n",
"17 0 0 0 160 132 \n",
"18 0 0 0 170 134 \n",
"19 0 0 0 180 137 \n",
"20 0 0 0 140 103 \n",
"21 0 0 0 160 103 \n",
"22 0 0 0 160 103 \n",
"23 0 0 0 170 103 \n",
"24 0 0 0 120 10 \n",
"25 0 0 0 140 7 \n",
"26 0 0 0 150 17 \n",
"27 0 0 0 160 10 \n",
"28 0 0 0 150 115 \n",
"29 0 0 0 170 131 \n",
"30 0 0 0 180 137 \n",
"31 0 0 0 190 143 \n",
"32 0 0 0 125 45 \n",
"33 0 0 0 135 45 \n",
"34 0 0 0 140 55 \n",
"35 0 0 0 145 55 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 신호계획\n",
"plan = pd.read_csv(\"time_plan.csv\")\n",
"plan = plan[plan.ID.isin([1, 5, 8, 11])]\n",
"ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n",
"plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n",
"plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n",
"plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle', 'offset']]\n",
"plan = plan.pivot_table(index=['inter_no', 'start_hour', 'start_minute', 'cycle', 'offset'], columns=['phase_no','ring_type'], values='duration', aggfunc='first').fillna(0).astype(int)\n",
"new_columns = [f'dura_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n",
"plan.columns = new_columns\n",
"new_columns = [f'dura_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n",
"for col in new_columns:\n",
" if col not in plan.columns:\n",
" plan[col] = 0\n",
"plan.reset_index(inplace=True)\n",
"plan = plan[list(plan.columns)[:3] + sorted(plan.columns)[1:-4] + list(plan.columns)[3:5]]\n",
"plan.to_csv('../plan.csv')\n",
"pland = plan.copy()\n",
"cums_A = np.array(pland[[f'dura_A{k}' for k in range(1,9)]].cumsum(axis=1))\n",
"cums_B = np.array(pland[[f'dura_B{k}' for k in range(1,9)]].cumsum(axis=1))\n",
"detailed_cums = []\n",
"i = 0\n",
"for row_A, row_B in zip(cums_A, cums_B):\n",
" combined_row = np.unique(np.concatenate((row_A, row_B)))\n",
" ddur = np.concatenate(([combined_row[0]], np.diff(combined_row)))\n",
" ddur = np.pad(ddur, (0, 8 - len(ddur)), constant_values=(0))\n",
" detailed_cums.append(ddur)\n",
" for j in range(8):\n",
" pland.at[i, f'ddur_{j+1}'] = ddur[j]\n",
" i+=1\n",
"pland = pland[['inter_no', 'start_hour', 'start_minute'] + [f'ddur_{i}' for i in range(1,9)] + ['cycle', 'offset']] # plan detailed\n",
"pland[[f'ddur_{i}' for i in range(1,9)]] = pland[[f'ddur_{i}' for i in range(1,9)]].astype(int)\n",
"display(plan)\n",
"display(pland)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 신호이력\n",
"midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n",
"pland['end_unix'] = pland['start_hour'].astype(int) * 3600 + plan['start_minute'].astype(int) * 60 + midnight\n",
"history = []\n",
"for inter_no in pland.inter_no.unique():\n",
" aplan = pland[pland.inter_no == inter_no] # a (specific) plan\n",
" rows = []\n",
" current_time = midnight # 현재시각\n",
" for i in range(len(aplan)):\n",
" first_row = aplan.iloc[i]\n",
" cycle = first_row['cycle']\n",
" unix_end = aplan.iloc[i + 1]['end_unix'] if i < len(aplan) - 1 else next_day # 프로그램의 마지막 시점\n",
" r = 0\n",
" while current_time <= unix_end:\n",
" remainder = current_time % 10\n",
" if remainder != 0: # 현재시각의 일의자리가 0이 아니면 다음 현재시각의 일이자리가 0이 되도록 맞춰준다.\n",
" r = (5 - remainder) % 10 - 5 # 1>-1, 2>-2, 3>-3, 4>-4, 5>-5, 6>4, 7>3, 8>2, 9>1\n",
" else:\n",
" r = random.choices([0, -1, 1], weights=[10, 1, 1])[0] # 측정오차\n",
" # 0.001의 확률로 결측 발생\n",
" if random.random() < 0.001: # 주기의 배수만큼 결측\n",
" n = random.randint(0,100)\n",
" current_time += n * cycle + r\n",
" # 0.01의 확률로 이상치 발생\n",
" elif random.random() > 0.99: # 카이제곱분포값 * 주기만큼의 이상치 발생. 카이제곱분포값은 항상 양수이고 평균이 1\n",
" current_time += int(np.random.normal()**2 * cycle) + r\n",
" else:\n",
" current_time += cycle + r # 결측/이상 없음\n",
" new_row = first_row.copy()\n",
" new_row['end_unix'] = current_time\n",
" rows.append(new_row)\n",
" ahistory = pd.concat(rows, axis=1).transpose().reset_index(drop=True) # a (specific) history\n",
" history.append(ahistory)\n",
"history = pd.concat(history)\n",
"history = history[history.end_unix <= next_day]\n",
"history = history.sort_values(by='end_unix').reset_index(drop=True)\n",
"history = history[['inter_no', 'end_unix'] + [f'ddur_{j}' for j in range(1, 9)] + ['cycle', 'offset']]\n",
"history.to_csv('../history.csv')\n",
"display(history[:30])\n",
"# hist = history.copy()[history.inter_no==175]\n",
"# hist['diff'] = hist['end_unix'].diff()\n",
"# with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
"# display(hist)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# df = history.sort_values(by=['inter_no','end_unix'])\n",
"# df['diff'] = df.end_unix.diff()\n",
"# with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
"# display(df)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" inter_no | \n",
" node_id | \n",
" inter_type | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 175 | \n",
" i0 | \n",
" parent | \n",
"
\n",
" \n",
" 1 | \n",
" 175 | \n",
" u00 | \n",
" child | \n",
"
\n",
" \n",
" 2 | \n",
" 176 | \n",
" i1 | \n",
" parent | \n",
"
\n",
" \n",
" 3 | \n",
" 177 | \n",
" i2 | \n",
" parent | \n",
"
\n",
" \n",
" 4 | \n",
" 177 | \n",
" u20 | \n",
" child | \n",
"
\n",
" \n",
" 5 | \n",
" 178 | \n",
" i3 | \n",
" parent | \n",
"
\n",
" \n",
" 6 | \n",
" 178 | \n",
" u30 | \n",
" child | \n",
"
\n",
" \n",
" 7 | \n",
" 178 | \n",
" u31 | \n",
" child | \n",
"
\n",
" \n",
" 8 | \n",
" 178 | \n",
" u32 | \n",
" child | \n",
"
\n",
" \n",
" 9 | \n",
" 201 | \n",
" i8 | \n",
" parent | \n",
"
\n",
" \n",
" 10 | \n",
" 202 | \n",
" i9 | \n",
" parent | \n",
"
\n",
" \n",
" 11 | \n",
" 206 | \n",
" i7 | \n",
" parent | \n",
"
\n",
" \n",
" 12 | \n",
" 210 | \n",
" i6 | \n",
" parent | \n",
"
\n",
" \n",
" 13 | \n",
" 210 | \n",
" u60 | \n",
" child | \n",
"
\n",
" \n",
" 14 | \n",
" 211 | \n",
" c30 | \n",
" parent | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" inter_no node_id inter_type\n",
"0 175 i0 parent\n",
"1 175 u00 child\n",
"2 176 i1 parent\n",
"3 177 i2 parent\n",
"4 177 u20 child\n",
"5 178 i3 parent\n",
"6 178 u30 child\n",
"7 178 u31 child\n",
"8 178 u32 child\n",
"9 201 i8 parent\n",
"10 202 i9 parent\n",
"11 206 i7 parent\n",
"12 210 i6 parent\n",
"13 210 u60 child\n",
"14 211 c30 parent"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 교차로-노드 매칭\n",
"uturn = pd.read_csv('U_TURN.csv')\n",
"inter_node = pd.read_csv('inter.csv')\n",
"inter_node = inter_node[['INT_NO', 'node_id', 'P/C']]\n",
"# inter_node.drop(index=len(inter_node) - 1, inplace=True)\n",
"inter_node.columns = ['inter_no', 'node_id', 'inter_type'] # parent : 주교차로, child : 부교차로\n",
"inter_node['inter_no'] = inter_node['inter_no'].astype(int) # i : intersection, u : u-turn intersection, c : coupling intersection\n",
"inter_node.iloc[-1] = pd.Series([211, 'c30', 'parent'])\n",
"inter_node.to_csv('../inter_node.csv')\n",
"display(inter_node)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# 부교차로 정보\n",
"# 지금은 생략 (23. 1. 9. 09:32)"
]
}
],
"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
}