Web 2 : decoration, streamlit

haeIT·2024년 8월 7일

Web

목록 보기
2/14
post-thumbnail

2024-08-07 WED

  • 여건이 되면 리액트까지 해서 웹앱 개발 끝낼 것.

  • 1,2교시 어제 한거 복습이라 아무것도 모르겠네요...

  • 이력서 써가야 하는데 뭘 써가야할까요?
    🍀clova says🍀

  • 하루 빠지니까 복습할 때 계속 못 쫓아가네여..

  • 이제 빠지지 않겠습니당..ㅜ



  • 파이썬으로 html, sql모두 연동하는 중
  • flask로 html 띄워서 학생정보 입력하고 데이터베이스에 저장하기(main.py -> add_point_pro.html -> database.py)

first_class function(일급함수)

👉 일급함수?

  1. 함수를 변수에 저장할 수 있다
  2. 함수의 반환 값으로 함수를 리턴할 수 있다
  3. 함수를 매개변수로 받을 수 있다

=> 파이썬 함수는 first class function에 해당됨

👉 first_class func를 지원하는 언어

  • python, Go, javascript, Kotlin등

데코레이션 decoration

  • 기본 형태
@ 함수명
def index():
   return 'hello world'
  • 이렇게 정의하면 index()함수에 @함수명이 데코된다~!
def outer_func(function):

  def inner_func(digit1, digit2):
    if digit2 == 0:
      print('cannot divide by zero')
      return
    else:
      function(digit1, digit2)

  return inner_func

def divide(digit1, digit2):
  return digit1/digit2 
  • 후에 divide(10,0)을 출력하면
  • 이렇게 오류가 발생하지만 데코레이터를 이용하면?!
@outer_func
def divide(digit1, digit2):
  return digit1/digit2

  • 위에 outer_func에서 설정한 데코가 적용되어 설정해둔 경고 문구가 나온다~!

streamlit

  • vscode에서 새로운 폴더 streamlit 생성 후 streamlit 설치~!
  • 터미널 창에서 streamlit run 파일명.py 하면 창이 뜹니다~!

실습 1. streamlit_0.py

import streamlit as st

st.title('이것은 타이틀입니다.')

st.title('스마일 : sunglasses')

sample_code = """
def function():
print('hello world')"""

st.code(sample_code, language='python')

st.text('일반 텍스트입니다.')

#마크다운
st.markdown('streamlit은 **마크다운 문법을 지원** 합니다.')
st.markdown('텍스트의 색상을 :green[초록색]으로 그리고"":blue[파란색]** 볼드체로 설정 ')
st.markdown(' :green[$\sqrt(x^2 + y^2) = 1$]와 같은 latex 문법도 지원합니다.')


실습 2. streamlit_1.py

import streamlit as st
import pandas as pd
import numpy as np

st.title('데이터프레임')

df = pd.DataFrame(
    {
        'first_column':[1,2,3,4,],
        'second_column':[10,20,30,40]
    }
)

#온도, 삼성전자
st.dataframe(df, use_container_width=True)

st.table(df)

st.metric(label = '온도', value = '10 C', delta = '1.2 C') 
#delta는 간격~!
st.metric(label = '삼성전자', value='61,000원', delta='1,200원')

#환율정보
# 화면 영역을 나누어서 표현
col1, col2, col3 = st.columns(3)
col1.metric(label='달러 USA',value='1,228 원', delta='-12.00 원')
col2.metric(label='일본 JPY',value='958.63 원', delta='-7.55 원')
col3.metric(label='유럽 EUR',value='1,355 원', delta='11.44 원')

  • 온도, 삼성전자

  • 환율정보 (화면 분할)


실습 3. streamlit_2.py

import streamlit as st
import pandas as pd
from datetime import datetime as dt
import datetime

button = st.button('press button')

if button: #button 눌러서 true일때
    st.write(':blue[버튼]이 눌렸습니다 :sparkles: ')
    
