7일차(Python)

허우영·2024년 6월 13일
post-thumbnail

생성일: 2024년 5월 17일 오전 9:31

Streamlit 활용 gui

anacomda prompt 실행하고 가상환경 만들어서 python -m pip install pysimplegui==4.60.5 설치하고 pysimplegui 튜토리얼 들어가서

import PySimpleGUI as sg

if __name__ == "__main__":

# All the stuff inside your window.
    layout = [  [sg.Text('Some text on Row 1')],
            [sg.Text('Enter something on Row 2'), sg.InputText()],
            [sg.Button('Ok'), sg.Button('Cancel')] ]

# Create the Window
window = sg.Window('Window Title', layout)

# Event Loop to process "events" and get the "values" of the inputs
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'Cancel': # if user closes window or clicks cancel
        break
    print('You entered ', values[0])

window.close()

복붙하고 티미널에서실행

pip install auto-py-to-exe 인스톨하고 설정에서 나는 위치를

C:/Users/USER/Desktop/WorkSpace/GUI/runner.py 설정했고

단일파일 설정하고 콘솔 매번 나오기 귀찮으니까 꺼주고

마지막으로 고급에서 --hidden-import 에서 PySimpleGUI 만 추가했음

.PY에서 .EXE로 전환 하면 바이러스 감시 뜨는데

window 보안 - 바이러스 및 위협 방지 - 보호 기록 - 심각에서 복원으로 바꿔주면 끝

The Project - PySimpleGUI Documentation

PysampleGUI docu

import PySimpleGUI as sg
import os.path

class Mainv:
    def __init__(self, title):

        # All the stuff inside your window.
        layout = [
            [sg.Text("Some text on Row 1")],
            [sg.Text("제목넣는 컴포넌트"), sg.Text("제목넣는 컴포넌트")],
            [sg.Input()],
            [sg.Button("Button1")],
            [sg.Text("Enter something on Row 2"), sg.InputText()],
            [sg.Button("Ok"), sg.Button("Cancel")],
        ]

        # Create the Window
        window = sg.Window(title, layout)

        # Event Loop to process "events" and get the "values" of the inputs
        while True:
            event, values = window.read()
            if (
                event == sg.WIN_CLOSED or event == "Cancel"
            ):  # if user closes window or clicks cancel
                break
            if (
                event == "Button1"
            ):  # if user closes window or clicks cancel
                print("버튼1이눌려짐")
            # print("You entered ", values[0])

        window.close()
import PySimpleGUI as sg
import os.path

class Mainv:
    def __init__(self):
        left_col = [
            [
                sg.Text("이미지가 들어있는 폴더를 선택해주세요"),
                sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
                sg.FolderBrowse(button_text="열기"),
            ],
            [
                sg.Listbox(
                    values=[], enable_events=True, size=(40, 20), key="-FILE LIST-"
                )
            ],
        ]

        image_col = [
            [sg.Text("선택한 폴더의 이미지 리스트")],
            [sg.Text(size=(40, 1), key="-TOUT-")],
            [sg.Image(key="-IMAGE-")],
        ]

        layout = [[sg.Column(left_col), sg.VSeparator(), sg.Column(image_col)]]

        window = sg.Window("이미지뷰어", layout)

        while True:
            event, values = window.read()

            if event in (None, "Exit"):
                break
            if event == "-FOLDER-":
                folder = values["-FOLDER-"]
                try:
                    file_list = os.listdir(folder)
                    # print(file_list)
                except Exception as e:
                    print(e)
                    file_list = []
                fnames = [
                    f
                    for f in file_list
                    if os.path.isfile(os.path.join(folder, f))
                    and f.lower().endswith((".png", ".jpg", "jpeg", ".tiff", ".bmp"))
                ]

                window["-FILE LIST-"].update(fnames)
            # 테이블객체로 리스트업
            elif event == "-FILE LIST-":
                try:
                    filename = os.path.join(
                        values["-FOLDER-"], values["-FILE LIST-"][0]
                    )
                    window["-TOUT-"].update(filename)
                    window["-IMAGE-"].update(filename=filename)
                except Exception as e:
                    print(e)
                    pass

        window.close()

