- 이용 데이터 자료
- python과 streamlit(데이터 기반 웹 애플리케이션을 만드는 도구) 을 이용하여 편의 시설, 시도별 부산 숙박업소 조회 웹사이트 개발
1. 소개
- 부산 숙박업소 데이터를 활용한 검색 웹 어플리케이션 소개
2. 어플리케이션 기능
- 다양한 편의시설 선택 가능
- 휠체어 이동 가능, 점자도로 이용 가능 등
- 지도 상에서 검색 조건에 맞는 숙박업소 표시
- 선택한 조건에 따라 지도 상에 마커로 표시
- 시군구 및 읍면동별 검색 조건 지원
- 사이드바에서 시군구명 및 읍면동명 선택 가능
- 엑셀 다운로드 기능
- 현재 필터링된 결과를 엑셀 파일로 다운로드
3. 코드 동작 과정
- 데이터 로드 및 초기 설정
- Plotly, Pandas, Streamlit 등의 라이브러리 사용
- 검색 조건 설정
- 편의시설 및 지역 선택을 위한 사이드바 제공
- 데이터 필터링
- 선택한 조건에 따라 데이터를 필터링하여 지도 및 결과에 반영
- 지도 표시
- Folium 라이브러리를 사용하여 숙박업소 위치를 지도 상에 표시
- 결과 표시 및 다운로드
- 필터링된 결과를 화면에 표시하고, 다운로드 버튼으로 엑셀 파일
pythonCopycode# 필요한 라이브러리 임포트importpandasaspdimportkoreanize_matplotlibimportmatplotlib.pyplotaspltimportseabornassnsfromIPython.displayimportset_matplotlib_formats# Colab에서 사용하는 한글 폰트 설정plt.rc('font', family='Malgun Gothic')
plt.rc('axes', unicode_minus=False)
set_matplotlib_formats('retina')
# 데이터 불러오기df=pd.read_csv("/content/drive/MyDrive/Colab Notebooks/BusanHotel.csv", encoding='cp949')
df1=pd.read_csv("/content/drive/MyDrive/Colab Notebooks/koreaLibrary.csv", encoding='cp949')pythonCopycode# 필요 없는 열 삭제clean_data=df.drop(['필지고유번호', '법정동코드', '행정동코드', '도로명코드', '등록일자'], axis=1)
# '카테고리명'이 '문화관광/명소'인 행 제거clean_data=clean_data[clean_data['카테고리명'] !='문화관광/명소']
# '폐업여부'가 'Y'인 행 제거clean_data=clean_data[clean_data['폐업여부'] !='Y']
# 결측값 처리clean_data['주차가능여부'] =clean_data['주차가능여부'].fillna('N')
clean_data['화장실유무'] =clean_data['화장실유무'].fillna('N')
# ... (이하 생략)pythonCopycodeimportfolium# 데이터의 위도, 경도 평균값을 중심으로 지도 생성map=folium.Map(location=[clean_data['위도'].mean(), clean_data['경도'].mean()], zoom_start=7)
# 지도에 마커 추가forninclean_data.index:
name=clean_data.loc[n, '업체명']
address=clean_data.loc[n, '도로명']
popup=f"{name}-{address}"location= [clean_data.loc[n, '위도'], clean_data.loc[n, '경도']]
folium.Marker(
location=location,
popup=popup,
icon=folium.Icon(color='red', icon='plus', prefix='fa')
).add_to(map)
# 지도 출력mappythonCopycode# 시군구명 별 읍면동 명 분류 및 출력table=pd.pivot_table(clean_data, index=['시군구명'], values=['읍면동명'], aggfunc='count')
print(table)pythonCopycode# 엑셀에 저장될 데이터 가공adress_roadname=clean_data['도로명'] +clean_data['도로명상세']
adress=clean_data['시도명'] +clean_data['시군구명'] +clean_data['읍면동명'] +clean_data['번지']
clean_data['일반주소'] =adressclean_data['도로명주소'] =adress_roadnamedown_data=clean_data[['업체명', '일반주소', '도로명주소', '전화번호', '홈페이지주소']]
down_data.fillna('', inplace=True)위 코드는 데이터를 불러오고 전처리한 뒤, 지도 시각화와 간단한 데이터 분석을 수행하며 최종적으로 Excel 파일로 저장하는 과정을 담고 있습니다. 코드의 주석과 출력 결과를 통해 각 단계에서 어떤 작업이 수행되고 있는지 확인할 수 있습니다.
pythonCopycode# '등록일자' 열 삭제clean_data=clean_data.drop(['등록일자'], axis=1)- '등록일자' 열을 삭제하는 부분입니다. 이 열은 데이터에서 제거되어 더 이상 사용되지 않게 됩니다.
pythonCopycode# '일반주소'와 '도로명주소' 열 추가 및 결측값 처리adress_roadname=clean_data['도로명'] +clean_data['도로명상세']
adress=clean_data['시도명'] +clean_data['시군구명'] +clean_data['읍면동명'] +clean_data['번지']
clean_data['일반주소'] =adressclean_data['도로명주소'] =adress_roadname# '업체명', '일반주소', '도로명주소', '전화번호', '홈페이지주소' 열 선택down_data=clean_data[['업체명', '일반주소', '도로명주소', '전화번호', '홈페이지주소']]
down_data.fillna('', inplace=True)- '일반주소' 및 '도로명주소' 열을 새로 만들고, 결측값을 처리하는 부분입니다.
- 최종적으로 '업체명', '일반주소', '도로명주소', '전화번호', '홈페이지주소' 열을 선택하여 데이터프레임을 만듭니다.
이 부분에서는 열을 조작하여 주소 관련 정보를 새로운 열로 추가하고, 필요한 열만 선택하여 최종 데이터를 정리하는 작업을 수행합니다.
pythonCopycodeimportplotly.graph_objectsasgoimportpandasaspdimportnumpyasnpimportstreamlitasstimportyfinanceasyfimportmatplotlib.pyplotaspltimportfoliumimportopenpyxlfrompyxlsbimportopen_workbookasopen_xlsbfromioimportBytesIOfromxlsxwriterimportWorkbook- plotly, pandas, streamlit, folium 등의 라이브러리를 사용하여 데이터 시각화 및 웹 애플리케이션 개발에 필요한 모듈 로드
pythonCopycodest.title('Dynamic Busan ☀️')
st.subheader('원하는 조건의 부산 숙박업소를 쉽게 검색해봐요! 😎', anchor=None, help=None, divider=False)- 웹 애플리케이션의 제목과 부제 설정
pythonCopycodedata=pd.read_csv('./BusanHotelFirst.csv')
filter_data=data- CSV 파일에서 부산 숙박업소 데이터 로드
filter_data변수에 초기 데이터 설정
pythonCopycodeoptions=st.sidebar.multiselect(
'편의시설',
['휠체어 이동 가능', '점자도로이용가능', '물품보관함 이용가능', '수유실 이용 가능'])st.sidebar.multiselect을 사용하여 편의시설에 대한 다중 선택 기능 구현
pythonCopycodeif (optionsisnotNone):
foriinoptions:
col=options_value[i]
filter_data=filter_data[filter_data[col] =='Y']- 선택한 편의시설에 따라 데이터를 필터링
pythonCopycodemap=folium.Map(location=[filter_data['위도'].mean(), filter_data['경도'].mean()], zoom_start=10)
forninfilter_data.index:
name=filter_data.loc[n, '업체명']
address=filter_data.loc[n, '도로명']
popup=folium.Popup(f'<i>{name}-{address}</i>', max_width=600, max_height=600)
location= [filter_data.loc[n, '위도'], filter_data.loc[n, '경도']]
folium.Marker(
location=location,
popup=popup,
icon=folium.Icon(color='red', icon='plus', prefix='fa')
).add_to(map)- Folium을 사용하여 지도를 생성하고, 필터링된 데이터에 대한 마커 표시
pythonCopycodedf_xlsx=to_excel(process_down_data(filter_data))
st.sidebar.download_button(label='📥 Download Current Result',
data=df_xlsx,
file_name='df_test.xlsx')