Categories: '교육'

파이썬 부동산 매매가 조회 프로그램 만들기 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())

 

urjent

Share
Published by
urjent

Recent Posts

박병호 은퇴식, 아들의 시구에 시타로 답한 418개 홈런 왕의 마지막 그라운드

박병호 은퇴식이 2026년 4월 26일 고척스카이돔에서 키움 히어로즈와 삼성 라이온즈 경기 전 진행되며 16년 프로…

1시간 ago

트럼프 총격 사건, 백악관 기자단 만찬 현장 상황과 향후 전망 총정리

2026년 4월 25일 워싱턴 힐튼 호텔에서 열린 백악관 출입기자단 만찬 도중 갑작스러운 총격 사건이 발생해…

8시간 ago

하늘 추락 목격담 진실은? 2026 년 수도권 밤하늘 가른 거대 불덩이 정체 완벽 분석

2026 년 4 월 24 일 저녁 8 시 30 분경 수도권 상공에서 거대한 불꽃이…

1일 ago

구성환 국토대장정 완주, 꽃분이를 위한 446km 눈물의 여정 2026년 4월 24일 방송

배우 구성환이 446km의 국토대장정을 완주하며 11년간 키운 반려견 꽃분이에게 "잘 갔지? 나중에 봐"라고 오열하며 작별…

2일 ago

2026년 4월 24일 목동 지게차 사고로 40대 여성 숨져, 신호 위반 60대 운전자 체포

2026년 4월 24일 오전 8시 3분, 서울 양천구 신목동역 인근 도로에서 신호 위반한 지게차가 자전거를…

2일 ago

말레이시아 한국인 구조 속보, 납치범 3 명 모두 한국인 검거 완료

말레이시아 쿠알라룸푸르에 거주하던 40 대 한국인 남성이 납치 4 일 만에 현지 당국에 의해 무사히…

2일 ago