출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] '대시보드 - Streamlit' 카테고리의 글 목록 :: 하나둘셋넷
728x90

스트림릿_input_2

 

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

 

st.header('날짜 구간으로 데이터 조회하기')

# streamlit\data_subway_in_seoul.csv  
# 한글 encoding='cp949' 추가하여 읽어오고 확인하기 
df = pd.read_csv('streamlit\data_subway_in_seoul.csv', encoding='cp949' )
# 날짜 필드의 데이터 형식 확인하기
st.write('날짜 필드 형식: ', df['날짜'].dtypes )
# 데이터프레임 내용 확인하기
st.write(df)

# 날짜 컬럼을 string에서 datetime으로 변환하기
df['날짜'] = pd.to_datetime(df['날짜'], format='%Y-%m-%d'  )
# 날짜 필드의 데이터 형식 확인하기
st.write('날짜 필드 형식: ', df['날짜'].dtypes )
# 데이터프레임 내용 확인하기
st.write(df)

# slider를 사용하여 날짜 구간 설정하기
slider_date = st.slider(
    '날짜 구간을 선택하세요 ',
    datetime(2021,1,1), datetime(2021,12,31),            # 날짜 전체 구간 : 2021.1.1~2021.12.31
    value=(datetime(2021, 7, 1), datetime(2021, 7, 31)), # 초기 설정 구간 : 2021.7.1~2021.7.31
    format='YY/MM/DD')                                   # 날짜 형식: YY/MM/DD

# slider_date의 구간 날짜 확인하기
st.write('slider_date[0]: ', slider_date[0], 'slider_date[1]: ', slider_date[1] )

# slider_date의 선택된 시작, 종료 날짜를 start_date, end_date에 저장하기
start_date = slider_date[0]
end_date = slider_date[1]

# slider 날짜 구간으로 df를 읽어서 새 sel_df 으로 저장하고 확인하기
sel_df = df.loc[df['날짜'].between(start_date, end_date)]
st.dataframe(sel_df)


# 파일실행: File > New > Terminal(anaconda prompt) - streamlit run streamlit\4-2.input_ans.py

 

날짜 구간으로 데이터 조회하기

 

 

날짜 형식 datetime으로 변경

 

 

슬라이더를 통해 날짜 구간 설정

 

728x90
728x90

Streamlit

# streamlit 라이브러리와 datetime 모듈 불러오기
import streamlit as st
import numpy as np
import pandas as pd
from datetime import datetime  

st.title('Unit 4. Input Widgets')
st.caption('참조사이트: https://docs.streamlit.io/library/api-reference/widgets')

st.header('1. Button')
if st.button('Say hello'):
    st.write('Hello')
else:
    st.write('Goodbye')

st.header('2. Radio button')
genre = st.radio('좋아하는 영화 장르를 선택하세요',('코메디', 'SF', '액션'))

if genre == '코메디':
    st.write('코메디 유쾌하신 분이시군요')
elif genre == 'SF':
    st.write('저도 SF 좋아합니다')
else:
    st.write('멋지십니다.')       

st.header('3. Checkbox')
agree = st.checkbox('I agree')
if agree:
    st.write('😄'*10) 

st.header('4. Select box')
option = st.selectbox('어떻게 연락 드릴까요?',('Email', 'Mobile phone', 'Office phone'))
st.write('네 ', option, ' 잘 알겠습니다')

st.header('5. Multi select')
options = st.multiselect('좋아하는 색을 모두 선택하세요',
         ['Green', 'Yellow', 'Red', 'Blue'],
         ['Yellow', 'Red'])
st.write('선호 색상:')
for i in options: 
    st.write(i)

st.header('6. Input: Text/Number')

st.subheader('**_text_input_**')
title = st.text_input('최애 영화를 입력하세요 ', 'Sound of Music')
st.write('당신이 가장 좋아하는 영화는 : ', title)

st.subheader('**_number_input_**')
number = st.number_input('Insert a number(1-10)', min_value=1, max_value=10, value=5, step=1)
st.write('The current number is ', number)

st.header('7. Date input')
ymd = st.date_input('When is your birthday',datetime(2000, 9, 6))
st.write('Your birthday is:', ymd)

st.header('8. Slider')

st.subheader('**_Slider- 이전 구간_**')
age = st.slider('나이가 어떻게 되세요 ? ', 0, 130, 25)
st.write('I am ', age, ' years old')

