프로그래밍 언어/Python

연관 키워드 분석 앱 만들기 - 데이터프레임 시각화하기

· 코딩마이데이

웹 앱에서 데이터프레임의 인덱스 표시를 숨기고, 숫자 표시 부분에 막대 그래프를 넣어서 수치가 전체 데이터에서 어느 정도를 차지하는지 확인할 수 있게 만듭니다.

 

ch08/step_3_2.py

import pandas as pd
import streamlit as st
from streamlit.column_config import NumberColumn, ProgressColumn # 열 스타일 지정 # 03
from step_2_4 import OUT_2_4  # 이전에 작성한 모듈을 불러옵니다.
from step_3_1 import analyze_keywords, init_page

def print_dataframe_with_style(keywords: str = None, event: int = None): # 07
    if keywords or event is not None: # 08
        with st.spinner("잠시만 기다려주세요..."): # 스피너 위젯 생성
            analyze_keywords(keywords=keywords, event=event) # 연관 키워드 분석
        df_result = pd.read_csv(OUT_2_4) # 분석 결과를 데이터프레임으로 변환
        max_values = df_result.max().to_dict() # 월별 최댓값을 딕셔너리로 변환 # 12
        st.dataframe( # 데이터프레임 출력
            df_result,
            use_container_width=True, # 너비 최대화
            column_config={ # 월별 스타일 설정 # 17
                "검색수M": ProgressColumn(width="small", # 18
                                       max_value=max_values.get("검색수M", 1), # 19
                                       format=""), # 20
                "클릭수M": ProgressColumn(width="small", 
                                       max_value=max_values.get("클릭수M", 1), 
                                       format=""), 
                "클릭률M": ProgressColumn(width="small", 
                                       max_value=max_values.get("클릭률M", 1), 
                                       format=""),
                "상품수": ProgressColumn(width="small", 
                                      max_value=max_values.get("상품수", 1), 
                                      format=""), 
                "경쟁강도": NumberColumn(format="%.2f"), # 30
            }
        )

if __name__ == "__main__":
    init_page() # 웹 앱 기본 설정 및 텍스트 입력 위젯 출력
    kewords = st.session_state["keywords"] # 연관 키워드 텍스트 입력 위젯 데이터
    print_dataframe_with_style(keywords=kewords) # 스타일이 반영된 데이터프레레임 출력

 

실행결과

You can now view your Streamlit app in your browser.

Local URL: http://localhost:8501
Network URL: http://192.168.0.39:8501

 

03 월별로 스타일로 지정하기 위해 streamlit.column_config 모듈에서 함수 NumberColumn(), ProgreesColumn()를 불러옵니다. 

07 데이터프레임을 출력하는 print_dataframe_with_style()를 정의합니다. 매개변수 keywords는 분석할 키워드를, event는 분석할 시즌 테마 코드를 저장합니다.

08 keywords 혹은 event 값이 존재하는 다음 코드를 실행합니다.

12 데이터프레임의 함수 max()를 사용하여 월별로 최댓값을 구하고 딕셔너리로 변환합니다.

17 매개변수 column_config에 딕셔녀리 형식으로 월별 스타일을 지정합니다.

18~20 함수 ProgressColumn()은 진행 표시줄을 출력합니다. 매개변수 width에 'email'을 전달하여 너비를 좁게 만들고, max_value에 해당 열의 최댓값을 전달하여 최댓값 대비 실제 값의 비율을 시각화하여 막대 그래프로 나타냅니다.

30 함수 NumberColumn()는 출력 형식을 지정하여 숫자 데이터를 출력합니다. 매개변수 format에 '%.2f'를 전달하여 부동소수점을 반올림하여 소수점 2번째 자리까지 출력합니다.

 

텍스트 입력 위젯에 '나이키'를 입력하고 [분석하기] 버튼을 클릭하면 열별로 최댓값 대비 실제 결괏값을 진행 표시줄로 시각화해서 경쟁강도를 직관적으로 파악할 수 있습니다. 참고로 열 이름을 클릭하면 해당 열을 기준으로 오름차순 또는 내림차순으로 정렬할 수 있습니다.