파이썬 부동산 매매가 조회 프로그램 만들기 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초 이내 시/도를 입력하지 않을 경우 전국의 데이터를 조사합니다.
위와 같이 나옵니다.
코드를 만지면서 중간에 컬럼 제목이 다시 원상태가 되었고, 시/도명이 ‘전국’으로만 표시 되는 문제가 있네요. 그래서 조금 수정하는 겸, 기조회기간도 설정해보도록 하겠습니다. 이렇게 서울 이외의 지역에 대해서, 아파트가 아닌 부동산에 대해서 조회해보았습니다.
다음 포스트에서는 필터역할을 해주는 메소드를 만들어서, 매매가 데이터에 대해 필터링을 해보겠습니다.
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())
윤남노 셰프가 6억 대출을 끌어 압구정에 프렌치 레스토랑 '비스트로 노뜨르'를 오픈했다. 6월 6일 MBC '전지적…
아이유의 SNS에 잠실 시위 참가자들의 커피와 빵 선결제 요청이 폭주하고 있습니다. 6월 6일 현재 인스타그램…
1세대 게임 BJ 난닝구(본명 한태식)가 향년 46세로 6월 5일 사망했다는 비보가 게임 커뮤니티를 강타했다. 동료…
손흥민이 2003년 홍명보 이후 23년 만에 MLS 올스타 퍼스트 11에 선정되며 축구계를 뜨겁게 달구고 있다.…
2026년 6월 6일 이란 혁명수비대가 호르무즈 해협을 무허가 통과하려던 상업용 유조선 4척을 향해 발포했습니다. 미국…
서울 송파구 잠실7동 투표함 미개표로 서울시의회 비례대표 의석이 민주당에서 국민의힘으로 1석 전환됐습니다. 6월 3일 치러진…