일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준
- 파이썬
- 금융문자분석경진대회
- PYTHON
- programmers
- 편스토랑 우승상품
- hackerrank
- dacon
- 데이콘
- 맥북
- AI 경진대회
- 우분투
- Docker
- Kaggle
- ChatGPT
- 더현대서울 맛집
- SW Expert Academy
- 프로그래머스
- ubuntu
- Git
- 자연어처리
- github
- Real or Not? NLP with Disaster Tweets
- 코로나19
- 편스토랑
- 프로그래머스 파이썬
- gs25
- 캐치카페
- leetcode
- Baekjoon
- Today
- Total
솜씨좋은장씨
[Python]지난 2년간의 추석 귀경길 도시 구간별 소요시간 파이썬으로 데이터 받아보기 본문
아래의 과정을 바탕으로 위의 결과를 만들어 보았습니다.
오늘은 목, 금, 토 2019년 추석연휴의 마지막 날!
자소서 쓰는건 재미없고, 뭔가 재밌는걸 해볼까 고민하다가 귀경길이 시작되었다는 기사를 보고
관련 데이터를 모아보고 그 데이터를 pandas의 Dataframe으로도 만들어보기도하고 그래프도 그려보면 어떨까 싶어
검색을 하기 시작했습니다.
검색을 하던 중 고속도로 공공데이터 포털이라는 홈페이지에 대해서 알게되었습니다.
어떠한 데이터들을 제공해주는지 둘러보던 중
OpenAPI목록 중에
특송기간 교통분석 서비스-도시간 소요시간이라는 항목을 발견하였습니다.
들어가서 상세정보를 확인하여보니
연말연시, 추석, 설날에
00~23시까지 1시간마다 서울에서 각 도시로 귀성할때 걸리는 소요시간
00~23시까지 1시간마다 각 도시에서 서울로 귀경할때 걸리는 소요시간
이 두 가지 데이터를 받아올 수 있었습니다.
추석의 마지막인날인만큼 귀경에 걸리는 소요시간 데이터를 받아와 보고자 했습니다.
API를 설명하는 페이지를 보면
request를 요청할때 사용하는 URL은 http://data.ex.co.kr/openapi/specialAnal/intercityLeadTime
요청 시 받을 수 있는 데이터의 형식은 XML과 JSON
요청 시 필수로 주어야하는 요청변수의 값은 발급받은 인증키, 검색결과 포맷, 기준년도였습니다.
위 처럼 예제 실행하기를 들어가면 아래와 같은 창이 나옵니다.
이렇게 변수 값을 넣어서 URL보기 > 예제 실행하기를 눌러주면
아래 예제 실행결과에 값이 나오게 됩니다.
자세하게 보고싶다면 상세를 클릭하여 보면 됩니다.
상세 페이지로 들어가게 되면 조금 전 페이지에서 URL보기를 클릭하여 만들었던 URL을 볼 수 있고
그 아래로 XML데이터를 확인할 수 있습니다.
저는 이 페이지를 켜두고 주소창에서 numOfRows, pageNo의 값을 변경해가면서 어떠한 데이터가 나오는지 확인해보았습니다.
numOfRows와 pageNo의 값 변경은
데이터가 각 구간별 00시~23시까지 24개의 데이터씩 제공되므로
한 페이지에 제공되는 데이터의 개수를 24
pageNo는 1, 2, 3, 4이렇게 하나씩 올려가며 보았습니다.
처음에는 이렇게 한페이지에 24개씩 데이터를 받아오면
받아온 데이터를 데이터 처리 시 더 편하게 할 수 있겠다!
싶었으나 중간중간 일부 구간에서 데이터가 누락되어 데이터의 개수가 24개가 되지않는 구간들도 있었기에
그냥 한 번에 다 받아오는 것으로 구현하기로 하였습니다.
하면서 알게된 점은 위에서 3번째 줄에 나오는 <count> 5166 </count> 이 값이 전체 데이터의 개수라는 것을 알 수 있었습니다.
2010년부터 2018년까지의 8년정도의 데이터를 가지고 오고 싶었지만
조금 전 말했던 방법을 활용하여 쭉 탐색해 본 결과 이 api는 2016년부터 데이터가 제공되며
특히 지금 제가 원하는 추석의 귀성길, 귀경길 데이터는 2016년에는 제공되지 않았고
2017년부터 제공되는 것을 알 수 있었습니다.
19년 9월 14일 기준 2019년은 추석 전날 이 코드속에서는 D(추석)-1까지 제공하고 있었습니다.
서두가 길었지만 받아와 DataFrame도 만들고 그래프도 그려 볼 데이터는
2017년 ~ 2018년 총 2년 간의 추석 1일후 , 2일 후 귀경길에 걸리는 소요시간으로 정했습니다.
2017년과 2018년의 데이터는 각각 다음과 같은 순서로 추석에 관련된 데이터를 제공해 줍니다.
표에 numOfRows와 pageNo는 한 번에 많은 양의 데이터를 받아오려면 오래 걸리니
requests시 필요한 데이터만 받아올 수 있게 요청 변수를 구해 적어 둔 것입니다.
2017년
날짜 | 도시 순서 | numOfRows | pageNo |
추석 3일전 (D-3) 귀성길 | 대전, 대구, 부산, 광주, 강릉 목포 | 24 | 1 ~ 6 |
추석 3일전 (D-3) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 7 ~ 12 |
추석 2일전 (D-2) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 13 ~ 18 |
추석 2일전 (D-2) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 19 ~ 25 |
추석 1일전 (D-1) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 25 ~ 30 |
추석 1일전 (D-1) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 30 ~ 36 |
추석 당일 (D) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 36 ~ 42 |
추석 당일 (D) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 42 ~ 48 |
추석 1일후 (D+1) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 48 ~ 54 |
추석 1일후 (D+1) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 54 ~ 60 |
추석 2일후(D+2) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 60 ~ 66 |
추석 2일후(D+2) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 66 ~ 72 |
추석 2일후(D+3) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 72 ~ 78 |
추석 2일후(D+3) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 78 ~ 84 |
2018년
날짜 | 도시 순서 | numOfRows | pageNo |
추석 3일전 (D-3) 귀성길 | 대전, 대구, 부산, 광주, 강릉 목포 | 24 | 132 ~ 138 |
추석 3일전 (D-3) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 138 ~ 144 |
추석 2일전 (D-2) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 144 ~ 150 |
추석 2일전 (D-2) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 150 ~ 156 |
추석 1일전 (D-1) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 156 ~ 162 |
추석 1일전 (D-1) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 162 ~ 168 |
추석 당일 (D) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 168 ~ 174 |
추석 당일 (D) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 174 ~ 180 |
추석 1일후 (D+1) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 180 ~ 186 |
추석 1일후 (D+1) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 186 ~ 192 |
추석 2일후(D+2) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 192 ~ 198 |
추석 2일후(D+2) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 198 ~ 204 |
추석 2일후(D+3) 귀성길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 204 ~ 210 |
추석 2일후(D+3) 귀경길 | 대전, 대구, 부산, 광주, 강릉, 목포 | 24 | 210 ~ 216 |
데이터를 받아오는 코드를 작성해보았습니다.
def getReturnTimeData(startPageNo, endPageNo, Year):
info_df_daegeon = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
info_df_daegu = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
info_df_busan = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
info_df_gwangju = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
info_df_ganglung = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
info_df_mockpo = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
daegeon = 0
daegu = 0
busan = 0
gwangju = 0
ganglung = 0
mockpo = 0
for pageNo in range(startPageNo, endPageNo):
startPoints = []
stdTimes = []
timeTOGOs = []
url = 'http://data.ex.co.kr/openapi/specialAnal/intercityLeadTime'
parameters = {"key":"발급받은키", "type":"xml", "numOfRows":"24", "pageNo":str(pageNo), "iYear":str(Year)}
req = requests.get(url, params=parameters)
xml_data = xmltodict.parse(req.text)
infomations = xml_data['data']['intercityLeadTimeLists']
for info in infomations:
if info['dirNm'] == '귀경방향':
if info['stUnitNm'] == "대전":
info_df_daegeon.loc[daegeon] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
daegeon = daegeon + 1
elif info['stUnitNm'] == "대구":
info_df_daegu.loc[daegu] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
daegu = daegu + 1
elif info['stUnitNm'] == "부산":
info_df_busan.loc[busan] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
busan = busan + 1
elif info['stUnitNm'] == "광주":
info_df_gwangju.loc[gwangju] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
gwangju = gwangju + 1
elif info['stUnitNm'] == "강릉":
info_df_ganglung.loc[ganglung] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
ganglung = ganglung + 1
elif info['stUnitNm'] == "목포":
info_df_mockpo.loc[mockpo] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
mockpo = mockpo + 1
return (info_df_daegeon, info_df_daegu, info_df_busan, info_df_gwangju, info_df_ganglung, info_df_mockpo)
위의 코드를 활용하여 데이터를 받아옵니다.
만약 이 코드를 복사해가서 사용하려고 한다면 API키는 본인이 발급받아 적용하기 바랍니다.
2017년 추석 1일 후 귀경길에 걸리는 소요시간
data_2017_plus1 = getReturnTimeData(54, 60, 2017)
2017년 추석 2일 후 귀경길에 걸리는 소요시간
data_2017_plus2 = getReturnTimeData(66, 73, 2017)
2018년 추석 1일 후 귀경길에 걸리는 소요시간
data_2018_plus1 = getReturnTimeData(186, 192, 2018)
2018년 추석 2일 후 귀경길에 걸리는 소요시간
data_2018_plus2 = getReturnTimeData(198, 204, 2018)
그럼 getReturnTimeData에서 return되는 값은
( 대전, 대구, 부산, 광주, 강릉, 목포 ) 각 도시의 소요시간 데이터를 가지는 Dataframe들이 담겨있는 Set입니다.
각각의 data 접근은
2017년 추석 2일 후 대전에서 서울로 오는 소요시간을 예로 들면 아래의 코드와 같다.
data_2017_plus2[0]
기준시간은 1시간 단위로 00시 ~ 23시 사이의 값이며
소요시간은 분 단위 입니다.
위처럼 보면 한눈에 보기 어려움이 있으므로 DataFrame을 그래프로 그려줍니다.
그래프로 만들어주는 코드는 아래와 같습니다.
선그래프
data_2017_plus2[0].plot.line()
막대그래프
data_2017_plus2[0].plot.bar()
그래프를 보면 2017년 추석 2일 후 대전에서 서울로 귀경하는데 걸리는 시간은 7시에서 9시 사이에 가장 적게 걸렸다는 것을 볼 수 있습니다.
'Programming > Python' 카테고리의 다른 글
[Python]Jupyter notebook New 버튼의 반응이 없을때 (0) | 2019.09.24 |
---|---|
[Python]과거의 데이터로 최적의 추석 귀경시간 추측해보기(feat, matplotlib) (0) | 2019.09.15 |
[Python]Selenium을 사용하여 유튜브 댓글 가져오기 (63) | 2019.09.14 |
[Python]연안 여객터미널 실시간 운항정보 API 활용기 (2) | 2019.09.13 |
[Python]VirtualBox에 설치된 Ubuntu에서 Jupyter Notebook설치 후 Windows에서 원격접속 설정하기 (2) | 2019.09.12 |