본문 바로가기
Streamlit

Streamlit 기본 문법(8) : 주식 데이터 조회 페이지 만들기(feat. 사이드바)

by ISLA! 2023. 7. 28.

주식 데이터 조회 페이지 만들기 (with 사이드바)

 

1. 필요한 라이브러리 다운

import plotly.graph_objects as go
import pandas as pd
import streamlit as st
import yfinance as yf
import matplotlib.pyplot as plt

 

2. 사이드바에 주식 종목(티커)를 입력 / 시작 ~ 종료 날짜 생성 / 데이터 조회하는 코드

def main():
    st.title("주식 데이터")
    st.sidebar.title("Stock Chart")
    ticker = st.sidebar.text_input("Enter a ticker (e. g. AAPL)", value = "AAPL")
    st.sidebar.markdown('Tickers Link : [All Stock Symbols](https://stockanalysis.com/stocks/)')
    start_date = st.sidebar.date_input("시작 날짜: ", value = pd.to_datetime("2023-01-01"))
    end_date = st.sidebar.date_input("종료 날짜: ", value = pd.to_datetime("2023-07-28"))

	#ticker 종목의 시작~종료 날짜 사이의 가격변화를 데이터로 보여줌
    data = yf.download(ticker, start= start_date, end= end_date)
    st.dataframe(data)
    
    
if __name__ == "__main__":
    main()
  • st.sidebar 를 통해 사이드바를 생성하고 내용을 넣을 수 있음.
  • st.sidebar.text_input : 사이드바에 텍스트를 입력할 수 있는 요소를 만듦
  • st.sidebar.date_input : 사이드바에 날짜를 입력할 수 있는 요소를 만듦
 

👉 결과 

 

3. 라디오버튼으로  캔들스틱/라인형 그래프를 볼 수 있게 만들기

(위 함수에 이어지는 코드)

 #Line Chart, Candle Stick 선택형으로 만들기
    chart_type = st.sidebar.radio("Select Chart Type", ("Candle_Stick", "Line"))
    candlestick = go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'])
    line = go.Scatter(x=data.index, y=data['Close'], mode='lines', name='Close')

    if chart_type == "Candle_Stick":
        fig = go.Figure(candlestick)
    elif chart_type == "Line":
        fig = go.Figure(line)
    else:
        st.error("error")

    fig.update_layout(title=f"{ticker} Stock {chart_type} Chart", xaxis_title="Date", yaxis_title="Price")
    st.plotly_chart(fig)

👉 결과 

 

 

4.  최신 날짜부터 조회하고 싶은 행의 개수 지정(사이드바에 숫자 input 영역)

   st.markdown("<hr>", unsafe_allow_html=True)	#구분선 추가
   
   #숫자를 넣을 수 있는 영역 생성
    num_row = st.sidebar.number_input("Number of Rows", min_value= 1, max_value=len(data))
    
    #최근 날짜부터 결과값 보여줌
    st.dataframe(data[-num_row:].reset_index().sort_index(ascending = False).set_index("Date"))

👉 결과 

 

 

 

[부록] 슬라이더 넣어보기

    #방법1
    value1 = st.sidebar.slider('숫자 선택(1)', 0, 100)
    st.sidebar.write(value1)

    #방법2
    with st.sidebar:
        value2 = st.slider("숫자 선택(2)",0, 100)
        st.write(value2)
        
if __name__ == "__main__":
    main()

👉 결과 

728x90