map_jochiwon.py
원본 내용을 읽기 전용으로 표시합니다.
# 조치원 골목상권 지도 제작기## 골목 덩어리별 예측 위험도까지 지도에 넣어야 해서import numpy as npimport foliumfrom folium.plugins import HeatMapfrom common import *def 조치원지도(T, Tp, alley, CATS):# 조치원 골목상권 지도log("\n" + "=" * 70)log(f"7. 지도 시각화 ②: {TARGET} (output/map2_조치원_골목상권.html)")log("=" * 70)m2 = 지도만들기([T["위도"].median(), T["경도"].median()], 15)# 업종별 업소 위치 (앞에 3개 업종만 켜놓음)for i in range(8):c = CATS[i]레이어 = folium.FeatureGroup(name=f"현재 업소: {c}", show=(i < 3))for _, r in T[T["상권업종대분류명"] == c].iterrows():folium.CircleMarker([r["위도"], r["경도"]], radius=3, color=COLORS[i], fill=True,fill_opacity=0.8, weight=0,tooltip=f"{r['상호명']} | {r['상권업종중분류명']} | {r['도로']}").add_to(레이어)레이어.add_to(m2)# 없어진 업소, 새로 생긴 업소 히트맵HeatMap(Tp.loc[Tp["소멸"] == 1, ["위도", "경도"]].values.tolist(), radius=18, blur=15,name="1년간 소멸 업소 밀집(히트맵)", show=False).add_to(m2)HeatMap(T.loc[T["신규"] == 1, ["위도", "경도"]].values.tolist(), radius=18, blur=15,name="1년간 신규 업소 밀집(히트맵)", show=False).add_to(m2)# 골목 덩어리 표시 (원 클릭하면 정보 나옴)골목레이어 = folium.FeatureGroup(name="골목상권 덩어리(DBSCAN)", show=True)for k, r in alley.iterrows():글 = (f"<b>골목군집 {k}</b><br>대표도로: {r['대표도로']}<br>업소 {int(r['업소수'])}개<br>"f"주요업종: {r['주요업종']}<br>음식 {r['음식비율']:.0%} · 소매 {r['소매비율']:.0%}<br>"f"1년 소멸률 {r['소멸률']:.0%} · 신규 {r['신규비율']:.0%}<br>예측위험 {r['평균예측위험']:.2f}")folium.CircleMarker([r["위도"], r["경도"]], radius=8 + np.sqrt(r["업소수"]), color="black", weight=2,fill=True, fill_color="#ffffff", fill_opacity=0.3,popup=folium.Popup(글, max_width=280), tooltip=f"골목군집 {k}: {r['대표도로']}").add_to(골목레이어)골목레이어.add_to(m2)folium.LayerControl(collapsed=False).add_to(m2)m2.save(os.path.join(결과폴더, "map2_조치원_골목상권.html"))log("저장 완료")if __name__ == "__main__":from jochiwon_alley import 조치원분석, 소멸예측now, prev, CATS = 데이터준비()T, Tp, alley = 조치원분석(now, prev)소멸예측(prev, Tp, alley)조치원지도(T, Tp, alley, CATS)
파일 확인 정보
SHA-256: 85e068cb74993d114b2da854f3996470edbc001bb1a55be0ea5e384ba7b0decc