파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)

반응형

파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터) ㅣ 서울 부동산 매매가를 조회하는 메소드가 잘 동작하는 것을 알았으니, 다 되었습니다. 약간 구조를 바꾸어서 서울 이외 지역의 부동산 매매가를 조회하는 메소드를 만들어보겠습니다.

파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)

파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)

2024.09.14 - [부동산/자동화 프로젝트] - 파이썬 부동산 매매가 조회 프로그램 만들기 1편

2024.09.14 - [부동산/자동화 프로젝트] - 파이썬 부동산 매매가 조회 프로그램 만들기 2편 (지역코드)

2024.09.14 - [부동산/자동화 프로젝트] - 파이썬 부동산 매매가 조회 프로그램 만들기 3편 (서울아파트 컬럼 정리)

서울 이외 지역 부동산 매매가를 조회하는 메소드

# 사용자에게 시/도 이름을 입력받습니다.
si_do_name = input("시/도를 입력하세요 (예: 서울특별시): ")
si_do_code = converter.get_si_do_code(si_do_name)

if si_do_code is None:
    print(f"'{si_do_name}'에 해당하는 시/도를 찾을 수 없습니다.")
else:
    # 입력받은 시/도에 대한 시/군/구 코드 리스트 가져오기
    sigungu_list = converter.get_sigungu(si_do_code)

    # 모든 시/군/구 데이터를 수집할 DataFrame 초기화
    all_data = pd.DataFrame()

그냥 이전에 문자열로 "서울" 로 넣던 부분을 사용자에게 입력받아서 실행하도록 변경하였습니다. 저는 시험을 하기 위해서 충청남도를 검색하니, 충청남도 아파트 값을 잘 읽어 들이네요.

서울 이외 지역 부동산 매매가를 조회하는 메소드

자동화를 위한 입력시간 제한

나중에 해당 소스를 자동화하기 위해서 만약 사용자에게 10초 이내 입력값을 받지 못하면, 전국을 조사하도록 코드를 변경합니다.

# 사용자에게 시/도를 물어봄
si_do_name = get_user_input("시/도를 입력하세요 (10초 이내 입력): ")

# 시/도가 제공되지 않았거나 유효하지 않은 경우 전체 데이터 조회
if not si_do_name or si_do_name not in [district["si_do_name"] for district in converter.districts]:
    si_do_name = None
    print("유효하지 않은 시/도 입력 또는 입력이 없어서 전체 데이터를 조회합니다.")
else:
    print(f"{si_do_name}에 대한 데이터를 조회합니다.")

# 시/도 코드 및 시/군/구 리스트 가져오기
si_do_code = converter.get_si_do_code(si_do_name) if si_do_name else None
sigungu_list = converter.get_sigungu(si_do_code) if si_do_code else [sigungu for district in converter.districts for sigungu in district["sigungu"]]

# 모든 시/군/구 데이터를 수집할 DataFrame 초기화
all_data = pd.DataFrame()

이렇게 하면 10초 이내 시/도를 입력하지 않을 경우 전국의 데이터를 조사합니다.

반응형

파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)
파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)

위와 같이 나옵니다.
코드를 만지면서 중간에 컬럼 제목이 다시 원상태가 되었고, 시/도명이 '전국'으로만 표시 되는 문제가 있네요. 그래서 조금 수정하는 겸, 기조회기간도 설정해보도록 하겠습니다. 이렇게 서울 이외의 지역에 대해서, 아파트가 아닌 부동산에 대해서 조회해보았습니다.

파이썬 부동산 매매가 조회 프로그램 만들기 4편 (전국 데이터)

 

서울특별시_202401_202402_매매.csv
0.76MB

다음 포스트에서는 필터역할을 해주는 메소드를 만들어서, 매매가 데이터에 대해 필터링을 해보겠습니다.

import json
import os
import pandas as pd
from google.colab import drive
import PublicDataReader as pdr
from PublicDataReader import TransactionPrice
from datetime import datetime

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

    def __read_district_file(self):
        # Google 드라이브를 마운트합니다.
        drive.mount('/content/drive')

        # 드라이브 내의 JSON 파일 경로를 설정합니다.
        json_file_path = '/content/drive/MyDrive/district.json'
        
        # 파일을 열어서 내용을 읽고 JSON으로 변환합니다.
        with open(json_file_path, 'r') as f:
            return json.loads(f.read())

    def get_si_do_code(self, si_do_name):
        for district in self.districts:
            if si_do_name == 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 == district["si_do_code"]:
                return district["sigungu"]