df = pd.DataFrame(
    {
        'first_col': [1,2,3,4],
        'second_col':[10,20,30,40]
    }
)

st.dataframe(df, use_container_width=True)

st.download_button(
    label = 'csv로 다운로드',
    data = df.to_csv(),
    file_name= 'sample.csv',
    mime = 'text/csv' #파일 형식 지정 text/csv는 csv 파일
)

#체크박스
agree = st.checkbox('동의하십니까?')

if agree:
    st.write('동의해주셔서 감사합니다. :100:')
    
    
#라디오버튼 - 여러개 중에서 하나 선택
mbti = st.radio(
    '당신의 MBTI는 무엇입니까?',
    ('ISTJ', 'ENFP', '선택지 없음')
)

if mbti == 'ISTJ':
    st.write('당신은 :blue[현실주의자] 이시네요.')
elif mbti == 'ENFP':
    st.write('당신은 :green[활동가] 이시네요.')
else:
    st.write('당신에 대해서 :red[알고 싶어요.] :exclamation:') 
    
    
#다중선택
options = st.multiselect(
    '당신이 좋아하는 과일은 무엇인가요?',
    ['망고', '오렌지', '사과', '바나나'],
    ['망고', '오렌지']
) 

st.write(f'당신의 선택은 : :red[{options}] 입니다.')

위 코드에서 추가!

#슬라이더
values = st.slider(
    '범위의 값을 다음과 같이 지정할 수 있어요 :sparkles:', 
    0.0, 100.0, (25.0, 75.0)
)
#괄호 안에는 디폴트 값~!

st.write('선택범위: ', values)

#텍스트입력
title = st.text_input(
    label = '가고 싶은 여행지는?',
    placeholder= '여행지를 입력하세요'
)

st.write(f'당신이 선택한 여행지 : :violet[{title}]')


#숫자 입력
number = st.number_input(
    label='나이를 입력해주세요',
    min_value= 10,
    max_value= 100,
    value=30, step=1
)

st.write('당신이 입력한 숫자는 : ', number)

# 시간 구간 슬라이더
start_time = st.slider(
    '언제 약속을 잡는 것이 좋을까요?',
    min_value=dt(2020,1,1,0,0),
    max_value=dt(2020,12,23,10,0),
    value=dt(2020,6,15,10,3),
    format='MM/DD/YY HH:mm'
)

st.write('선택한 약속시간: ', start_time)


실습 4. streamlit_3.py

import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

plt.rcParams['font.family'] = 'Gothic'
plt.rcParams['axes.unicode_minus'] = False

df = pd.DataFrame(
    {
        '이름':['영식', '철수', '영희'],
        '나이':[22,31,25],
        '모음계':[75.5, 80.2, 55.1]
    }
)
st.dataframe(df, use_container_width=True)

#matplotlib
fig, ax = plt.subplots()
ax.bar(df['이름'], df['나이']) #x,y축 지정
st.pyplot(fig)


#seaborn
barplot = sns.barplot(x='이름', y='나이', data = df, ax = ax, palette = 'Set2')
fig = barplot.get_figure()

st.pyplot(fig)

  • 한글 폰트가 안맞아서 깨짐ㅠ

  • 폰트를 맑은 고딕으로 바꾸니까 됩니다~!
    plt.rcParams['font.family'] = 'Malgun Gothic'

실습 5. streamlit_4.py

import streamlit as st
import FinanceDataReader as fdr
import datetime

date = st.date_input(
    '조회할 시작일을 선택해 주세요',
    datetime.datetime(2022, 1, 1)
)

code = st.text_input(
    '종목코드',
    value='',
    placeholder='종목코드를 입력해주세요'
)

if code and date:
    df = fdr.DataReader(code, date)
    data = df.sort_index(ascending=False).loc[:, 'Close']
    st.line_chart(data)



  • 내일 streamlit 마무리하고 fast api 넘어가겠습니다~!~!
  • 내일부터는 진짜 웹 구현~!~!

0개의 댓글