stramlit 실습

conda create -n 가상환경 이름 = 가상환경 만들기

conda env list = 가상환경 체크

conda activate 가상환경 이름 = 환경 바꾸기

Stramlit

Streamlit • A faster way to build and share data apps

stramlit 홈페이지 링크

pynecone(파인콘) → Reflex(리플렉스)

Reflex · Web apps in Pure Python

Reflex 홈페이지 링크

Alternative(얼터너티브)

Alternative 홈페이지 링크

pip install streamlit 으로 설치

pip freeze → requirements.txt

pip install -r requirements.txt = requirements.txt 파일 설치 같은 경로에있어야함

명령어에 streamlit hello를 치면

이렇게 나오면 성공이다

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

class VView:
    def __init__(self, appname):
        st.title(appname)
        st.title(":sunglasses:")
        st.title(":sunglasses:")
        st.header("데이터를 보여드릴께요! :sparkles:")
        st.caption("이미지입니다. :sparkles:")
        sample_code = '''
function01():
print("조회됨")'''
        st.code(sample_code, language='python')
        st.text("제가만들 모델은 이러이러하다")
        st.markdown("# 안녕하세요")
        st.html("<h1>안녕하세요</h1>")
        st.html("<hr>")

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

코드 실행 화면

이제 사용 해볼건

pandas가 제공하는 자료구조 Series, DataFrame

넘파이의 nd.array 자료구조와 Series

df 엑셀처럼 행과 열로 되어있다 2차원

2 행 열

행 가로 로우 rows

열 세로 컬럼 column

자료구조에서 [행] 이 먼저 온다.

ex) [1행[”홍길동”, 45, “서울”]2행[”이순신”, 55, “부산”]]

시리즈 자료구조가 모여서 데이터 프레임을 이룬다.

백터 매트릭스 텐서

이제 데이터 프레임을 만들어보자

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

class VView:
    def __init__(self, appname):
        st.title(appname)
        st.title(":sunglasses:")
        st.title(":sunglasses:")
        st.header("데이터를 보여드릴께요! :sparkles:")
        st.caption("이미지입니다. :sparkles:")
        sample_code = """
function01():
print("조회됨")"""
        st.code(sample_code, language="python")
        st.text("제가만들 모델은 이러이러하다")
        st.markdown("# 안녕하세요")
        st.html("<h1>안녕하세요</h1>")
        st.html("<hr>")

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

        # 리스트, 튜플, 셋트, 딕셔너리

        dataframe = pd.DataFrame(
            {
                "first column": [1, 2, 3, 4],
                "second column": [10, 20, 30, 40],
            }
        )

        st.dataframe(dataframe, use_container_width=False)

        st.table(dataframe)

        st.metric(label="온도", value="24°C", delta="12°C")
        st.metric(label="삼성전자", value="77,400 원", delta="800 원")

        col1, col2, col3 = st.columns(3)
        col1.metric(label="달러USD", value="1,355 원", delta="-12.00 원")
        col2.metric(label="일본JPY(100엔)", value="870.63 원", delta="-7.44 원")
        col3.metric(label="유럽연합EUR", value="1,471.82 원", delta="11.44 원")

        st.html("<hr>")

        button = st.button("눌러주세요")
        button2 = st.button("되돌리기")
        if button:
            st.write(":blue[버튼]이 눌렸습니다 :sparkles:")
        if button2:
            pass

        st.download_button(
            label="CSV로 다운로드",
            data=dataframe.to_csv(),
            file_name="sample data.csv",
            mime="text/csv",
        )
        st.link_button("Go to Naver", "https://www.naver.com")

        agree = st.checkbox("동의?")

        if agree:
            st.write("감사합니다. :100:")

        # 선택 박스
        mbti = st.selectbox(
            "당신의 MBTI는 무엇입니까?", ("ISTJ", "ENFP", "선택지 없음"), index=2
        )

        # 다중 선택 박스
        options = st.multiselect(
            "당신이 좋아하는 과일은 뭔가요?",
            ["망고", "오렌지", "사과", "바나나"],
            ["망고", "오렌지"],
        )

        # 슬라이더
        values = st.slider(
            "범위의 값을 지정할 수 있어요 :sparkles:", 0.0, 100.0, (25.0, 75.0)
        )
        st.write("선택 범위:", values)

        title = st.text_input(label="나이입력", placeholder=20)
        title2 = st.text_area(label="나이입력", placeholder="나이를 입력해주세요")
        number = st.number_input(
            label="숫자를 입력해주세요 :sparkles:", placeholder="나이를 입력해주세요"
        )
