Skip to content

sunk-dev/python_dynamicbusan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

54 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Dynamic Busan μˆ™λ°•μ—…μ†Œ 검색 μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜

"νŽΈμ˜μ— 맞게 κ²€μƒ‰ν•˜κ³ , μ§€λ„μ—μ„œ ν™•μΈν•˜μž!"

μ›Ή μ‚¬μ΄νŠΈ image

  • 이용 데이터 자료

뢀산관광곡사_λΆ€μ‚°μ§€μ—­ μˆ™λ°•λΆ„μ•Ό 업체_20220101

κ°„λž΅ μ„€λͺ…

  • pythonκ³Ό streamlit(데이터 기반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“œλŠ” 도ꡬ) 을 μ΄μš©ν•˜μ—¬ 편의 μ‹œμ„€, μ‹œλ„λ³„ λΆ€μ‚° μˆ™λ°•μ—…μ†Œ 쑰회 μ›Ήμ‚¬μ΄νŠΈ 개발

1. μ†Œκ°œ

  • λΆ€μ‚° μˆ™λ°•μ—…μ†Œ 데이터λ₯Ό ν™œμš©ν•œ 검색 μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ†Œκ°œ

2. μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κΈ°λŠ₯

  • λ‹€μ–‘ν•œ νŽΈμ˜μ‹œμ„€ 선택 κ°€λŠ₯
    • νœ μ²΄μ–΄ 이동 κ°€λŠ₯, μ μžλ„λ‘œ 이용 κ°€λŠ₯ λ“±
  • 지도 μƒμ—μ„œ 검색 쑰건에 λ§žλŠ” μˆ™λ°•μ—…μ†Œ ν‘œμ‹œ
    • μ„ νƒν•œ 쑰건에 따라 지도 상에 마컀둜 ν‘œμ‹œ
  • μ‹œκ΅°κ΅¬ 및 읍면동별 검색 쑰건 지원
    • μ‚¬μ΄λ“œλ°”μ—μ„œ μ‹œκ΅°κ΅¬λͺ… 및 읍면동λͺ… 선택 κ°€λŠ₯
  • μ—‘μ…€ λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯
    • ν˜„μž¬ ν•„ν„°λ§λœ κ²°κ³Όλ₯Ό μ—‘μ…€ 파일둜 λ‹€μš΄λ‘œλ“œ

3. μ½”λ“œ λ™μž‘ κ³Όμ •

  • 데이터 λ‘œλ“œ 및 초기 μ„€μ •
    • Plotly, Pandas, Streamlit λ“±μ˜ 라이브러리 μ‚¬μš©
  • 검색 쑰건 μ„€μ •
    • νŽΈμ˜μ‹œμ„€ 및 μ§€μ—­ 선택을 μœ„ν•œ μ‚¬μ΄λ“œλ°” 제곡
  • 데이터 필터링
    • μ„ νƒν•œ 쑰건에 따라 데이터λ₯Ό ν•„ν„°λ§ν•˜μ—¬ 지도 및 결과에 반영
  • 지도 ν‘œμ‹œ
    • Folium 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ™λ°•μ—…μ†Œ μœ„μΉ˜λ₯Ό 지도 상에 ν‘œμ‹œ
  • κ²°κ³Ό ν‘œμ‹œ 및 λ‹€μš΄λ‘œλ“œ
    • ν•„ν„°λ§λœ κ²°κ³Όλ₯Ό 화면에 ν‘œμ‹œν•˜κ³ , λ‹€μš΄λ‘œλ“œ λ²„νŠΌμœΌλ‘œ μ—‘μ…€ 파일

상세섀λͺ…

1. 데이터 μ „μ²˜λ¦¬

1. ν™˜κ²½ μ„€μ • 및 데이터 뢈러였기

pythonCopy code
# ν•„μš”ν•œ 라이브러리 μž„ν¬νŠΈ
import pandas as pd
import koreanize_matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import set_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')

2. 데이터 μ „μ²˜λ¦¬

pythonCopy code
# ν•„μš” μ—†λŠ” μ—΄ μ‚­μ œ
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')
# ... (μ΄ν•˜ μƒλž΅)

3. Folium을 μ‚¬μš©ν•œ 지도 μ‹œκ°ν™”

pythonCopy code
import folium

# λ°μ΄ν„°μ˜ μœ„λ„, 경도 평균값을 μ€‘μ‹¬μœΌλ‘œ 지도 생성
map = folium.Map(location=[clean_data['μœ„λ„'].mean(), clean_data['경도'].mean()], zoom_start=7)

