{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os\n", "import sumolib\n", "import random\n", "from tqdm import tqdm\n", "from datetime import datetime" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# plan_original = pd.read_csv('../../Data/tables/plan_original.csv', index_col=0)\n", "# plan_original_ = plan_original[plan_original.start_hour==0]\n", "# # plan_original_ = plan_original_[plan_original_.inter_no.isin([175, 210])]\n", "# with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n", "# display(plan_original_) # overlap : 175, 201, 210" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0%| | 0/17280 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_B
01751184
11752273
21753361
31753462
41754452
51761184
61762283
717633518
81771184
91772273
\n", "" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B\n", "0 175 1 1 8 4\n", "1 175 2 2 7 3\n", "2 175 3 3 6 1\n", "3 175 3 4 6 2\n", "4 175 4 4 5 2\n", "5 176 1 1 8 4\n", "6 176 2 2 8 3\n", "7 176 3 3 5 18\n", "8 177 1 1 8 4\n", "9 177 2 2 7 3" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# [이동류번호] 불러오기\n", "path_moves = '../../Data/tables/movements/'\n", "csv_moves = os.listdir('../../Data/tables/movements/')\n", "moves = [pd.read_csv(path_moves + csv_movement, index_col=0) for csv_movement in tqdm(csv_moves)]\n", "match1 = pd.concat(moves).drop_duplicates().sort_values(by=['inter_no','phas_A','phas_B']).reset_index(drop=True)\n", "match1 = match1[match1.inter_no!=212]\n", "match1.head(10)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_no
01751A8
01751B4
11752A7
11752B3
21753A6
21753B1
41754A5
31754B2
51761A8
51761B4
\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no\n", "0 175 1 A 8\n", "0 175 1 B 4\n", "1 175 2 A 7\n", "1 175 2 B 3\n", "2 175 3 A 6\n", "2 175 3 B 1\n", "4 175 4 A 5\n", "3 175 4 B 2\n", "5 176 1 A 8\n", "5 176 1 B 4" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 계층화\n", "moveA = match1[['inter_no', 'phas_A', 'move_A']].copy()\n", "moveA.columns = ['inter_no', 'phase_no', 'move_no']\n", "moveA['ring_type'] = 'A'\n", "moveB = match1[['inter_no', 'phas_B', 'move_B']].copy()\n", "moveB.columns = ['inter_no', 'phase_no', 'move_no']\n", "moveB['ring_type'] = 'B'\n", "match2 = pd.concat([moveA, moveB]).drop_duplicates()\n", "match2 = match2[['inter_no', 'phase_no', 'ring_type', 'move_no']]\n", "match2 = match2.sort_values(by=list(match2.columns))\n", "match2.head(10)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_noinc_dirout_dir
01751A8
11751B4
21752A7
31752B3
41753A6
.....................
592104B3
602111A6
612111B2
622112A17NaNNaN
632112B18NaNNaN
\n", "

64 rows × 6 columns

\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no inc_dir out_dir\n", "0 175 1 A 8 남 북\n", "1 175 1 B 4 북 남\n", "2 175 2 A 7 북 동\n", "3 175 2 B 3 남 서\n", "4 175 3 A 6 동 서\n", ".. ... ... ... ... ... ...\n", "59 210 4 B 3 남 서\n", "60 211 1 A 6 동 서\n", "61 211 1 B 2 서 동\n", "62 211 2 A 17 NaN NaN\n", "63 211 2 B 18 NaN NaN\n", "\n", "[64 rows x 6 columns]" ] }, "execution_count": 5, "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', left_on='move_no', right_on='이동류번호').drop_duplicates()\n", "match3.rename(columns={'진입방향': 'inc_dir', '진출방향': 'out_dir'}, inplace=True)\n", "match3.drop('이동류번호', axis=1, inplace=True)\n", "match3" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angle
01751A8179004
11751B4NaNNaN
21752A7NaNNaN
31752B3179270
41753A6NaNNaN
...........................
592104B3180270
602111A6NaNNaN
612111B2270090
622112A17NaNNaNNaNNaN
632112B18NaNNaNNaNNaN
\n", "

64 rows × 8 columns

\n", "
" ], "text/plain": [ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle\n", "0 175 1 A 8 남 북 179 004\n", "1 175 1 B 4 북 남 NaN NaN\n", "2 175 2 A 7 북 동 NaN NaN\n", "3 175 2 B 3 남 서 179 270\n", "4 175 3 A 6 동 서 NaN NaN\n", ".. ... ... ... ... ... ... ... ...\n", "59 210 4 B 3 남 서 180 270\n", "60 211 1 A 6 동 서 NaN NaN\n", "61 211 1 B 2 서 동 270 090\n", "62 211 2 A 17 NaN NaN NaN NaN\n", "63 211 2 B 18 NaN NaN NaN NaN\n", "\n", "[64 rows x 8 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# [방위각정보] 불러오기 및 병합\n", "angle = pd.read_csv('../../Data/tables/angle.csv', index_col=0)\n", "six_chars = angle.angle_code.apply(lambda x:len(x)==6)\n", "angle.loc[six_chars,'inc_angle'] = angle.angle_code.apply(lambda x:x[:3])\n", "angle.loc[six_chars,'out_angle'] = angle.angle_code.apply(lambda x:x[3:])\n", "angle = angle.drop('angle_code', axis=1)\n", "match4 = pd.merge(match3, angle, how='left', left_on=['inter_no', 'phase_no', 'ring_type'],\n", " right_on=['inter_no', 'phase_no', 'ring_type']).drop_duplicates()\n", "match4" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nonode_idmove_noinc_edgeout_edge
0175i01NaNNaN
1175i02571510153_02571545870_01
2175i03-571542797_02571510153_01
3175i04NaNNaN
4175i05571510153_02571500487_01
5175i06NaNNaN
6175i07NaNNaN
7175i08-571542797_02571500487_01
8176i13-571542810_01571543469_01
9176i14571542797_02.99571542810_01
10176i15571543469_02-571542797_02.99
11176i18-571542810_01-571542797_02.99
12176i18-571542810_01-571542797_02.99
13176i118NaNNaN
14177i21NaNNaN
15177i23-571542809_01571542809_01
16177i24NaNNaN
17177i25-571542809_01571542811_01
18177i27NaNNaN
19177i28-571542809_01571542811_01
20177i217NaNNaN
21177i218NaNNaN
22178i31NaNNaN
23178i32571540303_02.21571500475_01
24178i33571540304_02571540303_01
25178i34NaNNaN
26178i35571540303_02.21571556450_01
27178i36NaNNaN
28178i37NaNNaN
29178i38571540304_02571556450_01
30201i81NaNNaN
31201i82571500618_02571500617_01
32201i82571500618_02571500617_01
33201i83-571500569_01571500618_01
34201i84NaNNaN
35201i85571500618_02571500583_02
36201i86NaNNaN
37201i86NaNNaN
38201i87NaNNaN
39201i88-571500569_01571500583_02
40202i92571510152_01571510152_01.65
41202i96NaNNaN
42202i917NaNNaN
43202i918NaNNaN
44206i74NaNNaN
45206i74NaNNaN
46206i78-571511538_02571542073_02
47206i78-571511538_02571542073_02
48206i717NaNNaN
49206i717NaNNaN
50206i718NaNNaN
51206i718NaNNaN
52210i62571500535_02.18571542115_01
53210i63571500585_02571500535_01
54210i64NaNNaN
55210i65571500535_02.18571511538_01
56210i66NaNNaN
57210i67571511538_02.121571542115_01
58210i68571500585_02571511538_01
59210i618NaNNaN
\n", "
" ], "text/plain": [ " inter_no node_id move_no inc_edge out_edge\n", "0 175 i0 1 NaN NaN\n", "1 175 i0 2 571510153_02 571545870_01\n", "2 175 i0 3 -571542797_02 571510153_01\n", "3 175 i0 4 NaN NaN\n", "4 175 i0 5 571510153_02 571500487_01\n", "5 175 i0 6 NaN NaN\n", "6 175 i0 7 NaN NaN\n", "7 175 i0 8 -571542797_02 571500487_01\n", "8 176 i1 3 -571542810_01 571543469_01\n", "9 176 i1 4 571542797_02.99 571542810_01\n", "10 176 i1 5 571543469_02 -571542797_02.99\n", "11 176 i1 8 -571542810_01 -571542797_02.99\n", "12 176 i1 8 -571542810_01 -571542797_02.99\n", "13 176 i1 18 NaN NaN\n", "14 177 i2 1 NaN NaN\n", "15 177 i2 3 -571542809_01 571542809_01\n", "16 177 i2 4 NaN NaN\n", "17 177 i2 5 -571542809_01 571542811_01\n", "18 177 i2 7 NaN NaN\n", "19 177 i2 8 -571542809_01 571542811_01\n", "20 177 i2 17 NaN NaN\n", "21 177 i2 18 NaN NaN\n", "22 178 i3 1 NaN NaN\n", "23 178 i3 2 571540303_02.21 571500475_01\n", "24 178 i3 3 571540304_02 571540303_01\n", "25 178 i3 4 NaN NaN\n", "26 178 i3 5 571540303_02.21 571556450_01\n", "27 178 i3 6 NaN NaN\n", "28 178 i3 7 NaN NaN\n", "29 178 i3 8 571540304_02 571556450_01\n", "30 201 i8 1 NaN NaN\n", "31 201 i8 2 571500618_02 571500617_01\n", "32 201 i8 2 571500618_02 571500617_01\n", "33 201 i8 3 -571500569_01 571500618_01\n", "34 201 i8 4 NaN NaN\n", "35 201 i8 5 571500618_02 571500583_02\n", "36 201 i8 6 NaN NaN\n", "37 201 i8 6 NaN NaN\n", "38 201 i8 7 NaN NaN\n", "39 201 i8 8 -571500569_01 571500583_02\n", "40 202 i9 2 571510152_01 571510152_01.65\n", "41 202 i9 6 NaN NaN\n", "42 202 i9 17 NaN NaN\n", "43 202 i9 18 NaN NaN\n", "44 206 i7 4 NaN NaN\n", "45 206 i7 4 NaN NaN\n", "46 206 i7 8 -571511538_02 571542073_02\n", "47 206 i7 8 -571511538_02 571542073_02\n", "48 206 i7 17 NaN NaN\n", "49 206 i7 17 NaN NaN\n", "50 206 i7 18 NaN NaN\n", "51 206 i7 18 NaN NaN\n", "52 210 i6 2 571500535_02.18 571542115_01\n", "53 210 i6 3 571500585_02 571500535_01\n", "54 210 i6 4 NaN NaN\n", "55 210 i6 5 571500535_02.18 571511538_01\n", "56 210 i6 6 NaN NaN\n", "57 210 i6 7 571511538_02.121 571542115_01\n", "58 210 i6 8 571500585_02 571511538_01\n", "59 210 i6 18 NaN NaN" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# [네트워크], [교차로-노드 매칭], [교차로정보] 불러오기 \n", "net = sumolib.net.readNet('../../Data/networks/SN_sample.net.xml')\n", "inter_node = pd.read_csv('../../Data/tables/inter_node.csv', index_col=0)\n", "inter_info = pd.read_csv('../../Data/tables/inter_info.csv', index_col=0)\n", "\n", "inter_node1 = inter_node[inter_node.inter_type == 'parent'].drop('inter_type', axis=1)\n", "inter_info1 = inter_info[['inter_no', 'inter_lat', 'inter_lon']]\n", "inter = pd.merge(inter_node1, inter_info1, how='left', left_on=['inter_no'],\n", " right_on=['inter_no']).drop_duplicates()\n", "\n", "inter2node = dict(zip(inter['inter_no'], inter['node_id']))\n", "\n", "match5 = match4.copy()\n", "# 진입진출ID 매칭\n", "for index, row in match5.iterrows():\n", " node_id = inter2node[row.inter_no]\n", " node = net.getNode(node_id)\n", " # 교차로의 모든 (from / to) edges\n", " inc_edges = [edge for edge in node.getIncoming() if edge.getFunction() == ''] # incoming edges\n", " out_edges = [edge for edge in node.getOutgoing() if edge.getFunction() == ''] # outgoing edges\n", " # 교차로의 모든 (from / to) directions\n", " inc_dirs = []\n", " for inc_edge in inc_edges:\n", " start = inc_edge.getShape()[-2]\n", " end = inc_edge.getShape()[-1]\n", " inc_dir = np.array(end) - np.array(start)\n", " inc_dir = inc_dir / (inc_dir ** 2).sum() ** 0.5\n", " inc_dirs.append(inc_dir)\n", " out_dirs = []\n", " for out_edge in out_edges:\n", " start = out_edge.getShape()[0]\n", " end = out_edge.getShape()[1]\n", " out_dir = np.array(end) - np.array(start)\n", " out_dir = out_dir / (out_dir ** 2).sum() ** 0.5\n", " out_dirs.append(out_dir)\n", " # 진입각, 진출각 불러오기\n", " if not pd.isna(row.inc_angle):\n", " inc_angle = int(row.inc_angle)\n", " out_angle = int(row.out_angle)\n", " # 방위각을 일반각으로 가공, 라디안 변환, 단위벡터로 변환\n", " inc_angle = (-90 - inc_angle) % 360\n", " inc_angle = inc_angle * np.pi / 180.\n", " inc_dir_true = np.array([np.cos(inc_angle), np.sin(inc_angle)])\n", " out_angle = (90 - out_angle) % 360\n", " out_angle = out_angle * np.pi / 180.\n", " out_dir_true = np.array([np.cos(out_angle), np.sin(out_angle)])\n", " # 매칭 엣지 반환\n", " inc_index = np.array([np.dot(inc_dir, inc_dir_true) for inc_dir in inc_dirs]).argmax()\n", " out_index = np.array([np.dot(out_dir, out_dir_true) for out_dir in out_dirs]).argmax()\n", " inc_edge_id = inc_edges[inc_index].getID()\n", " out_edge_id = out_edges[out_index].getID()\n", " match5.at[index, 'inc_edge'] = inc_edge_id\n", " match5.at[index, 'out_edge'] = out_edge_id\n", "match5['node_id'] = match5['inter_no'].map(inter2node)\n", "match5 = match5[['inter_no', 'node_id', 'move_no', 'inc_edge', 'out_edge']]\n", "match5 = match5.sort_values(by=['inter_no', 'move_no']).reset_index(drop=True)\n", "match5[:60]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", "next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_B
01753361
01762283
0177331718
01782273
02013362
0202221718
02063384
02103374
02111162
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B\n", "0 175 3 3 6 1\n", "0 176 2 2 8 3\n", "0 177 3 3 17 18\n", "0 178 2 2 7 3\n", "0 201 3 3 6 2\n", "0 202 2 2 17 18\n", "0 206 3 3 8 4\n", "0 210 3 3 7 4\n", "0 211 1 1 6 2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "times = range(midnight, next_day, 5)\n", "time = random.choice(times)\n", "# 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n", "time2move = dict(zip(range(midnight, next_day, 5),moves))\n", "move1 = time2move[time]\n", "display(move1)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_noend_unix
13171751704409269
13131761704409150
13141771704409151
8301781704397060
13162011704409260
11152021704403380
13152061704409220
13182101704409280
10402111704401645
\n", "
" ], "text/plain": [ " inter_no end_unix\n", "1317 175 1704409269\n", "1313 176 1704409150\n", "1314 177 1704409151\n", "830 178 1704397060\n", "1316 201 1704409260\n", "1115 202 1704403380\n", "1315 206 1704409220\n", "1318 210 1704409280\n", "1040 211 1704401645" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로변호, 종료유닉스타임)만 수집 : B\n", "history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n", "recent_history = pd.concat([group.iloc[-1:] for inter_no, group in history[history['end_unix'] < time].groupby('inter_no')])\n", "recent_history = recent_history[['inter_no', 'end_unix']]\n", "recent_history" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bend_unix
017533611704409269
117622831704409150
21773317181704409151
317822731704397060
420133621704409260
52022217181704403380
620633841704409220
721033741704409280
821111621704401645
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B end_unix\n", "0 175 3 3 6 1 1704409269\n", "1 176 2 2 8 3 1704409150\n", "2 177 3 3 17 18 1704409151\n", "3 178 2 2 7 3 1704397060\n", "4 201 3 3 6 2 1704409260\n", "5 202 2 2 17 18 1704403380\n", "6 206 3 3 8 4 1704409220\n", "7 210 3 3 7 4 1704409280\n", "8 211 1 1 6 2 1704401645" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", "move2 = pd.merge(move1.copy(), recent_history, how='left', left_on='inter_no', right_on='inter_no').drop_duplicates()\n", "move2\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017533611704409269
117622831704409150
21773317181704409151
317822731704397060
420133621704409260
52022217181704403380
620633841704409220
721033741704409280
821111621704401645
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "0 175 3 3 6 1 1704409269\n", "1 176 2 2 8 3 1704409150\n", "2 177 3 3 17 18 1704409151\n", "3 178 2 2 7 3 1704397060\n", "4 201 3 3 6 2 1704409260\n", "5 202 2 2 17 18 1704403380\n", "6 206 3 3 8 4 1704409220\n", "7 210 3 3 7 4 1704409280\n", "8 211 1 1 6 2 1704401645" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n", "move3 = move2.copy().rename(columns = {'end_unix':'start_unix'})\n", "move3" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017533611704409269
117622831704409150
21773317181704409151
420133621704409260
620633841704409220
721033741704409280
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "0 175 3 3 6 1 1704409269\n", "1 176 2 2 8 3 1704409150\n", "2 177 3 3 17 18 1704409151\n", "4 201 3 3 6 2 1704409260\n", "6 206 3 3 8 4 1704409220\n", "7 210 3 3 7 4 1704409280" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 5. 이동류 이력정보 READ\n", "# - CSV 파일로 서버에 저장된 이동류정보를 읽어옮(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n", "try:\n", " if isinstance(movement, pd.DataFrame):\n", " pass\n", " else:\n", " movement = pd.DataFrame()\n", "except NameError:\n", " movement = pd.DataFrame()\n", "# 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n", "movement = pd.concat([movement, move3])\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 > time - 3600]\n", "movement" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inter_nophas_Aphas_Bmove_Amove_Bstart_unix
017533611704409269
117622831704409150
21773317181704409151
420133621704409260
620633841704409220
721033741704409280
\n", "
" ], "text/plain": [ " inter_no phas_A phas_B move_A move_B start_unix\n", "0 175 3 3 6 1 1704409269\n", "1 176 2 2 8 3 1704409150\n", "2 177 3 3 17 18 1704409151\n", "4 201 3 3 6 2 1704409260\n", "6 206 3 3 8 4 1704409220\n", "7 210 3 3 7 4 1704409280" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movement" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# # 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로변호, 종료유닉스타임)만 수집 : B\n", "# history = pd.read_csv('../../Data/tables/history.csv', index_col=0)\n", "# recent_history = pd.concat([group.iloc[-2:] for inter_no, group in history[history['unix'] < time].groupby('inter_no')])\n", "# display(recent_history)\n", "# # 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", "# ddurs = [f'ddur_{i}' for i in range(1,9)]\n", "# inter2stt_unix = {}\n", "# for (inter_no, group) in recent_history.groupby('inter_no'):\n", "# pre_unix = group.iloc[-2]['unix'] # previous unix time\n", "# end_unix = group.iloc[-1]['unix'] # end unix time\n", "# sum_dura = group.iloc[-1][ddurs].sum() # the sum of the duration\n", "# # 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 함.\n", "# if abs((end_unix - sum_dura) - pre_unix) <= 10:\n", "# stt_unix = pre_unix # start unix time\n", "# else:\n", "# stt_unix = end_unix - sum_dura\n", "# inter2stt_unix[inter_no] = stt_unix\n", "# move['end_unix'] = move['inter_no'].map(inter2stt_unix)\n", "# display(move)" ] } ], "metadata": { "kernelspec": { "display_name": "rts", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 }