# Base 이미지
FROM python:3.12-slim
# 2. 작업 디렉토리를 /app으로 설정
WORKDIR /app
# 3. 현재 디렉토리의 requirements.txt 파일을 컨테이너의 /app으로 복사
COPY requirements.txt /app/
# 4. requirements.txt에 명시된 패키지 설치
RUN pip3 install -r requirements.txt
# 5. 실행할 streamlit_app.py를 컨테이너 /app으로 복사
COPY streamlit_app.py /app/
# 6. 컨테이너가 수신할 포트 오픈
EXPOSE 8501
# 7. 컨테이너 헬스 체크
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
#8. 실행될 컨테이너 구성
ENTRYPOINT [ "streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0" ]
Streamlit 버전 1.10.0 이상에서는 Streamlit 앱을 Linux 배포판의 루트 디렉터리에서 실행할 수 없습니다. 따라서 WORKDIR은 루트가 아닌 별도 디렉토리를지정해야 합니다. (예. /app) (참고) github Issue:5239
Docker image 빌드
생성한 Dockerfile 을 streamlit 이미지 이름으로 빌드합니다.
docker build -t streamlit .
docker images 로 생성된 이미지 를 확인합니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
streamlit latest bb9ac485406e 2 minutes ago 634MB
Docker 컨테이너 실행
컨테이너의 포트 8501을 서버의 8501 포트에 게시합니다.
docker run -p 8501:8501 streamlit
출력된 URL로 접속합니다.
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.
You can now view your Streamlit app in your browser.
URL: http://0.0.0.0:8501
Streamlit은 데이터 애플리케이션을 빠르고 쉽게 만들 수 있도록 설계된 파이썬 기반의 오픈 소스 라이브러리입니다. 이 도구는 데이터 시각화와 머신 러닝 모델의 프로토타이핑 및 배포를 단순화하여 사용자가 복잡한 데이터 작업을 쉽게 수행할 수 있게 합니다.
Streamlit의 특징
코드 중심의 접근 방식: Streamlit 애플리케이션은 순수 파이썬 코드로 작성되므로 별도의 웹 프론트엔드 기술 없이도 데이터 앱을 만들 수 있습니다.
간편한 사용법: 몇 줄의 코드만으로도 인터랙티브한 요소(슬라이더, 버튼, 차트 등)를 추가할 수 있으며, 앱의 업데이트와 실행이 매우 빠릅니다.
빠른 프로토타이핑: 데이터 과학 프로젝트의 초기 아이디어를 빠르게 시각화하고 공유할 수 있어 프로토타이핑과 반복 개발 과정이 용이합니다.
확장성: Streamlit 앱은 컨테이너화하여 쉽게 배포할 수 있고, 다양한 데이터 소스와 라이브러리를 지원합니다.
장점
빠른 개발 속도: 복잡한 웹 앱을 빠르게 개발할 수 있으며, 데이터 과학자가 웹 개발에 대한 깊은 지식 없이도 사용할 수 있습니다.
쉬운 배포: Streamlit Sharing을 통해 GitHub에서 직접 앱을 호스팅하고 공유할 수 있습니다.
강력한 커뮤니티 지원: 오픈 소스 프로젝트로서 활발한 커뮤니티 지원과 지속적인 업데이트가 이루어집니다.
인터랙티비티: 사용자 입력에 반응하는 동적인 데이터 애플리케이션을 쉽게 만들 수 있습니다.
단점
고급 사용자 정의 제한: Streamlit은 사용의 용이성에 중점을 두기 때문에, 복잡한 사용자 인터페이스나 고도로 맞춤화된 앱 디자인을 구현하기 어려울 수 있습니다.
성능 문제: 대규모 데이터셋이나 복잡한 연산을 처리하는 앱의 경우, 성능 저하가 발생할 수 있습니다.
웹 개발 기능의 제한: 전통적인 웹 개발 툴셋에 비해 제공하는 웹 개발 기능이 제한적일 수 있습니다. 복잡한 웹 애플리케이션을 구축하려는 경우 다른 프레임워크를 고려해야 할 수도 있습니다.
Streamlit App 실행하기
# streamlit 라이브러리설치
pip install streamlit
# Streamlit으로 실행
streamlit run your_script.py
# Python 모듈로 실행 → Python으로 실행하는 경우, PyCharm과 같은 IDE를 구성할 때 유용할 수 있습니다.
python -m streamlit run your_script.py
Data 표시방법
Streamlit에서 Data (tables, arrays, data frames 등)를 표시하는 방법은 magic CLI 와 st.write() 를 활용하는 방법이 있다. st.write()는 텍스트에서 테이블까지 다 작성이 가능하다.
① magic command line
Streamlit은 변수나 데이터가 선언되어 있으면 자동으로 st.write()를 사용하여 앱을 빌드 합니다.
###
# first app
# DataFrame 으로 테이블을 생성
###
import streamlit as st
import pandas as pd
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20,30, 40]
})
df
② st.write()
st.write()는 텍스트, 데이터, 차트 등 arguments 에 따라 작성 할 수 있다.
import streamlit as st
import pandas as pd
st.write("Here's our first attempt at using data to create a table:")
st.write(pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20,30, 40]
}))
데이터를 표시하는 데 사용할 수 있는 st.dataframe() 및 st.table()과 같은 함수를 사용하여 다양한 style을 적용 할 수 있다.
DataFrame에 Style 적용하기
① DataFrame에 Highligt 적용
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(10, 20), # 표준 정규분포 확률을 따르는 난수를 생성
columns = ('col %d' % i for i in range(20))
)
# 열의 최대값에 하이라이트 표시
st.dataframe(df.style.highlight_max(axis=0))
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(10, 20), # 표준 정규분포 확률을 따르는 난수를 생성
columns = ('col %d' % i for i in range(20))
)
st.table(df)
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(20, 3), # 표준 정규분포 확률을 따르는 난수를 생성
columns = ['a', 'b', 'c']
)
st.line_chart(df)
import streamlit as st
import pandas as pd
import numpy as np
st.markdown("### 1. slider widget")
x = st.slider('x')
st.write(x, '제곱은', x * x)
st.markdown("### 2. text input widget")
st.text_input("Your name", key="name")
# You can access the value at any point with:
st.session_state.name
st.markdown("### 3. checkbox widget")
if st.checkbox('Once you checked, dataframe is displyed'):
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
chart_data
st.markdown("### 4. selectbox widget")
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
option = st.selectbox(
'Which number do you like best?',
df['first column'])
'You selected: ', option
import streamlit as st
import time
# 사이드바에 selctbox 구성하기
add_selectbox = st.sidebar.selectbox(
'How would you like to be contacted?',
('Email', 'Home phone', 'Mobile phone')
)
# 사이드바에 slide 구성하기
add_slider = st.sidebar.slider(
'Select a range of values',
0.0, 100.0, (25.0, 75.0)
)
# 위젯을 나란히 배치하기
left_column, right_column = st.columns(2)
left_column.title('Left Column')
left_column.button('Press me')
right_column.title('Right Column')
with right_column:
chosen = st.radio(
'Sorting hat',
("Gryffindor", "Ravenclaw", "Hufflepuff", "Slytherin")
)
st.write(f"You are in {chosen} house!")
# Progress Bar
st.title('Progress Bar')
'Starting a long computation...'
latest_iteration = st.empty()
bar = st.progress(0)
for i in range(100):
latest_iteration.text(f'Iteration {i+1}')
bar.progress(i+1)
time.sleep(0.1)
'...and now we\'re done!'
멀티페이지 App 만들기
Streamlit 1.10 이상 부터는 멀티 페이지를 구성할 수 있습니다.
서브페이지 구성 제약
Sub 페이지의 기본 구성은 pages 디렉토리에 위치해야 합니다.
각 Streamlit 앱의 이름은 파일 이름에 따라 결정되므로 앱 이름을 변경하려면 파일 이름을 변경해야 합니다. (이모티콘 추가도 가능)
각 Python 파일의 시작 부분에 숫자를 추가하여 페이지 순서를 지정할 수 있습니다. 파일 이름 앞에 1을 추가하면 Streamlit은 해당 파일을 목록의 첫 번째로 배치합니다.
각 페이지에는 파일 이름으로 정의된 고유한 URL이 있습니다.
멀티페이지 구성
멀티페이지는 메인이 되는 Home.py 와 내부의 1_page_one.py, 2_Page_two.py, 3_🥉_three.py 3개의 서브페이지로 이동 되도록 구성합니다.
페이스 구성 소스트리
Home.py # "streamlit run"으로 실행할 메인 파일
└─── pages/
└─── 1_page_one.py
└─── 2_Page_two.py
└─── 3_🥉_three.py
① 기본 사이드바 탐색 숨기기
파일명을 기준으로 사이드바 메뉴를 별도 이름으로 지정할 수 있도록 변경합니다. 사용자 정의 탐색 메뉴를 생성할 때 를 사용하여 기본 사이드바 탐색을 숨겨야 합니다. 소스코드 루트 .streamlit/config.toml작업 디렉터리에 다음 파일을 추가합니다 .
pdf 를 추출하기 위해 pdfplumber.open(file) 함수를 이용하여 pdf를 추출합니다.
import os
import pdfplumber
import pandas as pd
file_path = os.getcwd()+"/contents/"
pdf_name = "file.pdf"
pdf_file_path = file_path + pdf_name
# PDF 파일 열기
pdf = pdfplumber.open(pdf_file_path)
pages = pdf.pages
print("총 페이지 수 : ", len(pages))
tables = []
# 1. 페이지에서 표 데이터 추출하기
for each in pages:
table = each.extract_tables()
tables.extend(table)
3. 데이터 프레임으로 변환
# 2. 데이터 프레임으로 변환
df = pd.DataFrame(tables[1:], columns=[tables[0]])
# 3. 데이터프레임을 엑셀 파일로 저장
excel_file_path = file_path + "file.xlsx"
df.to_excel(excel_file_path, index=False, engine='openpyxl')
print(f'DataFrame이 {excel_file_path}에 저장 되었습니다.')
Anaconda 가상환경은 운영체제끼리는 같아야 yml 기반으로 가상환경 생성 과정에서 에러가 생기지 않습니다.
일부 OS 플랫폼에서는 사용할 수 없는 패키지가 있습니다.
Linux에서만 사용할 수 있는 패키지와 Windows에서만 사용할 수 있는 패키지가 있어 빌드버전은 OS에 따라 다를 수 있습니다.
Conda does not check architecture or dependencies when installing from a spec file. To ensure that the packages work correctly, make sure that the file was created from a working environment, and use it on the same architecture, operating system, and platform, such as linux-64 or osx-64.
1. 가상환경 Export
빌드 버전의 OS종속성을 제거하기 위해 --no-build 옵션을 사용하여 가상환경을 추출합니다.
Window 환경의 CMD(명령 프롬프트)에서는 conda 명령어가 잘 동작하지만 powershell에서는 명령어가 동작하지 않는 문제가 있습니다.
아래와 같이 하면 PowerShell에서도 사용할 수 있습니다.
1. init powershell in Conda
# 1. ****init powershell in Conda****
conda init powershell
# 2. 현재 설정된 정책을 확인
Get-ExecutionPolicy
# Result
PS C:\WINDOWS\system32> Get-ExecutionPolicy
ByPass
2. 실행 정책 변경
아래 명령어로 정책을 변경합니다.
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
Get-ExecutionPolicy 으로 Unrestricted 결과가 나오면 정책이 변경이 완료됩니다.