728x90
반응형

네이버 지도 저장

url = "https://naveropenapi.apigw.ntruss.com/map-static/v2/raster"
headers = {'X-NCP-APIGW-API-KEY-ID': client_id, 'X-NCP-APIGW-API-KEY': client_secret}
params = {
    'center' : f"{row['경도']},{row['위도']}", # 중심 좌표
    'level' : 13,                             # 줌 레벨 - 0 ~ 20
    'w' : int(8.83 * 37.79),                  # 가로 세로 크기 (픽셀)
    'h' : int(6.87 * 37.79),                  # 가로 세로 크기 (픽셀)
    'maptype' : "basic",                      # 지도 유형 - basic, traffic, satellite, satellite_base, terrain
    'format' : "png8",                        # 반환 이미지 형식 - jpg, jpeg, png8, png
    'scale' : 1,                              # 고해상도 디스펠레이 지원을 위한 옵션 - 1, 2
    'markers' : f"""type:d|size:mid|pos:{row['경도']} {row['위도']}|color:Default""",  # 마커
    'lang' : "ko",                            # 라벨 언어 설정 - ko, en, ja, zh
    'public_transit' : True,                  # 대중교통 정보 노출 - Boolean
    'dataversion' : "",                       # 서비스에서 사용할 데이터 버전 파라미터 전달 CDN 캐시 무효화
}
res = requests.get(url, params=params, headers=headers)

image_data = io.BytesIO(res.content)
image = PIL.Image.open(image_data)
image.save(f'./temp/building_map.png', quality=100)

  Naver API를 활용하여 물건 주변 지도를 이미지로 저장 가능 하다. 이를 활용하여 물건 list 검색 시 확인 했던 경,위도 정보를 활용하여 주변 지도도 추가로 저장하였다. 조건을 변경하면 원하는 지도 형태를 변경하여 저장 가능하다.

Naver 지도 예시
예시

매매 전월세 차트 추가

# 매매, 전월세 실거래 차트 그리기
# 동일한 구코드 필터링
trade_data_item = trade_data[trade_data['지역코드'] == str(row['구코드'])]
# 도로명코드가 정확히 일치하는 매매 정보 필터링
trade_data_item = trade_data_item[[all([s in row['소재지'].split(",")[0].split(" ") for s in rc.split(" ")]) for rc in list(trade_data_item['도로명코드'])]]
    
# 매매나 전월세가 한건도 없으면 패스. 실제로 없는지, 코드오류인지 확인 필요
if not len(trade_data_item):
    isChart = False
    print(n, row['사건번호'], '거래 기록 없음')
else: # 매매조건과 동일한 구콛, 법정동, 지번, 아파트 정보를 필터링
    isChart = True
    loan_data_item = loan_data[(loan_data['지역코드'] == str(row['구코드']))]
    loan_data_item = loan_data_item[(loan_data_item['법정동'] == trade_data_item['법정동'].unique()[0])]
    loan_data_item = loan_data_item[(loan_data_item['지번'] == trade_data_item['지번'].unique()[0])]
    loan_data_item = loan_data_item[(loan_data_item['아파트'] == trade_data_item['아파트'].unique()[0])]
    # 면적은 ± 1m2 의 범위를 설정. 서로 다른 type 도 한 chart에 그릴 수 있게
    trade_data_item = trade_data_item[(float(row['면적']) - 1 <= trade_data_item['전용면적']) & (trade_data_item['전용면적'] <= float(row['면적']) + 1)]
    loan_data_item = loan_data_item[(float(row['면적']) - 1 <= loan_data_item['전용면적']) & (loan_data_item['전용면적'] <= float(row['면적']) + 1)]
    # plt로 이미지 생성 후 저장
    with plt.rc_context({'xtick.color':'dimgrey', 'ytick.color':'dimgrey'}):
        plt.figure(figsize=(9.22*(1/2.54), 6.77*(1/2.54))) # ppt에 들어갈 크기로 고정
        plt.plot(trade_data_item['거래일자'], trade_data_item['거래금액'], 'g.', label = '매매')
        plt.plot(loan_data_item[loan_data_item['전월세'] == '전세']['거래일자'], loan_data_item[loan_data_item['전월세'] == '전세']['보증금액'], 'b.', label = '전세')
        plt.plot(loan_data_item[loan_data_item['전월세'] == '월세']['거래일자'], loan_data_item[loan_data_item['전월세'] == '월세']['보증금액'], 'c.', label = '월세')
        plt.axhline(round(float(re.sub('[^0-9]', "",row['감정평가액'])) / 100000000 , 2),0,1, color = 'k', linestyle = '--', label = '감정가')
        plt.axhline(round(float(re.sub('[^0-9]', "",row['최저가격'])) / 100000000 , 2),0,1, color = 'r', linestyle = '--', label = '최소가')
        plt.xticks(fontsize=7,rotation = 90)
        plt.yticks(fontsize=7)
        plt.xlim([datetime.datetime.strptime("2014-01-01", '%Y-%m-%d'),datetime.datetime.now()])
        plt.gca().set_yticklabels([f'{x}억'for x in plt.gca().get_yticks()])
        plt.grid(linestyle = '--', color = 'darkgrey')
        plt.legend(fontsize=6, loc = 2)
        plt.tight_layout()
        plt.savefig(f'./temp/chart.png')

  전처리해둔 매매, 전월세 정보를 물건에 해당하는 거래정보만 필터링하여 chart로 저장한다. 전월세 정보는 도로명 주소 관련 정보가 없어, 매매 정보를 먼저 필터링한 후 동일한 조건의 전월세 정보를 불러온다.chart에서 기간은 2014년으로 고정하여, 서로 다른 물건의 기간을 동일하여 전체적인 상승, 하강을 매칭하고자 했다.

