6.서울시 공공자전거 실시간 대여정보
2024. 12. 23. 10:09ㆍLLM(Large Language Model)의 기초
1. 인증키를 발급 받습니다.
2. "서울시 공공자전거 실시간 대여정보" 를 검색합니다.
3. 인증키를 신청합니다.
4. 인증키 관리가면 발급받은키를 확인할 수 있습니다.
사이트 주소 : https://data.seoul.go.kr/
1. 서울 열린데이터 광장
* 서울 열린데이터 광장(Seoul Open Data Plaza)은 서울시에서 운영하는 공공데이터 개방 플랫폼입니다.
* 시민, 연구자, 기업 등이 서울시에서 생성한 다양한 공공데이터를 자유롭게 활용할 수 있도록 제공하고 있습니다.
* 이를 통해 데이터 기반의 창의적인 아이디어와 혁신을 촉진하며, 시민들의 정보 접근성을 높이고 공공서비스를 개선하는 데 기여하고 있습니다.
예시 1)
import requests
import folium
import json
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
#http://openapi.seoul.go.kr:8088/61434341506261623131305748796271/xml/bikeList/1/5/
#base_url = 'http://openapi.seoul.go.kr:8088/sample/xml/bikeList/1/2/'
base_url = 'http://openapi.seoul.go.kr:8088/(인증키)/json/bikeList/1/5/'
response = requests.get(base_url)
# print(request)
json_data = response.json()
json_data
-->
{'rentBikeStatus': {'list_total_count': 5,
'RESULT': {'CODE': 'INFO-000', 'MESSAGE': '정상 처리되었습니다.'},
'row': [{'rackTotCnt': '15',
'stationName': '102. 망원역 1번출구 앞',
'parkingBikeTotCnt': '13',
'shared': '87',
'stationLatitude': '37.55564880',
'stationLongitude': '126.91062927',
'stationId': 'ST-4'},
{'rackTotCnt': '14',
'stationName': '103. 망원역 2번출구 앞',
'parkingBikeTotCnt': '18',
'shared': '129',
'stationLatitude': '37.55495071',
'stationLongitude': '126.91083527',
'stationId': 'ST-5'},
{'rackTotCnt': '13',
'stationName': '104. 합정역 1번출구 앞',
'parkingBikeTotCnt': '9',
'shared': '69',
'stationLatitude': '37.55073929',
'stationLongitude': '126.91508484',
'stationId': 'ST-6'},
{'rackTotCnt': '5',
'stationName': '105. 합정역 5번출구 앞',
'parkingBikeTotCnt': '2',
'shared': '40',
'stationLatitude': '37.55000687',
'stationLongitude': '126.91482544',
'stationId': 'ST-7'},
{'rackTotCnt': '12',
'stationName': '106. 합정역 7번출구 앞',
'parkingBikeTotCnt': '18',
'shared': '150',
'stationLatitude': '37.54864502',
'stationLongitude': '126.91282654',
'stationId': 'ST-8'}]}}
예시 2)
json_data['rentBikeStatus']['RESULT']['CODE']
-->
INFO-000
예시 3)
json_data.get('rentBikeStatus', {}).get('RESULT', {}).get('CODE', '') #기본값을 바꿀수 있다
-->
INFO-000
예시 4)
def fetch_bike_data():
# 서울시 공공자전거 실시간 대여소 정보 API 기본 URL
base_url = "http://openapi.seoul.go.kr:8088/61434341506261623131305748796271/json/bikeList/"
# 데이터 요청의 시작과 끝 인덱스 초기화
start = 1 # API 요청의 시작 인덱스
end = 1000 # API 요청의 끝 인덱스
step = 1000 # 한번에 요청할 데이터의 개수
data_frames = [] # 수집한 데이터를 저장할 리스트
while True:
# API 요청 URL 생성
url = f"{base_url}{start}/{end}/"
# API 호출
response = requests.get(url)
# 요청 실패 시 처리
if response.status_code != 200: # HTTP 응답 코드가 200(성공)이 아니면 종료
print(f"Status Code: {response.status_code}")
break
# API 응답 JSON 데이터 파싱
json_data = response.json()
# JSON 데이터에서 필요한 정보 추출
try:
rent_bike_status = json_data["rentBikeStatus"] # 'rentBikeStatus' 키로 데이터 추출
result_code = rent_bike_status["RESULT"]["CODE"] # 응답 코드 확인
except KeyError:
print("JSON 오류") # JSON 구조에 오류가 있을 경우 처리
break
# 응답 코드에 따른 처리
if result_code == "INFO-200": # INFO-200: 데이터가 없음을 의미
print("데이터 없음")
break
elif result_code == "INFO-000": # INFO-000: 데이터가 정상적으로 존재함
print(f"시작: {start} 끝: {end}.") # 현재 요청 범위 출력
try:
bike_data = rent_bike_status["row"] # 데이터 행(row) 추출
if bike_data: # 데이터가 존재하는 경우
df = pd.DataFrame(bike_data) # 데이터를 데이터프레임으로 변환
data_frames.append(df) # 데이터프레임을 리스트에 추가
except KeyError:
print("데이터를 찾을 수 없음") # 데이터 키가 없을 경우 예외 처리
else:
print(f"result code: {result_code}") # 예상하지 못한 결과 코드 처리
break
# 다음 요청 범위 설정
start += step # 시작 인덱스를 다음 범위로 증가
end += step # 끝 인덱스를 다음 범위로 증가
# 수집한 모든 데이터를 하나의 데이터프레임으로 병합
if data_frames:
final_df = pd.concat(data_frames, ignore_index=True) # 데이터프레임 병합
return final_df
else:
# 데이터가 없을 경우 빈 데이터프레임 반환
return pd.DataFrame()
bike_data_df = fetch_bike_data()
bike_data_df
-->
시작: 1 끝: 1000.
시작: 1001 끝: 2000.
시작: 2001 끝: 3000.
-->
예시 5)
bike_data_df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2711 entries, 0 to 2710
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 rackTotCnt 2711 non-null object
1 stationName 2711 non-null object
2 parkingBikeTotCnt 2711 non-null object
3 shared 2711 non-null object
4 stationLatitude 2711 non-null object
5 stationLongitude 2711 non-null object
6 stationId 2711 non-null object
dtypes: object(7)
memory usage: 148.4+ KB
예시 6)
'''
rackTotCnt 거치대개수
parkingBikeTotCnt 자전거주차총건수
shared 거치율
stationLatitude 위도
stationLongitude 경도
stationId 대여소ID
stationName 대여소이름
'''
bike_data_df.columns
-->
Index(['rackTotCnt', 'stationName', 'parkingBikeTotCnt', 'shared',
'stationLatitude', 'stationLongitude', 'stationId'],
dtype='object')
예시 7)
bike_data_df.shape
-->
(2711, 7)
예시 8)
#float형으로 변환
bike_data_df['stationLatitude'] = bike_data_df['stationLatitude'].astype(float)
bike_data_df['stationLongitude'] = bike_data_df['stationLongitude'].astype(float)
bike_data_df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2711 entries, 0 to 2710
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 rackTotCnt 2711 non-null object
1 stationName 2711 non-null object
2 parkingBikeTotCnt 2711 non-null object
3 shared 2711 non-null object
4 stationLatitude 2711 non-null float64
5 stationLongitude 2711 non-null float64
6 stationId 2711 non-null object
dtypes: float64(2), object(5)
memory usage: 148.4+ KB
예시 9)
# folium을 사용하여 지도 생성 및 시각화
bike_map = folium.Map(
location=[
bike_data_df['stationLatitude'].mean(), # 모든 대여소의 위도 평균
bike_data_df['stationLongitude'].mean() # 모든 대여소의 경도 평균
],
zoom_start=12 # 초기 지도 확대 수준
)
# 대여소 데이터를 반복하며 지도에 마커 추가
for index, data in bike_data_df.iterrows():
# 팝업에 표시할 문자열 생성
popup_str = '{} 자전거주차총건수:{}대'.format(
data['stationName'], # 대여소 이름
data['parkingBikeTotCnt'] # 대여소의 총 주차 가능한 자전거 대수
)
popup = folium.Popup(popup_str, max_width=600) # 팝업 생성 (최대 너비 설정)
# 대여소 위치에 마커 추가
folium.Marker(
location=[data['stationLatitude'], data['stationLongitude']], # 대여소 위도, 경도
popup=popup # 마커 클릭 시 표시할 팝업
).add_to(bike_map) # 마커를 지도에 추가
# 생성된 지도 객체 반환
bike_map
-->
728x90
LIST
'LLM(Large Language Model)의 기초' 카테고리의 다른 글
7. 커피프랜차이즈 이점 전략 (0) | 2024.12.23 |
---|---|
5. 상권_데이터셋 (6) | 2024.12.19 |
Matplotlib (4) | 2024.12.19 |
4. Online Retail 데이터셋 (1) | 2024.12.18 |
판다스(Pandas) 2 (4) | 2024.12.18 |