그럴 수도 있지

발전의 의지/파이썬

다차로 하이패스 분석 코드 공부 1-2 PET 계산 테이블 생성 (完) 20210602

OnlyMyStuff 2021. 8. 26. 13:08

시작하기에 앞서

PET(Post Encroachment Time) 이란?

구글에 쳐도 없길래 사내 연구보고서에서 찾은 걸로 적겠음

Gap Time 과 Encroachment Time 은 선행차량과 후행차량이 어느 한 지점을 통과한 후, 후행 차량이 그 지점을 통과할 때까지 걸리는 시간으로 PET와 동일하나,

GT는 같은 방향의 차량, ET는 교차로에서 상충이 발생하는 지점에서 PET를 산출하기 위한 지표임

쉽게 말해서 headway와 비슷한데, 상충지역에서의 차량 on-off-on 되는 시간을 말하는 것 같음

목적

전처리된 데이터를 활용하여 PET를 계산해낸다.

--------------------------------------

주피터 쓰기 싫어서 스파이더로 이관중

--------------------------------------

패키지 준비

import pandas as pd #너무 잘알아서 패스 import os #시스템 내 경로나 파일을 다루는 데 쓰는 듯 함 import gc #메모리 관리할때 쓴데요 from itertools import combinations #수열, 조합에 쓰는 듯 from tqdm import tqdm #for 문의 진행정도를 텍스트로 보여줌! import time #말그대로 시간을 이용하는거

데이터 불러오기

spyder는 .head()가 작동하진 않지만 R과 같은 인터페이스를 가져서 그냥 눌러서 보면된다

편한건가?

아무튼 필요한 데이터를 불러온다

이전에 전처리 끝낫던 final_data

curD = os.getcwd() TempFolder = "_dataset\\" FileName = 'dataset_1-3_주행방향찾기.csv' dataset_0 = pd.read_csv(TempFolder + FileName)

충돌 교차점 찾기 함수

아주 똑같이 적어보면서 코드를 해석해보자

우선 같은 시간대(SCAN)에서 존재하는 차량ID들과 그들의 조합을 만드는 함수를 작성

def DivTimeStep(dataset, timestep): # 해당 시간대의 dataset 불러오기 dataset_timestep = dataset[datset['SCAN'] == timestep] return dataset_timestep def FindVehDataset(dataset, veh_id): # 해당 차량의 dataset 불러오기 dataset_VehDataset = dataset[dataset['newID'] == veh_id] return dataset_VehDataset def GetTimeTNewIDCombinationList(dataset, timestep): dataset_t = DivTimeStep(dataset, timestep) dataset_t_newID = dataset_t['newID'] # 해당 시간대 dataset에서 newID 만 리스트 형태로 뽑음 dataset_t_newID_Combination_list = list(combinations(dataset_t_newID),2) # 각각의 newID를 쌍으로 묶음 (a,b), (a,c) ,,, return dataset_t_newID_Combination_list

그 다음에는 차량을 A, B로 나누고 merge 해주는 함수 작성

merge에 대해서 말하자면

왼쪽 데이터에 오른쪽 데이터를 붙이는데,

왼쪽이랑 오른쪽 비교 기준은 각각 _on 열을 기준으로 붙이라는 소리

def SetNewIDListCombinationDataset(dataset, timestep): dataset_t = DivTimeStep(dataset, timestep) dataset_t_newID_Combination_list = GetTimeTNewIDCombinationList(dataset, timestep) time_t_combination_dataset = [] if dataset_t_newID_Combination_list: for i in dataset_t_newID_Combination_list: vehicle_A = i[0] vehicle_B = i[1] vehicle_A_data = FindVehDataset(dataset_t, vehicle_A) vehicle_A_data = vehicle_A_data.add_prefix('A_') # 레이블 마다 앞에 A_를 붙여준다는 의미 index가 아닌 col에 붙음 vehicle_B_data = FindVehDataset(dataset_t, vehicle_B) vehicle_B_data = vehicle_B_data.add_prefix('B_') vehicle_A_B_dataset = pd.merge(vehicle_A_data, vehicle_B_data, how='left',left_on='A_SCAN',right_on='B_SCAN') time_t_combination_dataset.append(vehicle_A_B_dataset) Combination_dataset = pd.concat(time_t_combination_dataset) return Combination_dataset else: print("해당 시간대에 차량ID 조합이 없습니다. 시간대 : "+str(timestep))

함수 적용하기

원본데이터에서 SCAN(시간)값을 뽑고 맨마지막 걸 가져오기위해 iloc[-1] 그리고 숫자형태로 변환

time1 은 얼마나 걸리는지 보려고 하시는듯

지금도 뻉글 뺑글 돌아가는중 퇴근전에 되시려나

endOfTimeStep = dataset_0['SCAN'].iloc[-1].astype(int) time1 = time.time() CombinationDataset = [] for i in tqdm(range(endOfTimeStep)): newIDCombinationDataset = SetNewIDListCombinationDataset(dataset_0,i) CombinationDataset.append(newIDCombinationDataset) Combinationdataset_result = pd.concat(CombinationDataset) time2 = time.time() - time1 print('') print(time2) CombinationDataset_result.to_csv(TempFolder + 'Combination_table.csv', index=False)

끝!