# 지도에 마컀 μΆ”κ°€
for n in clean_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)

# 지도 좜λ ₯
map

4. 데이터 뢄석 및 μ‹œκ°ν™”

pythonCopy code
# μ‹œκ΅°κ΅¬λͺ… 별 읍면동 λͺ… λΆ„λ₯˜ 및 좜λ ₯
table = pd.pivot_table(clean_data, index=['μ‹œκ΅°κ΅¬λͺ…'], values=['읍면동λͺ…'], aggfunc='count')
print(table)

5. Excel 파일둜 데이터 μ €μž₯

pythonCopy code
# 엑셀에 μ €μž₯될 데이터 가곡
adress_roadname = clean_data['λ„λ‘œλͺ…'] + clean_data['λ„λ‘œλͺ…상세']
adress = clean_data['μ‹œλ„λͺ…'] + clean_data['μ‹œκ΅°κ΅¬λͺ…'] + clean_data['읍면동λͺ…'] + clean_data['λ²ˆμ§€']

clean_data['μΌλ°˜μ£Όμ†Œ'] = adress
clean_data['λ„λ‘œλͺ…μ£Όμ†Œ'] = adress_roadname

down_data = clean_data[['업체λͺ…', 'μΌλ°˜μ£Όμ†Œ', 'λ„λ‘œλͺ…μ£Όμ†Œ', 'μ „ν™”λ²ˆν˜Έ', 'ν™ˆνŽ˜μ΄μ§€μ£Όμ†Œ']]
down_data.fillna('', inplace=True)

μœ„ μ½”λ“œλŠ” 데이터λ₯Ό 뢈러였고 μ „μ²˜λ¦¬ν•œ λ’€, 지도 μ‹œκ°ν™”μ™€ κ°„λ‹¨ν•œ 데이터 뢄석을 μˆ˜ν–‰ν•˜λ©° μ΅œμ’…μ μœΌλ‘œ Excel 파일둜 μ €μž₯ν•˜λŠ” 과정을 λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œμ˜ 주석과 좜λ ₯ κ²°κ³Όλ₯Ό 톡해 각 λ‹¨κ³„μ—μ„œ μ–΄λ–€ μž‘μ—…μ΄ μˆ˜ν–‰λ˜κ³  μžˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

6. 데이터 μ „μ²˜λ¦¬

pythonCopy code
# 'λ“±λ‘μΌμž' μ—΄ μ‚­μ œ
clean_data = clean_data.drop(['λ“±λ‘μΌμž'], axis=1)
  • 'λ“±λ‘μΌμž' 열을 μ‚­μ œν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€. 이 열은 λ°μ΄ν„°μ—μ„œ μ œκ±°λ˜μ–΄ 더 이상 μ‚¬μš©λ˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.

7. Excel 파일둜 데이터 μ €μž₯

pythonCopy code
# 'μΌλ°˜μ£Όμ†Œ'와 'λ„λ‘œλͺ…μ£Όμ†Œ' μ—΄ μΆ”κ°€ 및 κ²°μΈ‘κ°’ 처리
adress_roadname = clean_data['λ„λ‘œλͺ…'] + clean_data['λ„λ‘œλͺ…상세']
adress = clean_data['μ‹œλ„λͺ…'] + clean_data['μ‹œκ΅°κ΅¬λͺ…'] + clean_data['읍면동λͺ…'] + clean_data['λ²ˆμ§€']

clean_data['μΌλ°˜μ£Όμ†Œ'] = adress
clean_data['λ„λ‘œλͺ…μ£Όμ†Œ'] = adress_roadname

# '업체λͺ…', 'μΌλ°˜μ£Όμ†Œ', 'λ„λ‘œλͺ…μ£Όμ†Œ', 'μ „ν™”λ²ˆν˜Έ', 'ν™ˆνŽ˜μ΄μ§€μ£Όμ†Œ' μ—΄ 선택
down_data = clean_data[['업체λͺ…', 'μΌλ°˜μ£Όμ†Œ', 'λ„λ‘œλͺ…μ£Όμ†Œ', 'μ „ν™”λ²ˆν˜Έ', 'ν™ˆνŽ˜μ΄μ§€μ£Όμ†Œ']]
down_data.fillna('', inplace=True)
  • 'μΌλ°˜μ£Όμ†Œ' 및 'λ„λ‘œλͺ…μ£Όμ†Œ' 열을 μƒˆλ‘œ λ§Œλ“€κ³ , 결츑값을 μ²˜λ¦¬ν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.
  • μ΅œμ’…μ μœΌλ‘œ '업체λͺ…', 'μΌλ°˜μ£Όμ†Œ', 'λ„λ‘œλͺ…μ£Όμ†Œ', 'μ „ν™”λ²ˆν˜Έ', 'ν™ˆνŽ˜μ΄μ§€μ£Όμ†Œ' 열을 μ„ νƒν•˜μ—¬ λ°μ΄ν„°ν”„λ ˆμž„μ„ λ§Œλ“­λ‹ˆλ‹€.

