RUBY
[CRIME] 8. Google Maps을 이용한 데이터 정리 본문
서울시 범죄 현황 데이터 분석 프로젝트
8. Google Maps을 이용한 데이터 정리
1. Google Maps API를 설치하자
conda install -c conda-forge googlemaps
은근히 시간이 걸리니 천천히 기다려주자.
2. 구글맵을 import 하자!
import googlemaps
gmaps_key = "방금 발급받은 Geocoding api key값 입력"
gmaps = googlemaps.Client(key=gmaps_key)
3. 구글맵 API 단순 테스트 해보기
gmaps.geocode("서울영등포경찰서", language="ko")
아 주 잘 출력된다~
4.
- 구글 맵 API에서 데이터 얻기
- 전체 결과 크기가 1인 list형이라서 tmp[0]로 접근
- 큰 리스트 안에 dict형이다.
- dict형에서 데이터를 얻는 get명령을 사용한다.
tmp = gmaps.geocode("서울영등포경찰서", language="ko")
print(tmp[0].get("geometry")["location"]["lat"])
print(tmp[0].get("geometry")["location"]["lng"])
print(tmp[0].get("formatted_address"))
5.
- 전체 주소에서 필요한 구 이름만 가져와보자
tmp = tmp[0].get("formatted_address")
tmp.split()
tmp.split()[2]
6.
- 구별, lat, lng 컬럼
7.
- 경찰서 이름에서 소속된 구 이름 얻기
- 구이름과 위도 경도 정보를 저장할 준비
- 반복문을 이용해서 위 표의 NaN을 모두 채워줍니다.
- iterrows()
8.
count = 0
for idx, rows in crime_station.iterrows():
station_name = "서울" + str(idx) + "경찰서"
tmp = gmaps.geocode(station_name, language="ko")
tmp[0].get("formatted_address")
tmp_gu = tmp[0].get("formatted_address")
lat = tmp[0].get("geometry")["location"]["lat"]
lng = tmp[0].get("geometry")["location"]["lng"]
crime_station.loc[idx, "lat"] = lat
crime_station.loc[idx, "lng"] = lng
crime_station.loc[idx, "구별"] = tmp_gu.split()[2]
print(count)
count = count + 1
아... 또 에러다..
0
1
2
3
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[70], line 14
12 crime_station.loc[idx, "lat"] = lat
13 crime_station.loc[idx, "lng"] = lng
---> 14 crime_station.loc[idx, "구별"] = tmp_gu.split()[2]
16 print(count)
17 count = count + 1
IndexError: list index out of range
IndexError: list index out of range는 list 범위 밖에 있는 인덱스를 가져오려고 해서 에러가 난 것이다.
수정해준다.
count = 0
for idx, rows in crime_station.iterrows():
station_name = "서울" + str(idx) + "경찰서"
tmp = gmaps.geocode(station_name, language="ko")
tmp[0].get("formatted_address")
tmp_gu = tmp[0].get("formatted_address")
lat = tmp[0].get("geometry")["location"]["lat"]
lng = tmp[0].get("geometry")["location"]["lng"]
crime_station.loc[idx, "lat"] = lat
crime_station.loc[idx, "lng"] = lng
crime_station.loc[idx, "구별"] = tmp_gu.split()[1]
print(count)
count = count + 1
9.
잘 고쳐졌나 보자.
crime_station.head()
Gooooood!!!
10. 코드를 한 번 뜯어보자.
1) crime_station에서 index(idx)와 나머지(rows)를 받아서 반복문을 수행한다.
2) station_name : 구글 검색을 용이하게 하기 위해 검색어를 가급적 상세하게 잡아준다.
앞서 수행한 formatted_address에서 구 이름을 잡는 과정은 그대로 진행한다.
3) loc 옵션을 사용한다.
행(idx)과 열('lat', 'lng', '구별')을 지정해서 구글 검색에서 얻은 정보를 기록한다.
11.
- 여기서 두 줄의 컬럼을 하나씩 합치는 걸로 하자
- 예를 들어 강도검거, 강도발생
crime_station.columns.get_level_values(0)[2] + crime_station.columns.get_level_values(1)[2]
len(crime_station.columns.get_level_values(0))
tmp = [
crime_station.columns.get_level_values(0)[n] + crime_station.columns.get_level_values(1)[n]
for n in range(0, len(crime_station.columns.get_level_values(0)))
]
tmp
tmp, len(tmp), len(crime_station.columns.get_level_values(0))
crime_station.columns = tmp
crime_station.head()
컬럼이 예쁘게 정리되었다.
12. 저장한다..
crime_station.to_csv("../data/02. crime_in_Seuol_raw.csv", sep=",", encoding="utf-8")
'데이터 분석 > EDA_웹크롤링_파이썬프로그래밍' 카테고리의 다른 글
[CRIME] 10. 범죄 데이터 정렬을 위한 데이터 정리 (0) | 2023.02.03 |
---|---|
[CRIME] 9. 구별 데이터 얻기 (1) | 2023.02.03 |
[CRIME] 7. Python의 반복문 (0) | 2023.02.03 |
[CRIME] 6. Google Maps API설치하기 (0) | 2023.02.03 |
[CRIME] 5. Python 모듈 설치하기(pip, conda) (0) | 2023.02.03 |