만약 데이터 특정상 선택한 문자열을 지도에서 검색해서 입력해야하는 경우 데이터가 방대하면 이를 절대 수동으로 할수가 없다. 그래서 현실의 데이터들을 모은 외부의 api데이터를 이용한다.
api는 Application Programming Interface의 약자로 유저가 서버에 요청하면 그서버에서 인증을 거친후 데이터를 제공하는 일종의 서비스다.
그림을 보면 조금은 이해가 갈껏이다.
그럼 실습을 통해 api를 써보자
우선 데이터를 불러올 준비를 하자
#서울시 범죄현황 데이터 불러보기
# 한글을 파이썬 환경에 적용
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
%matplotlib inline
import platform
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
else:
print('Unknown system... sorry~~~~')
#데이터를 불러드린다.
df = pd.read_csv('../data/crime_in_Seoul.csv', encoding='euc-kr')
df
데이터를 잘보자 경찰서의 따른 지역 컬럼이 없다. 추가 해줘야 분석을 할수 있다.
api데이터로 지도 데이터가 필요하기 때문에 구글의 지도 api데이터를 이용해본다.
우선 구글api키가 필요하다.
https://cloud.google.com/maps-platform/?hl=ko
Google Maps Platform - Location and Mapping Solutions
Create real world and real time experiences for your customers with dynamic maps, routes & places APIs from Google Maps Platform’s location solutions.
mapsplatform.google.com
여기에 접속하여
콘솔로 이동 => Geocoding API 선택 => 사용자인증정보 에서 API 키 생성 순서대로 적용한다.(결제 수단 필요)
위에 순서대로 진행하였다면 자기의 api키를 확인하고 복사 한뒤
다음과 같이 진행한다.
#아나콘다 프롬프트 실행 후, pip install googlemaps 실행
import googlemaps
gmaps_key = " #key입력란 " # 자신의 key를 사용합니다.
gmaps = googlemaps.Client(key=gmaps_key)
이제 한번 데이터 검색을 해본다.
gmaps.geocode('서울서대문경찰서', language='ko')#검색할꺼 입력
>>>[{'address_components': [{'long_name': '113',
'short_name': '113',
'types': ['premise']},
{'long_name': '통일로',
'short_name': '통일로',
'types': ['political', 'sublocality', 'sublocality_level_4']},
{'long_name': '서대문구',
'short_name': '서대문구',
'types': ['political', 'sublocality', 'sublocality_level_1']},
{'long_name': '서울특별시',
'short_name': '서울특별시',
'types': ['administrative_area_level_1', 'political']},
{'long_name': '대한민국',
'short_name': 'KR',
'types': ['country', 'political']},
{'long_name': '120-020',
'short_name': '120-020',
'types': ['postal_code']}],
'formatted_address': '대한민국 서울특별시 서대문구 통일로 113',
'geometry': {'location': {'lat': 37.5647439, 'lng': 126.9667705},
'location_type': 'ROOFTOP',
'viewport': {'northeast': {'lat': 37.5660928802915,
'lng': 126.9681194802915},
'southwest': {'lat': 37.5633949197085, 'lng': 126.9654215197085}}},
'partial_match': True,
'place_id': 'ChIJCZy8woiifDURz7CV6Khfi18',
'plus_code': {'compound_code': 'HX78+VP 대한민국 서울특별시',
'global_code': '8Q98HX78+VP'},
'types': ['establishment', 'point_of_interest', 'police']}]
결과가 길게 나오지만 위와 같이 나왔다면 성공이다.
이제 컬럼의 관서명을 고쳐주자
names = '서울' + df['관서명'].str[:-2+1 ] + '경찰서' #관서명을 서울##경찰서 형식으로
station_names = names.to_list() #이름을 리스트로 바꾼후 station_names에 저장
station_names
>>>['서울중부경찰서',
'서울종로경찰서',
'서울남대문경찰서',
'서울서대문경찰서',
'서울혜화경찰서',
'서울용산경찰서',
'서울성북경찰서',
'서울동대문경찰서',
'서울마포경찰서',
'서울영등포경찰서',
'서울성동경찰서',
'서울동작경찰서',
'서울광진경찰서',
'서울서부경찰서',
'서울강북경찰서',
'서울금천경찰서',
'서울중랑경찰서',
'서울강남경찰서',
'서울관악경찰서',
'서울강서경찰서',
'서울강동경찰서',
'서울종암경찰서',
'서울구로경찰서',
'서울서초경찰서',
'서울양천경찰서',
'서울송파경찰서',
'서울노원경찰서',
'서울방배경찰서',
'서울은평경찰서',
'서울도봉경찰서',
'서울수서경찰서']
관서명이 제대로 고쳐졌다.
이제 아까 api데이터에서 주소만 뽑아오는 코드를 세워보자
data = gmaps.geocode('서울중부경찰서', language= 'ko')
address = data[0]["formatted_address"]
address
>>>'대한민국 서울특별시 중구 수표로 27'
그걸 for문을 사용해 위에 관서명들을 넣어주자
station_address = []
for name in station_names :
data = gmaps.geocode(name, language= 'ko')
address = data[0]['formatted_address']
station_address.append(address)
station_address
>>>['대한민국 서울특별시 중구 수표로 27',
'대한민국 서울특별시 종로구 인사동5길 41',
'대한민국 서울특별시 중구 한강대로 410',
'대한민국 서울특별시 서대문구 통일로 113',
'대한민국 서울특별시 종로구 창경궁로 112-16',
'대한민국 서울특별시 용산구 백범로 329',
'대한민국 서울특별시 성북구 삼선동 보문로 170',
'대한민국 서울특별시 동대문구 약령시로21길 29',
'대한민국 서울특별시 마포구 마포대로 183',
'대한민국 서울특별시 영등포구 국회대로 608',
'대한민국 서울특별시 성동구 행당동 왕십리광장로 9',
'대한민국 서울특별시 동작구 노량진로 148',
'대한민국 서울특별시 광진구 구의동 자양로 167',
'대한민국 서울특별시 은평구 진흥로 58',
'대한민국 서울특별시 강북구 오패산로 406',
'대한민국 서울특별시 금천구 시흥대로73길 50',
'대한민국 서울특별시 중랑구 묵2동 249-2',
'대한민국 서울특별시 강남구 테헤란로114길 11',
'대한민국 서울특별시 관악구 관악로5길 33',
'대한민국 서울특별시 양천구 신월동 화곡로 73',
'대한민국 서울특별시 강동구 성내로 57',
'대한민국 서울특별시 성북구 종암로 135',
'대한민국 서울특별시 구로구 가마산로 235',
'대한민국 서울특별시 서초구 서초3동 반포대로 179',
'대한민국 서울특별시 양천구 목동동로 99',
'대한민국 서울특별시 송파구 중대로 221',
'대한민국 서울특별시 노원구 노원로 283',
'대한민국 서울특별시 서초구 동작대로 204',
'대한민국 서울특별시 은평구 연서로 365',
'대한민국 서울특별시 도봉구 노해로 403',
'대한민국 서울특별시 강남구 개포로 617']
각 관서에 따른 주소가 나왔다.
이제 이 데이터리스트를 다시 새로운 컬럼으로 저장하자
gu_list = []
for index in np.arange(0, 30+1) :
name = station_address[index].split()[2] #문자열에서 '구'로 끝나는것만 추출
gu_list.append(name)
gu_list
>>>['중구',
'종로구',
'중구',
'서대문구',
'종로구',
'용산구',
'성북구',
'동대문구',
'마포구',
'영등포구',
'성동구',
'동작구',
'광진구',
'은평구',
'강북구',
'금천구',
'중랑구',
'강남구',
'관악구',
'양천구',
'강동구',
'성북구',
'구로구',
'서초구',
'양천구',
'송파구',
'노원구',
'서초구',
'은평구',
'도봉구',
'강남구']
df['구별'] = gu_list
df
이제 각 관서에 구별 주소데이터가 저장되어 있는것을 알 수 있다. 구글 api데이터를 활용하여 이렇게 주소를 빠르게 찾아 찍을수 있다.
'파이썬 함수' 카테고리의 다른 글
머신러닝(9) confusionmatrix 값 시각화 하기 (0) | 2022.12.02 |
---|---|
pandas 라이브러리(15) 표준화와 정규화,차트와 데이터 관계분석 (0) | 2022.11.30 |
pandas 라이브러리(11) pandas 데이터 내에 문자열 슬라이싱 (0) | 2022.11.30 |
pandas 라이브러리(10) 엑셀데이터 불러오기 (1) | 2022.11.30 |
pandas라이브러리(9) 데이터 프레임에서 찾는값이 아닌걸 엑세스 할 경우 (0) | 2022.11.29 |