st.subheader('**_최소-최대값 내에서 숫자 사이 구간_**')
values = st.slider('값 구간을 선택하세요 ', 0.0, 100.0, (25.0, 75.0))
st.write('Values: ', values)

st.subheader('**_년 월 일 사이 구간_**')

slider_date = st.slider(
    '날짜 구간을 선택하세요 ',
    # min_value=datetime(2022, 1, 1), max_value=datetime(2022, 12, 31),
    datetime(2022, 1, 1), datetime(2022, 12, 31),
    value=(datetime(2022, 6, 1), datetime(2022, 7, 31)),
    format='YY/MM/DD')
st.write('slider date: ', slider_date)
st.write('slider_date[0]: ', slider_date[0], 'slider_date[1]: ', slider_date[1] )

# 년 월 일 시 사이 구간
# slider_time = st.slider(
#     'Select a range of datetime?',
#     datetime(2022, 1, 1, 0, 30), datetime(2022, 12, 31, 0, 30),
#     value=(datetime(2022, 7, 1, 0, 30), datetime(2022, 10, 31, 9, 30)),
#     format='MM/DD/YY - hh:mm')
# st.write('Slider time: ', slider_time)

# 파일실행: File > New > Terminal(anaconda prompt) - streamlit run streamlit\4-1.input_ans.py

 

 

 

728x90
728x90

스트림릿_map_folium_covid

 

import streamlit as st
import folium
import pandas as pd
map_data = pd.read_csv('.\streamlit\covid_map.csv')
# 1. 타이틀과 캡션 표시하기
# 타이틀 : Covid-19 감염현황
# 캡션 : Displaying geographical data on a map using Streamlit and Folium
st.title('Covid-19 감염현황')
st.caption('Displaying geographical data on a map using Streamlit and Folium')

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

# folium.Map(): Folium에서 지도 객체를 생성
# location: 지도가 초기에 어떤 위치에서 시작할지를 정의
# map_data['lat'].mean()과 map_data['lon'].mean(): 평균 위도와 경도 위치를 지도 중심으로 설정
# zoom_start: 이 매개변수는 지도의 초기 확대 수준 (default=10, 숫자가 클수록 확대)

my_map = folium.Map( location=[map_data['lat'].mean(), map_data['lon'].mean()], zoom_start=3 )

 

# 지도에 원형 마커와 값 추가
for index, row in map_data.iterrows():       # 데이터프레임 한 행 씩 index, row에 담아서 처리 
    folium.CircleMarker(                     # 원 표시 선언
        location=[row['lat'], row['lon']],   # 원 중심- 위도, 경도
        radius=row['value']/10000,           # 원의 반지름 /10000
        color='pink',                        # 원의 테두리 색상
        fill=True,                           # 원을 채움
        fill_opacity=0.8                     # 원의 내부를 채울 때의 투명도
    ).add_to(my_map)                         # my_map에 원형 마커 추가

    folium.Marker(                           # 값 표시 선언
        location=[row['lat'], row['lon']],   # 값 표시 위치- 위도, 경도
        icon=folium.DivIcon(html=f"<div>{row['name']} {row['value']:,.0f}</div>") # row['value']:,.0f - 천 단위 구분기호 추가
    ).add_to(my_map)                         # my_map에 값 추가


# 지도 그리기
# st.components.v1.html : Streamlit 라이브러리의 components 모듈에서 html 함수 사용
# ._repr_html_() : 지도를 HTML 형식으로 표시
st.components.v1.html(my_map._repr_html_(), width=1000, height=800)


# 파일실행: File > New > Terminal(anaconda prompt) - streamlit run streamlit\7-3.folium_covid_ans.py

728x90
728x90

스트림릿_map_folium

import streamlit as st
import folium
import pandas as pd
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 Petersburg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'],
    'value': [10, 12, 40, 70, 23, 43, 100, 43] 
})

# folium.Map(): Folium에서 지도 객체를 생성
# location: 지도가 초기에 어떤 위치에서 시작할지를 정의
# map_data['lat'].mean()과 map_data['lon'].mean(): 평균 위도와 경도 위치를 지도 중심으로 설정
# zoom_start: 이 매개변수는 지도의 초기 확대 수준 (default=10, 숫자가 클수록 확대)

