.. Cover Letter

ㅇ 프로젝트/TEAM_서울시 교통 인프라 분석

6. 서울시 승용차 평균속도 데이터 가공

BrainKimDu 2022. 11. 19. 22:38

 

 


다시 승용차 데이터

 

속도 정보 | 서울시 교통정보 시스템 - TOPIS (seoul.go.kr)

 

속도 정보 | 서울시 교통정보 시스템 - TOPIS

속도정보 안내 서울시 차량통행속도 생성개요 수집기간 : 1년 365일, 24시간 (00~24시) 수집범위 : 서울특별시 505개 도로 총 연장 : 1,471.1km 생성방법 : 수집 ⇒ 가공 ⇒ 제공 - 도시고속도로 : 영상검

topis.seoul.go.kr

 


 

 

speed = pd.read_excel('./2019_10_서울시 도로별 통행속도.xlsx')
speed

대충 필요없는 컬럼을 날려버리자.

 

speed_processing = speed.drop(['링크아이디', '기능유형구분', '도심/외곽구분', '권역구분'], axis=1)

 

 

버스나 지하철처럼 출근시간, 퇴근시간, 점심시간 등등으로 나누자

 

speed_processing['출근시간 (06~09)'] = (speed_processing['06시'] + speed_processing['07시'] +\
                            speed_processing['08시'] + speed_processing['09시']) / 4
                            
speed_processing['피크 출근시간 (07~08)'] = ( speed_processing['07시'] +speed_processing['08시']) / 2


speed_processing['퇴근시간 (17~20)'] = (speed_processing['17시'] +\
                            speed_processing['18시'] + speed_processing['19시'] +\
                            speed_processing['20시'])/4

speed_processing['피크 퇴근시간 (18~19)'] = (speed_processing['18시'] + speed_processing['19시'])/2 


speed_processing['점심시간(11~13)'] = (speed_processing['11시'] + speed_processing['12시'] +\
                            speed_processing['13시'])/3

speed_processing['저녁시간(21~24)'] = (speed_processing['21시'] + speed_processing['22시'] +\
                            speed_processing['23시'] + speed_processing['24시'])/4

speed_processing['새벽시간(02~05)'] = (speed_processing['02시'] + speed_processing['03시'] +\
                            speed_processing['04시'] + speed_processing['05시'])/4
   
speed_processing['오후시간(14~16)'] = (speed_processing['14시'] + speed_processing['15시'] +\
                            speed_processing['16시'])/3


speed_processing

 

 

 

이제 시간 데이터를 날려버리자.

for i in range(1,10):
    col = "0"+ str(i) +"시" 
    speed_processing = speed_processing.drop([col], axis=1)
for i in range(10, 25):
    col = str(i) +"시" 
    speed_processing = speed_processing.drop([col], axis=1)
speed_processing = speed_processing.drop(['차선수'], axis=1)

(차선은 가지고 놀 수 있을 거같긴한데)

speed_processing = speed_processing.astype({"일자" : 'string'})
speed_processing

(이건 연도별로 나눌려고)

 

 

그런생각이 들었다. 요일이 필요할까 그냥 월~금 / 토,일 만 있으면 되는거 아닌가?

 

speed_processing["주중,주말"] = ""
speed_processing

 

 

count = 0
weekday_list = ["월", "화", "수", "목", "금"]
weekend_list = ["토", '일']

for i in range(len(speed_processing)):
    if speed_processing['요일'][i] in weekday_list:
        speed_processing['주중,주말'][i] = "주중"
    elif speed_processing['요일'][i] in weekend_list:
        speed_processing['주중,주말'][i] = "주말"

speed_processing

그래서 월화수목금이면 주중으로 토일이면 주말로 해주세요

 

 

speed_processing = speed_processing.drop(['요일'], axis = 1)

그럼 이제 요일 컬럼 필요없다.

 

 

피벗을 할거다. 그러니 문자열 정보의 안전을 위해서 하나로 합쳐버린다.

speed_processing["정보"] =  speed_processing['도로명'] +"!" +speed_processing['시점명'] +"!" + \
                            speed_processing['종점명'] +"!" + speed_processing['방향'] +"!" +speed_processing['주중,주말']

 

speed_processing = speed_processing.drop(['도로명', '시점명', '종점명', '방향', '주중,주말'], axis = 1)

 

문자열 다 드랍시킨다.

 

speed_processing_pivot = speed_processing.pivot_table(speed_processing, index=["정보"], aggfunc = [np.average] )
speed_processing_pivot

 

피벗을 시켜버리면

 

이쁘게 나온다.

 

 

컬럼 조정을 해주고

speed_processing_pivot.columns = ['/'.join(col) for col in speed_processing_pivot.columns]
speed_processing_pivot

 

