본문 바로가기
문송충의 코딩하기/파이썬 데이터 분석

[파이썬] - 서울시 공공시설 테니스장 데이터 가져오기 from 서울 공공데이터 API

by 동장군님 2020. 11. 1.
728x90
반응형

서울시 공공시설 테니스장

요즘 축구 다음으로 가장 많이 하는 운동이 테니스다. 아직 레슨을 받는 테린이 단계라 실제 테니스 필드에서 플레이한 적은 별로 없지만 종종 친구와 테니스 게임을 하려고 할 때 가장 짜증 나는 과정이 있다. 바로 테니스장을 예약하는 것이다. 특히 최근에는 코로나로 문 닫는 체육시설도 많고 테니스의 경우에도 동호회에서 테니스장 전체를 예약하는 경우가 있어 예약하기 힘들다. 그래서 이번 포스팅에서는 서울 공공데이터 API를 통해서 서울 공공시설 테니스장의 유료/무료 여부, 예약 URL 그리고 지역 위치를 알아보고자 한다.

 

 

Python Code

Open Api는 아래 링크에서 확인하면 되고, API 키 신청도 마찬가지이다.

 

data.seoul.go.kr/dataList/OA-2266/S/1/datasetView.do

 

서울시 체육시설 공공서비스예약 정보

데이터 이용하기-서울시 체육시설 공공서비스예약 정보

data.seoul.go.kr

아래 코드를 돌리면 서울시에서 운영하고 있는 테니스장 정보를 Json 형태로 출력할 수 있을 것이다. 확인 결과 서울에는 총 54개의 테니스장을 운영하고 있다.

 

import requests
import pandas as pd

key='~'
url=f'http://openAPI.seoul.go.kr:8088/{key}/json/ListPublicReservationSport/1/54/테니스장'
res=requests.get(url)
rjson=res.json()
total_counts=rjson['ListPublicReservationSport']['list_total_count']

url=f'http://openAPI.seoul.go.kr:8088/{key}/json/ListPublicReservationSport/1/{total_counts}/테니스장'
res=requests.get(url)
rjson=res.json()

 

위에서 추출한 데이터를 Dataframe화 하도록 하겠다. 내가 판단하기에는 유의마한 데이터로는 가격, 지역, 예약 링크인 것 같아서 이 3개 데이터 칼럼만 가져오도록 하겠다.

 

pays=[]
areas=[]
reserve_link=[]
for i in rjson['ListPublicReservationSport']['row']:
    pays.append(i['PAYATNM'])
    areas.append(i['AREANM'])
    reserve_link.append(i['SVCURL'])
    
df=pd.DataFrame([pays,areas,reserve_link]).T
df.columns=['가격','지역','예약링크']

 

df를 출력하면 아래와 같은 데이터 행이 54개 출력됐음을 확인할 수 있다.

 

 

*번외 추가 분석 - 시각화

다음으로 서울시 내 지역별 테니스장 개수를 기준으로 해서 데이터를 시각화해보도록 하겠다. 아래 그래프를 보면 알겠지만 테니스장은 현재 성동구, 동작구, 마포구 순으로 많이 위치하고 있는 상황이다. 다만 데이터가 이상한 게 분명히 데이터 소스 자체는 서울시인데 왜 고양시가 있는지 모르겠다.

 

area=pd.DataFrame(
df.groupby('지역')['예약링크'].count()
)
area=area.rename(columns={"예약링크": "테니스장 개수"})
area=area.sort_values(by='테니스장 개수',ascending=False)

import matplotlib.pyplot as plt

plt.rcParams["font.family"] = 'Malgun Gothic'
plt.rcParams["font.size"] = 16
plt.figure(figsize=(16,8))

plt.bar(area.index,area['테니스장 개수'])
plt.title("서울 지역별 테니스장 개수")

for x, y in enumerate( list(area['테니스장 개수']) ):
    plt.text(x, y, y, fontsize=13, color='#ff0000', 
                    horizontalalignment='center', verticalalignment='bottom')

plt.ylim(0,30,5)
plt.show()

 

오늘 서울시에서 제공하고 있는 데이터 API를 통해 서울시 내에 있는 테니스장 데이터를 알아봤다. 서울시 공공데이터가 제공하고 있는 데이터가 많은 만큼 다음 시간에도 유익한 데이터로 분석하는 포스팅을 업로드하도록 하겠다. ㅃㅇ

 

 

 

728x90
반응형

댓글