my_map = folium.Map( location=[map_data['lat'].mean(), map_data['lon'].mean()], zoom_start=2 )
# 지도에 원형 마커와 값 추가
for index, row in map_data.iterrows():       # 데이터프레임 한 행 씩 index, row에 담아서 처리 
    folium.CircleMarker(                     # 원 표시 선언
        location=[row['lat'], row['lon']],   # 원 중심- 위도, 경도
        radius=row['value'] / 5,             # 원의 반지름
        color='pink',                        # 원의 테두리 색상
        fill=True,                           # 원을 채움
        fill_opacity=1.0                     # 원의 내부를 채울 때의 투명도
    ).add_to(my_map)                         # my_map에 원형 마커 추가

    folium.Marker(                           # 값 표시 선언
        location=[row['lat'], row['lon']],   # 값 표시 위치- 위도, 경도
        icon=folium.DivIcon(html=f"<div>{row['name']} {row['value']}</div>"), # row['name'], row['value'] 표시
    ).add_to(my_map)                         # my_map에 값 추가

 

# 타이틀과 캡션 표시하기
st.title('Map with Location Data')
st.caption("Displaying geographical data on a map using Streamlit and Folium")

# 지도 그리기
# st.components.v1.html : Streamlit 라이브러리의 components 모듈에서 html 함수 사용
# ._repr_html_() : 지도를 HTML 형식으로 표시
st.components.v1.html(my_map._repr_html_(), width=800, height=600)

 

# 파일실행: File > New > Terminal(anaconda prompt) - streamlit run streamlit\7-2.folium_map_ans.py

 

728x90
728x90

스트림릿_map

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')


# 파일실행: File > New > Terminal(anaconda prompt) - streamlit run streamlit\7-1.st_map_ans.py

 

728x90
728x90

스트림릿

단계

  • 터미널을 열어 pip install을 통해 streamlit을 설치한다.
  • 필요한 라이브러리를 import 한다.
  • 제목과 subheader를 입력하자
  • 버튼을 통해 원본 주소를 보여준다.
  • 체크박스를 클릭하며 다양한 동작을 수행하자
  • 차트 그리기
  • selectbox를 활용해보자
  • 차트 그리기 mark_line()
  • 차트 그리기 mark_area()
  • 차트 그리기 mark_bar()

터미널을 열어 pip install을 통해 streamlit을 설치한다.

설치화면이다.

터미널을 실행하여

streamlit run streamlit/파일이름.py

을 입력하면, 아래와 같은 창을 실행할 수 있다.

필요한 라이브러리를 import 한다.

import streamlit as st

import altair as alt

import pandas as pd

import plotly.express as px

 

제목과 subheader를 입력하자

st.title('종합실습')

st.header('_2021 서울교통공사 지하철 월별 하차 인원_')

 

버튼을 통해 원본 주소를 보여준다.

if st.button('data copyright link'):
        st.write('https://www.data.go.kr/data/15044247/fileData.do')

 

체크박스를 클릭하며 다양한 동작을 수행하자

# 원본 데이터 확인
if st.checkbox('원본 데이터 보기'):
	subheader('1. 원본 데이터 - df')
	st.dataframe(df)

# 구분 컬럼이 하차인 데이터 선택
# 먼저 구분 컬럼이 하차인 데이터를 선택한다.
df_off = df.loc[df['구분'] =='하차']

# checkbox를 선택하면 데이터프레임이 나오도록 한다.

if st.checkbox('하차 데이터 보기'):
	subheader('2. 하차 데이터 - df_off')
	st.write(df_off)

# 호선, 시간대별 인원수 보기
# 불필요한 컬럼을 삭제한다.

df_line = df_off.drop(['날짜','연번','역번호','역명','구분','합계'], axis=1)

if st.checkbox('호선, 시간대별 인원수 보기'):
	st.subheader('3. 호선, 시간대별 인원수 - df_line')
	st.write(df_line)

# Unpivot 데이터 보기
#  melt 함수 사용 unpivot: identifier-'호선', unpivot column-'시간', value column-'인원수' 
# 새로운 데이터프레임에 저장 & checkbox를 선택하면 데이터프레임이 나타남

df_line_melted = pd.melt(df_line, id_vars = ['호선'], var_name = '시간', value_name = '인원수')

if checkbox('Unpivot 데이터 보기'):
	st.subheader('4. 구조 변경 : (Unpivot by melt) 데이터 - df_line_melted')
	st.write(df_line_melted)

 

호선, 시간별 인원수의 합을 확인하자

# '호선','시간' 별 '인원수' 합,  as_index=False 저장 & 확인 
# 새로운 데이터프레임에 저장 & checkbox를 선택하면 데이터프레임이 나타남
df_line_groupby = df_line_melted.groupby( [ '호선', '시간' ], as_index = False)[ '인원수' ].sum()