speed_processing_pivot.rename(columns={speed_processing_pivot.columns[0]: "거리"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[1]: "새벽시간(02~05)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[2]: "오후시간(14~16)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[3]: "저녁시간(21~24)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[4]: "점심시간(11~13)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[5]: "출근시간 (06~09)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[6]: "퇴근시간 (17~20)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[7]: "피크 출근시간 (07~08)"}, inplace=True)
speed_processing_pivot.rename(columns={speed_processing_pivot.columns[8]: "피크 퇴근시간 (18~19)"}, inplace=True)
speed_processing_pivot

컬럼 이름을 바꿔준다.

 

speed_processing_pivot['새벽시간(02~05)']= round(speed_processing_pivot['새벽시간(02~05)'], 2)
speed_processing_pivot['오후시간(14~16)']= round(speed_processing_pivot['오후시간(14~16)'], 2)
speed_processing_pivot['저녁시간(21~24)']= round(speed_processing_pivot['저녁시간(21~24)'], 2)
speed_processing_pivot['점심시간(11~13)']= round(speed_processing_pivot['점심시간(11~13)'], 2)
speed_processing_pivot['출근시간 (06~09)']= round(speed_processing_pivot['출근시간 (06~09)'], 2)
speed_processing_pivot['퇴근시간 (17~20)']= round(speed_processing_pivot['퇴근시간 (17~20)'], 2)
speed_processing_pivot['피크 출근시간 (07~08)']= round(speed_processing_pivot['피크 출근시간 (07~08)'], 2)
speed_processing_pivot['피크 퇴근시간 (18~19)']= round(speed_processing_pivot['피크 퇴근시간 (18~19)'], 2)

이걸 왜 해준지는 모르겠다.

 

 

 

 

speed_processing_pivot["도로명"] = ""
speed_processing_pivot["시점명"] = ""
speed_processing_pivot["종점명"] = ""
speed_processing_pivot["방향"] = ""
speed_processing_pivot["주중,주말"] = ""

다시 문자열 데이터 만들어주고

 

speed_processing_pivot = speed_processing_pivot.reset_index()
speed_processing_pivot_list = speed_processing_pivot['정보']
speed_processing_pivot_list

리셋인덱싱해주고

 

정보를 리스트로 만들어서

 

느낌표로 split 해버리면 문자열 정보를 살릴 수 있다.

 

 

#speed_processing["정보"] =  speed_processing['도로명'] +"!" +speed_processing['시점명'] +"!" + \
#                            speed_processing['종점명'] +"!" + speed_processing['방향'] +"!" +speed_processing['주중,주말']
for i in range(len(speed_processing_pivot)):
    str_split = speed_processing_pivot_list[i].split('!')
    speed_processing_pivot["도로명"][i] = str_split[0]
    speed_processing_pivot["시점명"][i] = str_split[1]
    speed_processing_pivot["종점명"][i] = str_split[2]
    speed_processing_pivot["방향"][i] = str_split[3]
    speed_processing_pivot["주중,주말"][i] = str_split[4]

 

 

여기서 날짜 맞게 추가해주고

speed_processing_pivot["날짜"] = "2019010"

# 아마 2019년 자료를 수정하고 있었나봄

 

 

speed_processing_pivot = speed_processing_pivot[["날짜","주중,주말", "도로명", "시점명", "종점명", "방향", "거리", "출근시간 (06~09)"
                                               , '퇴근시간 (17~20)', '피크 출근시간 (07~08)', '피크 퇴근시간 (18~19)'
                                               , '점심시간(11~13)', '저녁시간(21~24)', '오후시간(14~16)', '새벽시간(02~05)']]

컬럼 순서를 변경해주면

 

 

끝인데

 

여기다가 우리가 구했던 위치정보를 추가해줘야한다.

 

location = pd.read_csv('./도로별 위치 정보.csv', encoding='EUC-KR')
location

 

 

 

 

speed_data["도로명 포함 시점"] = speed_data["도로명"] + " " + speed_data["시점명"]
speed_data["도로명 포함 종점"] = speed_data["도로명"] + " " + speed_data["종점명"]
speed_data

머지를 시킬려면 기준이 있어야한다.

 

 

merge_left = pd.merge(speed_data,location, how='left', left_on='도로명 포함 시점', right_on='도로명 포함 주소')
merge_left

 

 

merge_left = merge_left.drop(["도로명 포함 주소"], axis = 1)
merge_left.rename(columns={merge_left.columns[17]: "시점 경도"}, inplace=True)
merge_left.rename(columns={merge_left.columns[18]: "시점 위도"}, inplace=True)
merge_left

 

 

다시 머지

 

merge_left = pd.merge(merge_left,location, how='left', left_on='도로명 포함 종점', right_on='도로명 포함 주소')
merge_left

 

merge_left = merge_left.drop(['도로명 포함 시점', '도로명 포함 종점', '도로명 포함 주소'], axis = 1)
merge_left

 

다쓴 컬럼은 삭제

 

merge_left.rename(columns={merge_left.columns[17]: "종점 경도"}, inplace=True)
merge_left.rename(columns={merge_left.columns[18]: "종점 위도"}, inplace=True)
merge_left

 

 

 

 

이러면 자동차 데이터는 모두 끝이난다.