일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 머신러닝
- 데이터 분석
- data analyst
- 서브쿼리
- 크롤링
- GA4
- SQLD
- 기초통계
- lambda
- pandas
- jd
- 히트맵
- 전처리
- SQL
- cross join
- If
- 최종 프로젝트
- Chat GPT
- 클러스터링
- 시각화
- da
- streamlit
- 프롬프트 엔지니어링
- 기초프로젝트
- 군집화
- 팀프로젝트
- 데이터분석
- 프로젝트
- 태블로
- Python
- Today
- Total
세조목
최종 프로젝트 27일차(24.04.24) 본문
최종 프로젝트 27일차입니다.
이게 뭐냐구요??
네 맞습니다 VSCode에서 코드 작업한 화면입니다.
포스팅 처음부터 이걸 왜 올렸을까요??
저는 데이터 분석하면서 5,800줄짜리 코드를 짤꺼라고는 상상도 못했습니다.
그런데 streamlit 코드 작성하다보니까 어느새 5,800줄로 내려가 있더라구요.
물론 모듈이라고 해야하나? 하나의 로직이 담긴 코드 묶음이 완성되면 그 묶음을 복사 붙여넣고,
세부적인 부분들만 수정하긴했습니다. 튜터님께서 많은 도움을 주시기도 했구요.
오늘은 뭔가 무아지경에 빠진듯한 느낌이었습니다.
- 구현하고싶은게 먼저 생기고,
- 그걸 로직으로 구현할 수 있을 것 같다는 생각이 들면
- 일단 코드 작성부터 시작했습니다.
그러다가 모르는건 gpt한테 물어봤구요.
그렇게 작업하다보니 시간 가는줄도 모르고 코드 작성하고 있는 제가 보였습니다.
결과적으로 저희가 구상했던 대부분의 기능들은 구현을 했습니다.
(시연 영상은 마지막에 올려두겠습니다)
일단 어제 포스팅에 설명드린 로직 묶음 3가지가 반복해서 들어갔습니다.
2024.04.23 - [데이터 분석 공부/프로젝트] - 최종 프로젝트 26일차(24.04.23)
그렇게 큰 뼈대를 잡아놓은 후 세부적으로 코드를 작성했습니다.
아래 코드가 그 예시인데요,
st.markdown("""
<style>
.stButton>button {
color: black;
text_align: center;
background-color: #ffffff;
padding: 10px 24px;
border: 3px solid #c2c2c2;
border-raius: 8px;
cursor: pointer;
font-size: 20px !important;
width: 345px;
height: 80px;
}
.stButton>button:hover {
background-color: #ebebeb;
}
</style>
""", unsafe_allow_html=True
)
title = st.session_state.store_name
html_temp = f"""
<div style="text-align: center; margin: 40px;">
<h1 style="color: #f5bf84; font-size: 45px; text-shadow: -1px -1px 2px #d4833b,\
1px -1px 2px #d4833b, -1px 1px 2px #d4833b, 1px 1px 2px #d4833b;">{title}</h1>
</div>
"""
st.markdown(html_temp, unsafe_allow_html=True)
store_name = st.session_state.store_name
df_text = pd.read_csv('N:/개인/DA/내배캠/5. 최종 프로젝트/streamlit_text.csv')
# 빵집 정보
df_info = pd.DataFrame({"feature" : ["이름", "사는곳", "성격", "성적"],\
"info" : [store_name, df_text[df_text['Store']==store_name]['Address'].iloc[0], \
df_text[df_text['Store']==store_name]['cluster_labeling'].iloc[0],\
df_text[df_text['Store']==store_name]['Review_score'].iloc[0]]})
# 긍정 리뷰
good_review = df_text[(df_text['sentiment']==1) & (df_text['Store']==store_name)]['Review_text']
good_review = sorted(good_review.values)
if len(good_review) == 0:
good_review_text = pd.DataFrame({"Review" : ["리뷰가 없어요!"]})
elif len(good_review) == 1:
random_review = random.sample(good_review, 1)
good_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
elif len(good_review) == 2:
random_review = random.sample(good_review, 2)
good_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
elif len(good_review) == 3:
random_review = random.sample(good_review, 3)
good_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
elif len(good_review) == 4:
random_review = random.sample(good_review, 4)
good_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
else:
random_review = random.sample(good_review, 5)
good_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
# 부정 리뷰
bad_review = df_text[(df_text['sentiment']==0) & (df_text['Store']==store_name)]['Review_text']
bad_review = sorted(bad_review.values)
if len(bad_review) == 0:
bad_review_text = pd.DataFrame({"Review" : ["리뷰가 없어요!"]})
elif len(bad_review) == 1:
random_review = random.sample(bad_review, 1)
bad_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
elif len(bad_review) == 2:
random_review = random.sample(bad_review, 2)
bad_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
elif len(bad_review) == 3:
random_review = random.sample(bad_review, 3)
bad_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
elif len(bad_review) == 4:
random_review = random.sample(bad_review, 4)
bad_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
else:
random_review = random.sample(bad_review, 5)
bad_review_text = pd.DataFrame({"Review(리뷰 더블 클릭!!!)" : random_review})
# 경도
log = df_text[df_text['Store']==store_name]['X'].values[0]
# 위도
lat = df_text[df_text['Store']==store_name]['Y'].values[0]
test = pd.DataFrame({"lat" : lat, "log" : log}, index=[0])
col1, col2 = st.columns(2)
with col1:
# pydeck을 이용한 지도 생성
layer = pdk.Layer(
'ScatterplotLayer',
test,
get_position='[log, lat]',
get_color='[200, 30, 0, 160]',
get_radius=20,
)
# 뷰 상태 정의
view_state = pdk.ViewState(
latitude=lat,
longitude=log,
zoom=15,
)
# pydeck 차트 생성
r = pdk.Deck(layers=[layer], initial_view_state=view_state, map_style='mapbox://styles/mapbox/light-v10')
st.pydeck_chart(r)
st.button("다른 친구 보러가기", on_click=button_click, args=("cluster_3",))
with col2:
# 식당 정보 입력
subheader_html = """
<style>
.subheader h1{
background-color: #ffffff;
color: black;
padding: 10px;
border: 5px outset;
border-raius: 20px;
text-align: center;
font-size: 15px !important;
width: 345px;
height: 40px;
margin-bottom: 3px;
}
</style>
<div class="subheader">
<h1>저를 소개할께요😊</h1>
</div>
"""
st.markdown(subheader_html, unsafe_allow_html=True)
st.dataframe(df_info)
# 긍정 리뷰
subheader_html = """
<style>
.subheader h2{
background-color: #ffffff;
color: black;
padding: 10px;
border: 5px outset;
border-raius: 20px;
text-align: center;
font-size: 15px !important;
width: 345px;
height: 40px;
margin-bottom: 3px;
}
</style>
<div class="subheader">
<h2>저의 장점은😍</h2>
</div>
"""
st.markdown(subheader_html, unsafe_allow_html=True)
st.dataframe(good_review_text)
# 부정 리뷰
subheader_html = """
<style>
.subheader h3{
background-color: #ffffff;
color: black;
padding: 10px;
border: 5px outset;
border-raius: 20px;
text-align: center;
font-size: 15px !important;
width: 345px;
height: 40px;
margin-bottom: 3px;
}
</style>
<div class="subheader">
<h3>저의 단점은😭</h3>
</div>
"""
st.markdown(subheader_html, unsafe_allow_html=True)
st.dataframe(bad_review_text)
어제 포스팅에 이런 내용을 적어두었는데요,
if문 없이도 버튼을 클릭할 수 있게끔 작성한 코드입니다.
이 때 page 정보뿐만 아니라 store명 정보도 함께 담을 수 있는 함수를 하나 추가로 만들어서
store명 정보를 매개변수에 담으면 다음 페이지에 넘어가서도 해당 store명을 사용할 수 있습니다.
def button_click_2(page,store_name):
st.session_state.page = page
st.session_state.store_name = store_name
이렇게 함수를 만들어놓고,
st.button(f'**{store_list_0[0]}**',on_click=button_click_2,args=("cluster_0_store0", store_list_0[0],),key="button_7")
args에 페이지 정보와 store명을 모두 담으면 됩니다.
왜 이렇게 해야하냐면 마지막 페이지로 넘어갔을 때 우리가 클릭한 store명에 해당하는 정보들을 찾아서
사용자에게 보여줘야하기때문입니다.
store_name = st.session_state.store_name
df_text = pd.read_csv('N:/개인/DA/내배캠/5. 최종 프로젝트/streamlit_text.csv')
# 빵집 정보
df_info = pd.DataFrame({"feature" : ["이름", "사는곳", "성격", "성적"],\
"info" : [store_name, df_text[df_text['Store']==store_name]['Address'].iloc[0], \
df_text[df_text['Store']==store_name]['cluster_labeling'].iloc[0],\
df_text[df_text['Store']==store_name]['Review_score'].iloc[0]]})
store명을 저는 store_name이라는 변수에 넣어줬는데요,
리뷰 텍스트 정보가 담겨있는 데이터셋을 불러와서
store_name에 해당하는 정보들만 인덱싱한 후 사용하기만 하면 됩니다.
예를 들어 앞서 언급한 코드에서 저는 store의 정보들을 df_info라는 변수에
데이터프레임 형태로 저장했는데요,
이 df_info라는 데이터프레임을 그대로 넣어주기만 하면 됩니다.
거의 대부분 이런식으로 작업을 진행했고,
로직 外 디자인적인 부분들은 CSS 코드를 가지고서 수정했습니다.
이제 내일인 목요일부터는 ppt 작업에 들어갈 수 있습니다.
목요일, 금요일 ppt 작업하고 발표자료 제출한 후에는
시간이 부족하여 하지 못했던 군집분석 시각화 자료들을
streamlit에 마저 추가하고 배포할 예정입니다.
'데이터 분석 공부 > 프로젝트' 카테고리의 다른 글
최종 프로젝트 29일차(24.04.26) (0) | 2024.04.26 |
---|---|
최종 프로젝트 28일차(24.04.25) (1) | 2024.04.25 |
최종 프로젝트 26일차(24.04.23) (0) | 2024.04.23 |
최종 프로젝트 25일차(24.04.22) (0) | 2024.04.22 |
최종 프로젝트 24일차(24.04.21) (3) | 2024.04.21 |