카테고리 없음

스트림릿

chacha001 2024. 10. 11. 01:04

스트림릿 이란?

스트림릿(Streamlit)은 Python을 사용해 간단하고 빠르게 데이터 애플리케이션을 만들 수 있는 오픈소스 프레임워크입니다. 주로 데이터 분석가, 머신러닝 엔지니어, 그리고 개발자들이 데이터를 시각화하고 대화형 웹 애플리케이션을 구축하는 데 사용됩니다. 스트림릿의 가장 큰 장점 중 하나는 복잡한 HTML, CSS, JavaScript 코드를 작성하지 않고도, Python 스크립트만으로 대화형 대시보드를 만들 수 있다는 점입니다.

주요 특징:

  1. 쉽고 빠른 개발: 스트림릿을 사용하면 Python 코드를 작성하면서 바로 웹 애플리케이션을 만들 수 있습니다. 데이터 분석 또는 머신러닝 모델을 배포할 때 매우 유용합니다.
  2. 대화형 위젯: 버튼, 슬라이더, 체크박스, 입력 폼 등을 사용해 사용자가 직접 상호작용할 수 있는 대화형 웹 페이지를 쉽게 만들 수 있습니다.
  3. 실시간 업데이트: 코드가 변경될 때마다 애플리케이션이 실시간으로 업데이트되므로, 개발 과정을 효율적으로 관리할 수 있습니다.
  4. 쉬운 배포: 스트림릿 클라우드 같은 배포 서비스를 사용해 스트림릿 애플리케이션을 간단히 웹에 배포할 수 있습니다.

스트림릿은 데이터 시각화 도구인 Matplotlib, Plotly, Altair와 같은 라이브러리들과 쉽게 통합되어 데이터를 시각적으로 표현할 수 있습니다. 이를 통해 머신러닝 모델의 결과나 데이터 분석 결과를 대화형 애플리케이션으로 배포할 수 있습니다.

 

이라고 지피티씨가 알려주엇다.

 

 

몇가지 주요 코드들을 정리하자면

 

데이터프레임 다루는 방법-

import streamlit as st
import pandas as pd

st.text('1. 지하철 데이터 읽고 확인- data_subway_in_seoul.csv')
# 데이터 주소: 'C:/실습파일이 있는 폴더 경로/data_subway_in_seoul.csv' 또는 'data_subway_in_seoul.csv'
# encoding='cp949'  읽어오고 확인하기 
df = pd.read_csv('data_subway_in_seoul.csv', encoding='cp949')
st.dataframe(df)

st.text("2. 구분이 '하차'인 행만 새로운 데이터프레임으로 저장 & 확인") 
df_off = df.loc[df['구분']=='하차']
st.dataframe(df_off)

st.text("3. '날짜','연번','역번호','역명','구분','합계' 제외하고 저장 & 확인")
df_line = df_off.drop(['날짜','연번','역번호','역명','구분','합계'], axis=1)
st.dataframe(df_line)

st.text("4. 아래 방법으로 데이터프레임 변환하여 저장 & 확인")
st.caption("melt 함수 사용 unpivot: identifier-'호선', unpivot column-'시간', value column-'인원수'")
df_line_melted = pd.melt(df_line, id_vars=['호선'], var_name='시간', value_name='인원수')
st.dataframe(df_line_melted)

st.text("5. '호선','시간' 별 '인원수' 합,  as_index=False 저장 & 확인")
df_line_groupby = df_line_melted.groupby(['호선','시간'], as_index=False)['인원수'].sum()
st.dataframe(df_line_groupby)

 

이렇게 pandas를 이용해서 loc, drop등을 쓸수잇다

실행하면 웹페이지에서 데이터프레임이 보인다.

 

 

 

 

csv파일 데이터프레임으로 만들고 시각화하기

 

import streamlit as st
import altair as alt
import pandas as pd
import plotly.express as px
# px 모듈이 없다고 에러가 나는 경우, 아래 방법으로 plotly 라이브러리 설치
# File > New > Terminal 선택 후, 창에 다음 구분 실행 pip install plotly 