이 λΆ€λΆ„μ—μ„œλŠ” 열을 μ‘°μž‘ν•˜μ—¬ μ£Όμ†Œ κ΄€λ ¨ 정보λ₯Ό μƒˆλ‘œμš΄ μ—΄λ‘œ μΆ”κ°€ν•˜κ³ , ν•„μš”ν•œ μ—΄λ§Œ μ„ νƒν•˜μ—¬ μ΅œμ’… 데이터λ₯Ό μ •λ¦¬ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

2. streamlit ꡬ좕

1. 라이브러리 및 데이터 λ‘œλ“œ

pythonCopy code
import plotly.graph_objects as go
import pandas as pd
import numpy as np
import streamlit as st
import yfinance as yf
import matplotlib.pyplot as plt
import folium
import openpyxl
from pyxlsb import open_workbook as open_xlsb
from io import BytesIO
from xlsxwriter import Workbook
  • plotly, pandas, streamlit, folium λ“±μ˜ 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터 μ‹œκ°ν™” 및 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— ν•„μš”ν•œ λͺ¨λ“ˆ λ‘œλ“œ

2. Streamlit μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성

pythonCopy code
st.title('Dynamic Busan β˜€οΈ')
st.subheader('μ›ν•˜λŠ” 쑰건의 λΆ€μ‚° μˆ™λ°•μ—…μ†Œλ₯Ό μ‰½κ²Œ κ²€μƒ‰ν•΄λ΄μš”! 😎', anchor=None, help=None, divider=False)
  • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 제λͺ©κ³Ό λΆ€μ œ μ„€μ •

3. 데이터 λ‘œλ“œ 및 필터링

pythonCopy code
data = pd.read_csv('./BusanHotelFirst.csv')
filter_data = data
  • CSV νŒŒμΌμ—μ„œ λΆ€μ‚° μˆ™λ°•μ—…μ†Œ 데이터 λ‘œλ“œ
  • filter_data λ³€μˆ˜μ— 초기 데이터 μ„€μ •

4. 검색 쑰건 μ„€μ •

pythonCopy code
options = st.sidebar.multiselect(
    'νŽΈμ˜μ‹œμ„€',
    ['νœ μ²΄μ–΄ 이동 κ°€λŠ₯', 'μ μžλ„λ‘œμ΄μš©κ°€λŠ₯', 'λ¬Όν’ˆλ³΄κ΄€ν•¨ μ΄μš©κ°€λŠ₯', 'μˆ˜μœ μ‹€ 이용 κ°€λŠ₯'])
  • st.sidebar.multiselect을 μ‚¬μš©ν•˜μ—¬ νŽΈμ˜μ‹œμ„€μ— λŒ€ν•œ 닀쀑 선택 κΈ°λŠ₯ κ΅¬ν˜„

5. 검색 쑰건에 λ”°λ₯Έ 데이터 필터링

pythonCopy code
if (options is not None):
    for i in options:
        col = options_value[i]
        filter_data = filter_data[filter_data[col] == 'Y']
  • μ„ νƒν•œ νŽΈμ˜μ‹œμ„€μ— 따라 데이터λ₯Ό 필터링

6. 지도 상에 μˆ™λ°•μ—…μ†Œ ν‘œμ‹œ

pythonCopy code
map = folium.Map(location=[filter_data['μœ„λ„'].mean(), filter_data['경도'].mean()], zoom_start=10)
for n in filter_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을 μ‚¬μš©ν•˜μ—¬ 지도λ₯Ό μƒμ„±ν•˜κ³ , ν•„ν„°λ§λœ 데이터에 λŒ€ν•œ 마컀 ν‘œμ‹œ

7. κ²°κ³Ό 및 λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯

pythonCopy code
df_xlsx = to_excel(process_down_data(filter_data))
st.sidebar.download_button(label='πŸ“₯ Download Current Result',
                            data=df_xlsx,
                            file_name='df_test.xlsx')

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages