그럴 수도 있지

발전의 의지/파이썬

도로주행 시뮬레이터 데이터 그래프 그려보기

OnlyMyStuff 2022. 4. 8. 11:38

# -*- 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이 생겼다

없앨 방법을 모르겠다