경로형 교통분석시스템 TCS 자료 비교(0730 작성중)
이젠 구분선 같은거 하기도 귀찮다 그냥 할란다.
0. 필요 데이터 정리
- 오산, 서청주, 영산 진출입 TCS
- 서서울~목포, 서울~대전, 서울~울산 OD 교통량
- 장흥~서영암(장흥~강진무위사 + 장흥~서영암), 서포항~포항, 남양평Hi~양평 OD 교통량(동고성 제외)
- 서울, 포항, 통영, 양평 진출입 TCS
1. 필요 패키지 import
import os import pandas as pd cwd = os.getcwd() + "\\.spyder-py3"
2. 원본 데이터 불러오기
TCS_inout = pd.read_csv(cwd+"\\TCS_INOUT_RAW_DATA_20181018.csv") TCS_hour = pd.read_csv(cwd+"\\TCS_RAW_DATA_20181018.csv")
3. 필요한 영업소 df 만들기
raw data 는 모두 ID로만 나와있어 이름을 보고 골라줘야한다
그래서 모든 이름이 담긴 파일에서 내가 원하는 것만 필터링해서 쓸거다
TCS_name = ["오산톨게이트","서청주톨게이트","영산톨게이트","서울톨게이트","포항톨게이트","통영톨게이트","양평톨게이트", "서서울톨게이트","목포톨게이트","대전톨게이트","울산톨게이트""장흥톨게이트","강진무위사톨게이트","서영암톨게이트","서포항톨게이트","남양평(하이패스)톨게이트"] TCS_target = TOLL_name[TOLL_name["NAME"].isin(TCS_name)]
4. 영업소df 로 raw data에 이름 붙이기
별거 없다 merge 사용해서 붙이고 결측치 빼고
조건문을 별도로 작성해서 하면 좋다
isin()은 df["A"] 로 특정열을 지정하고 그걸 df[]안에 써주면 좋다
TCS_inout_target = pd.merge(TCS_inout, TCS_target, how='left', left_on="TOLL_ID", right_on="TOLL_ID").dropna() TCS_hour_target = pd.merge(TCS_hour, TCS_target, how='left', left_on="S_TOLL_ID", right_on="TOLL_ID").drop("TOLL_ID",axis=1).rename(columns={"NAME":"S_NAME"}) TCS_hour_target = pd.merge(TCS_hour_target, TCS_target, how='left', left_on="E_TOLL_ID", right_on="TOLL_ID").drop("TOLL_ID",axis=1).rename(columns={"NAME":"E_NAME"}) con_na = (TCS_hour_target["S_NAME"].isna())|(TCS_hour_target["E_NAME"].isna()) TCS_hour_target = TCS_hour_target[~con_na]
5. pivot 을 사용하여 진출입교통량 먼저 확인
피벗에 인덱스를 두개 넣으니 원하는 형식으로 잘나온다 행복하다
inout_data = pd.pivot_table(TCS_inout_target, index=("NAME","TCS_INOUT"),values="TCS_TRAF",aggfunc='sum')
원래 print를 하거나 주피터노트북으로 봐야 바로 표가 생성되는데
스파이더는 옆에 valuable explorer 가 존재해서 딱히 필요없다
하지만 주피터노트북처럼 table이 바로 정리되서 표출되면 좋긴하겠다
TCS_TRAF NAME TCS_INOUT 강진무위사톨게이트 0 2807 1 2686 남양평(하이패스)톨게이트 0 1343 1 1441 대전톨게이트 0 26310
0, 1 이 각각 진출입을 의미하는 것 같고 TCS_TRAF 를 보는 것이 맞는지는 업체에 문의해봐야겠다
TRAF 는 교통량, TCS_INOUT 0 은 진입, 1은 진출
그냥 변수별로 설명 달라캐야겟다
찾아보니 표그려주는 함수가 모듈이 있더라 tabulate라고
그래서 적용해봄
#pip install tabulate --trusted-host pypi.org --trusted-host files.pythonhosted.org print(tab(inout_data, headers='keys', tablefmt='psql')) +---------------------------------+------------+ | | TCS_TRAF | |---------------------------------+------------| | ('강진무위사톨게이트', 0) | 2807 | | ('강진무위사톨게이트', 1) | 2686 | | ('남양평(하이패스)톨게이트', 0) | 1343 | | ('남양평(하이패스)톨게이트', 1) | 1441 | | ('대전톨게이트', 0) | 26310 | | ('대전톨게이트', 1) | 25220 | | ('목포톨게이트', 0) | 16296 | | ('목포톨게이트', 1) | 16467 | | ('서서울톨게이트', 0) | 98808 | | ('서서울톨게이트', 1) | 99065 | | ('서영암톨게이트', 0) | 6232 | | ('서영암톨게이트', 1) | 4642 | | ('서울톨게이트', 0) | 108148 | | ('서울톨게이트', 1) | 112118 | | ('서청주톨게이트', 0) | 15378 | | ('서청주톨게이트', 1) | 15121 | | ('서포항톨게이트', 0) | 1751 | | ('서포항톨게이트', 1) | 1900 | | ('양평톨게이트', 0) | 3864 | | ('양평톨게이트', 1) | 4325 | | ('영산톨게이트', 0) | 3193 | | ('영산톨게이트', 1) | 3177 | | ('오산톨게이트', 0) | 27804 | | ('오산톨게이트', 1) | 29152 | | ('통영톨게이트', 0) | 9378 | | ('통영톨게이트', 1) | 9254 | | ('포항톨게이트', 0) | 13823 | | ('포항톨게이트', 1) | 13016 | +---------------------------------+------------+
tabulate 함수 안의 각 인자는 뭘 의미하는지 모름
6. OD 교통량 확인
이게 쫌 고민이네 일단 해보자
TCS_hour_target["travel"] = TCS_hour_target["S_NAME"] + TCS_hour_target["E_NAME"] travel_target = ["서서울톨게이트목포톨게이트","서울톨게이트대전톨게이트","서울톨게이트울산톨게이트", "장흥톨게이트강진무위사톨게이트","장흥톨게이트서영암톨게이트","서포항톨게이트포항톨게이트", "남양평(하이패스)톨게이트양평톨게이트"] TCS_hour_target_travel = TCS_hour_target[TCS_hour_target["travel"].isin(travel_target)] travel_data = pd.pivot_table(TCS_hour_target_travel, index="travel",values="OBUE_ID",aggfunc='count')
OD 경로를 한개의 변수로 합치고(나중에는 메모리 늘어나는거라 피해야할 방법이긴하다) 내가 원하는 것만 isin()으로 필터링했다
OBUE_ID로 개별 ID가 부여된다고 판단해서 count를 하였다(물론 인/아웃 두번 카운트되서 반을 해야한다.
여기다가 lambda를 쓰면 좋을 것 같긴하다 다시해볼까?
여튼 경로가 4개 밖에 안나와서 틀렸다 내가 잘못했나??