Project

PROJECT 1-(6) SelectBox(셀렉트박스) 활용하기

567Rabbit 2024. 5. 9. 15:01

 

사용해야 하는 라이브러리를 임포트합니다

from PIL import Image #파이썬 이미지 라이브러리 PIL
import streamlit as st
import pandas as pd
import numpy as np

 

 

 

데이터 불러오기

사용할 데이터를 불러옵니다.

데이터는 주피터노트북에서 2024/4/29자로 국내 ETF 데이터를 불러왔습니다

사용한 데이터는 아래와 같습니다

 

KRETF.csv
0.07MB

 

    col1, col2, col3 = st.columns([1, 2.5, 1])  # 화면을 가운데 정렬하기 위함이다
    
    with col2 :
        
        # 1. 데이터 불러오기
        etf_list = pd.read_csv('./KRETF.csv')
        
        # 2. 전체 설명하기
        st.title('Ⅲ. 국내 ETF 주식가치비교')
        st.header(' : Comparing domestic ETF stock valuations')
        st.text('ETF데이터는 2024/4/29 기준 데이터입니다.')
        st.text('ETF는 하나의 주식으로 거래되지만 여러 자산에 대한 소유권을 가질 수 있게 해줍니다.')
        st.text('쉽게 말하면 여러 채권과 주식, 자산을 담고있는 하나의 상자로 표현됩니다.')
        st.text('주식은 분산투자하는 경우, risk가 서로 상쇄되어 안전성이 높아지기 때문에')
        st.text('그 자체로 분산투자가 가능한 ETF는 원금상실위험이 적은 안전한 투자대상으로 평가됩니다')
        st.header('')

 

 

 

 

이자율 높은 순서대로 내림차순하

ascending=True(오름차순)이 sort_values의 기본값이기 때문에 ascending=False로 하여 내림차순으로 지정합니다.

        # 3. 이자율 높은 순서로 데이터프레임 화면에 표시
        st.subheader('이자율(EarningRate) 높은 순서로 보기')
        st.text('이자율(EarningRate)은 일정 기간 동안 얻는 수입이나 수익의 속도를 나타내는 지표입니다.')
        
        # 3-(1) etf_list DataFrame에서 'EarningRate' 열을 내림차순으로 정렬
        etf_list = etf_list.sort_values(by='EarningRate', ascending=False)

        # 3-(2) 정렬된 DataFrame을 streamlit의 st.dataframe()에 전달
        etf_list = etf_list.iloc[:,[2,3,4,6,7,9]]  #특정 열만 가져옵니다
        
        # 3-(3) 화면에 표시
        st.dataframe(etf_list)

 

 

 

 

 

카테고리(Category) 컬럼에 대한 설명

header, subheader, text를 사용하여 내용을 적었습니다

        # 4. ETF 카테고리별 이자율 보기
        st.header('')
        st.header('# ETF 카테고리별 이자율 보기')
        st.header('')
        
        # 4-(1) 카테고리에 대한 설명
        st.subheader('1. 국내시장지수 ETF')
        st.text('국내시장지수 ETF는 우리나라 증시를 추종하는 ETF입니다')
        st.subheader('2. 국내업종/테마 ETF')
        st.text('TIGER 2차전지테마, KODEX삼성그룹과 같은 특정 테마에 투자하는 ETF들이 상장되어 있습니다')
        st.subheader('3. 국내파생')
        st.text('국내파생ETF상품은 레버리지, 인버스 ETF들을 말합니다')
        st.text('레버리지 ETF는 추종지수의 2배수로 수익률을 낼 수 있는 상품입니다')
        st.text('반대로 지수가 1% 하락하면 ETF는 2% 손실을 보게 됩니다')
        st.subheader('4. 해외주식')
        st.text('미국의 S&P500지수 또는 나스닥지수를 추종하는 ETF 등 해외주식을 추종하는 ETF들이 있습니다.')
        st.subheader('5. 원자재')
        st.text('원자재 ETF는 원유, 금선물 등의 시세를 추종하는 ETF 입니다 특징은 롤오버비용, 괴리율이 크게 발생하여')
        st.text('추종지수를 잘 따라가지 못하는 경우가 많아 투자시에 주의가 필요하다는 것입니다.')
        st.subheader('6. 채권')
        st.text('채권형 ETF는 국채 등의 지수에 투자하는 상품입니다')
        st.subheader('7. 기타')
        st.text('KODEX달러선물 ETF, TIGER일본엔선물 ETF 등이 있습니다')
        st.text('달러가격 상승 또는 일본엔화의 상승을 예상한다면 투자할 수 있는 상품들입니다')
        st.header('')

 

 

 

 

 

 

 

SelectBox(셀렉트박스) 활용

 

Category는 숫자로 1,2,3,4,5,6,7로 되어있는데, 셀렉트박스에는 해당하는 컬럼의 name을 한글화하여 넣고,

카테고리의 name을 선택하면 그에 맞는 Category(1,2,3,4,5,6,7)에 해당하는 데이터 행을 가져오도록 할 것이다. 

 

        # 4-(2) 셀렉트박스 만들어서 컬럼 클릭하면 컬럼별 데이터 출력하게하기
        etf_list2 = etf_list.groupby('Category')['EarningRate'].mean().reset_index()
        etf_list2.dropna(inplace=True)
        
        etf_list2.loc[etf_list2['Category'] == 1, 'Category_Name'] = '국내시장지수 ETF'
        etf_list2.loc[etf_list2['Category'] == 2, 'Category_Name'] = '국내업종/테마 ETF'
        etf_list2.loc[etf_list2['Category'] == 3, 'Category_Name'] = '국내파생'
        etf_list2.loc[etf_list2['Category'] == 4, 'Category_Name'] = '해외주식'
        etf_list2.loc[etf_list2['Category'] == 5, 'Category_Name'] = '원자재'
        etf_list2.loc[etf_list2['Category'] == 6, 'Category_Name'] = '채권'
        etf_list2.loc[etf_list2['Category'] == 7, 'Category_Name'] = '기타'

        etf_list2 = etf_list2[['Category','Category_Name','EarningRate']]
        
        choice = st.selectbox('카테고리를 선택하세요', etf_list2['Category_Name'])
        
        if choice == '국내시장지수 ETF' :
            st.dataframe(etf_list.loc[etf_list['Category']==1], width=2000, height=350)
        elif choice == '국내업종/테마 ETF' :
            st.dataframe(etf_list.loc[etf_list['Category']==2], width=2000, height=350)
        elif choice == '국내파생' :
            st.dataframe(etf_list.loc[etf_list['Category']==3], width=2000, height=350)
        elif choice == '해외주식' :
            st.dataframe(etf_list.loc[etf_list['Category']==4], width=2000, height=350)
        elif choice == '원자재' :
            st.dataframe(etf_list.loc[etf_list['Category']==5], width=2000, height=350)
        elif choice == '채권' :
            st.dataframe(etf_list.loc[etf_list['Category']==6], width=2000, height=350)
        else :
            st.dataframe(etf_list.loc[etf_list['Category']==7], width=2000, height=350)