[Aws cloud school 17일차]open API 이용하기

miniPig·2024년 6월 5일

AWS cloud school

목록 보기
4/31
  • 오전 작업에서는 공공데이터 API 연결 후 지도차트 제작

→ 서울시 도서관 정보로

  • 판다스 : 행과 열의 개념으로 데이터 가져오는 것
  • xml : 데이터를 나열하는 것

open API란?

코드를 입력하세요<div class='openAPI'>
<h1>[openAPI란]</h1>
<p>설명</p>
</div>

## 방법 1
<h1>서울시 공공도서관</h1>
http://openapi.seoul.go.kr:8088/7771616662636c613731754b726d4c/xml/SeoulPublicLibraryInfo/1/5/
<a href 
 ='http://openapi.seoul.go.kr:8088/7771616662636c613731754b726d4c/xml/SeoulPublicLibraryInfo/1/5/'> 클릭하면 위의 사이트로 이동 </a>
 <p>교재는 <font color='red'>332페이지</font> json 처리 코드 있음</p>

## 방법 2
 <div class='공공도서관'>
<h1>[서울시 공공도서관]</h1>
<p>http://openapi.seoul.go.kr:8088/7771616662636c613731754b726d4c/xml/SeoulPublicLibraryInfo/1/5/</p>
<a href 
 ='http://openapi.seoul.go.kr:8088/7771616662636c613731754b726d4c/xml/SeoulPublicLibraryInfo/1/5/'> 클릭하면 위의 사이트로 이동 </a>
 <p>교재는 <font color='red'>332페이지</font> json 처리 코드 있음</p>
</div>

  • Open API(Open Application Programming Interface)는 다양한 소프트웨어 애플리케이션이 서로 상호작용할 수 있도록 설계된 공개된 인터페이스
  • Open API는 개발자들이 다른 애플리케이션이나 서비스의 기능을 활용하여 자신의 애플리케이션을 확장하거나 새로운 기능을 추가할 수 있게 해줌

URL 분리하기

코드를 입력## url을 분리하기
## 이유
## 1) 깃에 내 키를 오픈할 수 없으니까 -> 분리했다가 결합
## 2) 사용자가 json, xml 중 뭐를 사용할지 모르니까
api_Key = '7771616662636c613731754b726d4c'

url = 'http://openapi.seoul.go.kr:8088/'
url += api_Key
url += '/json/SeoulPublicLibraryInfo/1/206/'
## 데이터를 보고 싶으면 1~206 중 입력해주기 -> 보고 싶은 데이터만 보기 가능

url    #url이 잘 연결되나 확인하세요

특정 데이터 추출

코드를 입력하세요## 특정 URL에서 JSON 데이터를 가져와 파이썬 딕셔너리로 변환하고,
## 필요한 데이터를 추출하는 과정
## 필요한 라이브러리 임포트
import urllib.request    ## 주어진 URL에서 데이터를 가져
import json

plainText = urllib.request.urlopen(url).read().decode()  #URL에서 데이터를 가져오기
jsonData = json.loads(plainText)    ## 문자열 형태의 JSON 데이터를 파이썬 딕셔너리로 변환

## 특정 데이터 추출
dataCount = jsonData['SeoulPublicLibraryInfo']['list_total_count']
## 데이터 갯수 보여줘  ## url을 /로 나눈 뒤 뒤에서 두번째 요소롤 보여줘
dataCount,url.split('/')[-2]    #참고
코드를 입력하세요## 결과
(206, '206')

df.head()

dataCount = jsonData['SeoulPublicLibraryInfo']['row']   ## 특정 데이터 추출
libData = jsonData['SeoulPublicLibraryInfo']['row']   ## 데이터를 json으로 바꿔줌

import pandas as pd
# pd.DataFrame(libData)
df = pd.DataFrame(libData)  ##데이터프레임으로 변환
df.head()   ##df.head(5)-> 디폴트 -> 데이터의 구조와 내용을 빠르게 파악 가능

Pandas란?

  • 데이터 분석과 조작을 위한 파이썬 라이브러리로, 특히 테이블 형식의 데이터를 처리하는 데 탁월
  • Pandas는 데이터프레임(DataFrame)과 시리즈(Series)라는 두 가지 주요 데이터 구조를 제공

데이터 보는 방법

코드를 입력하세요## 데이터 보기

df['TEL_NO'][:3], df.iloc[:,5][:3]  
 #이 중에서 3개만 샘플로 보자
 # iloc : 행과 열로 샘플 보기 가능']]

