Problem

Goal : 교통사고 데이터의 위경도를 통해 행정동 주소를 반환

data

data2



1. 카카오 API


  • 앱 만들기 kakao1

  • key 발급 kakao2


2. 역지오코딩

import json
import sys
import pandas as pd
import requests
from datetime import *

# 전역 변수
accident_data = 'accident.csv'
location_data = 'location.csv'
APP_KEY = ''    # 발급받은 키 입력
URL = 'https://dapi.kakao.com/v2/local/geo/coord2regioncode.json'


  • json 데이터 요청

kakao3

def json_request(url='', encoding='utf-8', success=None, error=lambda e: print('%s : %s' % (e, datetime.now()), file=sys.stderr)):
    headers = {'Authorization': 'KakaoAK {}'.format(APP_KEY)}
    resp = requests.get(url, headers=headers)
    print('%s : success for request [%s]' % (datetime.now(), url))

    return resp.text


  • json 데이터 파싱해서 행정동 주소 반환 (region_3depth_name)

kakao4

def reverse_geocode(longitude, latitude):
    # 파라미터 최적화하여 url 생성
    url = '%s?x=%s&y=%s' %(URL, longitude, latitude)

    # json request
    try:
        json_req = json_request(url=url)
        json_data = json.loads(json_req)
        json_doc = json_data.get('documents')[1]
        json_name = json_doc.get('region_3depth_name')
    except:
        json_name = 'NaN'

    return json_name


  • 교통사고 파일에서 경위도 추출해서 동 주소 반환
def get_address(data):
    address = []

    # 경도, 위도 추출해서 동 주소 반환
    for i in range(len(data)):
        longitude = data['경도'][i]
        latitude = data['위도'][i]
        address.append(reverse_geocode(longitude, latitude))

    return address  # 전처리 함수에서 주소 리스트 받아서 데이터프레임에 추가


  • main 함수
def main():
    # 파일 읽기
    data = pd.read_csv(accident_data, encoding='euc-kr')
    location = pd.read_csv(location_data, encoding='euc-kr')

    address = get_address(data)
    data = preprocess(data, address, location)  # 전처리 함수(생략했음)

    # 최종 파일 저장
    data.to_csv('%s_final.csv' % (accident_data[:-4]), sep=',', encoding='euc-kr')

if __name__ == '__main__':
    main()