{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from datetime import datetime\n", "import os\n", "import random\n", "from tqdm import tqdm" ] }, { "cell_type": "code", "execution_count": 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", " \n", " \n", " \n", "
inter_nointer_nameinter_latinter_longroup_no
0175한솔삼거리(한솔마을3거리)37.36857127.114783
1176느티마을4단지37.36724127.114803
2177한솔6단지(정자동사무소)37.36619127.114803
3178신기4거리37.36346127.114803
4201느티마을4거리37.36854127.109843
5202느티마을 안촌유치원37.36855127.112413
6206상록마을 321동37.36483127.109813
7210상록4거리(상록마을입구4거리)37.36347127.109823
8211상록마을단일로37.36346127.112373
\n", "
" ], "text/plain": [ " inter_no inter_name inter_lat inter_lon group_no\n", "0 175 한솔삼거리(한솔마을3거리) 37.36857 127.11478 3\n", "1 176 느티마을4단지 37.36724 127.11480 3\n", "2 177 한솔6단지(정자동사무소) 37.36619 127.11480 3\n", "3 178 신기4거리 37.36346 127.11480 3\n", "4 201 느티마을4거리 37.36854 127.10984 3\n", "5 202 느티마을 안촌유치원 37.36855 127.11241 3\n", "6 206 상록마을 321동 37.36483 127.10981 3\n", "7 210 상록4거리(상록마을입구4거리) 37.36347 127.10982 3\n", "8 211 상록마을단일로 37.36346 127.11237 3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 교차로정보\n", "inter_info = pd.read_csv(\"inter_info.csv\")\n", "inter_info['group_no'] = 3\n", "display(inter_info)\n", "inter_info.to_csv('../inter_info.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_nomain_phasemg1Amg1Bmg2Amg2Bmg3Amg3Bmg4Amg4Bmg5Amg5Bmg6Amg6Bmg7Amg7Bmg8Amg8Br1Ar1Br2Ar2Br3Ar3Br4Ar4Br5Ar5Br6Ar6Br7Ar7Br8Ar8By1Ay1By2Ay2By3Ay3By4Ay4By5Ay5By6Ay6By7Ay7By8Ay8B
0175224273312153915190000000011111111000000004444444400000000
1176221313330160000000000011111000000000004444400000000000
21772351836360038130000000011111011000000004444004400000000
3178218193526362917370000000011111111000000004444444400000000
420122520213231283117272700000011111111110000004444444444000000
5202212300000000000000011100000000000004400000000000000
620623629003131000000000011101110000000004400440000000000
721021901213213712220000000010111111000000004044444400000000
8211232350000000000000011100000000000004400000000000000
\n", "
" ], "text/plain": [ " inter_no main_phase mg1A mg1B mg2A mg2B mg3A mg3B mg4A mg4B mg5A \\\n", "0 175 2 24 27 33 12 15 39 15 19 0 \n", "1 176 2 21 31 33 30 16 0 0 0 0 \n", "2 177 2 35 18 36 36 0 0 38 13 0 \n", "3 178 2 18 19 35 26 36 29 17 37 0 \n", "4 201 2 25 20 21 32 31 28 31 17 27 \n", "5 202 2 12 30 0 0 0 0 0 0 0 \n", "6 206 2 36 29 0 0 31 31 0 0 0 \n", "7 210 2 19 0 12 13 21 37 12 22 0 \n", "8 211 2 32 35 0 0 0 0 0 0 0 \n", "\n", " mg5B mg6A mg6B mg7A mg7B mg8A mg8B r1A r1B r2A r2B r3A r3B \\\n", "0 0 0 0 0 0 0 0 1 1 1 1 1 1 \n", "1 0 0 0 0 0 0 0 1 1 1 1 1 0 \n", "2 0 0 0 0 0 0 0 1 1 1 1 1 0 \n", "3 0 0 0 0 0 0 0 1 1 1 1 1 1 \n", "4 27 0 0 0 0 0 0 1 1 1 1 1 1 \n", "5 0 0 0 0 0 0 0 1 1 1 0 0 0 \n", "6 0 0 0 0 0 0 0 1 1 1 0 1 1 \n", "7 0 0 0 0 0 0 0 1 0 1 1 1 1 \n", "8 0 0 0 0 0 0 0 1 1 1 0 0 0 \n", "\n", " r4A r4B r5A r5B r6A r6B r7A r7B r8A r8B y1A y1B y2A y2B y3A \\\n", "0 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 \n", "1 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 \n", "2 1 1 0 0 0 0 0 0 0 0 4 4 4 4 0 \n", "3 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 \n", "4 1 1 1 1 0 0 0 0 0 0 4 4 4 4 4 \n", "5 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 \n", "6 1 0 0 0 0 0 0 0 0 0 4 4 0 0 4 \n", "7 1 1 0 0 0 0 0 0 0 0 4 0 4 4 4 \n", "8 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 \n", "\n", " y3B y4A y4B y5A y5B y6A y6B y7A y7B y8A y8B \n", "0 4 4 4 0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 0 0 0 0 \n", "2 0 4 4 0 0 0 0 0 0 0 0 \n", "3 4 4 4 0 0 0 0 0 0 0 0 \n", "4 4 4 4 4 4 0 0 0 0 0 0 \n", "5 0 0 0 0 0 0 0 0 0 0 0 \n", "6 4 0 0 0 0 0 0 0 0 0 0 \n", "7 4 4 4 0 0 0 0 0 0 0 0 \n", "8 0 0 0 0 0 0 0 0 0 0 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 현시구성\n", "phase_info = pd.read_csv(\"phase_info.csv\")\n", "phase_info.drop('flow_no', axis=1, inplace=True)\n", "# display(phase_info)\n", "mg = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='min_green_dur').fillna(0).astype(int)\n", "y = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='yellow_dur').fillna(0).astype(int)\n", "r = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='red_dur').fillna(0).astype(int)\n", "max_phase_no = phase_info['phase_no'].max()\n", "new_columns = [f'{col}{phase}{ring}' for col in ['mg', 'y', 'r'] for phase in range(1, max_phase_no + 1) for ring in ['A', 'B']]\n", "phase_info = pd.concat([mg, y, r], axis=1)\n", "phase_info.columns = new_columns\n", "phase_info['main_phase'] = 2\n", "phase_info['mg6A'] = phase_info['mg6B'] = phase_info['mg7A'] = phase_info['mg7B'] = phase_info['mg8A'] = phase_info['mg8B']= 0\n", "phase_info['y6A'] = phase_info['y6B'] = phase_info['y7A'] = phase_info['y7B'] = phase_info['y8A'] = phase_info['y8B']= 0\n", "phase_info['r6A'] = phase_info['r6B'] = phase_info['r7A'] = phase_info['r7B'] = phase_info['r8A'] = phase_info['r8B']= 0\n", "phase_info = phase_info[sorted(phase_info.columns)]\n", "phase_info.reset_index(inplace=True)\n", "with pd.option_context('display.max_rows', None, 'display.max_columns', None): \n", " display(phase_info)\n", "phase_info.to_csv('../phase_info.csv')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
angle_A1angle_A2angle_A3angle_A4angle_A5angle_A6angle_A7angle_A8angle_B1angle_B2angle_B3angle_B4angle_B5angle_B6angle_B7angle_B8
inter_no
175179004109590270268000NaNNaNNaNNaN317617927090180270090NaNNaNNaNNaN
176180000180000270356NaNNaNNaNNaNNaN359180180270NaNNaNNaNNaNNaNNaN
17718000090stop268000NaNNaNNaNNaN1176179270NaN90180NaNNaNNaNNaN
1781800009027000090270NaNNaNNaNNaN18018027027009090180NaNNaNNaNNaN
201180000270000902709027090NaNNaNNaN18027027009027009090180180NaNNaNNaN
20290270stopNaNNaNNaNNaNNaNNaN270090NaNNaNNaNNaNNaNNaNNaN
206180000stop180000stopNaNNaNNaNNaN180NaN180NaNNaNNaNNaNNaN
21090270268000359090180000NaNNaNNaNNaNNaN270090180180270NaNNaNNaNNaN
21190270stopNaNNaNNaNNaNNaNNaN270090NaNNaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " angle_A1 angle_A2 angle_A3 angle_A4 angle_A5 angle_A6 angle_A7 \\\n", "inter_no \n", "175 179004 1095 90270 268000 NaN NaN NaN \n", "176 180000 180000 270356 NaN NaN NaN NaN \n", "177 180000 90 stop 268000 NaN NaN NaN \n", "178 180000 90 270000 90270 NaN NaN NaN \n", "201 180000 270000 90270 90270 90 NaN NaN \n", "202 90270 stop NaN NaN NaN NaN NaN \n", "206 180000 stop 180000 stop NaN NaN NaN \n", "210 90270 268000 359090 180000 NaN NaN NaN \n", "211 90270 stop NaN NaN NaN NaN NaN \n", "\n", " angle_A8 angle_B1 angle_B2 angle_B3 angle_B4 angle_B5 angle_B6 \\\n", "inter_no \n", "175 NaN 3176 179270 90180 270090 NaN NaN \n", "176 NaN 359180 180270 NaN NaN NaN NaN \n", "177 NaN 1176 179270 NaN 90180 NaN NaN \n", "178 NaN 180 180270 270090 90180 NaN NaN \n", "201 NaN 180270 270090 270090 90180 180 NaN \n", "202 NaN 270090 NaN NaN NaN NaN NaN \n", "206 NaN 180 NaN 180 NaN NaN NaN \n", "210 NaN NaN 270090 180 180270 NaN NaN \n", "211 NaN 270090 NaN NaN NaN NaN NaN \n", "\n", " angle_B7 angle_B8 \n", "inter_no \n", "175 NaN NaN \n", "176 NaN NaN \n", "177 NaN NaN \n", "178 NaN NaN \n", "201 NaN NaN \n", "202 NaN NaN \n", "206 NaN NaN \n", "210 NaN NaN \n", "211 NaN NaN " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 방위각정보\n", "flow_angle = pd.read_csv(\"flow_angle.csv\")\n", "angle = flow_angle.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='angle_code', aggfunc='first').fillna('NaN')\n", "new_columns = [f'angle_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n", "angle.columns = new_columns\n", "angle['angle_A6'] = angle['angle_A7'] = angle['angle_A8'] = np.nan\n", "angle['angle_B6'] = angle['angle_B7'] = angle['angle_B8'] = np.nan\n", "angle = angle[sorted(angle.columns)]\n", "display(angle)\n", "flow_angle.to_csv('../angle.csv')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# # 이동류번호\n", "# plan = pd.read_csv(\"time_plan.csv\")\n", "# phase = pd.read_csv('phase_info.csv')\n", "# plan = plan[plan.ID.isin([1, 5, 8, 11])]\n", "# ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n", "# plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n", "# plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n", "# plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle']]\n", "# plan_ = pd.merge(plan, phase[['inter_no', 'phase_no', 'ring_type', 'flow_no']], on=['inter_no', 'phase_no', 'ring_type'], how='left')\n", "# plan_['flow_no'] = plan_['flow_no'].fillna(18).astype(int)\n", "# plan_['start_second'] = plan_.start_hour.astype(int)*3600 + plan_.start_minute.astype(int)*60\n", "# plan_ = plan_[['inter_no', 'start_second', 'phase_no', 'ring_type', 'duration', 'flow_no', 'cycle']]\n", "# cycle_dict = dict(zip(zip(plan_['inter_no'], plan_['start_second']), plan_['cycle']))\n", "# df = plan_[['inter_no','start_second','cycle']].drop_duplicates()\n", "# df = df.reset_index(drop=True)\n", "# df['start_second_exact'] = 0\n", "# for i in range(1, len(df)):\n", "# if i % 4 != 0:\n", "# prev = df.loc[i-1, 'start_second_exact']\n", "# start_second = df.loc[i, 'start_second']\n", "# cycle = df.loc[i-1, 'cycle']\n", "# df.loc[i, 'start_second_exact'] = (start_second - prev) % cycle + start_second\n", "# inter2start = {inter_no:list(df[df.inter_no==inter_no]['start_second_exact']) for inter_no in df.inter_no}\n", "# plan_ = plan_.pivot_table(index=['inter_no', 'start_second', 'phase_no'],\n", "# columns='ring_type',\n", "# values=['duration', 'flow_no'],\n", "# aggfunc='first').reset_index()\n", "# plan_.columns = ['inter_no', 'start_second', 'phase_no', 'dura_A', 'dura_B', 'move_A', 'move_B']\n", "# inter2no_phase = {inter_no:group.phase_no.unique().max() for (inter_no, group) in plan.groupby('inter_no')}\n", "\n", "# midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", "# present = int(datetime(2024, 1, 5, 3, 3, 10).timestamp()) # <===== 현재시각\n", "# sec = present - midnight\n", "# the_start_second = np.max(df.start_second[df.start_second <= sec])\n", "# move = []\n", "# for inter_no in plan_.inter_no.unique():\n", "# cycle = cycle_dict[(inter_no, the_start_second)]\n", "# df = plan_[(plan_.inter_no==inter_no)&(plan_.start_second==the_start_second)].reset_index(drop=True)\n", "# remainder = sec % cycle\n", "# df['cums_A'] = df.copy().dura_A.cumsum()\n", "# df['cums_B'] = df.copy().dura_B.cumsum()\n", "# ind_A = len(df.cums_A[df.cums_A <= remainder])%inter2no_phase[inter_no]\n", "# ind_B = len(df.cums_B[df.cums_B <= remainder])%inter2no_phase[inter_no]\n", "# dura_A = df.loc[ind_A,'dura_A']\n", "# dura_B = df.loc[ind_B,'dura_B']\n", "# phas_A = df.loc[ind_A,'phase_no']\n", "# phas_B = df.loc[ind_B,'phase_no']\n", "# move_A = df.loc[ind_A,'move_A']\n", "# move_B = df.loc[ind_B,'move_B']\n", "# move.append(pd.DataFrame({'inter_no':[inter_no],'phas_A':[phas_A], 'phas_B':[phas_B],'move_A':[move_A], 'move_B':[move_B]}))\n", "# move = pd.concat(move)\n", "# display(move)\n", "# move.to_csv('../movement.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 2%|▏ | 293/17280 [00:04<04:14, 66.80it/s]\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[3], line 52\u001b[0m\n\u001b[0;32m 50\u001b[0m move_B \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mloc[ind_B,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmove_B\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m 51\u001b[0m move\u001b[38;5;241m.\u001b[39mappend(pd\u001b[38;5;241m.\u001b[39mDataFrame({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minter_no\u001b[39m\u001b[38;5;124m'\u001b[39m:[inter_no],\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mphas_A\u001b[39m\u001b[38;5;124m'\u001b[39m:[phas_A], \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mphas_B\u001b[39m\u001b[38;5;124m'\u001b[39m:[phas_B],\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmove_A\u001b[39m\u001b[38;5;124m'\u001b[39m:[move_A], \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmove_B\u001b[39m\u001b[38;5;124m'\u001b[39m:[move_B]}))\n\u001b[1;32m---> 52\u001b[0m move \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmove\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 53\u001b[0m move\u001b[38;5;241m.\u001b[39mto_csv(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../moves/move_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcurrent_time\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.csv\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\reshape\\concat.py:385\u001b[0m, in \u001b[0;36mconcat\u001b[1;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[0;32m 370\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 372\u001b[0m op \u001b[38;5;241m=\u001b[39m _Concatenator(\n\u001b[0;32m 373\u001b[0m objs,\n\u001b[0;32m 374\u001b[0m axis\u001b[38;5;241m=\u001b[39maxis,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 382\u001b[0m sort\u001b[38;5;241m=\u001b[39msort,\n\u001b[0;32m 383\u001b[0m )\n\u001b[1;32m--> 385\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\reshape\\concat.py:616\u001b[0m, in \u001b[0;36m_Concatenator.get_result\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 612\u001b[0m indexers[ax] \u001b[38;5;241m=\u001b[39m obj_labels\u001b[38;5;241m.\u001b[39mget_indexer(new_labels)\n\u001b[0;32m 614\u001b[0m mgrs_indexers\u001b[38;5;241m.\u001b[39mappend((obj\u001b[38;5;241m.\u001b[39m_mgr, indexers))\n\u001b[1;32m--> 616\u001b[0m new_data \u001b[38;5;241m=\u001b[39m \u001b[43mconcatenate_managers\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 617\u001b[0m \u001b[43m \u001b[49m\u001b[43mmgrs_indexers\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[43mnew_axes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconcat_axis\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[43mbm_axis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\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[43mcopy\u001b[49m\n\u001b[0;32m 618\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 619\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m using_copy_on_write():\n\u001b[0;32m 620\u001b[0m new_data\u001b[38;5;241m.\u001b[39m_consolidate_inplace()\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:225\u001b[0m, in \u001b[0;36mconcatenate_managers\u001b[1;34m(mgrs_indexers, axes, concat_axis, copy)\u001b[0m\n\u001b[0;32m 223\u001b[0m values \u001b[38;5;241m=\u001b[39m values\u001b[38;5;241m.\u001b[39mview()\n\u001b[0;32m 224\u001b[0m fastpath \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m--> 225\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[43m_is_uniform_join_units\u001b[49m\u001b[43m(\u001b[49m\u001b[43mjoin_units\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[0;32m 226\u001b[0m vals \u001b[38;5;241m=\u001b[39m [ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mvalues \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units]\n\u001b[0;32m 228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m blk\u001b[38;5;241m.\u001b[39mis_extension:\n\u001b[0;32m 229\u001b[0m \u001b[38;5;66;03m# _is_uniform_join_units ensures a single dtype, so\u001b[39;00m\n\u001b[0;32m 230\u001b[0m \u001b[38;5;66;03m# we can use np.concatenate, which is more performant\u001b[39;00m\n\u001b[0;32m 231\u001b[0m \u001b[38;5;66;03m# than concat_compat\u001b[39;00m\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:696\u001b[0m, in \u001b[0;36m_is_uniform_join_units\u001b[1;34m(join_units)\u001b[0m\n\u001b[0;32m 679\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 680\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 681\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\n\u001b[0;32m 682\u001b[0m \u001b[38;5;66;03m# exclude cases where a) ju.block is None or b) we have e.g. Int64+int64\u001b[39;00m\n\u001b[0;32m 683\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28mtype\u001b[39m(ju\u001b[38;5;241m.\u001b[39mblock) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(first) \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 684\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 685\u001b[0m \u001b[38;5;66;03m# e.g. DatetimeLikeBlock can be dt64 or td64, but these are not uniform\u001b[39;00m\n\u001b[0;32m 686\u001b[0m \u001b[38;5;28mall\u001b[39m(\n\u001b[0;32m 687\u001b[0m is_dtype_equal(ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype, first\u001b[38;5;241m.\u001b[39mdtype)\n\u001b[0;32m 688\u001b[0m \u001b[38;5;66;03m# GH#42092 we only want the dtype_equal check for non-numeric blocks\u001b[39;00m\n\u001b[0;32m 689\u001b[0m \u001b[38;5;66;03m# (for now, may change but that would need a deprecation)\u001b[39;00m\n\u001b[0;32m 690\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mi\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 691\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units\n\u001b[0;32m 692\u001b[0m )\n\u001b[0;32m 693\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;66;03m# no blocks that would get missing values (can lead to type upcasts)\u001b[39;00m\n\u001b[0;32m 695\u001b[0m \u001b[38;5;66;03m# unless we're an extension dtype.\u001b[39;00m\n\u001b[1;32m--> 696\u001b[0m \u001b[38;5;28;43mall\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mju\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_na\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mju\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mblock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_extension\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mju\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mjoin_units\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 697\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 698\u001b[0m \u001b[38;5;66;03m# no blocks with indexers (as then the dimensions do not fit)\u001b[39;00m\n\u001b[0;32m 699\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;129;01mnot\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mindexers \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 700\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 701\u001b[0m \u001b[38;5;66;03m# only use this path when there is something to concatenate\u001b[39;00m\n\u001b[0;32m 702\u001b[0m \u001b[38;5;28mlen\u001b[39m(join_units) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 703\u001b[0m )\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:696\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 679\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 680\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 681\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\n\u001b[0;32m 682\u001b[0m \u001b[38;5;66;03m# exclude cases where a) ju.block is None or b) we have e.g. Int64+int64\u001b[39;00m\n\u001b[0;32m 683\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28mtype\u001b[39m(ju\u001b[38;5;241m.\u001b[39mblock) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(first) \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 684\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 685\u001b[0m \u001b[38;5;66;03m# e.g. DatetimeLikeBlock can be dt64 or td64, but these are not uniform\u001b[39;00m\n\u001b[0;32m 686\u001b[0m \u001b[38;5;28mall\u001b[39m(\n\u001b[0;32m 687\u001b[0m is_dtype_equal(ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype, first\u001b[38;5;241m.\u001b[39mdtype)\n\u001b[0;32m 688\u001b[0m \u001b[38;5;66;03m# GH#42092 we only want the dtype_equal check for non-numeric blocks\u001b[39;00m\n\u001b[0;32m 689\u001b[0m \u001b[38;5;66;03m# (for now, may change but that would need a deprecation)\u001b[39;00m\n\u001b[0;32m 690\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mi\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 691\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units\n\u001b[0;32m 692\u001b[0m )\n\u001b[0;32m 693\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;66;03m# no blocks that would get missing values (can lead to type upcasts)\u001b[39;00m\n\u001b[0;32m 695\u001b[0m \u001b[38;5;66;03m# unless we're an extension dtype.\u001b[39;00m\n\u001b[1;32m--> 696\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;129;01mnot\u001b[39;00m \u001b[43mju\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_na\u001b[49m \u001b[38;5;129;01mor\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mis_extension \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 697\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 698\u001b[0m \u001b[38;5;66;03m# no blocks with indexers (as then the dimensions do not fit)\u001b[39;00m\n\u001b[0;32m 699\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;129;01mnot\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mindexers \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 700\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 701\u001b[0m \u001b[38;5;66;03m# only use this path when there is something to concatenate\u001b[39;00m\n\u001b[0;32m 702\u001b[0m \u001b[38;5;28mlen\u001b[39m(join_units) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 703\u001b[0m )\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\_libs\\properties.pyx:36\u001b[0m, in \u001b[0;36mpandas._libs.properties.CachedProperty.__get__\u001b[1;34m()\u001b[0m\n", "File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:462\u001b[0m, in \u001b[0;36mJoinUnit.is_na\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 460\u001b[0m \u001b[38;5;129m@cache_readonly\u001b[39m\n\u001b[0;32m 461\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mis_na\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mbool\u001b[39m:\n\u001b[1;32m--> 462\u001b[0m blk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mblock\u001b[49m\n\u001b[0;32m 463\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m blk\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 464\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "# 이동류번호\n", "plan = pd.read_csv(\"time_plan.csv\")\n", "phase = pd.read_csv('phase_info.csv')\n", "plan = plan[plan.ID.isin([1, 5, 8, 11])]\n", "ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n", "plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n", "plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n", "plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle']]\n", "plan_ = pd.merge(plan, phase[['inter_no', 'phase_no', 'ring_type', 'flow_no']], on=['inter_no', 'phase_no', 'ring_type'], how='left')\n", "plan_['flow_no'] = plan_['flow_no'].fillna(18).astype(int)\n", "plan_['start_second'] = plan_.start_hour.astype(int)*3600 + plan_.start_minute.astype(int)*60\n", "plan_ = plan_[['inter_no', 'start_second', 'phase_no', 'ring_type', 'duration', 'flow_no', 'cycle']]\n", "cycle_dict = dict(zip(zip(plan_['inter_no'], plan_['start_second']), plan_['cycle']))\n", "df = plan_[['inter_no','start_second','cycle']].drop_duplicates()\n", "df = df.reset_index(drop=True)\n", "df['start_second_exact'] = 0\n", "for i in range(1, len(df)):\n", " if i % 4 != 0:\n", " prev = df.loc[i-1, 'start_second_exact']\n", " start_second = df.loc[i, 'start_second']\n", " cycle = df.loc[i-1, 'cycle']\n", " df.loc[i, 'start_second_exact'] = (start_second - prev) % cycle + start_second\n", "inter2start = {inter_no:list(df[df.inter_no==inter_no]['start_second_exact']) for inter_no in df.inter_no}\n", "plan_ = plan_.pivot_table(index=['inter_no', 'start_second', 'phase_no'],\n", " columns='ring_type',\n", " values=['duration', 'flow_no'],\n", " aggfunc='first').reset_index()\n", "plan_.columns = ['inter_no', 'start_second', 'phase_no', 'dura_A', 'dura_B', 'move_A', 'move_B']\n", "inter2no_phase = {inter_no:group.phase_no.unique().max() for (inter_no, group) in plan.groupby('inter_no')}\n", "\n", "midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", "next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n", "for current_time in tqdm(range(midnight, next_day, 5)):\n", " sec = current_time - midnight\n", " the_start_second = np.max(df.start_second[df.start_second <= sec])\n", " move = []\n", " for inter_no in plan_.inter_no.unique():\n", " cycle = cycle_dict[(inter_no, the_start_second)]\n", " df = plan_[(plan_.inter_no==inter_no)&(plan_.start_second==the_start_second)].reset_index(drop=True)\n", " remainder = sec % cycle\n", " df['cums_A'] = df.copy().dura_A.cumsum()\n", " df['cums_B'] = df.copy().dura_B.cumsum()\n", " ind_A = len(df.cums_A[df.cums_A <= remainder])%inter2no_phase[inter_no]\n", " ind_B = len(df.cums_B[df.cums_B <= remainder])%inter2no_phase[inter_no]\n", " dura_A = df.loc[ind_A,'dura_A']\n", " dura_B = df.loc[ind_B,'dura_B']\n", " phas_A = df.loc[ind_A,'phase_no']\n", " phas_B = df.loc[ind_B,'phase_no']\n", " move_A = df.loc[ind_A,'move_A']\n", " move_B = df.loc[ind_B,'move_B']\n", " move.append(pd.DataFrame({'inter_no':[inter_no],'phas_A':[phas_A], 'phas_B':[phas_B],'move_A':[move_A], 'move_B':[move_B]}))\n", " move = pd.concat(move)\n", " move.to_csv(f'../moves/move_{current_time}.csv')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# 신호계획\n", "plan = pd.read_csv(\"time_plan.csv\")\n", "plan = plan[plan.ID.isin([1, 5, 8, 11])]\n", "ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n", "plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n", "plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n", "plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle', 'offset']]\n", "plan = plan.pivot_table(index=['inter_no', 'start_hour', 'start_minute', 'cycle', 'offset'], columns=['phase_no','ring_type'], values='duration', aggfunc='first').fillna(0).astype(int)\n", "new_columns = [f'dura_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n", "plan.columns = new_columns\n", "new_columns = [f'dura_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n", "for col in new_columns:\n", " if col not in plan.columns:\n", " plan[col] = 0\n", "plan.reset_index(inplace=True)\n", "plan = plan[list(plan.columns)[:3] + sorted(plan.columns)[1:-4] + list(plan.columns)[3:5]]\n", "plan.to_csv('../plan.csv')\n", "# with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n", "# display(plan)\n", "pland = plan.copy()\n", "cums_A = np.array(pland[[f'dura_A{j}' for j in range(1,9)]].cumsum(axis=1))\n", "cums_B = np.array(pland[[f'dura_B{j}' for j in range(1,9)]].cumsum(axis=1))\n", "detailed_cums = []\n", "i = 0\n", "for row_A, row_B in zip(cums_A, cums_B):\n", " combined_row = np.unique(np.concatenate((row_A, row_B)))\n", " ddur = np.concatenate(([combined_row[0]], np.diff(combined_row)))\n", " ddur = np.pad(ddur, (0, 8 - len(ddur)), constant_values=(0))\n", " detailed_cums.append(ddur)\n", " for j in range(8):\n", " pland.at[i, f'ddur_{j+1}'] = ddur[j]\n", " i+=1\n", "pland = pland[['inter_no', 'start_hour', 'start_minute'] + [f'ddur_{j}' for j in range(1,9)] + ['cycle', 'offset']] # plan, detailed\n", "pland[[f'ddur_{j}' for j in range(1,9)]] = pland[[f'ddur_{j}' for j in range(1,9)]].astype(int)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pland = plan.copy()\n", "row = plan.iloc[0]\n", "cycle = row.cycle\n", "cums_A = row[[f'dura_A{j}' for j in range(1,9)]].cumsum()\n", "cums_B = row[[f'dura_B{j}' for j in range(1,9)]].cumsum()\n", "split = {}\n", "k = 0\n", "for t in range(cycle):\n", " new_phas_A = len(cums_A[cums_A < t]) + 1\n", " new_phas_B = len(cums_B[cums_B < t]) + 1\n", " if k == 0 or ((new_phas_A, new_phas_B) != (phas_A, phas_B)):\n", " k += 1\n", " phas_A = new_phas_A\n", " phas_B = new_phas_B\n", " split[(phas_A, phas_B)] = k\n", "split" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{0: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n", " 1: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n", " 2: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n", " 3: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n", " 4: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n", " 5: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n", " 6: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n", " 7: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n", " 8: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 9: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 10: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 11: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 12: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 13: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 3): 4, (4, 4): 5},\n", " 14: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 3): 4, (4, 4): 5},\n", " 15: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 3): 4, (4, 4): 5},\n", " 16: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n", " 17: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n", " 18: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n", " 19: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n", " 20: {(1, 1): 1, (2, 2): 2},\n", " 21: {(1, 1): 1, (2, 2): 2},\n", " 22: {(1, 1): 1, (2, 2): 2},\n", " 23: {(1, 1): 1, (2, 2): 2},\n", " 24: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 25: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 26: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 27: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n", " 28: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n", " 29: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n", " 30: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n", " 31: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n", " 32: {(1, 1): 1, (2, 2): 2},\n", " 33: {(1, 1): 1, (2, 2): 2},\n", " 34: {(1, 1): 1, (2, 2): 2},\n", " 35: {(1, 1): 1, (2, 2): 2}}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pland = plan.copy()\n", "splits = {}\n", "for i, row in pland.iterrows():\n", " splits[i] = {}\n", " cycle = row.cycle\n", " cums_A = row[[f'dura_A{j}' for j in range(1,9)]].cumsum()\n", " cums_B = row[[f'dura_B{j}' for j in range(1,9)]].cumsum()\n", " split = {}\n", " k = 0\n", " for t in range(cycle):\n", " new_phas_A = len(cums_A[cums_A < t]) + 1\n", " new_phas_B = len(cums_B[cums_B < t]) + 1\n", " if k == 0 or ((new_phas_A, new_phas_B) != (phas_A, phas_B)):\n", " k += 1\n", " phas_A = new_phas_A\n", " phas_B = new_phas_B\n", " splits[i][(phas_A, phas_B)] = k\n", "splits" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_nostart_hourstart_minutedura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7...dura_B1dura_B2dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleoffset
0175000037395529000...37392559000016057
1175070040425533000...40422959000017040
2175090043455537000...43453359000018028
3175183046485541000...46483759000019018
417600003773400000...37734000000150131
517607003793400000...37934000000170153
6176090037103400000...371034000000180169
7176183037113400000...371134000000190185
8177000036206826000...36206826000015035
9177070040257134000...40257134000017033
10177090043277040000...43277040000018041
11177183045327736000...45327736000019049
12178000038394023000...38394023000014050
13178070038394241000...38396221000016090
14178090038394350000...38397122000017080
15178183038394459000...38398023000018075
162010000242417581700...2424175817000140133
172010700303618581800...3036185818000160132
182010900333625581800...3336255818000170134
192011830365018581800...3650185818000180137
2020200003910100000...39101000000140103
2120207004611400000...46114000000160103
2220209004611400000...46114000000160103
2320218304812200000...48122000000170103
24206000033352626000...33352626000012010
25206070044442626000...4444262600001407
26206090045532626000...45532626000015017
27206183046622626000...46622626000016010
28210000043295622000...244856220000150115
29210070043396523000...245865230000170131
30210090043437024000...285870240000180137
31210183043477525000...246675250000190143
322110000289700000...289700000012545
3321107002810700000...2810700000013545
3421109002811200000...2811200000014055
3521118302811700000...2811700000014555
\n", "

36 rows × 21 columns

\n", "
" ], "text/plain": [ " inter_no start_hour start_minute dura_A1 dura_A2 dura_A3 dura_A4 \\\n", "0 175 00 00 37 39 55 29 \n", "1 175 07 00 40 42 55 33 \n", "2 175 09 00 43 45 55 37 \n", "3 175 18 30 46 48 55 41 \n", "4 176 00 00 37 73 40 0 \n", "5 176 07 00 37 93 40 0 \n", "6 176 09 00 37 103 40 0 \n", "7 176 18 30 37 113 40 0 \n", "8 177 00 00 36 20 68 26 \n", "9 177 07 00 40 25 71 34 \n", "10 177 09 00 43 27 70 40 \n", "11 177 18 30 45 32 77 36 \n", "12 178 00 00 38 39 40 23 \n", "13 178 07 00 38 39 42 41 \n", "14 178 09 00 38 39 43 50 \n", "15 178 18 30 38 39 44 59 \n", "16 201 00 00 24 24 17 58 \n", "17 201 07 00 30 36 18 58 \n", "18 201 09 00 33 36 25 58 \n", "19 201 18 30 36 50 18 58 \n", "20 202 00 00 39 101 0 0 \n", "21 202 07 00 46 114 0 0 \n", "22 202 09 00 46 114 0 0 \n", "23 202 18 30 48 122 0 0 \n", "24 206 00 00 33 35 26 26 \n", "25 206 07 00 44 44 26 26 \n", "26 206 09 00 45 53 26 26 \n", "27 206 18 30 46 62 26 26 \n", "28 210 00 00 43 29 56 22 \n", "29 210 07 00 43 39 65 23 \n", "30 210 09 00 43 43 70 24 \n", "31 210 18 30 43 47 75 25 \n", "32 211 00 00 28 97 0 0 \n", "33 211 07 00 28 107 0 0 \n", "34 211 09 00 28 112 0 0 \n", "35 211 18 30 28 117 0 0 \n", "\n", " dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n", "0 0 0 0 ... 37 39 25 59 \n", "1 0 0 0 ... 40 42 29 59 \n", "2 0 0 0 ... 43 45 33 59 \n", "3 0 0 0 ... 46 48 37 59 \n", "4 0 0 0 ... 37 73 40 0 \n", "5 0 0 0 ... 37 93 40 0 \n", "6 0 0 0 ... 37 103 40 0 \n", "7 0 0 0 ... 37 113 40 0 \n", "8 0 0 0 ... 36 20 68 26 \n", "9 0 0 0 ... 40 25 71 34 \n", "10 0 0 0 ... 43 27 70 40 \n", "11 0 0 0 ... 45 32 77 36 \n", "12 0 0 0 ... 38 39 40 23 \n", "13 0 0 0 ... 38 39 62 21 \n", "14 0 0 0 ... 38 39 71 22 \n", "15 0 0 0 ... 38 39 80 23 \n", "16 17 0 0 ... 24 24 17 58 \n", "17 18 0 0 ... 30 36 18 58 \n", "18 18 0 0 ... 33 36 25 58 \n", "19 18 0 0 ... 36 50 18 58 \n", "20 0 0 0 ... 39 101 0 0 \n", "21 0 0 0 ... 46 114 0 0 \n", "22 0 0 0 ... 46 114 0 0 \n", "23 0 0 0 ... 48 122 0 0 \n", "24 0 0 0 ... 33 35 26 26 \n", "25 0 0 0 ... 44 44 26 26 \n", "26 0 0 0 ... 45 53 26 26 \n", "27 0 0 0 ... 46 62 26 26 \n", "28 0 0 0 ... 24 48 56 22 \n", "29 0 0 0 ... 24 58 65 23 \n", "30 0 0 0 ... 28 58 70 24 \n", "31 0 0 0 ... 24 66 75 25 \n", "32 0 0 0 ... 28 97 0 0 \n", "33 0 0 0 ... 28 107 0 0 \n", "34 0 0 0 ... 28 112 0 0 \n", "35 0 0 0 ... 28 117 0 0 \n", "\n", " dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n", "0 0 0 0 0 160 57 \n", "1 0 0 0 0 170 40 \n", "2 0 0 0 0 180 28 \n", "3 0 0 0 0 190 18 \n", "4 0 0 0 0 150 131 \n", "5 0 0 0 0 170 153 \n", "6 0 0 0 0 180 169 \n", "7 0 0 0 0 190 185 \n", "8 0 0 0 0 150 35 \n", "9 0 0 0 0 170 33 \n", "10 0 0 0 0 180 41 \n", "11 0 0 0 0 190 49 \n", "12 0 0 0 0 140 50 \n", "13 0 0 0 0 160 90 \n", "14 0 0 0 0 170 80 \n", "15 0 0 0 0 180 75 \n", "16 17 0 0 0 140 133 \n", "17 18 0 0 0 160 132 \n", "18 18 0 0 0 170 134 \n", "19 18 0 0 0 180 137 \n", "20 0 0 0 0 140 103 \n", "21 0 0 0 0 160 103 \n", "22 0 0 0 0 160 103 \n", "23 0 0 0 0 170 103 \n", "24 0 0 0 0 120 10 \n", "25 0 0 0 0 140 7 \n", "26 0 0 0 0 150 17 \n", "27 0 0 0 0 160 10 \n", "28 0 0 0 0 150 115 \n", "29 0 0 0 0 170 131 \n", "30 0 0 0 0 180 137 \n", "31 0 0 0 0 190 143 \n", "32 0 0 0 0 125 45 \n", "33 0 0 0 0 135 45 \n", "34 0 0 0 0 140 55 \n", "35 0 0 0 0 145 55 \n", "\n", "[36 rows x 21 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pland" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 2\n" ] } ], "source": [ "cums_A = np.array(cums_A)\n", "t = 40\n", "phas_A = len(cums_A[cums_A < t]) + 1\n", "phas_B = len(cums_B[cums_B < t]) + 1\n", "print(phas_A, phas_B)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "inter_no 175\n", "start_hour 00\n", "start_minute 00\n", "dura_A1 37\n", "dura_A2 39\n", "dura_A3 55\n", "dura_A4 29\n", "dura_A5 0\n", "dura_A6 0\n", "dura_A7 0\n", "dura_A8 0\n", "dura_B1 37\n", "dura_B2 39\n", "dura_B3 25\n", "dura_B4 59\n", "dura_B5 0\n", "dura_B6 0\n", "dura_B7 0\n", "dura_B8 0\n", "cycle 160\n", "offset 57\n", "Name: 0, dtype: object\n" ] } ], "source": [ "# 신호계획\n", "plan = pd.read_csv(\"time_plan.csv\")\n", "plan = plan[plan.ID.isin([1, 5, 8, 11])]\n", "ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n", "plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n", "plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n", "plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle', 'offset']]\n", "plan = plan.pivot_table(index=['inter_no', 'start_hour', 'start_minute', 'cycle', 'offset'], columns=['phase_no','ring_type'], values='duration', aggfunc='first').fillna(0).astype(int)\n", "new_columns = [f'dura_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n", "plan.columns = new_columns\n", "new_columns = [f'dura_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n", "for col in new_columns:\n", " if col not in plan.columns:\n", " plan[col] = 0\n", "plan.reset_index(inplace=True)\n", "plan = plan[list(plan.columns)[:3] + sorted(plan.columns)[1:-4] + list(plan.columns)[3:5]]\n", "\n", "i, row = [(i, row) for (i, row) in plan.iterrows()][0]\n", "print(i)\n", "print(row)\n", "dura_A1 = row['dura_A1']\n", "dura_A2 = row['dura_A2']\n", "dura_A3 = row['dura_A3']\n", "dura_A4 = row['dura_A4']\n", "dura_A5 = row['dura_A5']\n", "dura_A6 = row['dura_A6']\n", "dura_A7 = row['dura_A7']\n", "dura_A8 = row['dura_A8']\n", "dura_B1 = row['dura_B1']\n", "dura_B2 = row['dura_B2']\n", "dura_B3 = row['dura_B3']\n", "dura_B4 = row['dura_B4']\n", "dura_B5 = row['dura_B5']\n", "dura_B6 = row['dura_B6']\n", "dura_B7 = row['dura_B7']\n", "dura_B8 = row['dura_B8']\n", "cums_A = np.array(pland[[f'dura_A{k}' for k in range(1,9)]].cumsum(axis=1))\n", "# for i, row in plan.iterrows():\n", "# k = 1\n", "# for j in range(1, 9):\n", "# if row[f'dura_A{j}'] == row[f'dura_B{j}']:\n", "# rowd = {'inter_no':row['inter_no'], 'start_hour':row['start_hour'], 'start_minute':row['start_minute'],\n", "# 'cycle':row['cycle'], 'offset':row['offset']}\n", "# # pland.at[i, f'ddur_{k}'] = ddur[j]" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_nostart_hourstart_minuteddur_1ddur_2ddur_3ddur_4ddur_5ddur_6ddur_7ddur_8cycleoffsetend_unix
02060000333526260000120101704380520
121100002897000000125451704380525
21780000383940230000140501704380540
3201000024241758170001401331704380540
42020000391010000001401031704380540
51770000362068260000150351704380550
6210000024192956220001501151704380550
71760000377340000001501311704380551
817500003739253029000160571704380559
92060000333526260000120101704380640
1021100002897000000125451704380645
112020000391010000001401031704380680
121780000383940230000140501704380680
13201000024241758170001401331704380680
141760000377340000001501311704380700
15210000024192956220001501151704380700
161770000362068260000150351704380700
1717500003739253029000160571704380720
182060000333526260000120101704380760
1921100002897000000125451704380765
201780000383940230000140501704380820
212020000391010000001401031704380820
22201000024241758170001401331704380820
23210000024192956220001501151704380850
241760000377340000001501311704380850
251770000362068260000150351704380851
2617500003739253029000160571704380880
272060000333526260000120101704380880
2821100002897000000125451704380885
29201000024241758170001401331704380960
\n", "
" ], "text/plain": [ " inter_no start_hour start_minute ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n", "0 206 00 00 33 35 26 26 0 0 \n", "1 211 00 00 28 97 0 0 0 0 \n", "2 178 00 00 38 39 40 23 0 0 \n", "3 201 00 00 24 24 17 58 17 0 \n", "4 202 00 00 39 101 0 0 0 0 \n", "5 177 00 00 36 20 68 26 0 0 \n", "6 210 00 00 24 19 29 56 22 0 \n", "7 176 00 00 37 73 40 0 0 0 \n", "8 175 00 00 37 39 25 30 29 0 \n", "9 206 00 00 33 35 26 26 0 0 \n", "10 211 00 00 28 97 0 0 0 0 \n", "11 202 00 00 39 101 0 0 0 0 \n", "12 178 00 00 38 39 40 23 0 0 \n", "13 201 00 00 24 24 17 58 17 0 \n", "14 176 00 00 37 73 40 0 0 0 \n", "15 210 00 00 24 19 29 56 22 0 \n", "16 177 00 00 36 20 68 26 0 0 \n", "17 175 00 00 37 39 25 30 29 0 \n", "18 206 00 00 33 35 26 26 0 0 \n", "19 211 00 00 28 97 0 0 0 0 \n", "20 178 00 00 38 39 40 23 0 0 \n", "21 202 00 00 39 101 0 0 0 0 \n", "22 201 00 00 24 24 17 58 17 0 \n", "23 210 00 00 24 19 29 56 22 0 \n", "24 176 00 00 37 73 40 0 0 0 \n", "25 177 00 00 36 20 68 26 0 0 \n", "26 175 00 00 37 39 25 30 29 0 \n", "27 206 00 00 33 35 26 26 0 0 \n", "28 211 00 00 28 97 0 0 0 0 \n", "29 201 00 00 24 24 17 58 17 0 \n", "\n", " ddur_7 ddur_8 cycle offset end_unix \n", "0 0 0 120 10 1704380520 \n", "1 0 0 125 45 1704380525 \n", "2 0 0 140 50 1704380540 \n", "3 0 0 140 133 1704380540 \n", "4 0 0 140 103 1704380540 \n", "5 0 0 150 35 1704380550 \n", "6 0 0 150 115 1704380550 \n", "7 0 0 150 131 1704380551 \n", "8 0 0 160 57 1704380559 \n", "9 0 0 120 10 1704380640 \n", "10 0 0 125 45 1704380645 \n", "11 0 0 140 103 1704380680 \n", "12 0 0 140 50 1704380680 \n", "13 0 0 140 133 1704380680 \n", "14 0 0 150 131 1704380700 \n", "15 0 0 150 115 1704380700 \n", "16 0 0 150 35 1704380700 \n", "17 0 0 160 57 1704380720 \n", "18 0 0 120 10 1704380760 \n", "19 0 0 125 45 1704380765 \n", "20 0 0 140 50 1704380820 \n", "21 0 0 140 103 1704380820 \n", "22 0 0 140 133 1704380820 \n", "23 0 0 150 115 1704380850 \n", "24 0 0 150 131 1704380850 \n", "25 0 0 150 35 1704380851 \n", "26 0 0 160 57 1704380880 \n", "27 0 0 120 10 1704380880 \n", "28 0 0 125 45 1704380885 \n", "29 0 0 140 133 1704380960 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 신호이력\n", "midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n", "next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n", "pland['end_unix'] = pland['start_hour'].astype(int)*3600 + plan['start_minute'].astype(int)*60 + midnight\n", "history = []\n", "for inter_no in pland.inter_no.unique():\n", " aplan = pland[pland.inter_no == inter_no]\n", " rows = []\n", " current_time = midnight\n", " for i in range(len(aplan)):\n", " first_row = aplan.iloc[i]\n", " cycle = first_row['cycle']\n", " unix_end = aplan.iloc[i+1]['end_unix'] if i < len(aplan) - 1 else next_day\n", " r = 0\n", " while current_time <= unix_end:\n", " remainder = current_time % 10\n", " if remainder != 0:\n", " r = (5 - remainder) % 10 - 5\n", " else:\n", " r = random.choices([0, -1, 1], weights=[10, 1, 1])[0]\n", " if random.random() < 0.005:\n", " n = random.randint(0,100)\n", " current_time += n * cycle + r\n", " elif random.random() > 0.995:\n", " n = random.randint(0,100)\n", " current_time += n * cycle + int(random.random() * cycle) + r\n", " else:\n", " current_time += cycle + r\n", " new_row = first_row.copy()\n", " new_row['end_unix'] = current_time\n", " rows.append(new_row)\n", " ahistory = pd.concat(rows, axis=1).transpose().reset_index(drop=True)\n", " history.append(ahistory)\n", "history = pd.concat(history)\n", "history = history[history.end_unix <= next_day]\n", "history = history.sort_values(by='end_unix').reset_index(drop=True)\n", "history.to_csv('../history.csv')\n", "display(history[:30])" ] }, { "cell_type": "code", "execution_count": null, "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", "
inter_nonode_idinter_type
0175i0parent
1175u00child
2176i1parent
3177i2parent
4177u20child
5178i3parent
6178u30child
7178u31child
8178u32child
9201i8parent
10202i9parent
11206i7parent
12210i6parent
13210u60child
14211c30parent
\n", "
" ], "text/plain": [ " inter_no node_id inter_type\n", "0 175 i0 parent\n", "1 175 u00 child\n", "2 176 i1 parent\n", "3 177 i2 parent\n", "4 177 u20 child\n", "5 178 i3 parent\n", "6 178 u30 child\n", "7 178 u31 child\n", "8 178 u32 child\n", "9 201 i8 parent\n", "10 202 i9 parent\n", "11 206 i7 parent\n", "12 210 i6 parent\n", "13 210 u60 child\n", "14 211 c30 parent" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 교차로-노드 매칭\n", "uturn = pd.read_csv('U_TURN.csv')\n", "inter_node = pd.read_csv('inter.csv')\n", "inter_node = inter_node[['INT_NO', 'node_id', 'P/C']]\n", "# inter_node.drop(index=len(inter_node) - 1, inplace=True)\n", "inter_node.columns = ['inter_no', 'node_id', 'inter_type'] # parent : 주교차로, child : 부교차로\n", "inter_node['inter_no'] = inter_node['inter_no'].astype(int) # i : intersection, u : u-turn intersection, c : coupling intersection\n", "inter_node.iloc[-1] = pd.Series([211, 'c30', 'parent'])\n", "inter_node.to_csv('../inter_node.csv')\n", "display(inter_node)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 부교차로 정보\n", "# 지금은 생략 (23. 1. 9. 09:32)" ] } ], "metadata": { "kernelspec": { "display_name": "rts", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 }