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

파리바게뜨 가격 인상 8월 25일부터 127종 제품 평균 5% 오른다

파리바게뜨가 오는 8월 25일부터 빵과 케이크를 포함한 일부 제품의 가격을 평균 5.0% 인상합니다. 이번 조치는…

24분 ago

트럼프 드론 관세 최대 100% 부과 및 한국산 조건부 15% 적용 분석

도널드 트럼프 미국 대통령이 특정 드론과 관련 부품을 수입할 때 최대 100%의 종가관세를 부과하는 포고문에…

4시간 ago

국가장학금 2학기 2차 신청 시작 대상자와 신청 방법 및 지원 금액 안내

교육부와 한국장학재단은 2026년 8월 12일 오전 9시부터 다음 달 9일 오후 6시까지 2026학년도 2학기 2차…

2일 ago

태풍 찬홈 영향으로 동해안 강우 발생 및 일본 혼슈 상륙에 따른 항공 결항 상황

제15호 태풍 찬홈이 일본 열도를 가로질러 동해 방향으로 이동하면서 대한민국 동해안 지역에 비를 뿌리고 있습니다.…

2일 ago

송승환 시각장애 4급 지팡이 직접 제작해 사용하며 일상 극복하는 근황

배우 송승환이 시각장애 4급 판정을 받은 이후 스스로 고안한 특수 지팡이를 사용하여 일상을 이어가는 모습이…

3일 ago

광주 군공항 이전 2028년 하반기까지 완료하여 반도체 산단 부지 확보 추진

정부는 광주 군공항 부지를 반도체 산업단지로 조기에 활용하기 위해 군 시설의 이전 및 임시 분산…

3일 ago