st.header('Unit 3. Streamlit Simple chart')

# data_sales.csv 읽고 확인하기
chart_data = pd.read_csv('data_sales.csv')
st.dataframe(chart_data)

st.subheader('3-1. Simple Line chart')
# use_container_width=True 가로로 화면에 꽉 채워 줌
st.line_chart(chart_data, use_container_width=True) 

st.subheader('3-2. Simple Bar chart')
st.bar_chart(chart_data)

st.subheader('3-3. Simple area chart')
st.area_chart(chart_data)

st.header('Unit 4. Altair chart') 
#data_retail.csv 읽고 
# melt 함수를 사용하여 데이터프레임 unpivot하기
df = pd.read_csv('data_retail.csv')
df_melted = pd.melt(df, id_vars=['date'], var_name='teams', value_name='sales')

# columns 함수를 이용하여 좌-원본 데이터, 우-변환 데이터 출력하기
col1, col2 = st.columns(2)
with col1:
    st.text('원본 데이터')
    st.dataframe(df)
with col2:
    st.text('변경 데이터')
    st.dataframe(df_melted)

    
st.subheader('4-1. Altair Line chart')
chart = alt.Chart(df_melted, title='일별 팀 매출 비교').mark_line().encode(
         x='date', y='sales', color='teams', strokeDash='teams').properties(width=650, height=350)
st.altair_chart(chart, use_container_width=True)


st.subheader('4-2. Altair Bar chart')

chart = alt.Chart(df_melted, title='일별 매출').mark_bar().encode(
    x='date', y='sales', color='teams')

text = alt.Chart(df_melted).mark_text(dx=0, dy=0, color='black').encode(
    x='date', y='sales', detail='teams',
    text=alt.Text('sales:Q')  # 소수점 이하 1자리: 'sales:Q', format='.1f'
    )
st.altair_chart(chart+text, use_container_width=True)
    
    
st.subheader('4-3. Altair Scatter chart')


iris = pd.read_csv('data_iris.csv')
st.dataframe( iris )

# caption으로 'sepal:꽃받침, petal:꽃잎' 설명 출력하기 
st.caption('sepal:꽃받침, petal:꽃잎')

# petal_length, petal_width로 Altair Circle chart 그리기
chart = alt.Chart(iris).mark_circle().encode(
    x = 'petal_length', y='petal_width', color = 'species'
)  
st.altair_chart(chart, use_container_width=True)


st.header('Unit 5. Plotly chart')


medal = pd.read_csv('data_medal.csv')
st.dataframe(medal)

st.subheader('5-1. Plotly Pie/Donut chart') 
fig = px.pie(medal, values = "gold", names = "nation", 
             title="올림픽 양궁 금메달 현황", hole=.3 ) # 도넛차트: hole=.3 
fig.update_traces(textposition='inside', textinfo = 'percent+value+label')
fig.update_layout(font = dict(size = 16))
# fig.update(layout_showlegend=False)  # 범례 표시 제거
st.plotly_chart(fig)

st.subheader('5-2. Plotly Bar chart')
# text_auto=True 값 표시 여부
fig = px.bar(medal, x="nation", y=["gold", "silver", "bronze"],
             text_auto=True, title="올림픽 양궁 메달 현황")
st.plotly_chart(fig)

 

엄청 많다

 

그중하나인 Pie/Donut 차트를 보자면

이런식으로 로컬 웹페이지에서 나타나진다~

 

 

 

그. 렇. 담

jupyter lab에서도 바로 시각화해서 볼수있는걸 왜 굳이 streamlit을 이용하는걸까?? 그것은 바로....

 

 

 

이런 기능을쓸수있기 때문이다!

 

import streamlit as st
import altair as alt
import pandas as pd
import plotly.express as px
# px 모듈이 없다고 에러가 나는 경우, 아래 방법으로 plotly 라이브러리 설치
# File > New > Terminal 선택 후, 창에 다음 구분 실행 pip install plotly 



st.subheader('1. Altair Scatter chart- 재무 분석')

