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

금강수목원 재개장, 충남도·세종시가 공공성 회복 방안을 논의한다

금강수목원은 2025년 은 행정 기준으로 폐지돼 한년간 방치된 뒤 재개장 논의가 본격화됐다. 충남도는 2026년 7월…

18시간 ago

삼천당제약 주식, 상한가와 하한가를 잇는 급등락의 비밀 6페이지로 짜리 차트분석

2026년 7월 21일 주식시장은 상한가를 기록한 삼천당제약 주식이 하한가로 전환된 놀라운 변화를 보였습니다. 이날 코스닥에서는…

21시간 ago

인천 선관위 직원 사망 사건, 사무실서 50대 직원 숨진 채 발견…경찰 수사 착수

인천 선관위 사무실에서 50대 직원이 숨진 채 발견돼 경찰이 정확한 경위 파악에 나섰다. 발견 당시…

1일 ago

메자닌 구조 화재 취약성, 쿠팡 인천 물류센터 사례로 본 문제점

인천 쿠팡 석남동 32물류센터에서 발생한 대형 화재가 사흘 넘게 지속되면서 메자닌 구조의 화재 취약성이 다시…

2일 ago

개미 디저트 식품위생법 위반 사건, 미슐랭 2스타 레스토랑 대표 징역 1년 구형

개미 디저트 식품위생법 위반으로 대표가 징역 1년을 구형되는 사건이 2026년 7월 20일 서울서부지방법원에서 재판이 진행됐습니다.…

2일 ago

보완수사권 토론 취소, 이건태 하루 만에 철회하고 한동훈은 도망이라 비판

더불어민주당 이건태 의원이 한동훈 무소속 의원과 예정했던 검찰 보완수사권 폐지 공개토론을 수락한 지 하루 만인…

4일 ago