|
@@ -1,11 +1,335 @@
|
|
|
---
|
|
|
-title: 第三章:注意力机制
|
|
|
+title: 第一章:入门介绍
|
|
|
author: SHENG XU
|
|
|
date: 2022-05-04
|
|
|
category: nlp
|
|
|
layout: post
|
|
|
---
|
|
|
|
|
|
+# streamlit 介绍
|
|
|
+
|
|
|
+streamlit 是一个用于构建数据应用的开源 Python 库。它提供了一个简单的 API,可以让你在几行代码中构建数据应用。streamlit 会自动处理数据的加载、交互和可视化,让你可以专注于数据分析和应用的构建。
|
|
|
+
|
|
|
+无需写html, css,js等前端代码。
|
|
|
+
|
|
|
+```
|
|
|
+poetry new streamlit
|
|
|
+poetry add streamlit
|
|
|
+
|
|
|
+sreamlit hello
|
|
|
+```
|
|
|
+
|
|
|
+demo.py
|
|
|
+
|
|
|
+```
|
|
|
+import streamlit as st
|
|
|
+import pandas as pd
|
|
|
+import numpy as np
|
|
|
+import matplotlib.pyplot as plt
|
|
|
+
|
|
|
+st.markdown("demo")
|
|
|
+st.title("demo")
|
|
|
+
|
|
|
+st.header("1、标题")
|
|
|
+st.text("文本")
|
|
|
+st.write("文本")
|
|
|
+st.code("print('hello world')",language="python")
|
|
|
+
|
|
|
+st.header("2、表格")
|
|
|
+st.subheader("2.1、表格")
|
|
|
+
|
|
|
+
|
|
|
+df = pd.DataFrame(
|
|
|
+ np.random.randn(10, 5),
|
|
|
+ columns=('第 %d 列' % (i+1) for i in range(5))
|
|
|
+)
|
|
|
+
|
|
|
+st.table(df)
|
|
|
+# 高级图表:排序,高亮
|
|
|
+st.dataframe(df.style.highlight_max(axis=0))
|
|
|
+
|
|
|
+
|
|
|
+#监控面板
|
|
|
+col1, col2, col3=st.columns(3)
|
|
|
+col1.metric("指标1", 100, 200)
|
|
|
+col2.metric("指标2", 200, 100)
|
|
|
+col3.metric("指标3", 300, 300)
|
|
|
+
|
|
|
+# 折线图,生成3列随机数
|
|
|
+chart_data=pd.DataFrame(
|
|
|
+ np.random.randn(20,3),
|
|
|
+ columns=['a','b','c']
|
|
|
+)
|
|
|
+st.line_chart(chart_data)
|
|
|
+
|
|
|
+# 柱状图
|
|
|
+st.bar_chart(chart_data)
|
|
|
+
|
|
|
+# 面积图
|
|
|
+st.area_chart(chart_data)
|
|
|
+
|
|
|
+# 交互式图表
|
|
|
+
|
|
|
+# 地图
|
|
|
+map_data=pd.DataFrame(
|
|
|
+ np.random.randn(1000,2)/[50,50]+[37.76,-122.4],
|
|
|
+ columns=['lat','lon']
|
|
|
+)
|
|
|
+st.map(map_data)
|
|
|
+
|
|
|
+
|
|
|
+# 散点图
|
|
|
+
|
|
|
+def scatter_plot(data, color):
|
|
|
+ fig, ax=plt.subplots()
|
|
|
+ ax.scatter(data['lat'], data['lon'], color=color)
|
|
|
+ ax.set_xlabel('lat')
|
|
|
+ ax.set_ylabel('lon')
|
|
|
+ ax.set_title('scatter plot')
|
|
|
+ return fig
|
|
|
+
|
|
|
+fig = scatter_plot(map_data, 'red')
|
|
|
+st.pyplot(fig)
|
|
|
+```
|
|
|
+
|
|
|
+运行:
|
|
|
+```
|
|
|
+
|
|
|
+if __name__=='__main__'
|
|
|
+ streamlit_runner.run(run, 'demo.py')
|
|
|
+
|
|
|
+streamlit run demo.py
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+Streamlit 的一些原生图表组件,虽然做到了傻瓜式,但仅能输入数据、高度和宽度,如果你想更漂亮的图表,就像 matplotlib.pyplot、Altair、vega-lite、Plotly、Bokeh、PyDeck、Graphviz 那样,streamlit 也提供了支持
|
|
|
+
|
|
|
+
|
|
|
+# 交互,表单
|
|
|
+
|
|
|
+- button:按钮
|
|
|
+- download_button:文件下载
|
|
|
+- file_uploader:文件上传
|
|
|
+- checkbox:复选框
|
|
|
+- radio:单选框
|
|
|
+- selectbox:下拉单选框
|
|
|
+- multiselect:下拉多选框
|
|
|
+- slider:滑动条
|
|
|
+- select_slider:选择条
|
|
|
+- text_input:文本输入框
|
|
|
+- text_area:文本展示框
|
|
|
+- number_input:数字输入框,支持加减按钮
|
|
|
+- date_input:日期选择框
|
|
|
+- time_input:时间选择框
|
|
|
+- color_picker:颜色选择器
|
|
|
+
|
|
|
+```
|
|
|
+import streamlit as st
|
|
|
+
|
|
|
+@st.cache_data
|
|
|
+def expensive_computation(a, b):
|
|
|
+ # 模拟一些很复杂的计算
|
|
|
+ return a * b
|
|
|
+
|
|
|
+input_a = st.number_input("输入a", value=1)
|
|
|
+input_b = st.number_input("输入b", value=1)
|
|
|
+
|
|
|
+output = expensive_computation(input_a, input_b)
|
|
|
+st.write("计算结果(:", output)
|
|
|
+
|
|
|
+
|
|
|
+name = st.text_input("请输入您的名字", value="John Doe")
|
|
|
+occupation = st.selectbox("请选择您的职业", ("学生", "教师", "工程师"))
|
|
|
+age = st.slider("请选择您的年龄", min_value=0, max_value=100, value=30, step=1)
|
|
|
+
|
|
|
+st.write(f"您好,{name}!您是一位{occupation},今年{age}岁。")
|
|
|
+
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+## 多媒体组件
|
|
|
+
|
|
|
+- image:图片 st.image
|
|
|
+- audio:音频 st.audio
|
|
|
+- video:视频 st.video
|
|
|
+
|
|
|
+## 状态进度条
|
|
|
+
|
|
|
+- progress:进度条,如游戏加载进度
|
|
|
+- spinner:等待提示
|
|
|
+- balloons:页面底部飘气球,表示祝贺
|
|
|
+- error:显示错误信息
|
|
|
+- warning:显示报警信息
|
|
|
+- info:显示常规信息
|
|
|
+- success:显示成功信息
|
|
|
+- exception:显示异常信息(代码错误栈)
|
|
|
+
|
|
|
+## 页面,侧边栏,布局
|
|
|
+
|
|
|
+- st.sidebar:侧边栏
|
|
|
+- st.empty:空白占位
|
|
|
+- st.markdown:Markdown
|
|
|
+- st.columns:多列布局
|
|
|
+- st.expander:展开收起
|
|
|
+- st.beta_expander:展开收起
|
|
|
+- st.container:容器
|
|
|
+
|
|
|
+
|
|
|
+```
|
|
|
+color = st.sidebar.color_picker('Pick A Color', '#00f900')
|
|
|
+```
|
|
|
+
|
|
|
+### 多页面交互,数据传递
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+main.py
|
|
|
+----pages
|
|
|
+---------home.py
|
|
|
+---------about.py
|
|
|
+
|
|
|
+import streamlit as st
|
|
|
+session_state=st.session_state
|
|
|
+session_state['page]='Home'
|
|
|
+
|
|
|
+sidebar_page=st.sidebar.radio('Page', ['Home', 'About'])
|
|
|
+
|
|
|
+if page =='Home':
|
|
|
+ st.title('Home')
|
|
|
+elif page =='About':
|
|
|
+ st.title('About')
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+##
|
|
|
+
|
|
|
+st.stop
|
|
|
+st.form
|
|
|
+st.form_submit_button
|
|
|
+st.echo
|
|
|
+
|
|
|
+# 缓存
|
|
|
+st.cache
|
|
|
+
|
|
|
+```
|
|
|
+read_and_cache_csv=st.cache(pd.read_csv)
|
|
|
+df=read_and_cache_csv("data.csv", nrows=1000)
|
|
|
+desired_label=st.selectbox("Label", df.columns)
|
|
|
+st.write(df[desired_label].value_counts())
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+## streamlit 与其他库的结合
|
|
|
+
|
|
|
+### streamlit + matplotlib
|
|
|
+
|
|
|
+
|
|
|
+### steamlit + plotly
|
|
|
+
|
|
|
+
|
|
|
+### streamlit + FastAPI + mysql
|
|
|
+
|
|
|
+streamlit 登录等功能较弱,为此可以结合fastapi框架,实现登录验证等功能。
|
|
|
+
|
|
|
+```python
|
|
|
+import streamlit as st
|
|
|
+import requests
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+### 登录验证 + firebase
|
|
|
+
|
|
|
+每次操作互动组件时(比如输入新问题),都会触发重新运行(rerun)。rerun(重新运行)是streamlit的一个特色,指的是将应用代码从头到尾重新运行一遍。
|
|
|
+
|
|
|
+初始化firebase:
|
|
|
+```python
|
|
|
+#配置firebaseConfig
|
|
|
+firebaseConfig = {...}
|
|
|
+#然后进行初始化
|
|
|
+firebase = pyrebase.initialize_app(firebaseConfig)
|
|
|
+auth = firebase.auth()
|
|
|
+# Database
|
|
|
+db = firebase.database()
|
|
|
+storage = firebase.storage()
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+登录按钮:
|
|
|
+```
|
|
|
+if st.session_state['logged_in']:
|
|
|
+ st.sidebar.write(f"Hello, {st.session_state['username']}!")
|
|
|
+ if st.sidebar.button('Logout'):
|
|
|
+ st.session_state['logged_in'] = False
|
|
|
+ st.session_state['username'] = ''
|
|
|
+ st.session_state['history'] = []
|
|
|
+ st.session_state['generated'] = []
|
|
|
+ st.session_state['past'] = []
|
|
|
+ st.experimental_rerun()
|
|
|
+else:
|
|
|
+ auth_option = st.sidebar.radio("Choose an option", ['Login', 'Register'])
|
|
|
+ email = st.sidebar.text_input("Email")
|
|
|
+ password = st.sidebar.text_input("Password", type='password')
|
|
|
+
|
|
|
+ if auth_option == 'Login':
|
|
|
+ if st.sidebar.button('Login'):
|
|
|
+ try:
|
|
|
+ user = auth.sign_in_with_email_and_password(email, password)
|
|
|
+ st.session_state['user'] = user
|
|
|
+ st.session_state['logged_in'] = True
|
|
|
+ st.session_state['username'] = email
|
|
|
+ st.session_state['email'] = email
|
|
|
+ st.success("Logged in successfully")
|
|
|
+ except:
|
|
|
+ error_message = "Invalid email or password"
|
|
|
+ st.error(error_message) # Display the error message
|
|
|
+ st.experimental_rerun()
|
|
|
+
|
|
|
+ elif auth_option == 'Register':
|
|
|
+ if st.sidebar.button('Register'):
|
|
|
+ try:
|
|
|
+ user = auth.create_user_with_email_and_password(email, password)
|
|
|
+ st.session_state['logged_in'] = True
|
|
|
+ st.session_state['username'] = email
|
|
|
+ st.success("Registered and logged in successfully")
|
|
|
+ #st.experimental_rerun()
|
|
|
+ except:
|
|
|
+ error_message = "Failed to create account"
|
|
|
+ st.error(error_message) # Display the error message
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+```
|
|
|
+if 'total_tokens_used' not in st.session_state:
|
|
|
+ st.session_state.total_tokens_used = 0
|
|
|
+
|
|
|
+
|
|
|
+with get_openai_callback() as cb:
|
|
|
+ output = conversational_chat(user_input)
|
|
|
+ token_cost = cb.total_tokens
|
|
|
+ st.session_state.total_tokens_used += token_cost
|
|
|
+ tokens_remaining -= token_cost
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+### streamlit + Flask
|
|
|
+
|
|
|
+## deploy
|
|
|
+
|
|
|
+默认部署到 https://share.streamlit.io/ ,也可以部署到自己的服务器上。
|
|
|
+
|
|
|
+Resources per app 1 GB
|
|
|
+Private apps 1 app
|
|
|
+Public apps Unlimited
|
|
|
+
|
|
|
+
|
|
|
+docker 部署, heroku.com
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|