6.서울시 공공자전거 실시간 대여정보

2024. 12. 23. 10:09LLM(Large Language Model)의 기초

1. 인증키를 발급 받습니다.

2. "서울시 공공자전거 실시간 대여정보" 를 검색합니다.

3. 인증키를 신청합니다.

4. 인증키 관리가면 발급받은키를 확인할 수 있습니다.

사이트 주소 : https://data.seoul.go.kr/

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

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