๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/59
[์๊ฐํ ๋ถ์ ํ๋ก์ ํธ] 2-3 ์น์ฐจ์๊ฐ ๊ฐ์ฅ ๋ง์ ์งํ์ฒ ์ญ ๋ถ์
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/58 https://silvercoding.tistory.com/57 https://silvercoding.tistory.com/56 https://silvercoding.tistory.com/55 https://silvercoding...
silvercoding.tistory.com
API ์ ์ฒญํ๊ธฐ
1. ํ์๊ฐ์ , ๋ก๊ทธ์ธ ํ๊ธฐ
์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ
๋ชจ๋ ์์ธ์๋ฏผ์ ์ํ ๊ณต๊ณต๋ฐ์ดํฐ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ์์ ์์ธ์์ ์ฐ๊ณ ๊ธฐ๊ด์ด ๊ณต๊ฐํ ๊ณต๊ณต๋ฐ์ดํฐ๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค. ์์ธ์์ ๊ด๋ จ๋ ๋ค์ํ ๊ณต๊ณต๋ฐ์ดํฐ๋ฅผ ํ์ธํด ๋ณด์ธ์.
data.seoul.go.kr
2. ์ํ๋ ๋ฐ์ดํฐ์ ์ธ์ฆํค ์ ์ฒญ ํด๋ฆญ
๋ณธ ํฌ์คํ ์์๋ ์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ ๊ด์ฅ์ ๊ณต๊ณต์์ ๊ฑฐ ์ค์๊ฐ ๋์ฌ์ ๋ณด API ๋ฅผ ์ฌ์ฉํ๋ค.
๋ค์์ ๋งํฌ์์ API๋ฅผ ์ ์ฒญํ ์ ์๋ค.
http://data.seoul.go.kr/dataList/OA-15493/A/1/datasetView.do
์ธ์ฆํค ์ ์ฒญ์ ํด๋ฆญํ๋ค.
3. ๊ฐ์ ์ ์ฒญ์ ์์ฑ
ํ์ฉํ ๋ชฉ์ ์ ๋ง๊ฒ ์ ์ฒญ์๋ฅผ ์์ฑํด ์ค๋ค. ํ์ฌ ๋ฐ์ดํฐ๋ถ์ ํ์ต์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ url์ด ์๋ค. ์ด ์ฒ๋ผ ์ฌ์ฉurl์ด ์์ ๊ฒฝ์ฐ์๋ localhost๋ฅผ ์์ฑํด์ค๋ค.
4. ์๋จ [๋์ํ๋ฉด - ์ธ์ฆํค ๊ด๋ฆฌ]
๋์ํ๋ฉด - ์ธ์ฆํค ๊ด๋ฆฌ์ ๋ค์ด๊ฐ๋ค.
5. ์ธ์ฆํค ๋ณต์ฌ
์ธ์ฆํค ๋ณต์ฌ๋ฅผ ํ๋ค. ์ด์ API์ ์ฒญ์ด ์๋ฃ๋์๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์๋ณด์.
๋ฐ์ดํฐ์ ๋ถ๋ฌ์ค๊ธฐ
1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
import requests # API๋ฅผ ์ด์ฉํด ์๋ฃ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด
import pandas as pd # ์๋ฃ ์ ์ฅ, ๋ค๋ฃจ๊ธฐ ์ํด
2. ์์ธํน๋ณ์ ๊ณต๊ณต์์ ๊ฑฐ ์ค์๊ฐ ๋์ฌ์ ๋ณด ๋ฐ์ดํฐ ์ดํด๋ณด๊ธฐ
- ํธ์ถ
ํ๋ฒ์ ์ต๋ 1000๊ฑด์ ํธ์ถํ ์ ์์ผ๋ฏ๋ก 2๋ฒ์ ๊ฑธ์ณ ํธ์ถํ ํ, ๋ฐ์ดํฐ๋ฅผ ํฉ์น๋ ์์ ์ ํด์ผํ๋ค.
- ์์
์์ ์ํ URL์ ์ฌ์ฉํ์ฌ API๋ฅผ ํธ์ถํ ์ ์๋ค. (์ธ์ฆํค) ๋ถํฐ ๊ฐ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ธ์ฆํค, ์์ฒญํ์ผ ํ์ , ์๋น์ค๋ช , ์์ฒญ์์์์น, ์์ฒญ์ข ๋ฃ์์น๋ฅผ ์๋ฏธํ๋ค. ์์ฒญ์์์์น์ ์์ฒญ์ข ๋ฃ์์น๋ฅผ ์กฐ์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
- ์ถ๋ ฅ๊ฐ
๋ฐ์ดํฐํ๋ ์์ ์ปฌ๋ผ์ด ๋ ๋ณ์๋ค์ด๋ค. ๊ฑฐ์น๋๊ฐ์, ๋์ฌ์์ด๋ฆ, ์์ ๊ฑฐ์ฃผ์ฐจ์ด๊ฑด์, ๊ฑฐ์น์จ, ์๋, ๊ฒฝ๋, ๋์ฌ์ID ๋ก ์ด 7๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
3. ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
- ์ธ์ฆํค ์ ๋ ฅ
apikey = ' ' # ๋ฐ์ key ๊ฐ ์
๋ ฅ
๋ณธ์ธ์ api ๊ฐ์ ๋ฃ์ด์ค๋ค.
- API ์์ฒญํ๊ธฐ
startnum = 1
endnum = 1000
url1 = f'http://openapi.seoul.go.kr:8088/{apikey}/json/bikeList/{startnum}/{endnum}/'
requests.get(url1)
# requests.get(url1).text
# requests.get(url1).content
requests.get() ์ ์ฌ์ฉํ๋ฉด ์๋ต์ด ์จ๋ค. ์ด ์ธ์๋ text, content๋ก ์์ ๋ด์ฉ์ ์คํํด๋ณผ ์๋ ์๋ค.
- ์๋ฃ ์์ฒญ
json1 = requests.get(url1).json()
json1
์ด๋ ๊ฒ json ํํ๋ก ๋ ๋ฐ์ดํฐ๊ฐ 1000๊ฐ ๋์ค๊ฒ ๋๋ค.
- ํ์ํ ์ ๋ณด(ํค) ์ ํ
json1['rentBikeStatus'].keys()
ํ์ฌ ๋ฐ์ดํฐ ๋ถ์์ ์ํด ํ์ํ ์ ๋ณด๋ rentBikeStatus ์์ ์๋ row ํค์ ๋ฐ์ดํฐ์ด์ง๋ง, ๋ชจ๋ ํค๋ฅผ ๊บผ๋ด๋ณธ๋ค.
json1['rentBikeStatus']['list_total_count'] # ๋ฐ์ดํฐ์ ๊ฐ์
json1['rentBikeStatus']['RESULT'] # ์ค๋ฅ ์ฌ๋ถ
json1['rentBikeStatus']['row'] # ์์ ๊ฑฐ ์ ๋ฅ์ฅ๋ณ ์์ ๊ฑฐ ํํฉ
- ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ณ๊ฒฝ
raw1 = pd.DataFrame(json1['rentBikeStatus']['row'])
raw1.head()
- 1000 ~ 2000 & 2000 ~ 3000 ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ณ ํฉ๋ณํ๊ธฐ
startnum = 1001
endnum = 2000
url2 = f'http://openapi.seoul.go.kr:8088/{apikey}/json/bikeList/{startnum}/{endnum}/'
json2 = requests.get(url2).json()
raw2 = pd.DataFrame(json2['rentBikeStatus']['row'])
raw2.tail()
data_mid = raw1.append(raw2)
data_mid
๋ฐ์ดํฐ๊ฐ 2000๊ฐ๋ฅผ ๋ ๋์ด๊ฐ๋ ๊ฒ ๊ฐ์ผ๋ 2000 ~ 3000 ๋ฐ์ดํฐ๋ ํธ์ถํ ํ ์ถ๊ฐํด์ค๋ค.
startnum = 2001
endnum = 3000
url3 = f'http://openapi.seoul.go.kr:8088/{apikey}/json/bikeList/{startnum}/{endnum}/'
json3 = requests.get(url3).json()
raw3 = pd.DataFrame(json3['rentBikeStatus']['row'])
raw3.tail()
data = data_mid.append(raw3)
data
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์๋ค. ์ด 2540๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ธ๋ฑ์ค๊ฐ ์กฐ๊ธ ์ด์ํด์ ์ธ๋ฑ์ค๋ฅผ ์ด๊ธฐํ ํด์ค ํ, ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ผ๋ก ์ ์ฅํด์ค๋ค.
- ์ต์ข ๋ฐ์ดํฐ
data.reset_index(drop=True)
data.info()
์ด 2450๊ฐ์ row๊ฐ ์กด์ฌํ๊ณ , null ๊ฐ์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ์์ ํ์ผ๋ก ์ ์ฅ
data.to_excel('./data/bicycle.xlsx', index = False)
์์ ํ์ผ๋ก ์ ์ฅํด์ค๋ค. ๋ค์์๊ฐ์๋ ์ด๋ฌํ ๊ณผ์ ์ผ๋ก ๋ถ๋ฌ์จ ์์ ๊ฑฐ ๋ฐ์ดํฐ์ ์ folium ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์์ธ์ ๋ฐ๋ฆ์ด ํํฉ ์ง๋๋ฅผ ์์ฑํด ๋ณผ ๊ฒ์ด๋ค.