파이썬으로 부동산 매매가 조회기 만들기 - 7. 리팩토링해보기 - 지역별 아파트, 다세대 빌라 한 번에 파일로 내보내기
저번 시간까지는 부동산 매매이력 조회기를 만들어보았습니다. 근데, 아파트 따로, 다세대 빌라 따로 조회하자니 생성되는 시트가 생각보다 많아서 조금 고민되었습니다.
이번 포스트에서는 리팩토링을 통해 아파트와 빌라를 하나의 시트로 합쳐서 조회해봅니다.
월세/전세 데이터가 아니라 매매가 데이터라 조회되는 컬럼은 같을 것이기 때문에 큰 수정은 없을 것 같습니다.
헤더 컬럼 수정하기
리팩토링을 하면서 조회하는 데이터에 컬럼을 추가할 거라, 기존에 헤더컬럼에도 신규 컬럼값을 넣어주어야합니다.
header = [
"시도",
"시군구",
"법정동",
"도로명",
"지번",
"종류",
"아파트",
"건축년도",
"전용면적",
"전용면적(평)",
"거래년도",
"거래월",
"거래일",
"거래금액",
"일련번호",
"거래유형",
"중개사소재지",
"해제여부",
"해제사유발생일"
]
매물 종류 선언하기
extract.py
상단에, 저번 포스트에 header
배열을 만들었었는데요, 해당 배열 하위에 product_list
라는 딕셔너리를 하나 만들었습니다.
product_list = {
"아파트":"아파트",
"연립다세대": "다세대빌라",
"단독다가구":"단독다가구",
"오피스텔": "오피스텔"
}
아파트와 빌라 매매가를 조회하는 메소드 만들기
일단 아파트와 빌래 매매가를 각각 조회하는 메소드를 만들어보겠습니다.
extract.py
에 아래의 메소드를 하나씩 만들어보겠습니다.
def get_apartment_data(sido_name, sigungu_list, transaction, year_month):
return get_data_using_sigungu_list(sido_name, sigungu_list, "연립다세대", transaction, year_month)
def get_villa_data(sido_name, sigungu_list, transaction, year_month):
return get_data_using_sigungu_list(sido_name, sigungu_list, "아파트", transaction, year_month)
기존에 만들어놓은 get_data_using_sigungu_list()
를 사용하는데요, 어떤 매물을 조회할것인지만 다를 뿐, 나머지 파라미터는 전부 동일합니다.
빌라는 연립다세대
, 아파트는 아파트
로 구분해주고, 나머지는 다 동일합니다.
기존 메소드 리팩토링하기
자 이제 기존 메소드를 리팩토링해보겠습니다.
def get_data_using_sigungu_list(si_do_name, sigungu_list: list, product, transaction, year_month):
df = pd.DataFrame()
for sigungu in sigungu_list:
print(f"{si_do_name} / {sigungu['sigungu_name']} {product} 조회")
data = get_data_from_portal(product, transaction, sigungu["sigungu_code"], year_month)
data["시도"] = si_do_name
data["시군구"] = sigungu["sigungu_name"]
data["종류"] = product_list[product]
df = pd.concat([data, df])
df = caculate_column_data(df)
df.rename(columns={"년": "거래년도",
"월": "거래월",
"일": "거래일"
},
inplace=True)
return df
기존과 바뀐점으로는, 일단 조회상황을 알 수 있도록 프린트문을 추가했고, 새롭게 컬럼으로 종류
라는 컬럼을 넣었습니다.
앞서 말씀드렸듯, 아파트와 빌라매매 조회이력을 하나의 시트로 합칠 것이므로, 종류를 따로 넣어주지 않으면 보고있는 이력이 아파트이력인지, 빌리이력인지 알 수가 없게 됩니다. 따라서 종류
컬럼을 만들어서, 거기다가 아까 앞서 만든 딕셔너리에서의 값을 넣어줍니다.
이렇게 하고, 나중에 엑셀에서 필터를 걸어서 조회해볼 수 있습니다.
서울 매매가 조회 메소드 만들기
이제, 서울의 아파트와 빌라의 매매가를 조회해서 하나로 합치는 메소드를 만들 차례입니다.
def get_seoul_data(transaction, year_month):
seoul_code = converter.get_si_do_code("서울")
seoul_name = converter.get_si_do_name("서울")
sigungu_list = converter.get_sigungu(seoul_code)
apart_data = get_apartment_data(seoul_name, sigungu_list, transaction, year_month)
villa_data = get_villa_data(seoul_name, sigungu_list, transaction, year_month)
df = pd.concat([apart_data, villa_data])
return df.reset_index().reindex(columns=header)
시군구 데이터를, 서울의 시군구 데이터만 뽑아 낸다음에, 이것으로 아파트와 빌라 매매가를 조회합니다.
그 다음, pd.concat
으로 하나로 합쳐줍니다.
타지역 매매가 조회 메소드 만들기
서울 매매가 조회 메소드를 만들어 보았으니, 그 외 지역 메소드 만드는 것도 어렵지 않습니다.
def get_district_data(sido_name, sigungu_name, transaction, year_month):
si_do_name = converter.get_si_do_name(sido_name)
si_do_code = converter.get_si_do_code(si_do_name)
sigungu_list = converter.get_sigungu_list(si_do_code, sigungu_name)
apart_data = get_apartment_data(si_do_name, sigungu_list, transaction, year_month)
villa_data = get_villa_data(si_do_code, sigungu_list, transaction, year_month)
df = pd.concat([apart_data, villa_data])
return df.reset_index().reindex(columns=header)
서울 조회 메소드와는 조금 다른점은, 시도
와 조회하고자하는 시군구
를 입력해주어야하고, 그 외 나머지는 전부 동일합니다.
extract.py
의 전체 코드는 아래와 같습니다.
from property.const.district_converter import DistrictConverter
from config.api_key import PUBLIC_DATA_PORTAL
import pandas as pd
import PublicDataReader as pdr
converter = DistrictConverter()
API = pdr.Transaction(PUBLIC_DATA_PORTAL, debug=False)
header = [
"시도",
"시군구",
"법정동",
"도로명",
"지번",
"종류",
"아파트",
"건축년도",
"전용면적",
"전용면적(평)",
"거래년도",
"거래월",
"거래일",
"거래금액",
"일련번호",
"거래유형",
"중개사소재지",
"해제여부",
"해제사유발생일"
]
product_list = {
"아파트":"아파트",
"연립다세대": "다세대빌라",
"단독다가구":"단독다가구",
"오피스텔": "오피스텔"
}
def get_test_data(product, transaction, year_month):
seoul_name = converter.get_si_do_name("서울")
df = pd.DataFrame()
data = get_data_from_portal(product, transaction, "11740", year_month)
data["시도"] = seoul_name
data["시군구"] = "강동구"
df = pd.concat([data, df])
df = caculate_column_data(df)
df.rename(columns={"년": "거래년",
"월": "거래월",
"일": "거래일"
},
inplace=True)
return df.reindex(columns=header)
def get_seoul_data(transaction, year_month):
seoul_code = converter.get_si_do_code("서울")
seoul_name = converter.get_si_do_name("서울")
sigungu_list = converter.get_sigungu(seoul_code)
apart_data = get_apartment_data(seoul_name, sigungu_list, transaction, year_month)
villa_data = get_villa_data(seoul_name, sigungu_list, transaction, year_month)
df = pd.concat([apart_data, villa_data])
return df.reset_index().reindex(columns=header)
def get_district_data(sido_name, sigungu_name, transaction, year_month):
si_do_name = converter.get_si_do_name(sido_name)
si_do_code = converter.get_si_do_code(si_do_name)
sigungu_list = converter.get_sigungu_list(si_do_code, sigungu_name)
apart_data = get_apartment_data(si_do_name, sigungu_list, transaction, year_month)
villa_data = get_villa_data(si_do_code, sigungu_list, transaction, year_month)
df = pd.concat([apart_data, villa_data])
return df.reset_index().reindex(columns=header)
def get_apartment_data(sido_name, sigungu_list, transaction, year_month):
return get_data_using_sigungu_list(sido_name, sigungu_list, "연립다세대", transaction, year_month)
def get_villa_data(sido_name, sigungu_list, transaction, year_month):
return get_data_using_sigungu_list(sido_name, sigungu_list, "아파트", transaction, year_month)
def get_data_using_sigungu_list(si_do_name, sigungu_list: list, product, transaction, year_month):
df = pd.DataFrame()
for sigungu in sigungu_list:
print(f"{si_do_name} / {sigungu['sigungu_name']} {product} 조회")
data = get_data_from_portal(product, transaction, sigungu["sigungu_code"], year_month)
data["시도"] = si_do_name
data["시군구"] = sigungu["sigungu_name"]
data["종류"] = product_list[product]
df = pd.concat([data, df])
df = caculate_column_data(df)
df.rename(columns={"년": "거래년도",
"월": "거래월",
"일": "거래일"
},
inplace=True)
return df
def caculate_column_data(df: pd.DataFrame):
df["전용면적(평)"] = round(df["전용면적"] / 3.3, 1)
return df
def get_data_from_portal(proudct, transaction, sigungu_code, year_month):
return API.read_data(proudct, transaction, sigungu_code, year_month)
최종 조회 하기
최종적으로, 조회를 실행하는 파일에서는 아래와 같이 됩니다.
from datetime import timedelta, date
from export_data.export_to_excel import ExportToData
import property.extract_data.extract as extract
import property.filter_data as filter_data
today = date.today()
month_ago = today.replace(day = 1) - timedelta(days = 1)
year = str(month_ago.year)
month = str(month_ago.month)
seoul_data =extract.get_seoul_data(
"매매",
year+month
)
suwon_data = extract.get_district_data(
"경기도",
"수원",
"매매",
year+month
)
seongnam_data = extract.get_district_data(
"경기도",
"성남",
"매매",
year+month
)
exporter = ExportToData()
exporter.export_to_excel_with_many_sheets(
f"YOUR/DIRECTORY/{year+month}_property_screeningData.xlsx",
[
filter_data.filtering_transaction_amount("서울 6억이하 매매", seoul_data),
filter_data.filtering_transaction_amount("수원 6억이하 매매", suwon_data),
filter_data.filtering_transaction_amount("성남 6억이하 매매", seongnam_data),
("서울 매매가 데이터_raw_data", seoul_data),
("수원 매매가 데이터_raw_data", suwon_data),
("성남 매매가 데이터_raw_data", seongnam_data)
]
)
이렇게하면, 6억이하 거래에 대한 필터처리가 들어간 시트가 총 3개, 그다음에 아무런 필터처리를 하지 않은 원본 시트가 총 3개로 총 6개의 시트를 가진 엑셀파일이 생성됩니다.
빌라와 아파트를 각각 조회하는 것 보다 생성해야하는 시트 갯수가 훨씬 줄었습니다.
이렇게 간단한 리팩토링이 끝났습니다. 남은 일은 천천히 조회해보면서 저의 경제력으로 구매할만한 집을 찾아보는 것입니다...!!
필요로 하면 월세/전세 거래가 조회기도 만들어볼까 합니다. 감사합니다~~
'파이썬으로 부동산 매매가 조회기 만들기' 카테고리의 다른 글
파이썬으로 부동산 매매가 조회기 만들기 - 6. 조건 필터와 엑셀로 내보내기 만들어보기 (0) | 2023.01.08 |
---|---|
파이썬으로 부동산 매매가 조회기 만들기 - 5. 서울 이외의 지역 매매가를 조회하는 메소드 만들기 (0) | 2023.01.07 |
파이썬으로 부동산 매매가 조회기 만들기 - 4. 라이브러리 이용해서 한 번 추출해보고, 필요한 컬럼만 따로 서울 아파트 매매가 조회해보기 (0) | 2023.01.07 |
파이썬으로 부동산 매매가 조회기 만들기 - 3. 지역별 코드 컨버터 만들기 (0) | 2023.01.06 |
파이썬으로 부동산 매매가 조회기 만들기 - 2. 지역 구분별 코드 먼저 준비하기 (0) | 2023.01.04 |
댓글