import streamlit as st
import numpy as np
import pandas as pd
import datetime
from datetime import datetime as dt
import random
from streamlit.components.v1 import html

class lotto:
    def __init__(self, appname):
        st.title(appname)
        st.header("lotto :sparkles:")

    def generate_lotto():
        lotto = set()

        while len(lotto) < 6:
            number = random.randint(1, 46)
            lotto.add(number)

        lotto = list(lotto)
        lotto.sort()
        return lotto

    # st.subheader(f'행운의 번호: :green[{generate_lotto()}]')
    # st.write(f"생성된 시각: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}")

    button = st.button('로또를 생성해 주세요!')

    if button:
        for i in range(1, 6):
            st.subheader(f'{i}. 행운의 번호: :green[{generate_lotto()}]')
        st.write(f"생성된 시각: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}")

차트 실습을 해보자 그 전에

python -m pip install -U matplotlib

pip install seaborn 을 설치하자

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

# class chart:
#     def __init__(self, appname):
#         st.title(appname)

# plt.rcParams['font.family'] = "AppleGothic"
# plt.rcParams['font.family'] = "NanumGothic"
plt.rcParams['font.family'] ="Malgun Gothic"
plt.rcParams['axes.unicode_minus'] = False

# 폰트 파일 경로로 설정해주는 방법도 있다

# DataFrame 생성
data = pd.DataFrame({
    '이름': ['영식', '철수', '영희'],
    '나이': [22, 31, 25],
    '몸무게': [69.4, 155.15, 45.45]
})

st.dataframe(data, use_container_width=True)

fig, ax = plt.subplots()
ax.bar(data['이름'], data['몸무게'])

st.pyplot(fig)

barplot = sns.barplot(x = '이름', y = '몸무게', data=data, ax=ax, palette='Set2')

fig = barplot.get_figure()

st.pyplot(fig)

파일 업로드를 실습해보자

pip install openpyxl 를 설치하자

import streamit as st
import pandas as pd
import time

# 파일 업로드 버튼 (업로드 기능)
file = st.file_uploader("파일 선택(csv or excel)", type=['csv', 'xls', 'xlsx'])

time.sleep(3)

# Excel or CSV 확장자를 구분하여 출력하는 경우
if file is not None:
    ext = file.name.split('.')[-1]
    if ext == 'csv':
        # 파일 읽기
        df = pd.read_csv(file)
        # 출력
        st.dataframe(df)
    elif 'xls' in ext:
        # 엑셀 로드
        df = pd.read_excel(file, engine='openpyxl')
        # 출력
        st.dataframe(df)

stockchart 를 실습해보자

pip install finance-datareader

pip install beautifulsoup4

pip install plotly 를 설치하자

import streamlit as st
import FinanceDataReader as fdr
import datetime

date = st.date_input(
    "조회 시작일을 선택해 주세요",
    datetime.datetime(2024, 5, 17)
)

code = st.text_input(
    '종목코드', 
    value='000660', # SK하이닉스 종목코드
    placeholder='종목코드를 입력해 주세요'
)

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

0개의 댓글