diff --git a/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb b/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb
index fd5dfe53a..42a97ce4a 100644
--- a/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb
+++ b/Analysis/0109_preprocess/0116_preprocess_8.2.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -24,14 +24,14 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 17280/17280 [00:13<00:00, 1299.31it/s]\n"
+ "100%|██████████| 17280/17280 [00:18<00:00, 924.90it/s] \n"
]
},
{
@@ -161,7 +161,7 @@
"9 177 2 2 7 3"
]
},
- "execution_count": 4,
+ "execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
@@ -177,7 +177,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -296,7 +296,7 @@
"5 176 1 B 4"
]
},
- "execution_count": 5,
+ "execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
@@ -317,7 +317,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -396,210 +396,1192 @@
"
서 \n",
" \n",
" \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
+ " 5 \n",
+ " 175 \n",
+ " 3 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
" \n",
" \n",
- " 59 \n",
- " 210 \n",
+ " 6 \n",
+ " 175 \n",
+ " 4 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 175 \n",
+ " 4 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 176 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 176 \n",
+ " 1 \n",
+ " B \n",
" 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 176 \n",
+ " 2 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 176 \n",
+ " 2 \n",
" B \n",
" 3 \n",
" 남 \n",
" 서 \n",
" \n",
" \n",
- " 60 \n",
- " 211 \n",
- " 1 \n",
+ " 12 \n",
+ " 176 \n",
+ " 3 \n",
" A \n",
- " 6 \n",
- " 동 \n",
+ " 5 \n",
" 서 \n",
+ " 북 \n",
" \n",
" \n",
- " 61 \n",
- " 211 \n",
+ " 13 \n",
+ " 176 \n",
+ " 3 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 177 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 177 \n",
" 1 \n",
" B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 177 \n",
" 2 \n",
- " 서 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
" 동 \n",
" \n",
" \n",
- " 62 \n",
- " 211 \n",
+ " 17 \n",
+ " 177 \n",
" 2 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 177 \n",
+ " 3 \n",
" A \n",
" 17 \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
- " 63 \n",
- " 211 \n",
- " 2 \n",
+ " 19 \n",
+ " 177 \n",
+ " 3 \n",
" B \n",
" 18 \n",
" NaN \n",
" NaN \n",
" \n",
- " \n",
- "\n",
- "64 rows × 6 columns
\n",
- ""
- ],
- "text/plain": [
- " inter_no phase_no ring_type move_no inc_dir out_dir\n",
- "0 175 1 A 8 남 북\n",
- "1 175 1 B 4 북 남\n",
- "2 175 2 A 7 북 동\n",
- "3 175 2 B 3 남 서\n",
- "4 175 3 A 6 동 서\n",
- ".. ... ... ... ... ... ...\n",
- "59 210 4 B 3 남 서\n",
- "60 211 1 A 6 동 서\n",
- "61 211 1 B 2 서 동\n",
- "62 211 2 A 17 NaN NaN\n",
- "63 211 2 B 18 NaN NaN\n",
- "\n",
- "[64 rows x 6 columns]"
- ]
- },
- "execution_count": 6,
- "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": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phase_no \n",
- " ring_type \n",
- " move_no \n",
- " inc_dir \n",
- " out_dir \n",
- " inc_angle \n",
- " out_angle \n",
+ " \n",
+ " 20 \n",
+ " 177 \n",
+ " 4 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 177 \n",
+ " 4 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 178 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 178 \n",
+ " 1 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 178 \n",
+ " 2 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 178 \n",
+ " 2 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 178 \n",
+ " 3 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 178 \n",
+ " 3 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 178 \n",
+ " 4 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 178 \n",
+ " 4 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 201 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " 201 \n",
+ " 1 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 201 \n",
+ " 2 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " 201 \n",
+ " 2 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 201 \n",
+ " 3 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " 201 \n",
+ " 3 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " 201 \n",
+ " 4 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 201 \n",
+ " 4 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 201 \n",
+ " 5 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 201 \n",
+ " 5 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 202 \n",
+ " 1 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " 202 \n",
+ " 1 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 42 \n",
+ " 202 \n",
+ " 2 \n",
+ " A \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " 202 \n",
+ " 2 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 206 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " 206 \n",
+ " 1 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 46 \n",
+ " 206 \n",
+ " 2 \n",
+ " A \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 47 \n",
+ " 206 \n",
+ " 2 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 48 \n",
+ " 206 \n",
+ " 3 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 49 \n",
+ " 206 \n",
+ " 3 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 50 \n",
+ " 206 \n",
+ " 4 \n",
+ " A \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 206 \n",
+ " 4 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 52 \n",
+ " 210 \n",
+ " 1 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ " 53 \n",
+ " 210 \n",
+ " 1 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 54 \n",
+ " 210 \n",
+ " 2 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 55 \n",
+ " 210 \n",
+ " 2 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 56 \n",
+ " 210 \n",
+ " 3 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " \n",
+ " \n",
+ " 57 \n",
+ " 210 \n",
+ " 3 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " \n",
+ " \n",
+ " 58 \n",
+ " 210 \n",
+ " 4 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " 210 \n",
+ " 4 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir\n",
+ "0 175 1 A 8 남 북\n",
+ "1 175 1 B 4 북 남\n",
+ "2 175 2 A 7 북 동\n",
+ "3 175 2 B 3 남 서\n",
+ "4 175 3 A 6 동 서\n",
+ "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": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " inter_no \n",
+ " phase_no \n",
+ " ring_type \n",
+ " move_no \n",
+ " inc_dir \n",
+ " out_dir \n",
+ " inc_angle \n",
+ " out_angle \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 175 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 179 \n",
+ " 004 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 175 \n",
+ " 1 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 003 \n",
+ " 176 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 175 \n",
+ " 2 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " 001 \n",
+ " 095 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 175 \n",
+ " 2 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " 179 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 175 \n",
+ " 3 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " 090 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 175 \n",
+ " 3 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " 090 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 175 \n",
+ " 4 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " 268 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 175 \n",
+ " 4 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " 270 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 176 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 176 \n",
+ " 1 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 359 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 176 \n",
+ " 2 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 176 \n",
+ " 2 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " 180 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 176 \n",
+ " 3 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " 270 \n",
+ " 356 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 176 \n",
+ " 3 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 177 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 177 \n",
+ " 1 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 001 \n",
+ " 176 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 177 \n",
+ " 2 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " 000 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 177 \n",
+ " 2 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " 179 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 177 \n",
+ " 3 \n",
+ " A \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 177 \n",
+ " 3 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 177 \n",
+ " 4 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " 268 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 177 \n",
+ " 4 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " 090 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 178 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 178 \n",
+ " 1 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 000 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 178 \n",
+ " 2 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " 000 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 178 \n",
+ " 2 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " 180 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 178 \n",
+ " 3 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " 270 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 178 \n",
+ " 3 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " 270 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 178 \n",
+ " 4 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " 090 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 178 \n",
+ " 4 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " 090 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 201 \n",
+ " 1 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " 201 \n",
+ " 1 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " 180 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 201 \n",
+ " 2 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " 270 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " 201 \n",
+ " 2 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " 270 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 201 \n",
+ " 3 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " 090 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " 201 \n",
+ " 3 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " 270 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " 201 \n",
+ " 4 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " 090 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 201 \n",
+ " 4 \n",
+ " B \n",
+ " 1 \n",
+ " 동 \n",
+ " 남 \n",
+ " 090 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 201 \n",
+ " 5 \n",
+ " A \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " 000 \n",
+ " 090 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 201 \n",
+ " 5 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 000 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 202 \n",
+ " 1 \n",
+ " A \n",
+ " 6 \n",
+ " 동 \n",
+ " 서 \n",
+ " 090 \n",
+ " 270 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " 202 \n",
+ " 1 \n",
+ " B \n",
+ " 2 \n",
+ " 서 \n",
+ " 동 \n",
+ " 270 \n",
+ " 090 \n",
" \n",
- " \n",
- " \n",
" \n",
- " 0 \n",
- " 175 \n",
+ " 42 \n",
+ " 202 \n",
+ " 2 \n",
+ " A \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " 202 \n",
+ " 2 \n",
+ " B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 206 \n",
" 1 \n",
" A \n",
" 8 \n",
" 남 \n",
" 북 \n",
- " 179 \n",
- " 004 \n",
+ " 180 \n",
+ " 000 \n",
" \n",
" \n",
- " 1 \n",
- " 175 \n",
+ " 45 \n",
+ " 206 \n",
" 1 \n",
" B \n",
" 4 \n",
" 북 \n",
" 남 \n",
- " 003 \n",
- " 176 \n",
+ " 000 \n",
+ " 180 \n",
" \n",
" \n",
- " 2 \n",
- " 175 \n",
+ " 46 \n",
+ " 206 \n",
" 2 \n",
" A \n",
- " 7 \n",
- " 북 \n",
- " 동 \n",
- " 001 \n",
- " 095 \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
" \n",
" \n",
- " 3 \n",
- " 175 \n",
+ " 47 \n",
+ " 206 \n",
" 2 \n",
" B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 48 \n",
+ " 206 \n",
" 3 \n",
+ " A \n",
+ " 8 \n",
" 남 \n",
- " 서 \n",
- " 179 \n",
- " 270 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
" \n",
" \n",
- " 4 \n",
- " 175 \n",
+ " 49 \n",
+ " 206 \n",
" 3 \n",
- " A \n",
- " 6 \n",
- " 동 \n",
- " 서 \n",
- " 090 \n",
- " 270 \n",
+ " B \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 000 \n",
+ " 180 \n",
" \n",
" \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
+ " 50 \n",
+ " 206 \n",
+ " 4 \n",
+ " A \n",
+ " 17 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
" \n",
" \n",
- " 59 \n",
- " 210 \n",
+ " 51 \n",
+ " 206 \n",
" 4 \n",
" B \n",
- " 3 \n",
- " 남 \n",
- " 서 \n",
- " 180 \n",
- " 270 \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
" \n",
" \n",
- " 60 \n",
- " 211 \n",
+ " 52 \n",
+ " 210 \n",
" 1 \n",
" A \n",
" 6 \n",
@@ -609,10 +1591,32 @@
" 270 \n",
" \n",
" \n",
- " 61 \n",
- " 211 \n",
+ " 53 \n",
+ " 210 \n",
" 1 \n",
" B \n",
+ " 18 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 54 \n",
+ " 210 \n",
+ " 2 \n",
+ " A \n",
+ " 5 \n",
+ " 서 \n",
+ " 북 \n",
+ " 268 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 55 \n",
+ " 210 \n",
+ " 2 \n",
+ " B \n",
" 2 \n",
" 서 \n",
" 동 \n",
@@ -620,30 +1624,51 @@
" 090 \n",
" \n",
" \n",
- " 62 \n",
- " 211 \n",
- " 2 \n",
+ " 56 \n",
+ " 210 \n",
+ " 3 \n",
" A \n",
- " 17 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
+ " 7 \n",
+ " 북 \n",
+ " 동 \n",
+ " 359 \n",
+ " 090 \n",
" \n",
" \n",
- " 63 \n",
- " 211 \n",
- " 2 \n",
+ " 57 \n",
+ " 210 \n",
+ " 3 \n",
" B \n",
- " 18 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
+ " 4 \n",
+ " 북 \n",
+ " 남 \n",
+ " 000 \n",
+ " 180 \n",
+ " \n",
+ " \n",
+ " 58 \n",
+ " 210 \n",
+ " 4 \n",
+ " A \n",
+ " 8 \n",
+ " 남 \n",
+ " 북 \n",
+ " 180 \n",
+ " 000 \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " 210 \n",
+ " 4 \n",
+ " B \n",
+ " 3 \n",
+ " 남 \n",
+ " 서 \n",
+ " 180 \n",
+ " 270 \n",
" \n",
" \n",
"
\n",
- "
64 rows × 8 columns
\n",
"
"
],
"text/plain": [
@@ -653,17 +1678,64 @@
"2 175 2 A 7 북 동 001 095\n",
"3 175 2 B 3 남 서 179 270\n",
"4 175 3 A 6 동 서 090 270\n",
- ".. ... ... ... ... ... ... ... ...\n",
- "59 210 4 B 3 남 서 180 270\n",
- "60 211 1 A 6 동 서 090 270\n",
- "61 211 1 B 2 서 동 270 090\n",
- "62 211 2 A 17 NaN NaN NaN NaN\n",
- "63 211 2 B 18 NaN NaN NaN NaN\n",
- "\n",
- "[64 rows x 8 columns]"
+ "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": 7,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -693,7 +1765,7 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
@@ -757,7 +1829,7 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -1651,46 +2723,6 @@
" 571511538_01 \n",
" i6 \n",
" \n",
- " \n",
- " 86 \n",
- " 211 \n",
- " 2 \n",
- " 서 \n",
- " 동 \n",
- " 571542116_02.96 \n",
- " 571542116_02.164 \n",
- " c30 \n",
- " \n",
- " \n",
- " 87 \n",
- " 211 \n",
- " 6 \n",
- " 동 \n",
- " 서 \n",
- " 571542116_01 \n",
- " -571542116_02.96 \n",
- " c30 \n",
- " \n",
- " \n",
- " 88 \n",
- " 211 \n",
- " 17 \n",
- " None \n",
- " None \n",
- " None \n",
- " None \n",
- " c30 \n",
- " \n",
- " \n",
- " 89 \n",
- " 211 \n",
- " 18 \n",
- " None \n",
- " None \n",
- " None \n",
- " None \n",
- " c30 \n",
- " \n",
" \n",
"\n",
""
@@ -1783,10 +2815,6 @@
"83 210 21 서 남 571500535_02.18 571500585_01 \n",
"84 210 21 남 동 571500585_02 571542115_01 \n",
"85 210 21 동 북 -571542115_01 571511538_01 \n",
- "86 211 2 서 동 571542116_02.96 571542116_02.164 \n",
- "87 211 6 동 서 571542116_01 -571542116_02.96 \n",
- "88 211 17 None None None None \n",
- "89 211 18 None None None None \n",
"\n",
" node_id \n",
"0 i0 \n",
@@ -1874,11 +2902,7 @@
"82 i6 \n",
"83 i6 \n",
"84 i6 \n",
- "85 i6 \n",
- "86 c30 \n",
- "87 c30 \n",
- "88 c30 \n",
- "89 c30 "
+ "85 i6 "
]
},
"metadata": {},
@@ -1961,21 +2985,21 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- " 0%| | 0/17280 [00:00, ?it/s]"
+ " 0%| | 14/17280 [00:00<02:04, 138.54it/s]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 17280/17280 [02:05<00:00, 137.67it/s]\n"
+ "100%|██████████| 17280/17280 [05:41<00:00, 50.64it/s] \n"
]
}
],
@@ -2035,300 +3059,18 @@
},
{
"cell_type": "code",
- "execution_count": 64,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1 672\n",
- "2 672\n",
- "3 672\n",
- "4 672\n",
- "5 672\n",
- "6 672\n",
- "7 672\n",
- "8 672\n",
- "9 672\n",
- "10 672\n",
- "11 672\n",
- "12 672\n",
- "13 672\n",
- "14 672\n",
- "15 672\n",
- "16 672\n",
- "17 672\n",
- "18 672\n",
- "19 672\n",
- "20 672\n",
- "21 672\n",
- "22 672\n",
- "23 672\n",
- "24 672\n",
- "25 672\n",
- "26 672\n",
- "27 672\n",
- "28 672\n",
- "29 672\n",
- "30 672\n",
- "31 672\n",
- "32 672\n",
- "33 672\n",
- "34 672\n",
- "35 672\n",
- "36 672\n",
- "37 672\n",
- "38 672\n",
- "39 672\n",
- "40 672\n",
- "41 672\n",
- "42 672\n",
- "43 672\n",
- "44 672\n",
- "45 672\n",
- "46 672\n",
- "47 672\n",
- "48 672\n",
- "49 672\n",
- "50 672\n",
- "51 672\n",
- "52 672\n",
- "53 672\n",
- "54 672\n",
- "55 672\n",
- "56 672\n",
- "57 672\n",
- "58 672\n",
- "59 672\n",
- "60 672\n",
- "61 672\n",
- "62 672\n",
- "63 672\n",
- "64 672\n",
- "65 672\n",
- "66 672\n",
- "67 672\n",
- "68 672\n",
- "69 672\n",
- "70 672\n",
- "71 672\n",
- "72 672\n",
- "73 672\n",
- "74 672\n",
- "75 672\n",
- "76 672\n",
- "77 672\n",
- "78 672\n",
- "79 672\n",
- "80 672\n",
- "81 672\n",
- "82 672\n",
- "83 672\n",
- "84 672\n",
- "85 672\n",
- "86 672\n",
- "87 672\n",
- "88 672\n",
- "89 672\n",
- "90 672\n",
- "91 672\n",
- "92 672\n",
- "93 672\n",
- "94 672\n",
- "95 672\n",
- "96 672\n",
- "97 672\n",
- "98 672\n",
- "99 672\n",
- "100 672\n",
- "101 672\n",
- "102 672\n",
- "103 672\n",
- "104 672\n",
- "105 672\n",
- "106 672\n",
- "107 672\n",
- "108 672\n",
- "109 672\n",
- "110 672\n",
- "111 672\n",
- "112 672\n",
- "113 672\n",
- "114 672\n",
- "115 672\n",
- "116 672\n",
- "117 672\n",
- "118 672\n",
- "119 672\n",
- "120 672\n",
- "121 672\n",
- "122 672\n",
- "123 672\n",
- "124 672\n",
- "125 672\n",
- "126 672\n",
- "127 672\n",
- "128 672\n",
- "129 672\n",
- "130 672\n",
- "131 672\n",
- "132 672\n",
- "133 672\n",
- "134 672\n",
- "135 672\n",
- "136 672\n",
- "137 672\n",
- "138 672\n",
- "139 672\n",
- "140 672\n",
- "141 672\n",
- "142 672\n",
- "143 672\n",
- "144 672\n",
- "145 672\n",
- "146 672\n",
- "147 672\n",
- "148 672\n",
- "149 672\n",
- "150 672\n",
- "151 672\n",
- "152 672\n",
- "153 672\n",
- "154 672\n",
- "155 672\n",
- "156 672\n",
- "157 672\n",
- "158 672\n",
- "159 672\n",
- "160 672\n",
- "161 672\n",
- "162 672\n",
- "163 672\n",
- "164 672\n",
- "165 672\n",
- "166 672\n",
- "167 672\n",
- "168 672\n",
- "169 672\n",
- "170 672\n",
- "171 672\n",
- "172 672\n",
- "173 672\n",
- "174 672\n",
- "175 672\n",
- "176 672\n",
- "177 672\n",
- "178 672\n",
- "179 672\n",
- "180 672\n",
- "181 672\n",
- "182 672\n",
- "183 672\n",
- "184 672\n",
- "185 672\n",
- "186 672\n",
- "187 672\n",
- "188 672\n",
- "189 672\n",
- "190 672\n",
- "191 672\n",
- "192 672\n",
- "193 672\n",
- "194 672\n",
- "195 672\n",
- "196 672\n",
- "197 672\n",
- "198 672\n",
- "199 672\n",
- "200 672\n",
- "201 672\n",
- "202 672\n",
- "203 672\n",
- "204 672\n",
- "205 672\n",
- "206 672\n",
- "207 672\n",
- "208 672\n",
- "209 672\n",
- "210 672\n",
- "211 672\n",
- "212 672\n",
- "213 672\n",
- "214 672\n",
- "215 672\n",
- "216 672\n",
- "217 672\n",
- "218 672\n",
- "219 672\n",
- "220 672\n",
- "221 672\n",
- "222 672\n",
- "223 672\n",
- "224 672\n",
- "225 672\n",
- "226 672\n",
- "227 672\n",
- "228 672\n",
- "229 672\n",
- "230 672\n",
- "231 672\n",
- "232 672\n",
- "233 672\n",
- "234 672\n",
- "235 672\n",
- "236 672\n",
- "237 672\n",
- "238 672\n",
- "239 672\n",
- "240 672\n",
- "241 672\n",
- "242 672\n",
- "243 672\n",
- "244 672\n",
- "245 672\n",
- "246 672\n",
- "247 672\n",
- "248 672\n",
- "249 672\n",
- "250 672\n",
- "251 672\n",
- "252 672\n",
- "253 672\n",
- "254 672\n",
- "255 672\n",
- "256 672\n",
- "257 672\n",
- "258 672\n",
- "259 672\n",
- "260 672\n",
- "261 672\n",
- "262 672\n",
- "263 672\n",
- "264 672\n",
- "265 672\n",
- "266 672\n",
- "267 672\n",
- "268 672\n",
- "269 672\n",
- "270 672\n",
- "271 672\n",
- "272 672\n",
- "273 672\n",
- "274 672\n",
- "275 672\n",
- "276 672\n",
- "277 672\n",
- "278 672\n",
- "279 672\n",
- "280 672\n",
- "281 672\n",
- "282 672\n",
- "283 672\n",
- "284 672\n",
- "285 672\n",
- "286 672\n",
- "287 672\n"
+ "ename": "NameError",
+ "evalue": "name 'fmins' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[9], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m288\u001b[39m):\n\u001b[1;32m----> 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(m, \u001b[38;5;28mlen\u001b[39m(time2movement[\u001b[43mfmins\u001b[49m[\u001b[38;5;241m287\u001b[39m]]))\n",
+ "\u001b[1;31mNameError\u001b[0m: name 'fmins' is not defined"
]
}
],
@@ -2346,7 +3088,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -2635,7 +3377,7 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -3059,7 +3801,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -3163,7 +3905,7 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -3183,7 +3925,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -3260,7 +4002,7 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -3660,7 +4402,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -3695,7 +4437,7 @@
},
{
"cell_type": "code",
- "execution_count": 85,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -5731,7 +6473,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -5978,7 +6720,7 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -6071,7 +6813,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -14748,7 +15490,7 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -15083,7 +15825,7 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -15103,7 +15845,7 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -15359,7 +16101,7 @@
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -15368,7 +16110,7 @@
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -15724,7 +16466,7 @@
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
diff --git a/Analysis/0109_preprocess/0116_preprocess_8.ipynb b/Analysis/0109_preprocess/0116_preprocess_8.ipynb
index c1c0aa392..22ffbc062 100644
--- a/Analysis/0109_preprocess/0116_preprocess_8.ipynb
+++ b/Analysis/0109_preprocess/0116_preprocess_8.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 324,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -24,21 +24,14 @@
},
{
"cell_type": "code",
- "execution_count": 325,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- " 0%| | 17/17280 [00:00<01:44, 165.78it/s]"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "100%|██████████| 17280/17280 [01:02<00:00, 277.24it/s]\n"
+ "100%|██████████| 17280/17280 [00:14<00:00, 1222.96it/s]\n"
]
},
{
@@ -168,7 +161,7 @@
"9 177 2 2 7 3"
]
},
- "execution_count": 325,
+ "execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
@@ -184,7 +177,7 @@
},
{
"cell_type": "code",
- "execution_count": 326,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -303,7 +296,7 @@
"5 176 1 B 4"
]
},
- "execution_count": 326,
+ "execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
@@ -324,7 +317,7 @@
},
{
"cell_type": "code",
- "execution_count": 327,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -965,7 +958,7 @@
"59 210 4 B 3 남 서"
]
},
- "execution_count": 327,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -979,7 +972,7 @@
},
{
"cell_type": "code",
- "execution_count": 328,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
@@ -1742,7 +1735,7 @@
"59 210 4 B 3 남 서 180 270"
]
},
- "execution_count": 328,
+ "execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@@ -1772,7 +1765,7 @@
},
{
"cell_type": "code",
- "execution_count": 329,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -1948,7 +1941,7 @@
"1 571510153_02 571545870_01 i0 "
]
},
- "execution_count": 329,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@@ -2015,7 +2008,7 @@
},
{
"cell_type": "code",
- "execution_count": 394,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -3602,7 +3595,7 @@
},
{
"cell_type": "code",
- "execution_count": 398,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
@@ -3829,7 +3822,7 @@
"[116 rows x 11 columns]"
]
},
- "execution_count": 398,
+ "execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
@@ -3840,7 +3833,7 @@
},
{
"cell_type": "code",
- "execution_count": 414,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -3877,7 +3870,7 @@
" \n",
" 0 \n",
" 175 \n",
- " 1.0 \n",
+ " 1 \n",
" 동 \n",
" 남 \n",
" 571545870_02 \n",
@@ -3887,7 +3880,7 @@
" \n",
" 1 \n",
" 175 \n",
- " 2.0 \n",
+ " 2 \n",
" 서 \n",
" 동 \n",
" 571510153_02 \n",
@@ -3897,7 +3890,7 @@
" \n",
" 2 \n",
" 175 \n",
- " 3.0 \n",
+ " 3 \n",
" 남 \n",
" 서 \n",
" -571542797_02 \n",
@@ -3907,7 +3900,7 @@
" \n",
" 3 \n",
" 175 \n",
- " 4.0 \n",
+ " 4 \n",
" 북 \n",
" 남 \n",
" -571500487_01 \n",
@@ -3917,7 +3910,7 @@
" \n",
" 4 \n",
" 175 \n",
- " 5.0 \n",
+ " 5 \n",
" 서 \n",
" 북 \n",
" 571510153_02 \n",
@@ -3937,7 +3930,7 @@
" \n",
" 69 \n",
" 210 \n",
- " 8.0 \n",
+ " 8 \n",
" 남 \n",
" 북 \n",
" 571500585_02 \n",
@@ -3947,7 +3940,7 @@
" \n",
" 70 \n",
" 210 \n",
- " 21.0 \n",
+ " 21 \n",
" 북 \n",
" 서 \n",
" 571511538_02.121 \n",
@@ -3957,7 +3950,7 @@
" \n",
" 71 \n",
" 210 \n",
- " 21.0 \n",
+ " 21 \n",
" 서 \n",
" 남 \n",
" 571500535_02.18 \n",
@@ -3967,7 +3960,7 @@
" \n",
" 72 \n",
" 210 \n",
- " 21.0 \n",
+ " 21 \n",
" 남 \n",
" 동 \n",
" 571500585_02 \n",
@@ -3977,7 +3970,7 @@
" \n",
" 73 \n",
" 210 \n",
- " 21.0 \n",
+ " 21 \n",
" 동 \n",
" 북 \n",
" -571542115_01 \n",
@@ -3991,17 +3984,17 @@
],
"text/plain": [
" inter_no move_no inc_dir out_dir inc_edge out_edge node_id\n",
- "0 175 1.0 동 남 571545870_02 571542797_02 i0\n",
- "1 175 2.0 서 동 571510153_02 571545870_01 i0\n",
- "2 175 3.0 남 서 -571542797_02 571510153_01 i0\n",
- "3 175 4.0 북 남 -571500487_01 571542797_02 i0\n",
- "4 175 5.0 서 북 571510153_02 571500487_01 i0\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.0 남 북 571500585_02 571511538_01 i6\n",
- "70 210 21.0 북 서 571511538_02.121 571500535_01 i6\n",
- "71 210 21.0 서 남 571500535_02.18 571500585_01 i6\n",
- "72 210 21.0 남 동 571500585_02 571542115_01 i6\n",
- "73 210 21.0 동 북 -571542115_01 571511538_01 i6\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]"
]
@@ -4078,6 +4071,7 @@
"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",
"display(matching)"
]
},
@@ -4090,16 +4084,83 @@
},
{
"cell_type": "code",
- "execution_count": 109,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
- "name": "stdout",
+ "name": "stderr",
"output_type": "stream",
"text": [
- "1704380565\n"
+ "100%|██████████| 17280/17280 [02:16<00:00, 126.94it/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": 12,
+ "metadata": {},
+ "outputs": [
{
"data": {
"text/html": [
@@ -4122,1686 +4183,123 @@
" \n",
" \n",
" inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
+ " end_unix \n",
+ " dura_A1 \n",
+ " dura_A2 \n",
+ " dura_A3 \n",
+ " dura_A4 \n",
+ " dura_A5 \n",
+ " dura_A6 \n",
+ " dura_A7 \n",
+ " dura_A8 \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",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
+ " 206 \n",
+ " 1704380520 \n",
+ " 33 \n",
+ " 35 \n",
+ " 26 \n",
+ " 26 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 33 \n",
+ " 35 \n",
+ " 26 \n",
+ " 26 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 120 \n",
+ " 10 \n",
" \n",
" \n",
" 1 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 2 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 3 \n",
" 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
" 1704380540 \n",
+ " 38 \n",
+ " 39 \n",
+ " 40 \n",
+ " 23 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 38 \n",
+ " 39 \n",
+ " 40 \n",
+ " 23 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 140 \n",
+ " 50 \n",
" \n",
" \n",
- " 4 \n",
+ " 2 \n",
" 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
" 1704380540 \n",
+ " 24 \n",
+ " 24 \n",
+ " 17 \n",
+ " 58 \n",
+ " 17 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 24 \n",
+ " 24 \n",
+ " 17 \n",
+ " 58 \n",
+ " 17 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 140 \n",
+ " 133 \n",
" \n",
" \n",
- " 5 \n",
+ " 3 \n",
" 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 6 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
+ " 1704380540 \n",
+ " 39 \n",
+ " 101 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 39 \n",
+ " 101 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 140 \n",
+ " 103 \n",
" \n",
" \n",
- " 7 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- "\n",
- ""
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 175 1 1 8 4 1704380560\n",
- "1 176 1 1 8 4 1704380550\n",
- "2 177 1 1 8 4 1704380550\n",
- "3 178 1 1 8 4 1704380540\n",
- "4 201 2 2 5 2 1704380540\n",
- "5 202 1 1 6 2 1704380541\n",
- "6 206 2 2 17 18 1704380520\n",
- "7 210 1 1 6 18 1704380550"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 1 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 2 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 3 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 4 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 5 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 6 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 7 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 206 2 2 17 18 1704380520\n",
- "1 178 1 1 8 4 1704380540\n",
- "2 201 2 2 5 2 1704380540\n",
- "3 202 1 1 6 2 1704380541\n",
- "4 176 1 1 8 4 1704380550\n",
- "5 177 1 1 8 4 1704380550\n",
- "6 210 1 1 6 18 1704380550\n",
- "7 175 1 1 8 4 1704380560"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1704380570\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- " 1 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 2 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 3 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 4 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 5 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 6 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 7 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 175 1 1 8 4 1704380560\n",
- "1 176 1 1 8 4 1704380550\n",
- "2 177 1 1 8 4 1704380550\n",
- "3 178 1 1 8 4 1704380540\n",
- "4 201 2 2 5 2 1704380540\n",
- "5 202 1 1 6 2 1704380541\n",
- "6 206 2 2 17 18 1704380520\n",
- "7 210 1 1 6 18 1704380550"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 1 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 2 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 3 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 4 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 5 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 6 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 7 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 206 2 2 17 18 1704380520\n",
- "1 178 1 1 8 4 1704380540\n",
- "2 201 2 2 5 2 1704380540\n",
- "3 202 1 1 6 2 1704380541\n",
- "4 176 1 1 8 4 1704380550\n",
- "5 177 1 1 8 4 1704380550\n",
- "6 210 1 1 6 18 1704380550\n",
- "7 175 1 1 8 4 1704380560"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1704380575\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- " 1 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 2 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 3 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 4 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 5 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 6 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 7 \n",
- " 210 \n",
- " 1 \n",
- " 2 \n",
- " 6 \n",
- " 2 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 175 1 1 8 4 1704380560\n",
- "1 176 1 1 8 4 1704380550\n",
- "2 177 1 1 8 4 1704380550\n",
- "3 178 1 1 8 4 1704380540\n",
- "4 201 2 2 5 2 1704380540\n",
- "5 202 1 1 6 2 1704380541\n",
- "6 206 2 2 17 18 1704380520\n",
- "7 210 1 2 6 2 1704380550"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 1 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 2 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 3 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 4 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 5 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 6 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 7 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 8 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 9 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 10 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 11 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 12 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 13 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 14 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- " 15 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 206 2 2 17 18 1704380520\n",
- "1 206 2 2 17 18 1704380520\n",
- "2 178 1 1 8 4 1704380540\n",
- "3 178 1 1 8 4 1704380540\n",
- "4 201 2 2 5 2 1704380540\n",
- "5 201 2 2 5 2 1704380540\n",
- "6 202 1 1 6 2 1704380541\n",
- "7 202 1 1 6 2 1704380541\n",
- "8 176 1 1 8 4 1704380550\n",
- "9 176 1 1 8 4 1704380550\n",
- "10 177 1 1 8 4 1704380550\n",
- "11 177 1 1 8 4 1704380550\n",
- "12 210 1 1 6 18 1704380550\n",
- "13 210 1 1 6 18 1704380550\n",
- "14 175 1 1 8 4 1704380560\n",
- "15 175 1 1 8 4 1704380560"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1704380580\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- " 1 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 2 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 3 \n",
- " 178 \n",
- " 2 \n",
- " 2 \n",
- " 7 \n",
- " 3 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 4 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 5 \n",
- " 202 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 6 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 7 \n",
- " 210 \n",
- " 1 \n",
- " 2 \n",
- " 6 \n",
- " 2 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 175 1 1 8 4 1704380560\n",
- "1 176 1 1 8 4 1704380550\n",
- "2 177 1 1 8 4 1704380550\n",
- "3 178 2 2 7 3 1704380540\n",
- "4 201 2 2 5 2 1704380540\n",
- "5 202 2 2 17 18 1704380541\n",
- "6 206 2 2 17 18 1704380520\n",
- "7 210 1 2 6 2 1704380550"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " phas_A \n",
- " phas_B \n",
- " move_A \n",
- " move_B \n",
- " start_unix \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 1 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 2 \n",
- " 206 \n",
- " 2 \n",
- " 2 \n",
- " 17 \n",
- " 18 \n",
- " 1704380520 \n",
- " \n",
- " \n",
- " 3 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 4 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 5 \n",
- " 178 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 6 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 7 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 8 \n",
- " 201 \n",
- " 2 \n",
- " 2 \n",
- " 5 \n",
- " 2 \n",
- " 1704380540 \n",
- " \n",
- " \n",
- " 9 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 10 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 11 \n",
- " 202 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 2 \n",
- " 1704380541 \n",
- " \n",
- " \n",
- " 12 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 13 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 14 \n",
- " 176 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 15 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 16 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 17 \n",
- " 177 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 18 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 19 \n",
- " 210 \n",
- " 1 \n",
- " 1 \n",
- " 6 \n",
- " 18 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 20 \n",
- " 210 \n",
- " 1 \n",
- " 2 \n",
- " 6 \n",
- " 2 \n",
- " 1704380550 \n",
- " \n",
- " \n",
- " 21 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- " 22 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- " 23 \n",
- " 175 \n",
- " 1 \n",
- " 1 \n",
- " 8 \n",
- " 4 \n",
- " 1704380560 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " inter_no phas_A phas_B move_A move_B start_unix\n",
- "0 206 2 2 17 18 1704380520\n",
- "1 206 2 2 17 18 1704380520\n",
- "2 206 2 2 17 18 1704380520\n",
- "3 178 1 1 8 4 1704380540\n",
- "4 178 1 1 8 4 1704380540\n",
- "5 178 1 1 8 4 1704380540\n",
- "6 201 2 2 5 2 1704380540\n",
- "7 201 2 2 5 2 1704380540\n",
- "8 201 2 2 5 2 1704380540\n",
- "9 202 1 1 6 2 1704380541\n",
- "10 202 1 1 6 2 1704380541\n",
- "11 202 1 1 6 2 1704380541\n",
- "12 176 1 1 8 4 1704380550\n",
- "13 176 1 1 8 4 1704380550\n",
- "14 176 1 1 8 4 1704380550\n",
- "15 177 1 1 8 4 1704380550\n",
- "16 177 1 1 8 4 1704380550\n",
- "17 177 1 1 8 4 1704380550\n",
- "18 210 1 1 6 18 1704380550\n",
- "19 210 1 1 6 18 1704380550\n",
- "20 210 1 2 6 2 1704380550\n",
- "21 175 1 1 8 4 1704380560\n",
- "22 175 1 1 8 4 1704380560\n",
- "23 175 1 1 8 4 1704380560"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "del movement\n",
- "fsec = fsecs[33]\n",
- "print(fsec)\n",
- "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\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",
- "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",
- "move = move.rename(columns = {'end_unix':'start_unix'})\n",
- "display(move)\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",
- "movement = pd.concat([movement, move])\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",
- "display(movement)\n",
- "\n",
- "fsec = fsecs[34]\n",
- "print(fsec)\n",
- "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\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",
- "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",
- "move = move.rename(columns = {'end_unix':'start_unix'})\n",
- "display(move)\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",
- "display(movement)\n",
- "movement = pd.concat([movement, move])\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",
- "fsec = fsecs[35]\n",
- "print(fsec)\n",
- "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\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",
- "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",
- "move = move.rename(columns = {'end_unix':'start_unix'})\n",
- "display(move)\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",
- "display(movement)\n",
- "movement = pd.concat([movement, move])\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",
- "fsec = fsecs[36]\n",
- "print(fsec)\n",
- "move = pd.read_csv(f'../../Data/tables/moves/move_{fsec}.csv', index_col=0)\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",
- "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",
- "move = move.rename(columns = {'end_unix':'start_unix'})\n",
- "display(move)\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",
- "display(movement)\n",
- "movement = pd.concat([movement, move])\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"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 415,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- " 0%| | 0/17280 [00:00, ?it/s]"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "100%|██████████| 17280/17280 [02:44<00:00, 104.85it/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": 416,
- "metadata": {},
- "outputs": [
- {
- "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",
- " 0 \n",
- " 0 \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",
- " 7 \n",
- " 0 \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",
- " 9 \n",
- " 0 \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",
- " 0 \n",
- " 0 \n",
- " 37 \n",
- " 73 \n",
- " 40 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 150 \n",
- " 131 \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 0 0 37 39 25 30 29 \n",
- "1 175 7 0 40 42 29 26 33 \n",
- "2 175 9 0 43 45 33 22 37 \n",
- "3 175 18 30 46 48 37 18 41 \n",
- "4 176 0 0 37 73 40 0 0 \n",
- "\n",
- " ddur_6 ddur_7 ddur_8 cycle offset \n",
- "0 0 0 0 160 57 \n",
- "1 0 0 0 170 40 \n",
- "2 0 0 0 180 28 \n",
- "3 0 0 0 190 18 \n",
- "4 0 0 0 150 131 "
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " inter_no \n",
- " end_unix \n",
- " dura_A1 \n",
- " dura_A2 \n",
- " dura_A3 \n",
- " dura_A4 \n",
- " dura_A5 \n",
- " dura_A6 \n",
- " dura_A7 \n",
- " dura_A8 \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",
- " 206 \n",
- " 1704380520 \n",
- " 33 \n",
- " 35 \n",
- " 26 \n",
- " 26 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 33 \n",
- " 35 \n",
- " 26 \n",
- " 26 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 120 \n",
- " 10 \n",
- " \n",
- " \n",
- " 1 \n",
- " 178 \n",
- " 1704380540 \n",
- " 38 \n",
- " 39 \n",
- " 40 \n",
- " 23 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 38 \n",
- " 39 \n",
- " 40 \n",
- " 23 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 140 \n",
- " 50 \n",
- " \n",
- " \n",
- " 2 \n",
- " 201 \n",
- " 1704380540 \n",
- " 24 \n",
- " 24 \n",
- " 17 \n",
- " 58 \n",
- " 17 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 24 \n",
- " 24 \n",
- " 17 \n",
- " 58 \n",
- " 17 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 140 \n",
- " 133 \n",
- " \n",
- " \n",
- " 3 \n",
- " 202 \n",
- " 1704380540 \n",
- " 39 \n",
- " 101 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 39 \n",
- " 101 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 140 \n",
- " 103 \n",
- " \n",
- " \n",
- " 4 \n",
- " 177 \n",
+ " 4 \n",
+ " 177 \n",
" 1704380550 \n",
" 36 \n",
" 20 \n",
@@ -5854,17 +4352,17 @@
}
],
"source": [
- "pland = pd.read_csv('../../Data/tables/pland.csv', index_col=0)\n",
+ "# pland = pd.read_csv('../../Data/tables/pland.csv', index_col=0)\n",
"plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n",
"history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n",
- "display(pland.head())\n",
+ "# display(pland.head())\n",
"display(history.head())\n",
"# plan은 A, B가 통합된 형식으로 history는 분리된 형식으로 표시되었음."
]
},
{
"cell_type": "code",
- "execution_count": 417,
+ "execution_count": 13,
"metadata": {},
"outputs": [
{
@@ -5930,7 +4428,7 @@
"3 18 30 1704447000"
]
},
- "execution_count": 417,
+ "execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
@@ -5968,42 +4466,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2024-01-05 14:29:20\n",
- "2024-01-05 15:29:19\n"
- ]
- }
- ],
- "source": [
- "# inter_no = 175, m = 30 : 조정 (수축)\n",
- "# inter_no = 175, m = 70 : 삭제 + 조정(수축)\n",
- "# inter_no = 175, m = 90 : 결측(전이) + 삭제 + 조정(수축)\n",
- "# inter_no = 175, m = 140 : 삭제 + 조정(수축)\n",
- "# inter_no = 176, m = 50 : 조정(수축)\n",
- "# inter_no = 176, m = 155 : 삭제(마지막 행에서 삭제)\n",
- "# inter_no = 176, m = 160 : 조정(수축) + 삭제 + 조정(수축)\n",
- "# inter_no = 176, m = 190 : 결측\n",
- "# inter_no = 176, m = 220 : 삭제\n",
- "# inter_no = 176, m = 270 : 삭제\n",
- "# inter_no = 176, m = 275 : 삭제\n",
- "# inter_no = 177, m = 40 : 조정(수축)\n",
- "# inter_no = 178, m = 70 : 삭제\n",
- "# inter_no = 178, m = 100 : 조정(확장) + 삭제\n",
- "# inter_no = 178, m = 270 : 결측 + 조정(확장)\n",
- "\n",
- "print(datetime.fromtimestamp(1704432560))\n",
- "print(datetime.fromtimestamp(1704436159))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 419,
+ "execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
@@ -6015,17 +4478,17 @@
" output : rhistory\n",
" - recent history\n",
" - 현재시각(present_time) 이전 1시간 동안의 신호이력에 대하여 결측치 및 이상치를 처리한 결과\n",
- " - 교차로번호(inter_no), 종료유닉스(end_unix), 현시시간(ddur_j), 주기(cycle), 옵셋(offset)\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 = []\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 (3시간 이내)\n",
+ " rhistory = history.copy() # recent history (3시간 이내 : 1시간 이내의 이력에 대한 전처리를 위해 3시간 이내 데이터가 필요함)\n",
" rhistory = rhistory[(rhistory.end_unix < present_time) & (rhistory.end_unix >= present_time - 10800)]\n",
" hours = np.array(range(midnight, next_day + 1, 3600))\n",
" rhist = rhistory.copy()[rhistory.inter_no == inter_no] # 특정한 inter_no\n",
@@ -6045,12 +4508,11 @@
" idx = (start_seconds <= curr_unix).sum() - 1\n",
" start_hour = timetable.iloc[idx].start_hour\n",
" start_minute = timetable.iloc[idx].start_minute\n",
- " prow = pland[(pland.inter_no==inter_no) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)] # planned row\n",
+ " prow = 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",
- "\n",
" rhist = pd.concat([rhist] + new_rows).sort_values(['end_unix'])\n",
" rhist = rhist.reset_index(drop=True)\n",
"\n",
@@ -6069,9 +4531,9 @@
" base_unix = end_unixes_lt_ghour[-5] # 기준유닉스 : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 end_unix\n",
" # D_n : 시간차이\n",
" D_n = curr_unix - base_unix\n",
- " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n",
+ " 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()\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",
@@ -6085,8 +4547,8 @@
" # D_n : 시간차이\n",
" D_n = curr_unix - base_unix\n",
" # S_n : 현시시간합\n",
- " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n",
- " S_n = ddurations.values.sum()\n",
+ " 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",
@@ -6104,16 +4566,16 @@
" # D_n : 시간차이\n",
" D_n = curr_unix - base_unix\n",
" # S_n : 현시시간합\n",
- " ddurations = rhist[(rhist.end_unix > base_unix) & (rhist.end_unix <= curr_unix)][[f'ddur_{j}' for j in range(1,9)]]\n",
- " S_n = ddurations.values.sum()\n",
+ " 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 = pland[(pland.inter_no==inter_no) & (pland.start_hour==start_hour) & (pland.start_minute==start_minute)].copy().reset_index(drop=True).iloc[0] # planned row\n",
- " adjusted_dur = prow[['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] * R_n\n",
+ " 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",
@@ -6123,8 +4585,8 @@
" max_frac_index = frac_parts.idxmax()\n",
" int_parts[max_frac_index] += 1\n",
" frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n",
- " Rhist.loc[n, ['ddur_1', 'ddur_2', 'ddur_3', 'ddur_4', 'ddur_5', 'ddur_6', 'ddur_7', 'ddur_8']] = int_parts.values\n",
- " Rhist.loc[n, 'cycle'] = int_parts.sum()\n",
+ " 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",
@@ -6136,7 +4598,7 @@
},
{
"cell_type": "code",
- "execution_count": 420,
+ "execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
@@ -6152,7 +4614,7 @@
" # 이전 유닉스 존재, abs >=10 => 현시시간 합의 차\n",
" inter_no = row.inter_no\n",
" end_unix = row.end_unix\n",
- " elapsed_time = row[[f'ddur_{j}' for j in range(1, 9)]].sum()\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",
@@ -6166,30 +4628,35 @@
" 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'ddur_{j}' for j in range(1, 9)] + ['cycle']]\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",
+ " 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",
- " new_rows = []\n",
- " for j in isplit.keys():\n",
- " phas_A, phas_B = isplit[j]\n",
- " duration = row[f'ddur_{j}']\n",
- " new_rows.append(pd.DataFrame({'inter_no':[inter_no], 'start_unix':[start_unix],\n",
- " 'phas_A':[phas_A],'phas_B':[phas_B],'duration':[duration]}))\n",
- " new_rows = pd.concat(new_rows)\n",
+ " 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",
+ " cums_A = durs_A.cumsum()\n",
+ " cums_B = durs_B.cumsum()\n",
+ " cycle = durs_A.sum()\n",
+ " cums = np.unique(np.concatenate((cums_A,cums_B)))\n",
+ " durations = np.concatenate(([cums[0]], np.diff(cums)))\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'])\n",
- " # movements and durations\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",
" # 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n",
@@ -6198,19 +4665,247 @@
" start_unix = row.start_unix\n",
" move_A = row.move_A\n",
" move_B = row.move_B\n",
- " match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
- " match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
- " inc_edge_A = match_A.inc_edge\n",
- " inc_edge_B = match_B.inc_edge\n",
- " out_edge_A = match_A.out_edge\n",
- " out_edge_B = match_B.out_edge\n",
+ " if move_A in [17, 18]:\n",
+ " inc_edge_A = np.nan\n",
+ " out_edge_A = np.nan\n",
+ " elif move_B in [17, 18]:\n",
+ " inc_edge_B = np.nan\n",
+ " out_edge_B = np.nan\n",
+ " else:\n",
+ " match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n",
+ " match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n",
+ " inc_edge_A = match_A.inc_edge\n",
+ " inc_edge_B = match_B.inc_edge\n",
+ " out_edge_A = match_A.out_edge\n",
+ " out_edge_B = match_B.out_edge\n",
" movedur.loc[i, ['inc_edge_A', 'inc_edge_B', 'out_edge_A', 'out_edge_B']] = [inc_edge_A, inc_edge_B, out_edge_A, out_edge_B]\n",
" # 이동류 컬럼 제거\n",
- " # movedur = movedur.drop(['move_A', 'move_B'], axis=1)\n",
+ " movedur = movedur.drop(['move_A', 'move_B'], axis=1)\n",
"\n",
" histid = movedur.copy() # history with edge ids (incoming and outgoing edge ids)\n",
" return histid"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2024-01-05 02:30:00\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " inter_no \n",
+ " start_unix \n",
+ " phas_A \n",
+ " phas_B \n",
+ " duration \n",
+ " inc_edge_A \n",
+ " inc_edge_B \n",
+ " out_edge_A \n",
+ " out_edge_B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 175 \n",
+ " 1704385840 \n",
+ " 1 \n",
+ " 1 \n",
+ " 37 \n",
+ " -571542797_02 \n",
+ " -571500487_01 \n",
+ " 571500487_01 \n",
+ " 571542797_02 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 175 \n",
+ " 1704385840 \n",
+ " 2 \n",
+ " 2 \n",
+ " 39 \n",
+ " -571500487_01 \n",
+ " -571542797_02 \n",
+ " 571545870_01 \n",
+ " 571510153_01 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 175 \n",
+ " 1704385840 \n",
+ " 3 \n",
+ " 3 \n",
+ " 25 \n",
+ " 571545870_02 \n",
+ " 571545870_02 \n",
+ " 571510153_01 \n",
+ " 571542797_02 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 175 \n",
+ " 1704385840 \n",
+ " 3 \n",
+ " 4 \n",
+ " 30 \n",
+ " 571545870_02 \n",
+ " 571510153_02 \n",
+ " 571510153_01 \n",
+ " 571545870_01 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 175 \n",
+ " 1704385840 \n",
+ " 4 \n",
+ " 4 \n",
+ " 29 \n",
+ " 571510153_02 \n",
+ " 571510153_02 \n",
+ " 571500487_01 \n",
+ " 571545870_01 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 582 \n",
+ " 210 \n",
+ " 1704389240 \n",
+ " 1 \n",
+ " 1 \n",
+ " 24 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 583 \n",
+ " 210 \n",
+ " 1704389240 \n",
+ " 1 \n",
+ " 2 \n",
+ " 19 \n",
+ " -571542115_01 \n",
+ " 571500535_02.18 \n",
+ " 571500535_01 \n",
+ " 571542115_01 \n",
+ " \n",
+ " \n",
+ " 584 \n",
+ " 210 \n",
+ " 1704389240 \n",
+ " 2 \n",
+ " 2 \n",
+ " 29 \n",
+ " 571500535_02.18 \n",
+ " 571500535_02.18 \n",
+ " 571511538_01 \n",
+ " 571542115_01 \n",
+ " \n",
+ " \n",
+ " 585 \n",
+ " 210 \n",
+ " 1704389240 \n",
+ " 3 \n",
+ " 3 \n",
+ " 56 \n",
+ " 571511538_02.121 \n",
+ " 571511538_02.121 \n",
+ " 571542115_01 \n",
+ " 571500585_01 \n",
+ " \n",
+ " \n",
+ " 586 \n",
+ " 210 \n",
+ " 1704389240 \n",
+ " 4 \n",
+ " 4 \n",
+ " 22 \n",
+ " 571500585_02 \n",
+ " 571500585_02 \n",
+ " 571511538_01 \n",
+ " 571500535_01 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
587 rows × 9 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no start_unix phas_A phas_B duration inc_edge_A \\\n",
+ "0 175 1704385840 1 1 37 -571542797_02 \n",
+ "1 175 1704385840 2 2 39 -571500487_01 \n",
+ "2 175 1704385840 3 3 25 571545870_02 \n",
+ "3 175 1704385840 3 4 30 571545870_02 \n",
+ "4 175 1704385840 4 4 29 571510153_02 \n",
+ ".. ... ... ... ... ... ... \n",
+ "582 210 1704389240 1 1 24 NaN \n",
+ "583 210 1704389240 1 2 19 -571542115_01 \n",
+ "584 210 1704389240 2 2 29 571500535_02.18 \n",
+ "585 210 1704389240 3 3 56 571511538_02.121 \n",
+ "586 210 1704389240 4 4 22 571500585_02 \n",
+ "\n",
+ " inc_edge_B out_edge_A out_edge_B \n",
+ "0 -571500487_01 571500487_01 571542797_02 \n",
+ "1 -571542797_02 571545870_01 571510153_01 \n",
+ "2 571545870_02 571510153_01 571542797_02 \n",
+ "3 571510153_02 571510153_01 571545870_01 \n",
+ "4 571510153_02 571500487_01 571545870_01 \n",
+ ".. ... ... ... \n",
+ "582 NaN NaN NaN \n",
+ "583 571500535_02.18 571500535_01 571542115_01 \n",
+ "584 571500535_02.18 571511538_01 571542115_01 \n",
+ "585 571511538_02.121 571542115_01 571500585_01 \n",
+ "586 571500585_02 571511538_01 571500535_01 \n",
+ "\n",
+ "[587 rows x 9 columns]"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "make_histid(30)"
+ ]
}
],
"metadata": {
diff --git a/Analysis/0117_make_signals/0117_make_signals.ipynb b/Analysis/0117_make_signals/0117_make_signals.ipynb
index 2bc8b6a70..da224c492 100644
--- a/Analysis/0117_make_signals/0117_make_signals.ipynb
+++ b/Analysis/0117_make_signals/0117_make_signals.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -17,14 +17,14 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "1704406800\n"
+ "1704410400\n"
]
},
{
@@ -64,73 +64,73 @@
" \n",
" \n",
" 0 \n",
- " i9 \n",
- " 1704403210 \n",
+ " i1 \n",
+ " 1704406840 \n",
" 1 \n",
" 1 \n",
- " 39 \n",
- " 571510152_02 \n",
- " 571510152_01 \n",
- " -571510152_01 \n",
- " 571510152_01.65 \n",
- " 6 \n",
- " 2 \n",
+ " 37 \n",
+ " -571542810_01 \n",
+ " 571542797_02.99 \n",
+ " -571542797_02.99 \n",
+ " 571542810_01 \n",
+ " 8 \n",
+ " 4 \n",
" \n",
" \n",
" 1 \n",
- " i9 \n",
- " 1704403210 \n",
+ " i1 \n",
+ " 1704406840 \n",
" 2 \n",
" 2 \n",
- " 101 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " 17 \n",
- " 18 \n",
+ " 93 \n",
+ " -571542810_01 \n",
+ " -571542810_01 \n",
+ " -571542797_02.99 \n",
+ " 571543469_01 \n",
+ " 8 \n",
+ " 3 \n",
" \n",
" \n",
" 2 \n",
- " i6 \n",
- " 1704403210 \n",
- " 1 \n",
- " 1 \n",
- " 24 \n",
- " -571542115_01 \n",
+ " i1 \n",
+ " 1704406840 \n",
+ " 3 \n",
+ " 3 \n",
+ " 40 \n",
+ " 571543469_02 \n",
" NaN \n",
- " 571500535_01 \n",
+ " -571542797_02.99 \n",
" NaN \n",
- " 6 \n",
+ " 5 \n",
" 18 \n",
" \n",
" \n",
" 3 \n",
- " i6 \n",
- " 1704403210 \n",
+ " i9 \n",
+ " 1704406850 \n",
" 1 \n",
- " 2 \n",
- " 19 \n",
- " -571542115_01 \n",
- " 571500535_02.18 \n",
- " 571500535_01 \n",
- " 571542115_01 \n",
+ " 1 \n",
+ " 46 \n",
+ " 571510152_02 \n",
+ " 571510152_01 \n",
+ " -571510152_01 \n",
+ " 571510152_01.65 \n",
" 6 \n",
" 2 \n",
" \n",
" \n",
" 4 \n",
- " i6 \n",
- " 1704403210 \n",
- " 2 \n",
+ " i9 \n",
+ " 1704406850 \n",
" 2 \n",
- " 29 \n",
- " 571500535_02.18 \n",
- " 571500535_02.18 \n",
- " 571511538_01 \n",
- " 571542115_01 \n",
- " 5 \n",
" 2 \n",
+ " 114 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " 17 \n",
+ " 18 \n",
" \n",
" \n",
" ... \n",
@@ -147,68 +147,54 @@
" ... \n",
" \n",
" \n",
- " 417 \n",
- " i8 \n",
- " 1704406590 \n",
- " 5 \n",
- " 5 \n",
- " 18 \n",
- " 571500583_01 \n",
- " 571500583_01 \n",
- " 571500617_01 \n",
- " 571500569_01 \n",
- " 7 \n",
+ " 477 \n",
+ " i6 \n",
+ " 1704410200 \n",
" 4 \n",
+ " 4 \n",
+ " 23 \n",
+ " 571500585_02 \n",
+ " 571500585_02 \n",
+ " 571511538_01 \n",
+ " 571500535_01 \n",
+ " 8 \n",
+ " 3 \n",
" \n",
" \n",
- " 418 \n",
- " i7 \n",
- " 1704406630 \n",
+ " 478 \n",
+ " i2 \n",
+ " 1704410220 \n",
" 1 \n",
" 1 \n",
- " 44 \n",
- " -571511538_02 \n",
- " 571542073_01 \n",
- " 571542073_02 \n",
- " 571511538_02 \n",
+ " 40 \n",
+ " -571542809_01 \n",
+ " 571542811_02 \n",
+ " 571542811_01 \n",
+ " 571542809_01 \n",
" 8 \n",
" 4 \n",
" \n",
" \n",
- " 419 \n",
- " i7 \n",
- " 1704406630 \n",
+ " 479 \n",
+ " i2 \n",
+ " 1704410220 \n",
" 2 \n",
" 2 \n",
- " 44 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " 17 \n",
- " 18 \n",
+ " 25 \n",
+ " 571542811_02 \n",
+ " -571542809_01 \n",
+ " 571542107_01 \n",
+ " 571542809_01 \n",
+ " 7 \n",
+ " 3 \n",
" \n",
" \n",
- " 420 \n",
- " i7 \n",
- " 1704406630 \n",
+ " 480 \n",
+ " i2 \n",
+ " 1704410220 \n",
" 3 \n",
" 3 \n",
- " 26 \n",
- " -571511538_02 \n",
- " 571542073_01 \n",
- " 571542073_02 \n",
- " 571511538_02 \n",
- " 8 \n",
- " 4 \n",
- " \n",
- " \n",
- " 421 \n",
- " i7 \n",
- " 1704406630 \n",
- " 4 \n",
- " 4 \n",
- " 26 \n",
+ " 71 \n",
" NaN \n",
" NaN \n",
" NaN \n",
@@ -216,42 +202,56 @@
" 17 \n",
" 18 \n",
" \n",
+ " \n",
+ " 481 \n",
+ " i2 \n",
+ " 1704410220 \n",
+ " 4 \n",
+ " 4 \n",
+ " 34 \n",
+ " -571542809_01 \n",
+ " 571542107_02 \n",
+ " 571542811_01 \n",
+ " 571542809_01 \n",
+ " 5 \n",
+ " 1 \n",
+ " \n",
" \n",
"
\n",
- "
422 rows × 11 columns
\n",
+ "
482 rows × 11 columns
\n",
"
"
],
"text/plain": [
- " node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
- "0 i9 1704403210 1 1 39 571510152_02 \n",
- "1 i9 1704403210 2 2 101 NaN \n",
- "2 i6 1704403210 1 1 24 -571542115_01 \n",
- "3 i6 1704403210 1 2 19 -571542115_01 \n",
- "4 i6 1704403210 2 2 29 571500535_02.18 \n",
- ".. ... ... ... ... ... ... \n",
- "417 i8 1704406590 5 5 18 571500583_01 \n",
- "418 i7 1704406630 1 1 44 -571511538_02 \n",
- "419 i7 1704406630 2 2 44 NaN \n",
- "420 i7 1704406630 3 3 26 -571511538_02 \n",
- "421 i7 1704406630 4 4 26 NaN \n",
+ " node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
+ "0 i1 1704406840 1 1 37 -571542810_01 \n",
+ "1 i1 1704406840 2 2 93 -571542810_01 \n",
+ "2 i1 1704406840 3 3 40 571543469_02 \n",
+ "3 i9 1704406850 1 1 46 571510152_02 \n",
+ "4 i9 1704406850 2 2 114 NaN \n",
+ ".. ... ... ... ... ... ... \n",
+ "477 i6 1704410200 4 4 23 571500585_02 \n",
+ "478 i2 1704410220 1 1 40 -571542809_01 \n",
+ "479 i2 1704410220 2 2 25 571542811_02 \n",
+ "480 i2 1704410220 3 3 71 NaN \n",
+ "481 i2 1704410220 4 4 34 -571542809_01 \n",
"\n",
- " inc_edge_B out_edge_A out_edge_B move_A move_B \n",
- "0 571510152_01 -571510152_01 571510152_01.65 6 2 \n",
- "1 NaN NaN NaN 17 18 \n",
- "2 NaN 571500535_01 NaN 6 18 \n",
- "3 571500535_02.18 571500535_01 571542115_01 6 2 \n",
- "4 571500535_02.18 571511538_01 571542115_01 5 2 \n",
- ".. ... ... ... ... ... \n",
- "417 571500583_01 571500617_01 571500569_01 7 4 \n",
- "418 571542073_01 571542073_02 571511538_02 8 4 \n",
- "419 NaN NaN NaN 17 18 \n",
- "420 571542073_01 571542073_02 571511538_02 8 4 \n",
- "421 NaN NaN NaN 17 18 \n",
+ " inc_edge_B out_edge_A out_edge_B move_A move_B \n",
+ "0 571542797_02.99 -571542797_02.99 571542810_01 8 4 \n",
+ "1 -571542810_01 -571542797_02.99 571543469_01 8 3 \n",
+ "2 NaN -571542797_02.99 NaN 5 18 \n",
+ "3 571510152_01 -571510152_01 571510152_01.65 6 2 \n",
+ "4 NaN NaN NaN 17 18 \n",
+ ".. ... ... ... ... ... \n",
+ "477 571500585_02 571511538_01 571500535_01 8 3 \n",
+ "478 571542811_02 571542811_01 571542809_01 8 4 \n",
+ "479 -571542809_01 571542107_01 571542809_01 7 3 \n",
+ "480 NaN NaN NaN 17 18 \n",
+ "481 571542107_02 571542811_01 571542809_01 5 1 \n",
"\n",
- "[422 rows x 11 columns]"
+ "[482 rows x 11 columns]"
]
},
- "execution_count": 13,
+ "execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
@@ -260,7 +260,7 @@
"midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n",
"fmins = range(midnight, next_day, 300)\n",
- "m = 88 # m ranges from 26 to 287\n",
+ "m = 100 # m ranges from 26 to 287\n",
"print(fmins[m])\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",
@@ -276,7 +276,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -298,7 +298,141 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "i0 grrrgrrrgrrrrrgrr\n",
+ "i1 grrrrrrgrr\n",
+ "i2 rrggrrr\n",
+ "i3 grrrrgrrrrgrrrrgrrrr\n",
+ "i6 grrrgrrrrgrrgrrr\n",
+ "i7 rrrggrr\n",
+ "i8 grrrrrrrgrrrgrrr\n",
+ "i9 rrrr\n"
+ ]
+ }
+ ],
+ "source": [
+ "node2init = {}\n",
+ "for node in nodes:\n",
+ " node_id = node.getID()\n",
+ " conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n",
+ " conns = [c for c in conns if c[0] >= 0]\n",
+ " conns = sorted(conns, key=lambda x: x[0])\n",
+ " state = []\n",
+ " for i, ci in conns:\n",
+ " if ci.getTLLinkIndex() < 0:\n",
+ " continue\n",
+ " are_foes = False\n",
+ " for j, cj in conns:\n",
+ " if ci.getTo() == cj.getTo():\n",
+ " continue\n",
+ " if node.areFoes(i, j):\n",
+ " are_foes = True\n",
+ " break\n",
+ " state.append('r' if are_foes else 'g')\n",
+ " node2init[node_id] = state\n",
+ "\n",
+ "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n",
+ "for _, row in sigtable.iterrows():\n",
+ " node_id = row['node_id']\n",
+ " inc_edge_A = row.inc_edge_A\n",
+ " inc_edge_B = row.inc_edge_B\n",
+ " out_edge_A = row.out_edge_A\n",
+ " out_edge_B = row.out_edge_B\n",
+ " move_A = row['move_A']\n",
+ " move_B = row['move_B']\n",
+ "\n",
+ " if pd.isna(inc_edge_A) or pd.isna(out_edge_A):\n",
+ " continue\n",
+ " else:\n",
+ " inc_edge_A = net.getEdge(inc_edge_A)\n",
+ " out_edge_A = net.getEdge(out_edge_A)\n",
+ " for conn in inc_edge_A.getConnections(out_edge_A):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " node2init[node_id][index] = 'r'\n",
+ "\n",
+ " if pd.isna(inc_edge_B) or pd.isna(out_edge_B):\n",
+ " continue\n",
+ " else:\n",
+ " inc_edge_B = net.getEdge(inc_edge_B)\n",
+ " out_edge_B = net.getEdge(out_edge_B)\n",
+ " for conn in inc_edge_B.getConnections(out_edge_B):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " node2init[node_id][index] = 'r'\n",
+ "for node_id in node_ids:\n",
+ " print(node_id, \"\".join(node2init[node_id]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n",
+ "['G', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n",
+ "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(node2init['i6'])\n",
+ "state = copy.deepcopy(node2init)['i6']\n",
+ "state[0] = 'G'\n",
+ "print(state)\n",
+ "print(node2init['i6'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(array([ 1., 7., 11., 12., 6., 7., 3., 1., 2., 3.]),\n",
+ " array([ 0. , 12.2, 24.4, 36.6, 48.8, 61. , 73.2, 85.4, 97.6,\n",
+ " 109.8, 122. ]),\n",
+ " )"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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q1/9Kn3ta19Ld911V4qItGzZsm77e7Im733ve9PJJ5+cHnnkkfS73/0uvfWtb02XXHJJ5r9J73q9ddq5c2dqbm5Od955Z3riiSfS6tWr0+TJk9Opp57a7TH6yjoNiPiYPHlyamlpKd3v7OxMDQ0NqbW1tYJT9S07duxIEZEeeuihlNLL/5APO+yw9POf/7x0zF/+8pcUEWn16tWVGrNidu3alY4//vh0//33p3e/+92l+LBOL5s7d24644wzXnN/V1dXGj16dPrud79b2rZz585UKBTS7bffnmPEPmH69OnpU5/6VLdtH/jAB9KMGTNSStYppbTfk2pP1uTPf/5zioi0bt260jG//vWvU1VVVXruueeyzZ7TgSLt1dauXZsiIj3zzDMppb61Tof8yy4vvfRSbNiwIZqbm0vbBg0aFM3NzbF69eoKTta3tLe3R0TEiBEjIiJiw4YNsW/fvm7rNn78+Bg7duyAXLeWlpaYPn16t/WIsE6vuPvuu2PSpElx8cUXx6hRo+KUU06JG264obR/69at0dbW1m2d6urqYsqUKQNqnU4//fRYsWJFPPnkkxER8dhjj8WqVavi3HPPjQjrdCA9WZPVq1fH8OHDY9KkSaVjmpubY9CgQbFmzZrsM/cV7e3tUVVVVfq+tL60ThX/Vtve9o9//CM6Ozv3++2q9fX18cQTT1Roqr6lq6srZs+eHdOmTYsJEyZERERbW1vU1NTs9yV/9fX10dbWVoEpK+eOO+6IjRs3xrp16/bbZ51e9vTTT8fSpUtjzpw58dWvfjXWrVsXl112WdTU1MTMmTNLa3Gg/w8H0jrNmzcvisVijB8/PgYPHhydnZ2xaNGimDFjRkSEdTqAnqxJW1tbjBo1qtv+6urqGDFixIBdtxdffDHmzp0bl1xySenL5frSOh3y8cEba2lpiccffzxWrVpV6VH6nG3btsXll18e999/fwwZMqTS4/RZXV1dMWnSpPjWt74VERGnnHJKPP7443HdddfFzJkzKzxd3/Gzn/0sbr311rjtttvipJNOik2bNsXs2bOjoaHBOlE2+/btiw9/+MORUoqlS5dWepwDOuRfdjn66KNj8ODB+336YPv27TF69OgKTdV3XHrppXHPPffEypUr45hjjiltHz16dLz00kuxc+fObscPtHXbsGFD7NixI97xjndEdXV1VFdXx0MPPRQ/+MEPorq6Ourr661TRIwZMyZOPPHEbttOOOGEePbZZyMiSmsx0P8//MpXvhLz5s2Lj370ozFx4sT4+Mc/Hl/+8pejtbU1IqzTgfRkTUaPHh07duzotv8///lPvPDCCwNu3V4Jj2eeeSbuv//+0lWPiL61Tod8fNTU1MSpp54aK1asKG3r6uqKFStWxNSpUys4WWWllOLSSy+NZcuWxQMPPBBNTU3d9p966qlx2GGHdVu3zZs3x7PPPjug1u3ss8+OP/7xj7Fp06bSbdKkSTFjxozSf1uniGnTpu33Ue0nn3wyjj322IiIaGpqitGjR3dbp2KxGGvWrBlQ67R3794YNKj7j93BgwdHV1dXRFinA+nJmkydOjV27twZGzZsKB3zwAMPRFdXV0yZMiX7zJXySnhs2bIlfvvb38bIkSO77e9T65T17a0Vcscdd6RCoZBuvvnm9Oc//zl99rOfTcOHD09tbW2VHq1ivvCFL6S6urr04IMPpr/97W+l2969e0vHfP7zn09jx45NDzzwQFq/fn2aOnVqmjp1agWn7hv++9MuKVmnlF5+V311dXVatGhR2rJlS7r11lvT4Ycfnn7605+Wjlm8eHEaPnx4+sUvfpH+8Ic/pAsvvPCQ/wjpq82cOTO9+c1vLn3U9q677kpHH310uuKKK0rHDMR12rVrV3r00UfTo48+miIiXXPNNenRRx8tfUqjJ2vy3ve+N51yyilpzZo1adWqVen4448/5D5q+3rr9NJLL6ULLrggHXPMMWnTpk3dfq53dHSUHqOvrNOAiI+UUvrhD3+Yxo4dm2pqatLkyZPTI488UumRKioiDni76aabSsf8+9//Tl/84hfTUUcdlQ4//PD0/ve/P/3tb3+r3NB9xKvjwzq97Je//GWaMGFCKhQKafz48en666/vtr+rqystWLAg1dfXp0KhkM4+++y0efPmCk1bGcViMV1++eVp7NixaciQIektb3lL+trXvtbtyWEgrtPKlSsP+PNo5syZKaWerck///nPdMkll6Qjjzwy1dbWplmzZqVdu3ZV4G/Te15vnbZu3fqaP9dXrlxZeoy+sk5VKf3Xr9YDAOhlh/x7PgCAvkV8AABZiQ8AICvxAQBkJT4AgKzEBwCQlfgAALISHwBAVuIDAMhKfAAAWYkPACAr8QEAZPV/qgnE9bhoJQwAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plan = pd.read_csv('../../Data/tables/plan.csv', index_col=0)\n",
+ "durs = plan[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].values.flatten()\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "plt.hist(np.unique(durs))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
"metadata": {},
"outputs": [
{
@@ -324,266 +458,169 @@
" \n",
" node_id \n",
" start_unix \n",
- " phas_A \n",
- " phas_B \n",
+ " phase_sumo \n",
" duration \n",
- " inc_edge_A \n",
- " inc_edge_B \n",
- " out_edge_A \n",
- " out_edge_B \n",
- " move_A \n",
- " move_B \n",
+ " state \n",
+ " start_dt \n",
" \n",
" \n",
" \n",
" \n",
- " 0 \n",
- " i9 \n",
- " 1704403210 \n",
- " 1 \n",
+ " 399 \n",
+ " i7 \n",
+ " 1704410130 \n",
+ " 0 \n",
+ " 44 \n",
+ " GGrggGG \n",
+ " 2024-01-05 08:15:30 \n",
+ " \n",
+ " \n",
+ " 400 \n",
+ " i7 \n",
+ " 1704410130 \n",
" 1 \n",
- " 39 \n",
- " 571510152_02 \n",
- " 571510152_01 \n",
- " -571510152_01 \n",
- " 571510152_01.65 \n",
- " 6 \n",
- " 2 \n",
+ " 26 \n",
+ " GGrggGG \n",
+ " 2024-01-05 08:15:30 \n",
" \n",
" \n",
- " 1 \n",
- " i9 \n",
- " 1704403210 \n",
- " 2 \n",
- " 2 \n",
- " 101 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " 17 \n",
- " 18 \n",
- " \n",
- " \n",
- " 2 \n",
- " i6 \n",
- " 1704403210 \n",
- " 1 \n",
- " 1 \n",
- " 24 \n",
- " -571542115_01 \n",
- " NaN \n",
- " 571500535_01 \n",
- " NaN \n",
- " 6 \n",
- " 18 \n",
+ " 401 \n",
+ " i0 \n",
+ " 1704410170 \n",
+ " 0 \n",
+ " 40 \n",
+ " gGGrgrrrgGGGGrgrr \n",
+ " 2024-01-05 08:16:10 \n",
" \n",
" \n",
- " 3 \n",
- " i6 \n",
- " 1704403210 \n",
+ " 402 \n",
+ " i0 \n",
+ " 1704410170 \n",
" 1 \n",
- " 2 \n",
- " 19 \n",
- " -571542115_01 \n",
- " 571500535_02.18 \n",
- " 571500535_01 \n",
- " 571542115_01 \n",
- " 6 \n",
- " 2 \n",
+ " 42 \n",
+ " grrGgrrrgrrrrGgrr \n",
+ " 2024-01-05 08:16:10 \n",
" \n",
" \n",
- " 4 \n",
- " i6 \n",
- " 1704403210 \n",
- " 2 \n",
+ " 403 \n",
+ " i0 \n",
+ " 1704410170 \n",
" 2 \n",
" 29 \n",
- " 571500535_02.18 \n",
- " 571500535_02.18 \n",
- " 571511538_01 \n",
- " 571542115_01 \n",
- " 5 \n",
- " 2 \n",
+ " grrrgGGGgrrrrrgrr \n",
+ " 2024-01-05 08:16:10 \n",
" \n",
" \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
- " ... \n",
+ " 404 \n",
+ " i0 \n",
+ " 1704410170 \n",
+ " 3 \n",
+ " 26 \n",
+ " grrrgGGrgrrrrrgGr \n",
+ " 2024-01-05 08:16:10 \n",
" \n",
" \n",
- " 417 \n",
- " i8 \n",
- " 1704406590 \n",
- " 5 \n",
- " 5 \n",
- " 18 \n",
- " 571500583_01 \n",
- " 571500583_01 \n",
- " 571500617_01 \n",
- " 571500569_01 \n",
- " 7 \n",
+ " 405 \n",
+ " i0 \n",
+ " 1704410170 \n",
" 4 \n",
+ " 33 \n",
+ " grrrgrrrgrrrrrgGG \n",
+ " 2024-01-05 08:16:10 \n",
" \n",
" \n",
- " 418 \n",
- " i7 \n",
- " 1704406630 \n",
- " 1 \n",
+ " 406 \n",
+ " i6 \n",
+ " 1704410200 \n",
+ " 0 \n",
+ " 24 \n",
+ " grrrgGGGrgrrgrrr \n",
+ " 2024-01-05 08:16:40 \n",
+ " \n",
+ " \n",
+ " 407 \n",
+ " i6 \n",
+ " 1704410200 \n",
" 1 \n",
- " 44 \n",
- " -571511538_02 \n",
- " 571542073_01 \n",
- " 571542073_02 \n",
- " 571511538_02 \n",
- " 8 \n",
- " 4 \n",
+ " 19 \n",
+ " grrrgGGGrgrrgGGr \n",
+ " 2024-01-05 08:16:40 \n",
" \n",
" \n",
- " 419 \n",
- " i7 \n",
- " 1704406630 \n",
- " 2 \n",
+ " 408 \n",
+ " i6 \n",
+ " 1704410200 \n",
" 2 \n",
- " 44 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " 17 \n",
- " 18 \n",
+ " 39 \n",
+ " grrrgrrrrgrrgGGG \n",
+ " 2024-01-05 08:16:40 \n",
" \n",
" \n",
- " 420 \n",
- " i7 \n",
- " 1704406630 \n",
- " 3 \n",
+ " 409 \n",
+ " i6 \n",
+ " 1704410200 \n",
" 3 \n",
- " 26 \n",
- " -571511538_02 \n",
- " 571542073_01 \n",
- " 571542073_02 \n",
- " 571511538_02 \n",
- " 8 \n",
- " 4 \n",
+ " 65 \n",
+ " gGGGgrrrrgrrgrrr \n",
+ " 2024-01-05 08:16:40 \n",
" \n",
" \n",
- " 421 \n",
- " i7 \n",
- " 1704406630 \n",
- " 4 \n",
+ " 410 \n",
+ " i6 \n",
+ " 1704410200 \n",
" 4 \n",
- " 26 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " 17 \n",
- " 18 \n",
+ " 23 \n",
+ " grrrgrrrrgGGgrrr \n",
+ " 2024-01-05 08:16:40 \n",
" \n",
" \n",
"\n",
- "422 rows × 11 columns
\n",
""
],
"text/plain": [
- " node_id start_unix phas_A phas_B duration inc_edge_A \\\n",
- "0 i9 1704403210 1 1 39 571510152_02 \n",
- "1 i9 1704403210 2 2 101 NaN \n",
- "2 i6 1704403210 1 1 24 -571542115_01 \n",
- "3 i6 1704403210 1 2 19 -571542115_01 \n",
- "4 i6 1704403210 2 2 29 571500535_02.18 \n",
- ".. ... ... ... ... ... ... \n",
- "417 i8 1704406590 5 5 18 571500583_01 \n",
- "418 i7 1704406630 1 1 44 -571511538_02 \n",
- "419 i7 1704406630 2 2 44 NaN \n",
- "420 i7 1704406630 3 3 26 -571511538_02 \n",
- "421 i7 1704406630 4 4 26 NaN \n",
- "\n",
- " inc_edge_B out_edge_A out_edge_B move_A move_B \n",
- "0 571510152_01 -571510152_01 571510152_01.65 6 2 \n",
- "1 NaN NaN NaN 17 18 \n",
- "2 NaN 571500535_01 NaN 6 18 \n",
- "3 571500535_02.18 571500535_01 571542115_01 6 2 \n",
- "4 571500535_02.18 571511538_01 571542115_01 5 2 \n",
- ".. ... ... ... ... ... \n",
- "417 571500583_01 571500617_01 571500569_01 7 4 \n",
- "418 571542073_01 571542073_02 571511538_02 8 4 \n",
- "419 NaN NaN NaN 17 18 \n",
- "420 571542073_01 571542073_02 571511538_02 8 4 \n",
- "421 NaN NaN NaN 17 18 \n",
+ " node_id start_unix phase_sumo duration state \\\n",
+ "399 i7 1704410130 0 44 GGrggGG \n",
+ "400 i7 1704410130 1 26 GGrggGG \n",
+ "401 i0 1704410170 0 40 gGGrgrrrgGGGGrgrr \n",
+ "402 i0 1704410170 1 42 grrGgrrrgrrrrGgrr \n",
+ "403 i0 1704410170 2 29 grrrgGGGgrrrrrgrr \n",
+ "404 i0 1704410170 3 26 grrrgGGrgrrrrrgGr \n",
+ "405 i0 1704410170 4 33 grrrgrrrgrrrrrgGG \n",
+ "406 i6 1704410200 0 24 grrrgGGGrgrrgrrr \n",
+ "407 i6 1704410200 1 19 grrrgGGGrgrrgGGr \n",
+ "408 i6 1704410200 2 39 grrrgrrrrgrrgGGG \n",
+ "409 i6 1704410200 3 65 gGGGgrrrrgrrgrrr \n",
+ "410 i6 1704410200 4 23 grrrgrrrrgGGgrrr \n",
"\n",
- "[422 rows x 11 columns]"
+ " start_dt \n",
+ "399 2024-01-05 08:15:30 \n",
+ "400 2024-01-05 08:15:30 \n",
+ "401 2024-01-05 08:16:10 \n",
+ "402 2024-01-05 08:16:10 \n",
+ "403 2024-01-05 08:16:10 \n",
+ "404 2024-01-05 08:16:10 \n",
+ "405 2024-01-05 08:16:10 \n",
+ "406 2024-01-05 08:16:40 \n",
+ "407 2024-01-05 08:16:40 \n",
+ "408 2024-01-05 08:16:40 \n",
+ "409 2024-01-05 08:16:40 \n",
+ "410 2024-01-05 08:16:40 "
]
},
- "execution_count": 15,
"metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sigtable"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "i0 grrrgrrrgrrrrrgrr\n",
- "i1 grrrrrrgrr\n",
- "i2 rrggrrr\n",
- "i3 grrrrgrrrrgrrrrgrrrr\n",
- "i6 grrrgrrrrgrrgrrr\n",
- "i7 rrrggrr\n",
- "i8 grrrrrrrgrrrgrrr\n",
- "i9 rrrr\n"
- ]
+ "output_type": "display_data"
}
],
"source": [
- "node2init = {}\n",
- "for node in nodes:\n",
- " node_id = node.getID()\n",
- " conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n",
- " conns = [c for c in conns if c[0] >= 0]\n",
- " conns = sorted(conns, key=lambda x: x[0])\n",
- " state = []\n",
- " for i, ci in conns:\n",
- " if ci.getTLLinkIndex() < 0:\n",
- " continue\n",
- " are_foes = False\n",
- " for j, cj in conns:\n",
- " if ci.getTo() == cj.getTo():\n",
- " continue\n",
- " if node.areFoes(i, j):\n",
- " are_foes = True\n",
- " break\n",
- " state.append('r' if are_foes else 'g')\n",
- " node2init[node_id] = state\n",
- "\n",
- "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n",
- "for _, row in sigtable.iterrows():\n",
- " node_id = row['node_id']\n",
+ "sigtable = histid.copy()\n",
+ "sigtable['init_state'] = sigtable['node_id'].map(node2init)\n",
+ "for i, row in sigtable.iterrows():\n",
+ " node_id = row.node_id\n",
" inc_edge_A = row.inc_edge_A\n",
" inc_edge_B = row.inc_edge_B\n",
" out_edge_A = row.out_edge_A\n",
" out_edge_B = row.out_edge_B\n",
- " move_A = row['move_A']\n",
- " move_B = row['move_B']\n",
+ " state = copy.deepcopy(node2init)[node_id]\n",
"\n",
" if pd.isna(inc_edge_A) or pd.isna(out_edge_A):\n",
" continue\n",
@@ -593,7 +630,8 @@
" for conn in inc_edge_A.getConnections(out_edge_A):\n",
" index = conn.getTLLinkIndex()\n",
" if index >= 0:\n",
- " node2init[node_id][index] = 'r'\n",
+ " state[index] = 'G'\n",
+ " sigtable.at[i, 'state'] = ''.join(state)\n",
"\n",
" if pd.isna(inc_edge_B) or pd.isna(out_edge_B):\n",
" continue\n",
@@ -603,401 +641,722 @@
" for conn in inc_edge_B.getConnections(out_edge_B):\n",
" index = conn.getTLLinkIndex()\n",
" if index >= 0:\n",
- " node2init[node_id][index] = 'r'\n",
- "for node_id in node_ids:\n",
- " print(node_id, \"\".join(node2init[node_id]))"
+ " state[index] = 'G'\n",
+ " sigtable.at[i, 'state'] = ''.join(state)\n",
+ "sigtable = sigtable.dropna(subset='state')\n",
+ "sigtable = sigtable.reset_index(drop=True)\n",
+ "sigtable['phase_sumo'] = sigtable.groupby(['node_id', 'start_unix']).cumcount()\n",
+ "sigtable = sigtable[['node_id', 'start_unix', 'phase_sumo', 'duration', 'state']]\n",
+ "sigtable = sigtable.sort_values(by=['start_unix', 'node_id'])\n",
+ "sigtable_dt = sigtable.copy()[sigtable.start_unix >= fmins[m]-360]\n",
+ "sigtable_dt['start_dt'] = sigtable_dt['start_unix'].apply(lambda x:datetime.fromtimestamp(x))\n",
+ "sigtable_dt = sigtable_dt[sigtable_dt.node_id!='i9']\n",
+ "sigtable_dt = sigtable_dt[sigtable_dt.node_id!='i2']\n",
+ "display(sigtable_dt)"
]
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n",
- "['G', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n",
- "['g', 'r', 'r', 'r', 'g', 'r', 'r', 'r', 'r', 'g', 'r', 'r', 'g', 'r', 'r', 'r']\n"
+ "3380\n",
+ "2024-01-05 08:15:00\n",
+ "2024-01-05 08:20:00\n",
+ "2024-01-05 08:17:00\n",
+ "2024-01-05 07:20:40\n"
]
}
],
"source": [
- "print(node2init['i6'])\n",
- "state = copy.deepcopy(node2init)['i6']\n",
- "state[0] = 'G'\n",
- "print(state)\n",
- "print(node2init['i6'])"
+ "print(sigtable.start_unix.max() - sigtable.start_unix.min())\n",
+ "print(datetime.fromtimestamp(fmins[m - 1]))\n",
+ "print(datetime.fromtimestamp(fmins[m]))\n",
+ "print(datetime.fromtimestamp(sigtable.start_unix.max()))\n",
+ "print(datetime.fromtimestamp(sigtable.start_unix.min()))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sigtable1 = sigtable.copy()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['i0', 'i1', 'i2', 'i3', 'i6', 'i7', 'i8', 'i9']"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sorted(sigtable.node_id.unique())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "strings = ['\\n']\n",
+ "for key, group in sigtable.groupby(['start_unix', 'node_id']):\n",
+ " start_unix = key[0]\n",
+ " node_id = key[1]\n",
+ " strings.append(f' \\n')\n",
+ " for i, row in group.iterrows():\n",
+ " duration = row.duration\n",
+ " state = row.state\n",
+ " strings.append(f' \\n')\n",
+ " strings.append(' \\n')\n"
]
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "2024-01-05 07:20:00\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " node_id \n",
- " start_unix \n",
- " phase_sumo \n",
- " duration \n",
- " state \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 1 \n",
- " i6 \n",
- " 1704403210 \n",
- " 0 \n",
- " 24 \n",
- " grrrgGGGrgrrgrrr \n",
- " \n",
- " \n",
- " 2 \n",
- " i6 \n",
- " 1704403210 \n",
- " 1 \n",
- " 19 \n",
- " grrrgGGGrgrrgGGr \n",
- " \n",
- " \n",
- " 3 \n",
- " i6 \n",
- " 1704403210 \n",
- " 2 \n",
- " 29 \n",
- " grrrgrrrrgrrgGGG \n",
- " \n",
- " \n",
- " 4 \n",
- " i6 \n",
- " 1704403210 \n",
- " 3 \n",
- " 56 \n",
- " gGGGgrrrrgrrgrrr \n",
- " \n",
- " \n",
- " 5 \n",
- " i6 \n",
- " 1704403210 \n",
- " 4 \n",
- " 22 \n",
- " grrrgrrrrgGGgrrr \n",
- " \n",
- " \n",
- " 0 \n",
- " i9 \n",
- " 1704403210 \n",
- " 0 \n",
- " 39 \n",
- " GGGG \n",
- " \n",
- " \n",
- " 6 \n",
- " i3 \n",
- " 1704403220 \n",
- " 0 \n",
- " 38 \n",
- " gGGGrgrrrrgGGGrgrrrr \n",
- " \n",
- " \n",
- " 7 \n",
- " i3 \n",
- " 1704403220 \n",
- " 1 \n",
- " 39 \n",
- " grrrGgrrrrgrrrGgrrrr \n",
- " \n",
- " \n",
- " 8 \n",
- " i3 \n",
- " 1704403220 \n",
- " 2 \n",
- " 40 \n",
- " grrrrgrrrrgrrrrgGGGG \n",
- " \n",
- " \n",
- " 9 \n",
- " i3 \n",
- " 1704403220 \n",
- " 3 \n",
- " 23 \n",
- " grrrrgGGGGgrrrrgrrrr \n",
- " \n",
- " \n",
- " 10 \n",
- " i2 \n",
- " 1704403230 \n",
- " 0 \n",
- " 36 \n",
- " GGggGGG \n",
- " \n",
- " \n",
- " 11 \n",
- " i2 \n",
- " 1704403230 \n",
- " 1 \n",
- " 20 \n",
- " rrggrrr \n",
- " \n",
- " \n",
- " 12 \n",
- " i2 \n",
- " 1704403230 \n",
- " 2 \n",
- " 26 \n",
- " rrggGGG \n",
- " \n",
- " \n",
- " 13 \n",
- " i1 \n",
- " 1704403250 \n",
- " 0 \n",
- " 37 \n",
- " gGGGGGrgrr \n",
- " \n",
- " \n",
- " 14 \n",
- " i1 \n",
- " 1704403250 \n",
- " 1 \n",
- " 73 \n",
- " grrGGGGgrr \n",
- " \n",
- " \n",
- " 15 \n",
- " i1 \n",
- " 1704403250 \n",
- " 2 \n",
- " 40 \n",
- " grrrrrrgGG \n",
- " \n",
- " \n",
- " 16 \n",
- " i0 \n",
- " 1704403270 \n",
- " 0 \n",
- " 37 \n",
- " gGGrgrrrgGGGGrgrr \n",
- " \n",
- " \n",
- " 17 \n",
- " i0 \n",
- " 1704403270 \n",
- " 1 \n",
- " 39 \n",
- " grrGgrrrgrrrrGgrr \n",
- " \n",
- " \n",
- " 18 \n",
- " i0 \n",
- " 1704403270 \n",
- " 2 \n",
- " 25 \n",
- " grrrgGGGgrrrrrgrr \n",
- " \n",
- " \n",
- " 19 \n",
- " i0 \n",
- " 1704403270 \n",
- " 3 \n",
- " 30 \n",
- " grrrgGGrgrrrrrgGr \n",
- " \n",
- " \n",
- " 20 \n",
- " i0 \n",
- " 1704403270 \n",
- " 4 \n",
- " 29 \n",
- " grrrgrrrgrrrrrgGG \n",
- " \n",
- " \n",
- " 21 \n",
- " i7 \n",
- " 1704403320 \n",
- " 0 \n",
- " 33 \n",
- " GGrggGG \n",
- " \n",
- " \n",
- " 22 \n",
- " i7 \n",
- " 1704403320 \n",
- " 1 \n",
- " 26 \n",
- " GGrggGG \n",
- " \n",
- " \n",
- " 23 \n",
- " i9 \n",
- " 1704403350 \n",
- " 0 \n",
- " 39 \n",
- " GGGG \n",
- " \n",
- " \n",
- " 24 \n",
- " i3 \n",
- " 1704403360 \n",
- " 0 \n",
- " 38 \n",
- " gGGGrgrrrrgGGGrgrrrr \n",
- " \n",
- " \n",
- " 25 \n",
- " i3 \n",
- " 1704403360 \n",
- " 1 \n",
- " 39 \n",
- " grrrGgrrrrgrrrGgrrrr \n",
- " \n",
- " \n",
- " 26 \n",
- " i3 \n",
- " 1704403360 \n",
- " 2 \n",
- " 40 \n",
- " grrrrgrrrrgrrrrgGGGG \n",
- " \n",
- " \n",
- " 27 \n",
- " i3 \n",
- " 1704403360 \n",
- " 3 \n",
- " 23 \n",
- " grrrrgGGGGgrrrrgrrrr \n",
- " \n",
- " \n",
- " 28 \n",
- " i6 \n",
- " 1704403360 \n",
- " 0 \n",
- " 24 \n",
- " grrrgGGGrgrrgrrr \n",
- " \n",
- " \n",
- " 29 \n",
- " i6 \n",
- " 1704403360 \n",
- " 1 \n",
- " 19 \n",
- " grrrgGGGrgrrgGGr \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " node_id start_unix phase_sumo duration state\n",
- "1 i6 1704403210 0 24 grrrgGGGrgrrgrrr\n",
- "2 i6 1704403210 1 19 grrrgGGGrgrrgGGr\n",
- "3 i6 1704403210 2 29 grrrgrrrrgrrgGGG\n",
- "4 i6 1704403210 3 56 gGGGgrrrrgrrgrrr\n",
- "5 i6 1704403210 4 22 grrrgrrrrgGGgrrr\n",
- "0 i9 1704403210 0 39 GGGG\n",
- "6 i3 1704403220 0 38 gGGGrgrrrrgGGGrgrrrr\n",
- "7 i3 1704403220 1 39 grrrGgrrrrgrrrGgrrrr\n",
- "8 i3 1704403220 2 40 grrrrgrrrrgrrrrgGGGG\n",
- "9 i3 1704403220 3 23 grrrrgGGGGgrrrrgrrrr\n",
- "10 i2 1704403230 0 36 GGggGGG\n",
- "11 i2 1704403230 1 20 rrggrrr\n",
- "12 i2 1704403230 2 26 rrggGGG\n",
- "13 i1 1704403250 0 37 gGGGGGrgrr\n",
- "14 i1 1704403250 1 73 grrGGGGgrr\n",
- "15 i1 1704403250 2 40 grrrrrrgGG\n",
- "16 i0 1704403270 0 37 gGGrgrrrgGGGGrgrr\n",
- "17 i0 1704403270 1 39 grrGgrrrgrrrrGgrr\n",
- "18 i0 1704403270 2 25 grrrgGGGgrrrrrgrr\n",
- "19 i0 1704403270 3 30 grrrgGGrgrrrrrgGr\n",
- "20 i0 1704403270 4 29 grrrgrrrgrrrrrgGG\n",
- "21 i7 1704403320 0 33 GGrggGG\n",
- "22 i7 1704403320 1 26 GGrggGG\n",
- "23 i9 1704403350 0 39 GGGG\n",
- "24 i3 1704403360 0 38 gGGGrgrrrrgGGGrgrrrr\n",
- "25 i3 1704403360 1 39 grrrGgrrrrgrrrGgrrrr\n",
- "26 i3 1704403360 2 40 grrrrgrrrrgrrrrgGGGG\n",
- "27 i3 1704403360 3 23 grrrrgGGGGgrrrrgrrrr\n",
- "28 i6 1704403360 0 24 grrrgGGGrgrrgrrr\n",
- "29 i6 1704403360 1 19 grrrgGGGrgrrgGGr"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ]
}
],
"source": [
- "sigtable = histid.copy()\n",
- "sigtable['init_state'] = sigtable['node_id'].map(node2init)\n",
- "for i, row in sigtable.iterrows():\n",
- " node_id = row.node_id\n",
- " inc_edge_A = row.inc_edge_A\n",
- " inc_edge_B = row.inc_edge_B\n",
- " out_edge_A = row.out_edge_A\n",
- " out_edge_B = row.out_edge_B\n",
- " state = copy.deepcopy(node2init)[node_id]\n",
- "\n",
- " if pd.isna(inc_edge_A) or pd.isna(out_edge_A):\n",
- " continue\n",
- " else:\n",
- " inc_edge_A = net.getEdge(inc_edge_A)\n",
- " out_edge_A = net.getEdge(out_edge_A)\n",
- " for conn in inc_edge_A.getConnections(out_edge_A):\n",
- " index = conn.getTLLinkIndex()\n",
- " if index >= 0:\n",
- " state[index] = 'G'\n",
- " sigtable.at[i, 'state'] = ''.join(state)\n",
- "\n",
- " if pd.isna(inc_edge_B) or pd.isna(out_edge_B):\n",
- " continue\n",
- " else:\n",
- " inc_edge_B = net.getEdge(inc_edge_B)\n",
- " out_edge_B = net.getEdge(out_edge_B)\n",
- " for conn in inc_edge_B.getConnections(out_edge_B):\n",
- " index = conn.getTLLinkIndex()\n",
- " if index >= 0:\n",
- " state[index] = 'G'\n",
- " sigtable.at[i, 'state'] = ''.join(state)\n",
- "sigtable = sigtable.dropna(subset='state')\n",
- "sigtable = sigtable.reset_index(drop=True)\n",
- "sigtable['phase_sumo'] = sigtable.groupby(['node_id', 'start_unix']).cumcount()\n",
- "sigtable = sigtable[['node_id', 'start_unix', 'phase_sumo', 'duration', 'state']]\n",
- "sigtable = sigtable.sort_values(by=['start_unix', 'node_id'])\n",
- "print(datetime.fromtimestamp(fmins[m]))\n",
- "display(sigtable[:30])"
+ "strings = ['\\n']\n",
+ "for key, group in sigtable.groupby(['start_unix', 'node_id']):\n",
+ " start_unix = key[0]\n",
+ " node_id = key[1]\n",
+ " strings.append(f' \\n')\n",
+ " for i, row in group.iterrows():\n",
+ " duration = row.duration\n",
+ " state = row.state\n",
+ " strings.append(f' \\n')\n",
+ " strings.append(' \\n')\n",
+ "strings.append(' ')\n",
+ "strings = ''.join(strings)\n",
+ "# 저장\n",
+ "path_output = '../../Data/networks/SN_sample.tll.xml'\n",
+ "with open(path_output, 'w') as f:\n",
+ " f.write(strings)\n",
+ "print(strings)"
]
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -1621,55 +1980,6 @@
" f.write(strings)\n",
"print(strings)"
]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "ename": "FileNotFoundError",
- "evalue": "[Errno 2] No such file or directory: 'one_cycle.csv'",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[1;32mIn[9], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m 2\u001b[0m path \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mone_cycle.csv\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m----> 3\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# 적당히 지정하세요\u001b[39;00m\n\u001b[0;32m 6\u001b[0m node_id \u001b[38;5;241m=\u001b[39m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnode_id\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n",
- "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:912\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m 899\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m 900\u001b[0m dialect,\n\u001b[0;32m 901\u001b[0m delimiter,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 908\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[0;32m 909\u001b[0m )\n\u001b[0;32m 910\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m--> 912\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:577\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m 574\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[0;32m 576\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 577\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 579\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[0;32m 580\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
- "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:1407\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m 1404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 1406\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 1407\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:1661\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m 1659\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[0;32m 1660\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1662\u001b[0m \u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1663\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1664\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1665\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1666\u001b[0m \u001b[43m \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1667\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1668\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1669\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1670\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1671\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1672\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
- "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\io\\common.py:859\u001b[0m, in \u001b[0;36mget_handle\u001b[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[0;32m 854\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m 855\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[0;32m 856\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[0;32m 857\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[0;32m 858\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[1;32m--> 859\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[0;32m 860\u001b[0m \u001b[43m \u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 861\u001b[0m \u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 862\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 863\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 864\u001b[0m \u001b[43m \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 865\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 866\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 867\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[0;32m 868\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
- "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'one_cycle.csv'"
- ]
- }
- ],
- "source": [
- "import pandas as pd\n",
- "path = 'one_cycle.csv'\n",
- "df = pd.read_csv(path)\n",
- "\n",
- "# 적당히 지정하세요\n",
- "node_id = df['node_id'][0]\n",
- "offset = 999\n",
- "\n",
- "# xml양식대로 작성\n",
- "strings = ['\\n']\n",
- "strings.append(f' \\n')\n",
- "for i, row in df.iterrows():\n",
- " dur = row['dura']\n",
- " state = row['signal']\n",
- " strings.append(f' \\n')\n",
- "strings.append(' \\n')\n",
- "strings.append(' ')\n",
- "strings = ''.join(strings)\n",
- "print(strings)\n",
- "\n",
- "# 저장\n",
- "path_output = 'example.tll.xml'\n",
- "with open(path_output, 'w') as f:\n",
- " f.write(strings)"
- ]
}
],
"metadata": {
diff --git a/Analysis/0119_test_2/example.add.xml b/Analysis/0119_test_2/example.add.xml
new file mode 100644
index 000000000..974bac024
--- /dev/null
+++ b/Analysis/0119_test_2/example.add.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Analysis/0119_test_2/example.net.xml b/Analysis/0119_test_2/example.net.xml
new file mode 100644
index 000000000..5db7310f1
--- /dev/null
+++ b/Analysis/0119_test_2/example.net.xml
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Analysis/0119_test_2/example.rou.xml b/Analysis/0119_test_2/example.rou.xml
new file mode 100644
index 000000000..56b8f3985
--- /dev/null
+++ b/Analysis/0119_test_2/example.rou.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Analysis/0119_test_2/example.sumocfg b/Analysis/0119_test_2/example.sumocfg
new file mode 100644
index 000000000..b317b170b
--- /dev/null
+++ b/Analysis/0119_test_2/example.sumocfg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Data/networks/SN_sample.rou.xml b/Data/networks/SN_sample.rou.xml
new file mode 100644
index 000000000..279eb08b5
--- /dev/null
+++ b/Data/networks/SN_sample.rou.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/networks/SN_sample.sumocfg b/Data/networks/SN_sample.sumocfg
deleted file mode 100644
index 036d77192..000000000
--- a/Data/networks/SN_sample.sumocfg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Data/networks/SN_sample.xml.rou.xml b/Data/networks/SN_sample.xml.rou.xml
deleted file mode 100644
index 33813e9a5..000000000
--- a/Data/networks/SN_sample.xml.rou.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Data/networks/SN_sample_with_a_route.net.xml b/Data/networks/SN_sample_with_a_route.net.xml
deleted file mode 100644
index ed6bd1e4d..000000000
--- a/Data/networks/SN_sample_with_a_route.net.xml
+++ /dev/null
@@ -1,2218 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Data/networks/example/example.add.xml b/Data/networks/example/example.add.xml
new file mode 100644
index 000000000..375348ebd
--- /dev/null
+++ b/Data/networks/example/example.add.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Data/networks/example/example.net.xml b/Data/networks/example/example.net.xml
new file mode 100644
index 000000000..5db7310f1
--- /dev/null
+++ b/Data/networks/example/example.net.xml
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/networks/example/example.rou.xml b/Data/networks/example/example.rou.xml
new file mode 100644
index 000000000..56b8f3985
--- /dev/null
+++ b/Data/networks/example/example.rou.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/tables/0110_view_tables.ipynb b/Data/tables/0110_view_tables.ipynb
index e8411f15e..2c041b4ae 100644
--- a/Data/tables/0110_view_tables.ipynb
+++ b/Data/tables/0110_view_tables.ipynb
@@ -35,14 +35,14 @@
},
{
"attachments": {
- "image.png": {
- "image/png": "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"
+ "image-2.png": {
+ "image/png": "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"
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
- ""
+ ""
]
},
{
diff --git a/Documents/1127_table_definition/table_definition_v0.8.4.xlsx b/Documents/1127_table_definition/table_definition_v0.8.4.xlsx
index 6c503e1a9..0d2b5dae2 100644
Binary files a/Documents/1127_table_definition/table_definition_v0.8.4.xlsx and b/Documents/1127_table_definition/table_definition_v0.8.4.xlsx differ