# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
#%% import modules and change cwd
import os
import pandas as pd
from glob2 import glob
import matplotlib.pyplot as plt
from tqdm import tqdm
os.chdir('C:\\Users\\82103\\Desktop\\python\\simulator analysis\\dataset')
cwd = os.getcwd()
#%% read dataset and make dataframe 1(simulation data)
df_list = []
for i in tqdm(glob('*.txt')):
new_data = pd.read_csv(i,sep=' ')
text = i[:-4].split('_')
new_data[['file_cop','file_kph','file_numb']] = text # 기관, 속도, 순번
new_data['file_name'] = i
df_list.append(new_data)
df_1 = pd.concat(df_list)
del new_data, df_list, i, text # delete unnecessary variables
#%% read dataset and make dataframe 2(road network ID and length)
network_file = 'road_network_data.xlsx'
df_list = []
def make_road_ID_df(file_name,sheet_num):
new_data = pd.read_excel(file_name, sheet_name=sheet_num,skiprows=2,header=None)
new_data.columns = ['구분','IC','도로','Track_ID','총연장','road_portion','RP_length','road_ID','road_ID_length',
'추가필요연장','제한속도']
return new_data
for i in range(len(pd.read_excel(network_file,sheet_name=None))): # for short code, use 7
df_list.append(make_road_ID_df(network_file,i))
road_network_df = pd.concat(df_list)
del df_list, i, network_file # delete unnecessary variables
#%% choose cols to analysis and compose speed
df_2 = df_1.iloc[:,[0,10,11,16,17,39,40,41,42]].rename(columns={'[00].VehicleUpdate-speed.001' : 'spd_x',
'[00].VehicleUpdate-speed.002' : 'spd_y',
'[00].VehicleUpdate-accel.001' : 'acc_x',
'[00].VehicleUpdate-accel.002' : 'acc_y'})
df_2['spd_x'] ,df_2['spd_y'] = df_2['spd_x']*3.6 ,df_2['spd_y']*3.6
spd_x, spd_y = df_2['spd_x'], df_2['spd_y']
df_2['spd_comp'] = (spd_x**2+spd_y**2)**(1/2)
# 감가속도는 합성하면 양수음수 구분이 어렵다 -> 이전 속도값을 가져와서 활용하는 것이 좋음
#spd_comp = df_2['spd_comp'].append(9999999)
# acc_x, acc_y = df_2['acc_x'], df_2['acc_y']
# df_2['acc_comp'] = (acc_x**2+acc_y**2)**(1/2)
del spd_x, spd_y
#%%
for col_num, col_name in enumerate(df_1.columns):
print('col_num :',col_num,'col_name :',col_name)
""" column lsit
v col_num : 0 col_name : time
col_num : 1 col_name : [00].VehicleUpdate-pos.001
col_num : 2 col_name : [00].VehicleUpdate-pos.002
col_num : 3 col_name : [00].VehicleUpdate-pos.003
col_num : 4 col_name : [00].VehicleUpdate-pos.004
col_num : 5 col_name : [00].VehicleUpdate-pos.005
col_num : 6 col_name : [00].VehicleUpdate-pos.006
col_num : 7 col_name : [00].VehicleUpdate-COGPos.001
col_num : 8 col_name : [00].VehicleUpdate-COGPos.002
col_num : 9 col_name : [00].VehicleUpdate-COGPos.003
v col_num : 10 col_name : [00].VehicleUpdate-speed.001
v col_num : 11 col_name : [00].VehicleUpdate-speed.002
col_num : 12 col_name : [00].VehicleUpdate-speed.003
col_num : 13 col_name : [00].VehicleUpdate-speed.004
col_num : 14 col_name : [00].VehicleUpdate-speed.005
col_num : 15 col_name : [00].VehicleUpdate-speed.006
v col_num : 16 col_name : [00].VehicleUpdate-accel.001
v col_num : 17 col_name : [00].VehicleUpdate-accel.002
v col_num : 18 col_name : [00].VehicleUpdate-accel.003
col_num : 19 col_name : [00].VehicleUpdate-accel.004
col_num : 20 col_name : [00].VehicleUpdate-accel.005
col_num : 21 col_name : [00].VehicleUpdate-accel.006
col_num : 22 col_name : [00].VehicleUpdate-accelerator
col_num : 23 col_name : [00].VehicleUpdate-wheelAngle
col_num : 24 col_name : [00].VehicleUpdate-lights
col_num : 25 col_name : [00].VehicleUpdate-engineSpeed
col_num : 26 col_name : [00].VehicleUpdate-consumption
col_num : 27 col_name : [00].VehicleUpdate-steeringWheelAngle
col_num : 28 col_name : [00].VehicleUpdate-steeringWheelSpeed
col_num : 29 col_name : [00].VehicleUpdate-steeringTorq
col_num : 30 col_name : [00].VehicleUpdate-accelerator.1
col_num : 31 col_name : [00].VehicleUpdate-brake
col_num : 32 col_name : [00].VehicleUpdate-roadInfo-roadId.0
col_num : 33 col_name : [00].VehicleUpdate-roadInfo-roadAbscissa.0
col_num : 34 col_name : [00].VehicleUpdate-roadInfo-roadGap.0
col_num : 35 col_name : [00].VehicleUpdate-roadInfo-roadAngle.0
col_num : 36 col_name : [00].VehicleUpdate-roadInfo-laneId.0
col_num : 37 col_name : [00].VehicleUpdate-roadInfo-laneGap.0
col_num : 38 col_name : Last_TimeMarker
v col_num : 39 col_name : file_cop
v col_num : 40 col_name : file_kph
v col_num : 41 col_name : file_numb
v col_num : 42 col_name : file_name
"""
#for col_num, col_name in enumerate(road_network_df.columns):
# print('col_num :',col_num,'col_name :',col_name)
"""
col_num : 0 col_name : 구분
col_num : 1 col_name : IC
col_num : 2 col_name : 도로
col_num : 3 col_name : Track_ID
col_num : 4 col_name : 총연장
col_num : 5 col_name : road_portion
col_num : 6 col_name : RP_length
col_num : 7 col_name : road_ID
col_num : 8 col_name : road_ID_length
col_num : 9 col_name : 추가필요연장
col_num : 10 col_name : 제한속도
"""
del col_num, col_name
#%% add station data and delete missing value // 결측치를 제거하면 주행거리의 확실성이 더 떨어진다
df_3 = df_2.copy()
df_3['distance_traveled'] = df_3['spd_comp']*0.1/3600 # 단위는 km로 나온다 // 가속도를 활용하면 조금 더 정밀한 주행거리 계산기 가능
# 새로운 df를 만들어서 한줄 추가하고 마지막행 삭제하고 df_3에 붙여주면 이전 속도도 옆에 붙일 수 있음
df_3['station'] = df_3.groupby('file_name')['distance_traveled'].cumsum()
df_3 = df_3.dropna()
#%%
"""
피벗으로 스테이션 별 자료를 쪼개려면
스테이션을 재가공 해야한다.
0.01km 정도단위로
"""
#%% create condition function
def create_cond(df,col,val): # 넣는 value가 string 일 경우 같은 것을, int 일 경우 초과 값을
if type(val)==int:
return (df[col] > val)
else:
return (df[col] == val)
#%% plot speed tachograph
plt.figure(figsize=(30,10))
plt.plot(df_3.loc[create_cond(df_3,'file_kph','120km') & create_cond(df_3,'file_cop','ex'),'station'],
df_3.loc[create_cond(df_3,'file_kph','120km') & create_cond(df_3,'file_cop','ex'),'spd_comp'],
'r--',linewidth=1, alpha=0.7)
plt.plot(df_3.loc[create_cond(df_3,'file_kph','140km') & create_cond(df_3,'file_cop','ex'),'station'],
df_3.loc[create_cond(df_3,'file_kph','140km') & create_cond(df_3,'file_cop','ex'),'spd_comp'],
'b--',linewidth=1, alpha=0.7)
plt.title('Speed Tachograph')
plt.xlabel('station, km')
plt.ylabel('spd_comp, kmph')
#%% calculate acceleration
df_4 = df_3.copy()
ex_spd = list(df_4['spd_comp'])
ex_spd.insert(0,0)
ex_spd = ex_spd[:-1]
df_4['spd_comp_ex'] = ex_spd
time_0 =df_4[df_4['time']==0].index
df_4 = df_4.drop(time_0)
df_4['acc_cal'] = (df_4['spd_comp'] - df_4['spd_comp_ex'])/0.36
#%% plot acceleration tachograph
plt.figure(figsize=(30,10))
plt.plot(df_4.loc[create_cond(df_4,'file_kph','120km') & create_cond(df_4,'file_cop','ex'),'station'],
df_4.loc[create_cond(df_4,'file_kph','120km') & create_cond(df_4,'file_cop','ex'),'acc_cal'],
'r--',linewidth=1, alpha=0.3)
plt.plot(df_4.loc[create_cond(df_4,'file_kph','140km') & create_cond(df_4,'file_cop','ex'),'station'],
df_4.loc[create_cond(df_4,'file_kph','140km') & create_cond(df_4,'file_cop','ex'),'acc_cal'],
'b--',linewidth=1, alpha=0.3)
plt.title('Acceleration Tachograph')
plt.xlabel('station, km')
plt.ylabel('acc_cal, m/s^2')
#%% round station for pivot table and create pivot table
df_5 = df_4.copy()
df_5['station'] = round(df_5['station'],1)
df_5 = pd.pivot_table(df_5,
index = 'station',
values = ['spd_comp','acc_cal'],
columns = ['file_cop','file_kph'],
aggfunc = 'mean'
)
#%% plot acceleration tachograph + mean
plt.figure(figsize=(30,10))
plt.plot(df_4.loc[create_cond(df_4,'file_kph','120km') & create_cond(df_4,'file_cop','ex'),'station'],
df_4.loc[create_cond(df_4,'file_kph','120km') & create_cond(df_4,'file_cop','ex'),'acc_cal'],
'r--',linewidth=1, alpha=0.3)
plt.plot(df_4.loc[create_cond(df_4,'file_kph','140km') & create_cond(df_4,'file_cop','ex'),'station'],
df_4.loc[create_cond(df_4,'file_kph','140km') & create_cond(df_4,'file_cop','ex'),'acc_cal'],
'b--',linewidth=1, alpha=0.3)
plt.plot(df_5.index,df_5['acc_cal','ex','120km'],'r--', linewidth=1, alpha=1)
plt.plot(df_5.index,df_5['acc_cal','ex','140km'],'b--', linewidth=1, alpha=1)
plt.title('Acceleration Tachograph',fontsize=50)
plt.xlabel('station, km',fontsize=20)
plt.ylabel('acc_cal, m/s^2',fontsize=20)
plt.xticks(range(0,35,2),fontsize=20)
plt.yticks(range(-5,5,1),fontsize=20)
plt.grid(True)
plt.legend(['120kph','140kph'], fontsize=20)
plt.savefig("Acceleration Tachograph.png")
#%% plot speed tachograph + mean
plt.figure(figsize=(30,10))
plt.plot(df_3.loc[create_cond(df_3,'file_kph','120km') & create_cond(df_3,'file_cop','ex'),'station'],
df_3.loc[create_cond(df_3,'file_kph','120km') & create_cond(df_3,'file_cop','ex'),'spd_comp'],
'r--',linewidth=1, alpha=0.3)
plt.plot(df_3.loc[create_cond(df_3,'file_kph','140km') & create_cond(df_3,'file_cop','ex'),'station'],
df_3.loc[create_cond(df_3,'file_kph','140km') & create_cond(df_3,'file_cop','ex'),'spd_comp'],
'b--',linewidth=1, alpha=0.3)
plt.plot(df_5.index,df_5['spd_comp','ex','120km'],'r--', linewidth=1, alpha=1)
plt.plot(df_5.index,df_5['spd_comp','ex','140km'],'b--', linewidth=1, alpha=1)
plt.title('Speed Tachograph',fontsize=50)
plt.xlabel('station, km',fontsize=20)
plt.ylabel('spd_comp, km/h',fontsize=20)
plt.xticks(range(0,35,2),fontsize=20)
plt.yticks(range(0,180,10),fontsize=20)
plt.grid(True)
plt.legend(['120kph','140kph'], fontsize=20)
plt.savefig("Speed Tachograph.png")
메차쿠차해서 연습삼아 그려봤다
Speed Tachograph에선 의문의 0 line이 생겼다
없앨 방법을 모르겠다
'발전의 의지 > 파이썬' 카테고리의 다른 글
요즘 하는 것 (파이썬 머신러닝 완벽가이드) (0) | 2022.05.10 |
---|---|
도로주행 시뮬레이터 데이터 그래프 그려보기 2 (0) | 2022.04.11 |
교보 EBOOK 캡쳐하는 방법 (2) | 2022.01.31 |
파이썬 안하는 것 같아서 책샀음 (0) | 2021.12.01 |
심심할때마다 푸는 백준 단계별로 풀어보기 현황 20210826 (0) | 2021.08.29 |