본문 바로가기
파이썬으로 부동산 매매가 조회기 만들기

파이썬으로 부동산 매매가 조회기 만들기 - 3. 지역별 코드 컨버터 만들기

by 유티끌 2023. 1. 6.

null

파이썬으로 부동산 매매가 조회기 만들기 - 3. 지역별 코드 컨버터 만들기

저번 포스팅에서 지역구분 코드를 json파일을 만들어보았습니다. 이것을 Read해서 필요한대로 사용하도록 몇가지 메소드를 만들어야 쓰기 편할 것 같습니다.

음, 그 전에 파일 구성을 좀 확인해야겠습니다.

파일트리

null

파일트리는 위와 같습니다. 이번 프로젝트에서 테스트는 주피터 노트북을 이용해서 좀 더 쉽고 빠르게 테스트해보겠습니다.
전체 파일트리는 아래와 같습니다.

null

저의 다른 카테고리에 있는 소형주 스크리닝 코드들과 같은 프로젝트에서 사용하려고 합니다. 왜냐하면 excel로 export하는 등의 로직은 이미 만들어놓았기 때문에, 재사용하면 훨씬 편하기 떄문입니다.

DistrictConverter

다음으로 첫번째는 json파일을 읽은 후에 필요한 데이터들을 추출해내는 클래스를 하나 만듭니다.

property.const.distrct_converter.py

class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        _path = os.path.dirname(__file__)
        _project_root_path = os.path.dirname(_path)
        _json_file_path = f"""{_project_root_path}/district_data/district.json"""

        with open(f"""{_json_file_path}""", "r") as f:
            return json.loads(f.read())

일단 읽기전용의 메소드를 하나 선언한다음, 프로젝트 폴더의 루트를 이용해서 파일을 읽어드립니다. 제가 작성한 지역구분코드가 담긴 json파일은, 프로젝트 루트폴더 하위에 property.district_data.district.json 에 위치하고 있습니다. 그래서 __read_district_file() 내용을 보시면 이 property 폴더를 기준으로 수행합니다.

이 메소드를 이용해서, 생성자에서 호출하여 json파일을 읽습니다.

그 다음으로 시도 이름과 코드를 구하는 메소드입니다.

    def get_si_do_name(self, si_do):
        for district in self.districts:
            if si_do in district["si_do_name"]:
                return district["si_do_name"]

    def get_si_do_code(self, si_do_name):
        for district in self.districts:
            if si_do_name in district["si_do_name"]:
                return district["si_do_code"]

이게 파이썬은 한줄로도 표현이 가능한데 파이썬이 익숙치가 않아서... 제가 쓰기 편한대로 작성하였습니다.
입력받은 시도 이름으로 시도데이터를 찾아 이름 혹은 코드를 리턴합니다.
예를 들어 서울 만 입력해도 서울특별시 의 이름이나 혹은 코드를 리턴하는 식입니다.

다음으로는 시군구 데이터입니다.

    def get_sigungu(self, si_do_code):
        for district in self.districts:
            if si_do_code in district["si_do_code"]:
                return district["sigungu"]

    def get_sigungu_list(self, si_do_code, sigungu_name):
        sigungu_list = []
        sigungu_data = self.get_sigungu(si_do_code)
        for sigungu in sigungu_data:
            if sigungu_name in sigungu["sigungu_name"]:
                sigungu_list.append(sigungu)

        return sigungu_list

첫번째 메소드는, 시도의 코드를 입력받아 일치하는 시도데이터가 있으면 해당 시도 하위 시군구 데이터를 리턴합니다.
두번째 메소드는 시도코드를 이용해서 특정 시도 하위에 시군구 데이터를 확인하고, 그 시군구 데이터 안에서 찾고자하는 시군구가 있으면 리스트에 담아 리턴합니다.

예를들어, 경기도 하위에 성남시의 경우에는 아래와 같은 시군구데이터가 있습니다.

  • 성남시
  • 성남시 수정구
  • 성남시 중원구
  • 성남시 분당구

그리고 구 하위에 다시 읍면동 데이터들이 위치해 있습니다. 따라서 성남시 만 딱 넣으면, 하나만 찾을 수 있는게 아니라 여러개를 찾을 수 있는거죠.
그래서 리스트형태로 시군구리스트를 찾는 메소드를 만들었습니다.

컨버터는 현재상황에서는 딱 이정도만 구현했습니다. 앞으로 다른 api를 사용하게되면 좀 더 메소드가 늘어날 숟는 있겠네요.

아래는 전체 코드입니다.

import json
import os

"""
도시별 구역 데이터 모음
"""


class DistrictConverter:
    def __init__(self):
        self.districts = self.__read_district_file()

    def __read_district_file(self):
        _path = os.path.dirname(__file__)
        _project_root_path = os.path.dirname(_path)
        _json_file_path = f"""{_project_root_path}/district_data/district.json"""

        with open(f"""{_json_file_path}""", "r") as f:
            return json.loads(f.read())

    def get_data(self):
        return self.districts

    def get_si_do_name(self, si_do):
        for district in self.districts:
            if si_do in district["si_do_name"]:
                return district["si_do_name"]

    def get_si_do_code(self, si_do_name):
        for district in self.districts:
            if si_do_name in district["si_do_name"]:
                return district["si_do_code"]

    def get_sigungu(self, si_do_code):
        for district in self.districts:
            if si_do_code in district["si_do_code"]:
                return district["sigungu"]

    def get_sigungu_list(self, si_do_code, sigungu_name):
        sigungu_list = []
        sigungu_data = self.get_sigungu(si_do_code)
        for sigungu in sigungu_data:
            if sigungu_name in sigungu["sigungu_name"]:
                sigungu_list.append(sigungu)

        return sigungu_list

다음포스트에서는 공공데이터를 읽어와서, 컬럼이름을 수정하고, 전용면적을 평수로 계산하는 메소드를 구현해봅니다.

반응형

댓글