df[['TEL_NO', 'HMPG_URL']]     # 데이터 보여주기 여러 방법으로 가능
df.iloc[:,[5,6]]


코드를 입력하세요df['CODE_VALUE'].unique()   #df.head()로 확인

# 1. 서울시 도서관 전체 개수는?
len(df)

# 2. 서울시의 도서관이 있는 구의 갯수는?
#질문이 중요
len(df['CODE_VALUE'].unique()), #CODE_VALUE값만을 묶어서 df로 만들어준 다음에 그 길이를 보여줘라
df['CODE_VALUE'].unique()

# 3. 각 구별로 도서관은 몇개가 있나요?
df['CODE_VALUE'].value_counts()   #숫자가 가장 많은 값부터 출력

# 4. 도서관 갯수가 많은 상위 top3는 어디인가요?
df['CODE_VALUE'].value_counts()[:3]
코드를 입력하세요##1
##206

##2
(25, array(['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구',
       '도봉구', '동대문구', '동작구', '마포구', '서대문구', '서초구', '성동구', '성북구', '송파구',
       '양천구', '영등포구', '용산구', '은평구', '종로구', '중구', '중랑구'], dtype=object)

##3
CODE_VALUE
강남구     16
성북구     13
구로구     12
송파구     12
강동구     10
양천구     10
종로구      9
노원구      9
동대문구     9
서초구      9
강서구      9
도봉구      9
동작구      8
중구       8
은평구      8
광진구      7
성동구      7
강북구      7
영등포구     6
마포구      6
관악구      5
중랑구      5
용산구      4
서대문구     4
금천구      4
Name: count, dtype: int64
##4
CODE_VALUE
강남구    16
성북구    13
구로구    12
Name: count, dtype: int64

강남구 데이터만 추출하기

코드를 입력하세요df[df['CODE_VALUE'] == '강남구']

지도 시각화

코드를 입력하세요## 지도 시각화
## 위 자료는 위도와 경도 가지고 있음
## 구글에서 제공하는 지도맵을 세팅(출력), 줌인아웃 사이트, 중심좌표
## 내가 표시하고자 하는 위경도값을 그 구글맵지도에 추가한다.

import folium

# 위도
latitude = 37.394946
# 경도
longitude = 127.111104

m = folium.Map(location=[latitude, longitude],
               zoom_start=17,
               width=750,
               height=500
              )
m

tmp = df[['XCNTS', 'YDNTS', 'LBRRY_NAME', 'OP_TIME']]

for lat, lon, name, time in zip(tmp['XCNTS'], tmp['YDNTS'], tmp['LBRRY_NAME'], tmp['OP_TIME']):
    pop = name + time
    folium.Marker([lat, lon],
                  popup=pop).add_to(m)
m

새로운 마커

코드를 입력하세요import folium

# 지도 생성 (중심 좌표: 서울)
m = folium.Map(location=[37.5665, 126.9780], zoom_start=12)

# 기본 아이콘 마커 추가
folium.Marker(
    location=[37.5665, 126.9780],
    popup='Default Icon',
    icon=folium.Icon()
).add_to(m)

# 녹색 아이콘 마커 추가
folium.Marker(
    location=[37.5765, 126.9880],
    popup='Green Icon',
    icon=folium.Icon(color='green')
).add_to(m)

# 다른 모양 아이콘 마커 추가
folium.Marker(
    location=[37.5565, 126.9680],
    popup='Star Icon',
    icon=folium.Icon(icon='star')
).add_to(m)

# 붉은색 아이콘 마커 추가
folium.Marker(
    location=[37.5465, 126.9580],
    popup='Red Icon',
    icon=folium.Icon(color='red', icon='info-sign')
).add_to(m)

# 커스텀 아이콘 추가 (아이콘 URL 사용)
icon_url = 'https://example.com/icon.png'
folium.Marker(
    location=[37.5365, 126.9480],
    popup='Custom Icon',
    icon=folium.CustomIcon(icon_url, icon_size=(30, 30))
).add_to(m)

# 지도 출력
m.save('map_with_custom_icons.html')
m

지도에 원 표시하기

import folium

# 지도 생성 (중심 좌표: 서울)
m = folium.Map(location=[37.5665, 126.9780], zoom_start=12)

# folium.Circle을 사용하여 지리적 거리 반지름으로 동그라미 추가
folium.Circle(
    location=[37.5665, 126.9780],
    radius=500,  # 반지름 (미터 단위)
    color='blue',
    fill=True,
    fill_color='blue'
).add_to(m)

# folium.CircleMarker를 사용하여 픽셀 단위 반지름으로 동그라미 추가
folium.CircleMarker(
    location=[37.5765, 126.9880],
    radius=10,  # 반지름 (픽셀 단위)
    color='green',
    fill=True,
    fill_color='green'
).add_to(m)

# 지도 저장
m.save('map_with_circles.html')
m

지도시각화 2

코드를 입력하세요### 지도시각화
### 구글에서 제공하는 지도맵을 세팅(출력) , 줌인아웃 사이트, 중심좌표
### 내가 표시하고자 하는 위경도값을 그 구글맵지도에 추가한다.
#!pip install folium
import folium
# 위도, 경도 <지도 중심 좌표> -> 이 위도와 경도를 중심으로 지도가 표시됨 -> 줌아웃
latitude = 37.48283
longitude = 126.8830
# 지도 생성
m = folium.Map(location=[latitude, longitude],   #지도의 중심 좌표
    zoom_start=10,  #초기 확대 수준
    width=750,    #너비 픽셀
    height=500    #높이 픽셀
    )
# 반드시 tmp 변수를 작성해야 하는것은 아님. df 자료로 작업해 됨.
# 주어진 DataFrame에서 특정 열을 선택하여 새로운 DataFrame을 만듦
tmp=df[['CODE_VALUE','XCNTS','YDNTS','LBRRY_NAME','OP_TIME']]
# LBRRY_NAME에 따른 색상 매핑을 위한 딕셔너리
color_map = {
    "강남구": "blue",
    "강동구": "green",
    "강서구": "red",
# 추가적인 라이브러리 이름과 색상을 추가하세요
}
# 지역별 색상을 다르게 하기 위하여서 CODE_VALUE값 추가함.
# zip 함수를 사용하여 각 열을 동시에 반복
for gu, lat, lon, name, time in zip(tmp['CODE_VALUE'],tmp['XCNTS'], tmp['YDNTS'],tmp['LBRRY_NAME'],tmp['OP_TIME']):
    pop=name+time
    color = color_map.get(gu)  #코드와 색상을 매핑
    folium.Marker([lat, lon],   #마커 생성
        popup=pop,
        icon=folium.Icon(icon_color=color, icon_size=(20,20)) # gpt 검색 , 파이썬 지도 차트 아이콘 크기
        ).add_to(m)   #지도에 추가
m

지도시각화 3 (점)

코드를 입력하세요### 지도시각화
### 구글에서 제공하는 지도맵을 세팅(출력) , 줌인아웃 사이트, 중심좌표
### 내가 표시하고자 하는 위경도값을 그 구글맵지도에 추가한다.
### 위 지도는 너무 지저분하니까 점으로 표시해보자!
#!pip install folium
import folium
# 위도, 경도
latitude = 37.48283    
longitude = 126.8830
# 지도 만들어주기
m = folium.Map(location=[latitude, longitude],  #이 위도와 경도를 중심으로
    zoom_start=10,  
    width=750,
    height=500
    )
# 반드시 tmp 변수를 작성해야 하는것은 아님. df 자료로 작업해 됨.
tmp=df[['CODE_VALUE','XCNTS','YDNTS','LBRRY_NAME','OP_TIME']]
# LBRRY_NAME에 따른 색상 매핑을 위한 딕셔너리
color_map = {
    "강남구": "blue",
    "강동구": "green",
    "강서구": "red",
# 추가적인 라이브러리 이름과 색상을 추가하세요
}
# 지역별 색상을 다르게 하기 위하여서 CODE_VALUE값 추가함.
### folium.CricleMaker를 사용하여 지도의 각 위치에 원형 마커 추
for gu,lat, lon,name,time in zip(tmp['CODE_VALUE'],tmp['XCNTS'], tmp['YDNTS'],tmp['LBRRY_NAME'],tmp['OP_TIME']):
    pop=name+time   #누르면 이름과 운영시간 뜸
    color = color_map.get(gu)   
    folium.CircleMarker([lat, lon],
    popup=pop,
    radius=5, # 원의 반지름

    color=color,
    fill=True,
    fill_color=color,
    fill_opacity=1 #투명도
    ).add_to(m)   #지도에 저장
m

0개의 댓글