๋Ÿฌ๋‹์Šคํ‘ผ์ฆˆ ์ˆ˜์—… ์ •๋ฆฌ 

 

 

< ์ด์ „ ๊ธ€ > 

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. ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ํ•˜๊ธฐ 

http://data.seoul.go.kr

 

์„œ์šธ ์—ด๋ฆฐ๋ฐ์ดํ„ฐ๊ด‘์žฅ

๋ชจ๋“  ์„œ์šธ์‹œ๋ฏผ์„ ์œ„ํ•œ ๊ณต๊ณต๋ฐ์ดํ„ฐ ์—ด๋ฆฐ๋ฐ์ดํ„ฐ๊ด‘์žฅ์—์„œ ์„œ์šธ์‹œ์™€ ์—ฐ๊ณ„ ๊ธฐ๊ด€์ด ๊ณต๊ฐœํ•œ ๊ณต๊ณต๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ์šธ์‹œ์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๊ณต๊ณต๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ์šธ์‹œ ๋”ฐ๋ฆ‰์ด ํ˜„ํ™ฉ ์ง€๋„๋ฅผ ์ƒ์„ฑํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค. 

 

 

 

 

 

 

+ Recent posts