24_starbucks_Analysis
import warnings
warnings.filterwarnings('ignore')
import requests
import folium
from pandas.io.json import json_normalize
#전국 또는 특정 지역의 스타벅스 매장의 위치를 찾아서 지도위에 표시하기
#1. requests 모듈로 스타벅스 매장 위치 데이터를
# 가져와서 딕셔너리 타입으로 변환한다.
#2. 판다스의 json_normalize()함수로 json이 변환된 딕셔너리를
# 판다스 데이터프레임으로 변환한다.
#3. folium 모듈을 사용해 지도를 표시하고 지도위의 스타벅스 매장 위치에
# 마커를 표시한다.
#서울 스타벅스 전 지점
targetSite = 'https://www.starbucks.co.kr/store/getStore.do?r=V412YZ6GQ3'
request = requests.post(targetSite, data={
'ins_lat' : 37.2700715, # 위도
'ins_lng': 127.1273485, # 경도
'p_sido_cd' : '01', #시도코드
'p_gugun_cd': '', #구군코드
'in_biz_cd': '', #?
'iend' : 1600, #서버가 응답하는 최대 매장의 개수
'set_date' : '' #?
})
storeList = request.json()
print(type(storeList))
print(len(storeList['list']))
<class 'dict'>
581
#json_normalize()함수로 json타입으로 데이터가
#변환된 딕셔너리를 판다스 데이터프레임으로 변환한다.
#json_normalize(데이터프레임으로 변환할 데이터가 저장된 딕셔너리,
# '딕셔너리의 key중에서 데이터 프레임으로 변환할 key')
star_df = json_normalize(storeList, 'list')
print(type(star_df))
<class 'pandas.core.frame.DataFrame'>
star_df.head()
seq | sido_cd | sido_nm | gugun_cd | gugun_nm | code_order | view_yn | store_num | sido | gugun | ... | t22 | t21 | p90 | t05 | t30 | t36 | t27 | t29 | t43 | t48 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | None | None | None | None | None | None | None | None | None | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | None | None | None | None | None | None | None | None | None | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | None | None | None | None | None | None | None | None | None | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | None | None | None | None | None | None | None | None | None | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 0 | None | None | None | None | None | None | None | None | None | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 rows × 129 columns
print(storeList['list'][0])
{'seq': 0, 'sido_cd': None, 'sido_nm': None, 'gugun_cd': None, 'gugun_nm': None, 'code_order': None, 'view_yn': None, 'store_num': None, 'sido': None, 'gugun': None, 'address': None, 'new_img_nm': None, 'p_pro_seq': 0, 'p_view_yn': None, 'p_sido_cd': '', 'p_gugun_cd': '', 'p_store_nm': None, 'p_theme_cd': None, 'p_wireless_yn': None, 'p_smoking_yn': None, 'p_book_yn': None, 'p_music_yn': None, 'p_terrace_yn': None, 'p_table_yn': None, 'p_takeout_yn': None, 'p_parking_yn': None, 'p_dollar_assent': None, 'p_card_recharge': None, 'p_subway_yn': None, 'stb_store_file_renew': None, 'stb_store_theme_renew': None, 'stb_store_time_renew': None, 'stb_store_lsm': None, 's_code': '1509', 's_name': '역삼아레나빌딩', 'tel': '1522-3232', 'fax': '02-568-3763', 'sido_code': '01', 'sido_name': '서울', 'gugun_code': '0101', 'gugun_name': '강남구', 'addr': '서울특별시 강남구 역삼동 721-13 아레나빌딩', 'park_info': None, 'new_state': None, 'theme_state': 'T05@T08@T16@T17@T20@T21@T30@@T52@P80@P90', 'new_bool': 0, 'search_text': '', 'ins_lat': '', 'ins_lng': '', 'in_distance': 0, 'out_distance': '26.75', 'all_search_cnt': -1, 'addr_search_cnt': -1, 'store_search_cnt': -1, 'rowCount': 30, 'store_nm': '', 'store_cd': 0, 's_biz_code': '3762', 'new_icon': 'N', 'set_user': '', 'favorites': 0, 'map_desc': None, 'notice': None, 'defaultimage': '/upload/store/2020/09/[3762]_20200917031519_6juwr.JPG', 'etcimage': None, 'in_biz_cd': None, 'in_store_cd': None, 'in_favorites': None, 'in_user_id': None, 'in_biz_cds': 0, 'in_biz_arr': None, 'in_biz_arrdata': None, 'in_scodes': 0, 'in_scode_arr': None, 'in_scode_arrdata': None, 'disp': None, 'set_date': None, 'hlytag': None, 'hlytag_msg': None, 'vSal': '', 'istart': 1, 'iend': 60, 'open_dt': '20190613', 'gold_card': 0, 'ip_lat': '', 'ip_long': '', 'espresso': '', 'new_store': '', 'premiere_food': '', 'doro_address': '서울특별시 강남구 언주로 425 (역삼동)', 'cold_blew': '', 'my_siren_order_store_yn': 'N', 'whcroad_yn': 'WHCROAD', 'skuNo': '', 'skuName': '', 'skuImgUrl': '', 'stock_count': 0, 'store_area_name': None, 'store_area_code': 'A01', 'is_open': None, 'gift_stock_yn': None, 'lat': '37.501087', 'lot': '127.043069', 't20': 0, 't04': 0, 't03': 0, 't01': 0, 't12': 0, 't09': 0, 't06': 0, 't10': 0, 'p10': 0, 'p50': 0, 'p20': 0, 'p60': 0, 'p30': 0, 'p70': 0, 'p40': 0, 'p80': 0, 't22': 0, 't21': 0, 'p90': 0, 't05': 0, 't30': 0, 't36': 0, 't27': 0, 't29': 0, 't43': 0, 't48': 0}
# 작업에 필요한 칼럼 및 가지를 선택해서 지도에 마커를
# 표시할 때 사용할 데이터가 저장된 데이터프레임을 만든다.
# s_name => 지점이름
# sido_code => 시도코드
# sido_name => 시도이름
# gugun_code => 구군코드
# gugun_name => 구군이름
# ,doro_address => 도로명주소
# lat => 위도
# lot => 경도
star_df_map = star_df[['s_name','sido_code','sido_name','gugun_code',
'gugun_name','doro_address','lat','lot']]
star_df_map.head()
s_name | sido_code | sido_name | gugun_code | gugun_name | doro_address | lat | lot | |
---|---|---|---|---|---|---|---|---|
0 | 역삼아레나빌딩 | 01 | 서울 | 0101 | 강남구 | 서울특별시 강남구 언주로 425 (역삼동) | 37.501087 | 127.043069 |
1 | 논현역사거리 | 01 | 서울 | 0101 | 강남구 | 서울특별시 강남구 강남대로 538 (논현동) | 37.510178 | 127.022223 |
2 | 신사역성일빌딩 | 01 | 서울 | 0101 | 강남구 | 서울특별시 강남구 강남대로 584 (논현동) | 37.514132 | 127.020563 |
3 | 국기원사거리 | 01 | 서울 | 0101 | 강남구 | 서울특별시 강남구 테헤란로 125 (역삼동) | 37.499517 | 127.031495 |
4 | 대치재경빌딩R | 01 | 서울 | 0101 | 강남구 | 서울특별시 강남구 남부순환로 2947 (대치동) | 37.494668 | 127.062583 |
star_df_map.dtypes
s_name object
sido_code object
sido_name object
gugun_code object
gugun_name object
doro_address object
lat object
lot object
dtype: object
star_df_map['lat'] = star_df_map['lat'].astype(float)
star_df_map['lot'] = star_df_map['lot'].astype(float)
star_df_map.dtypes
s_name object
sido_code object
sido_name object
gugun_code object
gugun_name object
doro_address object
lat float64
lot float64
dtype: object
#종각점
star_df_map[star_df_map['s_name']=='종각']
s_name | sido_code | sido_name | gugun_code | gugun_name | doro_address | lat | lot | |
---|---|---|---|---|---|---|---|---|
431 | 종각 | 01 | 서울 | 0118 | 종로구 | 서울특별시 종로구 종로 64 (종로2가) | 37.569918 | 126.984528 |
#종로관철점
star_df_map[star_df_map['s_name']=='종로관철']
s_name | sido_code | sido_name | gugun_code | gugun_name | doro_address | lat | lot | |
---|---|---|---|---|---|---|---|---|
433 | 종로관철 | 01 | 서울 | 0118 | 종로구 | 서울특별시 종로구 종로12길 21, 2층 (관철동) | 37.569058 | 126.986013 |
# folium 모듈의 Map()함수로 location 속성으로 지정한
# 위치를 중심으로 하는 zoom_start옵션으로 지정한
# 배율을 가지는 지도를 만든다.
star_map = folium.Map(location=[37.56996875550683, 126.98374888362954], zoom_start=18)
# folium 모듈의 Marker()함수로 location 속성으로 지정한
# 위치에 마커를 만들고 addto()함수로 지도에 추가한다.
# folium 모듈의 Popup()함수로 마커를 클릭했을 때
# 표시할 팝업 메시지와 max_width속성으로 팝업메시지
# 표시되는 창의 최대 크기를 지정할 수 있다.
popup = folium.Popup('종각점', max_width=200)
folium.Marker(location=[37.56996875550683, 126.98374888362954],
popup=popup).add_to(star_map)
popup = folium.Popup('종로 관철점점', max_width=200)
folium.Marker(location=[37.56919236504892, 126.98600579712074],
popup=popup).add_to(star_map)
star_map.save('./output/star1.html')
star_map
# 서울특별시에 위치한 스타벅스 전 지점의 위치를 지도위에
# 표시한다.
# 지도를 작성할 때 지도의 중심으로 설정할 위치가 애매할 경우
# 지도위에 표시할 모든 스타벅스의 위도,경도위치의 평균을
# 중심으로 하는 지도를 만들면 된다.
star_map = folium.Map(location=[star_df_map['lat'].mean(),
star_df_map['lot'].mean()],
zoom_start=18)
# iterrows() 함수는 데이터프레임에 저장된 데이터의 인덱스와
# 그 인덱스에 해당되는 데이터를 얻어온다.
for index, data in star_df_map.iterrows():
popup = folium.Popup(data['s_name'] + '점, 주소 : ' +data['doro_address'], max_width=300)
folium.Marker(location=[data['lat'], data['lot']], popup=popup).add_to(star_map)
star_map.save('./output/star2.html')
star_map
# 강남구 스타벅스 전 지점
targetSite = 'https://www.starbucks.co.kr/store/getStore.do?r=V412YZ6GQ3'
request = requests.post(targetSite, data={
'ins_lat' : 37.2700715, # 위도
'ins_lng': 127.1273485, # 경도
'p_sido_cd' : '01', #시도코드
'p_gugun_cd': '', #구군코드
'in_biz_cd': '', #?
'iend' : 1600, #서버가 응답하는 최대 매장의 개수
'set_date' : '' #?
})
storeList = request.json()
star_df = json_normalize(storeList, 'list')
star_df_map = star_df[['s_name','sido_code','sido_name','gugun_code',
'gugun_name','doro_address','lat','lot']]
star_df_map['lat'] = star_df_map['lat'].astype(float)
star_df_map['lot'] = star_df_map['lot'].astype(float)
star_map = folium.Map(location=[star_df_map['lat'].mean(),
star_df_map['lot'].mean()],
zoom_start=12)
for index, data in star_df_map.iterrows():
popup = folium.Popup(data['s_name'] + '점, 주소 : ' +data['doro_address'], max_width=300)
folium.Marker(location=[data['lat'], data['lot']], popup=popup).add_to(star_map)
star_map.save('./output/star3.html')
star_map
댓글남기기