if st.checkbox('호선, 시간대별 인원 집계 데이터 보기'):
	st.subheader(' 5. 호선, 시간대별 인원 집계 데이터 - df_line_groupby')
	st.write(df_line_groupby)

# Unpivot과 호선','시간' 별 '인원수' 합을 수행하면 아래와 같다.

 

 

차트 그리기 mark_line()

# altair mark_line 차트 그리기
st.subheader('전체 호선 시간대별 하차 인원 (5.df_line_groupby)')

# 데이터프레임- df_line_groupby
# x- '시간', y- '인원수', color- '호선', strokeDash- '호선'

chart = alt.Chart(df_line_groupby).mark_line().encode(
	x = '시간', y = '인원수', color = '호선', stroke = '호선').properties(width = 650, height = 350)

st.altair_chart(chart, use_container_width = True)

 

selectbox를 활용해보자

st.subheader('선택한 호선의 시간대별 하차 인원')

# 데이터프레임- df_line_groupby  ('호선', '시간대별' 인원 집계 )
# ['호선'] 컬럼에 대해 .unique() 매소드를 사용하여 
# selectbox에 호선이 각각 하나만 나타나게 함

option = st.selectbox('호선 선택 (5.df_line_groupby)', df_line_groupby['호선'].unique())

# .loc 함수를 사용하여 선택한 호선 데이터 선별하고
# 새로운 데이터 프레임-에 저장 & 확인 
df_selected_line = df_line_groupby.loc[df_line_groupby['호선'] ==option]
st.write(option, ' 데이터 (df_selected_line)', df_selected_line)

 

차트 그리기 mark_area()

# altair mark_area 차트 그리기
# 데이터프레임- df_selected_line, x- '시간', y- '인원수'

chart = alt.Chart(df_selected_line).mark_area().encode(                           
	x='시간', y='인원수').properties(width = 650, height = 350)st.altair_chart(chart, use_container_width = True)

 

선택한 역의 시간대별 하차 인원 - selectbox

st.subheader('선택한 역의 시간대별 하차 인원')

# selectbox를 사용하여 '하차역' 선택
# ['역명'] 컬럼에 대해  .unique() 매소드를 사용하여 
# selectbox에 역명이 각각 하나만 나타나게 함

option = st.selectbox('하차역 선택 (2.df_off)', df_off['역명'].unique())

# .loc 함수를 사용하여 선택한 역의 데이터를 선별하고
# 새로운 데이터 프레임에 저장
df_sta = df_off.loc[df_off['역명'] == option]
st.write(option, '하차 데이터 (df_sta)', df_sta)

 

 

# 불필요한 컬럼 '연번','호선','역번호','역명','구분','합계' 제외하고 기존 데이터 프레임에 저장
# 참고) df_sta = df_sta[df_sta.columns.difference(['연번', '호선', '역번호', '역명','구분','합계'])]

df_sta_drop = df_sta.drop(['연번', '호선', '역번호', '역명','구분','합계'], axis=1)
st.write('날짜, 시간대별 인원수 (df_sta_drop)', df_sta_drop)

 

# melt 함수 사용 unpivot: identifier-'날짜', unpivot column-'시간', value column-'인원수' 
# 새로운 데이터 프레임-에 저장 & 확인

df_sta_melted = pd.melt(df_sta_drop, id_vars=['날짜'], var_name='시간', value_name='인원수')
st.write('Unpivot (df_sta_melted)', df_sta_melted)

 

# '시간' 별 '인원수' 집계 , as_index=False
# 새로운 데이터 프레임-에 저장 & 확인
df_sta_groupby = df_sta_melted(['시간'], as_index = False)['인원수'].sum()

st.write(option, ' 집계 데이터 (dfa_sta_groupb)', df_sta_groupby)

 

altair mark_bar  chart + text 그리기 mark_bar()

# 데이터프레임- df_sta_groupby,  x-'시간',  y-'인원수'

chart = alt.Chart(df_sta_groupby).mark_bar().encode(
			x = '시간', y = '인원수').properties(width = 650, height = 350)

text = alt.Chart(df_sta_groupby).mark_text(dx = 0, dy = -10, color = 'black').encode(
			x = '시간', y = '인원수', text = alt.Text('인원수:Q', format = ',.0f') )
# format=',.0f' : 천 단위 구분기호+소수점 이하 0
st.altair_chart(chart+text, use_container_width = True)

728x90

+ Recent posts