전월세 매매 차트 예시
예시

728x90
반응형

PPT 슬라이드로 저장

# 물건별 슬라이드
slide = prs.slides.add_slide(layout)
# 텍스트 박스 list 생성 (양식 설정 위함)
tfs = []
tf = slide.shapes.add_textbox(Cm(5.54), Cm(0.56), Cm(4.6), Cm(0.6)).text_frame # Left, Top, Width, Height 순
tf.text = row['법원'] # 법원
tfs.append(tf)

# ...
# 사건번호, 물건번호, 용도, 최저가격, 감정평가액, ... 등등 필요한 정보를 동일하게 추가
# ...

tf = slide.shapes.add_textbox(Cm(14.24), Cm(1.9), Cm(18.83), Cm(1.2)).text_frame
tf.text = row['비고'] # 비고
tfs.append(tf)
# 모든 텍스트를 동일한 양식으로 지정
for t in tfs:
    t.paragraphs[0].font.size = Pt(10)
    t.paragraphs[0].alignment = PP_ALIGN.CENTER
    
# 지도 추가
pic = slide.shapes.add_picture("./temp/building_map.png", Cm(1.43), Cm(11.48), height = Cm(6.77))
# 매각 물건 명세서 추가
if isinfo: pic = slide.shapes.add_picture("./temp/building_info.png", Cm(21.75), Cm(6), height = Cm(11.35))
if isPic: # 사진 2장 추가
    im = PIL.Image.open(f"./temp/building_image_{0}.jpg")
    if im.size[0] > im.size[1] * (8.7/6.77) :pic = slide.shapes.add_picture(f"./temp/building_image_{0}.jpg", Cm(1.43), Cm(4.6), width = Cm(8.7)) # 가로가 더 큰 경우
    else: pic = slide.shapes.add_picture(f"./temp/building_image_{0}.jpg", Cm(1.43), Cm(4.6), height = Cm(6.77)) # 세로가 더 큰 경우

    im = PIL.Image.open(f"./temp/building_image_{1}.jpg")
    if im.size[0] > im.size[1] * (9.22/6.77) :pic = slide.shapes.add_picture(f"./temp/building_image_{1}.jpg", Cm(10.82), Cm(4.6), width = Cm(9.22)) # 가로가 더 큰 경우
    else:pic = slide.shapes.add_picture(f"./temp/building_image_{1}.jpg", Cm(10.82), Cm(4.6), height = Cm(6.77)) # 세로가 더 큰 경우
# 거래 차트 추가
if isChart: pic = slide.shapes.add_picture(f'./temp/chart.png', Cm(10.89), Cm(11.48))

prs.save(f"./{today}.pptx")

  물건에 관련하여 1차적으로 검토하고자 하는 필요한 정보를 전부 획득했다. 이제미리 만들어둔 템플렛에 맞춰 내용들을 기록하고자 한다. 항목 별로 textbox를 따로 생성하며 전부 동일한 양식이라 위 코드에서는 생략했다.예외처리를 위해 저장해둔 변수를 활용하여 이미지 추가 여부 확인한다.임차인의 대항력 및 배당요구의 경우는 물건매각명세서를 통해 직접 확인 필요하다. 마지막 물건까지 완료한 후에 ppt 저장하여 검토에 활용면 된다..

자동 PPT 슬라이드 예시
예시

이후 목표

  • 경매 결과 자동 정리 구현 예정이다.
728x90
반응형

+ Recent posts