|
|
@ -1162,6 +1162,94 @@ |
|
|
|
"# 신호배정\n", |
|
|
|
"self.matching.head()" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 1, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [ |
|
|
|
{ |
|
|
|
"name": "stdout", |
|
|
|
"output_type": "stream", |
|
|
|
"text": [ |
|
|
|
"1. 데이터를 준비합니다.\n", |
|
|
|
"1-1. 네트워크가 로드되었습니다.\n", |
|
|
|
"1-2. 테이블들이 로드되었습니다.\n", |
|
|
|
"1-5. 필요한 보조 객체들이 모두 준비되었습니다.\n", |
|
|
|
"2. 신호이력 테이블을 변환합니다.\n" |
|
|
|
] |
|
|
|
} |
|
|
|
], |
|
|
|
"source": [ |
|
|
|
"import pandas as pd\n", |
|
|
|
"import numpy as np\n", |
|
|
|
"import os, sys, copy, argparse\n", |
|
|
|
"import json\n", |
|
|
|
"import sumolib, traci\n", |
|
|
|
"from tqdm import tqdm\n", |
|
|
|
"from datetime import datetime\n", |
|
|
|
"path_root = os.path.dirname(os.path.dirname(os.path.abspath('.')))\n", |
|
|
|
"path_scr = os.path.join(path_root, 'scripts')\n", |
|
|
|
"sys.path.append(path_scr)\n", |
|
|
|
"from preprocess_daily import DailyPreprocessor\n", |
|
|
|
"from generate_signals import SignalGenerator\n", |
|
|
|
"self = SignalGenerator()\n", |
|
|
|
"self.prepare_data()\n", |
|
|
|
"self.process_history()\n", |
|
|
|
"\n", |
|
|
|
"fsecs = list(range(self.present_time - self.sim_timespan, self.present_time + 1, 5))\n", |
|
|
|
"fsec = fsecs[0]\n", |
|
|
|
"\n", |
|
|
|
"# 1. 상태 테이블 조회해서 전체 데이터중 필요데이터(교차로번호, A링 현시번호, A링 이동류번호, B링 현시번호, B링 이동류번호)만 수집 : A\n", |
|
|
|
"move = pd.read_csv(os.path.join(self.path_tables, 'move', f'move_{fsec}.csv'), index_col=0)\n" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": 2, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [ |
|
|
|
"isinstance(movement, pd.DataFrame)" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [ |
|
|
|
"# 2. 이력 테이블 조회해서 교차로별로 유닉스시간 최대인 데이터(교차로번호, 종료유닉스타임)만 수집 : B\n", |
|
|
|
"recent_histories = [group.iloc[-1:] for _, group in self.history[self.history['end_unix'] < fsec].groupby('inter_no')] # 교차로별로 유닉스시간이 최대인 행들\n", |
|
|
|
"\n", |
|
|
|
"if not recent_histories:\n", |
|
|
|
" rhistory = pd.DataFrame({'inter_no':[], 'end_unix':[]}) # recent history\n", |
|
|
|
"else:\n", |
|
|
|
" rhistory = pd.concat(recent_histories)\n", |
|
|
|
"recent_unix = rhistory[['inter_no', 'end_unix']]\n", |
|
|
|
"# 3. 상태 테이블 조회정보(A)와 이력 테이블 조회정보(B) 조인(키값 : 교차로번호) : C\n", |
|
|
|
"move = pd.merge(move, recent_unix, how='left', on='inter_no')\n", |
|
|
|
"move['end_unix'] = move['end_unix'].fillna(0).astype(int)\n", |
|
|
|
"# 4. C데이터 프레임에 신규 컬럼(시작 유닉스타임) 생성 후 종료유닉스 타임 값 입력, 종료 유닉스 타임 컬럼 제거\n", |
|
|
|
"move = move.rename(columns = {'end_unix':'start_unix'})\n", |
|
|
|
"# 5. 이동류 이력정보 READ\n", |
|
|
|
"# - CSV 파일로 서버에 저장된 이동류정보를 읽어옴(파일이 없는 경우에는 데이터가 없는 프레임 D 생성)\n", |
|
|
|
"try:\n", |
|
|
|
" if isinstance(movement, pd.DataFrame): # movement가 존재할 경우 그걸 그대로 씀.\n", |
|
|
|
" pass\n", |
|
|
|
" else: \n", |
|
|
|
" movement = pd.DataFrame()\n", |
|
|
|
"except NameError: # movement가 존재하지 않는 경우 생성\n", |
|
|
|
" movement = pd.DataFrame()\n", |
|
|
|
"# 6. 이동류 이력정보 데이터테이블(D)에 C데이터 add\n", |
|
|
|
"movement = pd.concat([movement, move])\n", |
|
|
|
"# 7. D데이터 프레임에서 중복데이터 제거(교차로번호, 시작 유닉스타임, A링 현시번호, B링 현시번호 같은 행은 제거)\n", |
|
|
|
"movement = movement.drop_duplicates(['inter_no','phas_A','phas_B','start_unix'])\n", |
|
|
|
"# 8. D데이터 보관 시간 기준시간을 시작 유닉스 타임의 최대값 - self.subtractor // 2을 값으로 산출하고, 보관 시간 기준시간보다 작은 시작 유닉스 타임을 가진 행은 모두 제거(1시간 데이터만 보관)\n", |
|
|
|
"movement = movement[movement.start_unix > fsec - self.subtractor // 2]\n", |
|
|
|
"# movement = movement.sort_values(by=['start_unix','inter_no','phas_A','phas_B']).reset_index(drop=True)\n", |
|
|
|
"self.movement = pd.read_csv(os.path.join(self.path_intermediates, 'movement', f'movement_{self.present_time}.csv'), index_col=0)\n" |
|
|
|
] |
|
|
|
} |
|
|
|
], |
|
|
|
"metadata": { |
|
|
|