스타벅스 서울 매장 가져오기
#라이브러리 불러오기
import requests
import json
import pandas as pd
!pip install -U finance-datareader #코랩 사용시 설치 필요요
import FinanceDataReader as fdr
# 스타벅스 서울 매장 가져오는 함수
def get_star() :
data = {
'ins_lat':'37.56682',
'ins_lng':'126.97865',
'p_sido_cd':'01',
'p_gugun_cd':'',
'in_biz_cd':'',
'set_date':'',
'iend':'1000'}
url = "<https://www.starbucks.co.kr/store/getStore.do>"
response = requests.post(url, data = data)
star_list = response.json()['list']
df_star = pd.DataFrame(star_list)
df = df_star[['open_dt','s_name', 'sido_name','gugun_name','doro_address', 'tel', 'lat', 'lot','sido_code']]
cols = ['오픈일', '매장명', '시/도', '구/군', '주소', '전화번호', '위도', '경도', '코드']
df.columns = cols
df['위도'] = df['위도'].astype(float)
df['경도'] = df['경도'].astype(float)
df = df.sort_values('오픈일').reset_index(drop = True)
return df
df_seoul = get_star()
file_name_1 = 'starbucks_seoul'
df_seoul.to_csv(file_name_1, index=False)
전국 매장 가져오기
# 전국 매장 함수
def get_all(sido_code) :
url = '<https://www.starbucks.co.kr/store/getStore.do?r=UENRAT44P1>'
data = {
'ins_lat':'37.2637696',
'ins_lng':'127.0939648',
'p_sido_cd':sido_code, #전국의 코드가 다르기 때문에
'p_gugun_cd':'',
'in_biz_cd':'',
'set_date':'',
'iend':'1000'
}
response = requests.post(url, data)
data_list = response.json()['list']
df_all = pd.DataFrame(data_list)
df = df_all[['open_dt','s_name', 'sido_name','gugun_name','doro_address', 'tel','sido_code', 'lat', 'lot']]
cols = ['오픈일', '매장명', '시/도', '구/군', '주소', '전화번호', '코드', '위도', '경도']
df.columns = cols
df = df.sort_values('오픈일', ascending = True).reset_index(drop = True)
df['위도'] = df['위도'].astype(float)
df['경도'] = df['경도'].astype(float)
return df
df_list = []
for i in range(1, 18) :
if i <= 9 :
df_coffee = get_all(f'0{i}')
else :
df_coffee = get_all(i)
df_list.append(df_coffee)
df_all_city = pd.concat(df_list).reset_index(drop = True)
df_all_city
file_name = 'starbucks_all'
df_all_city.to_csv(file_name, index=False)
스타벅스 시각화
구/군별 스타벅스 매장 수
plt.figure(figsize = (17, 8))
sns.countplot(x = '구/군', data = df_seoul)
연도별 오픈 매장수
# 오픈연도만 뽑아오기
df_year = df_seoul.copy()
df_year['오픈일'] = df_year['오픈일'].astype(str)
df_year['오픈일'] = df_year['오픈일'].str[:4]
df_year = pd.DataFrame(df_year['오픈일'].value_counts())
df_year = df_year.reset_index()
df_year.columns = ['오픈연도', '매장수']
df_year = df_year.sort_values('오픈연도')
plt.figure(figsize = (17,8))
plt.plot(df_year['오픈연도'], df_year['매장수'])
plt.xlabel('오픈연도도')
plt.ylabel('매장수')
plt.title('연도별 오픈매장 수')
plt.show()
folium을 활용해서 지도에 스타벅스 매장 그려보기
starbucks_map = folium.Map(location = [37.573050, 126.979189],
titles = 'stamenTerrain',
zoom_start = 11)
for idx in df_seoul.index :
lat = df_seoul.loc[idx, '위도']
lng = df_seoul.loc[idx, '경도']
folium.CircleMarker(location = [lat, lng],
color = 'yellow',
radius = 3,
weight = 1,
fill = True,
fill_color = 'green',
fill_opacity = 0.5). add_to(starbucks_map)
starbucks_map
json 을 읽어올 때 response.text.와 response.json()을 가져올 때 무슨 차이가 있는지 궁금해서 찾아봤다.
# 스타벅스 공홈 json 가져오기
data = {
'ins_lat':'37.56682',
'ins_lng':'126.97865',
'p_sido_cd':'01',
'p_gugun_cd':'',
'in_biz_cd':'',
'set_date':'',
'iend':'1000'
}
url = "https://www.starbucks.co.kr/store/getStore.do"
response = requests.post(url, data=data)
response.json()
response.text
response.json() 은 bs 한 것 처럼 정리해서 나오고, text는 그냥 ~ 구구절절 나옴
이때 response.json()은 기존에 우리가 한 것 처럼(etf) []를 사용하여 원하는 내용을 찾아 그 다음에 pd.DataFrame에 담아 데이터 프레임에 담아 주는 것이고,
response.text일 때는 json_normalize()라는 json을 DataFrmae으로 생성할 수 있다.(json에서 데이터 프레임을 쉽게 생성할 수 있도록 도움을 주는 메서드)
-> 내 생각엔... response.json() 이 편하지 않나?
json.load(response.text)를 변수에 넣어주고 하면 더욱 깔끔하겠지만 일단 과정을 보기 위해서...
사업체현황과 인구수를 스타벅스 동별 매장 리스트와 합치기
data = pd.read_csv('/content/사업체현황(산업대분류별_동별)2020년_20230129154423.txt', sep='\t', header=2)
data_final = data[['동별(2)', '소계','소계.2']]
data_final.columns = ['구/군', '사업체수', '종사자수']
data_final = data_final.drop([0, 1, 2])
data_final = data_final.reset_index(drop = True)
df_people = pd.read_csv('/content/주민등록인구2020csv_20230128204537.csv')
df_people = df_people[['동별(2)', '2020.1']]
df_people.columns = ['구/군', '주민등록인구']
df_people = df_people.drop([0, 1])
df_people = df_people.reset_index(drop = True)
star_count = df_seoul.pivot_table(index = '구/군', values = '매장명', aggfunc = 'count')
star_count = star_count.reset_index(drop = False).rename(columns = {'매장명' : '스타벅스_매장수'})
star_count_all = pd.merge(star_count,df_people, how = 'left' , on = '구/군')
star_count_all
star_count_all = pd.merge(star_count_all,data_final, how = 'left' , on = '구/군')
star_count_all
- 좋았던 것(Liked) : folium 활용 / 처음에 정말 어떻게 해야할 지 모르겠던 스벅 매장 리스트를 긁어올 수 있었다.
- 배운 것(Learned) : json 타입을 어떻게 데이터프레임으로 만들 수 있는지에 대해 알 수 있었다.
- 부족했던 것(Lacked) : 스타벅스 매장과 인구, 사업체수로 시각화 하는 것을 끝까지 하지 못했다. 데이터를 불러오기는 했지만 그 후 map을 만드는 것이 쉽지 않았다.
- 바라는 것(Longed for) : 노력
'AI SCHOOL > project' 카테고리의 다른 글
[mini project 2] 공공데이터를 활용한 대한민국 산업재해 현황 분석 (0) | 2023.02.05 |
---|---|
[mini project] 동의종료 청원 데이터 수집 (0) | 2023.01.29 |