def get_user_input(prompt, default_value=None):
    try:
        user_input = input(prompt)
        return user_input if user_input.strip() else default_value
    except EOFError:
        return default_value

# 사용자로부터 시/도와 기간을 입력 받음
si_do_name = get_user_input("시/도를 입력하세요 (예: 서울특별시) 또는 '전국' 입력: ", "전국")
start_year_month = get_user_input("조회 시작 년월 (YYYYMM 형식, 예: 202301): ", None)
end_year_month = get_user_input("조회 종료 년월 (YYYYMM 형식, 예: 202312): ", None)

# 현재 날짜를 기준으로 기간을 설정
now = datetime.now()
current_year_month = now.strftime("%Y%m")

# 기간을 설정합니다.
if not start_year_month:
    start_year_month = f"{now.year}01"
if not end_year_month:
    end_year_month = current_year_month

# DistrictConverter 인스턴스 생성
converter = DistrictConverter()

# 서울특별시와 모든 시/군/구 데이터를 수집할 DataFrame 초기화
all_data = pd.DataFrame()

# 전체 시/도 조사
if si_do_name == "전국":
    for district in converter.districts:
        si_do_code = district["si_do_code"]
        sigungu_list = district["sigungu"]
        for sigungu in sigungu_list:
            sigungu_code = sigungu["sigungu_code"]
            sigungu_name = sigungu["sigungu_name"]

            print(f"Processing data for {sigungu_name} ({sigungu_code})")

            # 부동산 데이터를 가져옴
            df = api.get_data(
                property_type="아파트",
                trade_type="매매",
                sigungu_code=sigungu_code,
                start_year_month=start_year_month,
                end_year_month=end_year_month
            )

            # 시/군/구 이름 및 시/도 이름을 새로운 컬럼으로 추가
            df["sigungu_name"] = sigungu_name
            df["si_do_name"] = district["si_do_name"]

            # 가져온 데이터를 all_data에 추가
            all_data = pd.concat([all_data, df], ignore_index=True)
else:
    si_do_code = converter.get_si_do_code(si_do_name)
    sigungu_list = converter.get_sigungu(si_do_code)

    for sigungu in sigungu_list:
        sigungu_code = sigungu["sigungu_code"]
        sigungu_name = sigungu["sigungu_name"]

        print(f"Processing data for {sigungu_name} ({sigungu_code})")

        # 부동산 데이터를 가져옴
        df = api.get_data(
            property_type="아파트",
            trade_type="매매",
            sigungu_code=sigungu_code,
            start_year_month=start_year_month,
            end_year_month=end_year_month
        )

        # 시/군/구 이름 및 시/도 이름을 새로운 컬럼으로 추가
        df["sigungu_name"] = sigungu_name
        df["si_do_name"] = si_do_name

        # 가져온 데이터를 all_data에 추가
        all_data = pd.concat([all_data, df], ignore_index=True)

# 데이터 열 이름을 한국어로 변환
columns_to_select = {
    "si_do_name": "시도",
    "sigungu_name": "시군구",
    "umdNm": "법정동",
    "roadNm": "도로명",
    "bonbun": "지번",
    "aptNm": "아파트",
    "buildYear": "건축년도",
    "excluUseAr": "전용면적",
    "floor": "층",
    "dealYear": "거래년도",
    "dealMonth": "거래월",
    "dealDay": "거래일",
    "dealAmount": "거래금액",
    "aptSeq": "일련번호",
    "dealingGbn": "거래유형",
    "estateAgentSggNm": "중개사소재지",
    "cdealType": "해제여부",
    "cdealDay": "해제사유발생일"
}

# 필요한 열만 남기고 한국어 열 이름으로 변경
selected_data = all_data.rename(columns=columns_to_select)[list(columns_to_select.values())]

# 파일명을 규칙적으로 지정
file_name = f'{si_do_name if si_do_name != "전국" else "전체"}_{start_year_month}_{end_year_month}_매매.csv'.replace(" ", "")
csv_path = f'/content/drive/MyDrive/{file_name}'

# 필요한 열만 남긴 데이터를 CSV 파일로 저장 (utf-8-sig 인코딩으로 저장)
selected_data.to_csv(csv_path, index=False, encoding='utf-8-sig')

# 파일 저장 후, 선택된 데이터의 일부를 출력하여 확인
print(selected_data.head())

 

728x90
반응형