# data_financial.csv 읽어오기 
# 한글 encoding='CP949'
fi = pd.read_csv('data_financial.csv', encoding='CP949')

# 체크박스 버튼을 선택하여 데이터 확인
if st.checkbox('재무분석 데이터 조회'):
    st.dataframe(fi)
    
# radio button을 사용하여 판매량/매출원가/수익을 선택
sel = st.radio(
     '총매출 대비 분석을 원하는 항목을 선택하세요.',
     ('판매량', '매출원가', '수익'))

# altar circle chart 그리기: x=총매출, y=선택된 항목, color='상품', size=선택된 항목
fig = alt.Chart(fi).mark_circle().encode( x = '총매출', y=sel, color = '상품', size= sel).properties(width=650, height=450)
st.altair_chart(fig, use_container_width=True)


st.subheader('2. Plotly Pie chart- 타이타닉 생존 분석')

# data_titanic.csv 데이터 읽어오기 
titanic = pd.read_csv('data_titanic.csv')

# 체크박스 버튼을 선택하여 데이터 확인
if st.checkbox('타이타닉 데이터 조회'):
    st.dataframe(titanic)

# select box를 사용하여 탑승지역-Embarked/객실등급-Pclass 선택
tit = st.selectbox(
     '생존자 분석을 위한 항목을 선택하세요.',
     ('탑승지역별 분석', '객실등급별 분석') )
if tit == '탑승지역별 분석':
    sel = 'Embarked' 
else:  
    sel = 'Pclass'

# columns 함수를 이용하여 좌-pie chart, 우-bar chart 그리기
# 차트 크기 조정- fig.update_layout(height=400, width=400)
col1, col2 = st.columns(2)
with col1:
    # pie chart 그리기: name=선택항목, values='Survived'
    fig = px.pie(titanic, names=sel, values='Survived') 
    fig.update_traces(textposition='inside', textinfo = 'percent+label+value')
    fig.update_layout(height=400, width=400, font = dict(size = 16))
    fig.update(layout_showlegend=False)
    st.plotly_chart(fig)
with col2:
    # bar chart 그리기: x=선택 항목, y="Survived", color="Sex"
    fig = px.bar(titanic, x=sel, y="Survived", color="Sex")
    fig.update_layout(height=400, width=400)
    st.plotly_chart(fig)

st.subheader('2. Plotly Pie chart- 타이타닉 생존 분석') 부터 동영상부분 코드이고, 그 위 코드는 산점도 그리는 코드다!

 

 

 

 

그. 리. 고.

streamlit 을 쓰는 또다른 이유

 

 

이렇게  위도와 경로를 데이터프레임에 넣어서 지도위에 마커를 찍을수있다. 당근 지도는 확대가능~

 

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

# 위도 : latitude  경도 : longitude
data = pd.DataFrame({
    'lat':[-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97],
    'lon':[-58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5]
})

# 지도 그리기
st.map(data,
       latitude='lat',
       longitude='lon')


##################### 연습 문제 #####################

# 1. 아래 데이터를 딕셔너리 형태로 선언하고 map_data에 저장하기 
# 'lat': -34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97
# 'lon': -58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5
# 'name': 'Buenos Aires', 'Paris', 'melbourne', 'St Petersbourg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'
# 'value': 10, 12, 40, 70, 23, 43, 100, 43

map_data = pd.DataFrame({
    'lat':[-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97],
    'lon':[-58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5],
    'name':['Buenos Aires', 'Paris', 'melbourne', 'St Petersbourg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'],
    'value':[10, 12, 40, 70, 23, 43, 100, 43]
})

# 2. subheader 코드를 사용하여 지도 제목 'Aivle Map' 보여주기
st.subheader('Aivle Map')

# 3. checkbox를 이용하여 checkbox 선택여부에 따라
#    write 코드를 사용하여 화면에 데이터프레임 값 나타내기 
if st.checkbox('Display Data'):
    st.write(map_data) 

# 지도 그리기
st.map(map_data,
    latitude='lat',
    longitude='lon')

 

이건 위 지도위 마커 코드다

 

 

끝..