streamlit快速部署-SCADA数据分析
作者:互联网
通过建立一个SCADA数据分析的web app,简单介绍一下streamlit的使用及部署上线。
文中代码请详见GitHub:
https://github.com/SooHooLee/test
项目的web app请详见:
https://share.streamlit.io/soohoolee/test/data_analysis.py
Streamlit快速部署
1. 什么是Streamlit
Streamlit:针对机器学习和数据科学团队的应用开发框架,是构建和共享数据应用的最快方式,不需要前端经验,可以在几分钟内在python中快速搭建可共享的用户交互友好型web app。
2. Streamlit安装与运行
安装:打开Anaconda Prompt,在命令行模式下,直接pip安装。
$ pip install streamlit
运行:在文件目录下,运行streamlit文件
$ streamlit run 文件名.py
3. SCADA数据分析实践
引入Streamlit:import streamlit as st
streamlit主界面只能分为左侧和右侧,虽然没有HTML/CSS的样式好看,但是好在简洁明了吧。在本项目中,左侧用于操作,右侧实时显示。在streamlit的语句中添加.sidebar.
就可以将其置于左侧界面了。
3.1 导库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import streamlit as st
from windrose import WindroseAxes
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei'] #正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #正常显示负号
from statsmodels.tsa.stattools import acf
from statsmodels.graphics.tsaplots import plot_acf
3.2 数据读入
(1)标题:st.header('This is a header')
(2)副标题:st.subheader('This is a subheader')
(3)导入文件:st.file_uploader(label, type=None, accept_multiple_files=False, key=None, help=None, on_change=None, args=None, kwargs=None)
参数详解:
label (str):简短的标签,提示用户上传器的用途;
type (str/list/str/None):允许的扩展名数组。[‘png’, ‘jpg’] 默认为 None,表示允许所有扩展名;
accept_multiple_files (bool):如果为 True,则允许用户同时上传多个文件,在这种情况下,返回值将是文件列表。默认值:False;
key (str/int):可选的字符串或整数,用作小部件的唯一键;
help (str):显示在文件上传器旁边的工具提示。
on_change (callable):file_uploader 的值可选回调。
args (tuple):传递给回调的可选参数元组。
kwargs (dict):传递给回调的 kwargs 可选字典。
(4)将数据框显示为交互性表格:st.dataframe(data)
st.sidebar.subheader('* 数据上传 *')
st.subheader('* 数据说明 *')
file = st.sidebar.file_uploader('上传数据', type=['csv'], key=None)
scada_data = pd.read_csv(file)
st.dataframe(scada_data)
3.3 选择时间序列
(5)滑动条:st.slider(label, min_value=None, max_value=None, value=None, step=None, format=None, key=None, help=None, on_change=None, args=None, kwargs=None)
参数详解:
label (str):简短的标签,提示用户滑动条的用途;
min_value:最小允许值。如果值为 int,则默认为 0,如果为浮点数,则为 0.0,如果为日期/日期时间,则为 value - timedelta(days=14),如果为时间,则为 time.min;
max_value:最大允许值。如果值为 int,则默认为 100,如果为浮点数,则为 1.0,如果为日期/日期时间,则为 value + timedelta(days=14),如果为时间,则为 time.max;
value:滑块首次渲染时的值。如果在此处传递一个包含两个值的元组/列表,则会呈现具有这些下限和上限的范围滑块。例如,如果设置为(1, 10),滑块将有一个介于 1 和 10 之间的可选范围。默认为 min_value。
step(int/float/timedelta/None):步长间隔,如果值为整数,则默认为 1,如果为浮点数,则默认为 0.01,如果是日期/日期时间,则默认为 0.01,如果是日期/日期时间,则默认为 timedelta(minutes=15)(或者如果 max_value - min_value < 1 天);
format (str/None):printf 样式的格式字符串,控制界面应如何显示数字。这不会影响返回值。int/float 格式器支持:%d %e %f %g %i 日期/时间/日期时间格式器使用 Moment.js 符号
(6)写入:st.write(*args, **kwargs)
write()是个百宝箱,可以根据()里的命令显示相应的内容,比如:
write(string) : 打印格式化的 Markdown 字符串,使用支持 LaTeX 表达式和表情符号短代码。
write(data_frame) :将 DataFrame 显示为表格。
write(error) :专门打印异常。
write(func) :显示有关函数的信息。
write(module) :显示有关模块的信息。
write(dict) :在交互式小部件中显示 dict。
write(mpl_fig) :显示 Matplotlib 图。
write(altair) :显示 Altair 图表。
write(keras) :显示 Keras 模型。
write(graphviz) :显示 Graphviz 图。
write(plotly_fig) :显示 Plotly 图。
write(bokeh_fig) :显示散景图。
write(sympy_expr) :使用 LaTeX 打印 SymPy 表达式。
write(htmlable) :如果可用,则为对象打印 repr_html() 。
write(obj) :如果其他未知,则打印 str(obj)
等等等等…
# ---------------------------选择时间序列-----------------------
st.sidebar.subheader('* 时间序列 *')
st.subheader('* 时间序列 *')
options = np.array(scada_data['real_time']).tolist()
(start_time, end_time) = st.select_slider("请选择时间序列:", options=options,value=(options[0], options[len(options) - 1]))
# setting index as date
scada_data['real_time'] = pd.to_datetime(scada_data['real_time'], format='%Y-%m-%d')
scada_data.index = scada_data['real_time']
st.write("序列开始时间:", start_time)
st.write("序列结束时间:", end_time)
scada_data = scada_data[start_time:end_time]
st.dataframe(scada_data)
3.4 时变特性分析
(7)选择框:st.selectbox(label, options, index=0, format_func=special_internal_function, key=None, help=None, on_change=None, args=None, kwargs=None)
注意: #选择框内的元素是SCADA数据中的标签,可按照实际的标签修改;
(8)折线图:st.line_chart(data)
# ---------------------------数据分析-----------------------
st.header('------------------------数据分析------------------------')
st.sidebar.header('-----------------数据分析-----------------')
# -----------时变特性分析-----------------
st.sidebar.subheader('* 时变特性分析 *')
st.subheader('* 时变特性分析 *')
type = st.sidebar.selectbox('请选择分析对象:',
('ActivePower', 'WindSpeed', 'NacellePosition', 'WindDirction', 'AirPressure',
'Temperature', 'PitchAngle', 'ErrorMode', 'OperationMode', 'GeratorSpeed', 'RotorSpeed',
'AirDensity'))
st.write("选择的分析对象为:", type)
st.line_chart(scada_data[type])
3.5 风玫瑰图
python中可以使用windrose库绘制玫瑰图。
先安装:$ pip install windrose
后引入:from windrose import WindroseAxes
具体使用方法,请详见官方文档。
官方给出的例子:
from windrose import WindroseAxes
from matplotlib import pyplot as plt
import matplotlib.cm as cm
import numpy as np
# Create wind speed and direction variables
ws = np.random.random(500) * 6
wd = np.random.random(500) * 360
ax = WindroseAxes.from_ax()
ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
ax.set_legend()
然后依葫芦画瓢,先画玫瑰图,再显示图。
(9)显示matplotlib.pyplot 的图:st.pyplot(fig)
# -----------风玫瑰图-----------------
st.sidebar.subheader('* 风玫瑰图 *')
st.subheader('* 风玫瑰图 *')
ws = scada_data['WindSpeed']
wd = scada_data['WindDirction']
ax = WindroseAxes.from_ax()
fig = ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
st.set_option('deprecation.showPyplotGlobalUse', False)
st.pyplot(fig)
3.6 相关性分析
3.6.1 Pearson相关性
# -----------相关性分析-----------------
st.sidebar.subheader('* 相关性分析 *')
st.subheader('* 相关性分析 *')
# data.corr()计算相关系数
# Pearson相关性
st.sidebar.subheader(" (1) Pearson相关系数")
st.subheader(" (1) Pearson相关系数")
corr = scada_data.corr()
st.write("相关性系数:", corr)
fig, ax = plt.subplots(figsize=(8, 8)) # 调整画布大小
ax = sns.heatmap(corr, vmax=.8, square=True, annot=True) # 画热力图 annot=True 显示系数
st.pyplot(fig)
3.6.2 自相关性
# 自相关性acf
st.sidebar.subheader(" (2) 自相关性")
st.subheader(" (2) 自相关性")
type_acf = st.sidebar.selectbox('请选择自相关性分析对象:',
(
'ActivePower', 'WindSpeed', 'NacellePosition', 'WindDirction', 'AirPressure',
'Temperature',
'PitchAngle', 'ErrorMode', 'OperationMode', 'GeratorSpeed', 'RotorSpeed',
'AirDensity'))
st.write("选择的自相关性分析对象为:", type_acf)
lags = st.sidebar.number_input("请输入自相关性的阶数:", min_value=1, max_value=200, value=30, step=1)
st.write("选择的自相关性阶数为:", lags)
data_acf = acf(scada_data[type_acf], unbiased=False, nlags=lags, qstat=False, fft=None, alpha=None, missing='none')
st.write("自相关性系数:", data_acf)
plot_acf(scada_data[type_acf])
st.pyplot()
4. 本地运行
Step1:打开CMD,在命令行模式进入文件夹路径
我的文件位置是:D:\project\test\data_analysis.py
Step2:运行streamlit文件streamlit run 文件名.py
Step3:会显示URL,在浏览器打开URL,就可以本地打开了。
还有一种方法,是在pycharm的terminal中打开streamlit run 文件名.py
,这样就不用在cmd内进入文件夹位置了。
我们可以看到,本地部署的url是8502的端口,如果需要展示的话,不能关掉程序哦,要保持程序开着,url才能打开,这样是不是很不方便,接下来我们就快速部署,不用本地也能打开链接了。
5. Streamlit快速部署
首先我们来看看官方文档怎么部署的:
Step1:将你的App添加到 GitHub;
Step2:在streamlit cloud上部署你的App
Step3:部署的高级设置;
Step4:等待部署
关于Streamlit的快速部署,官方文档就给出了以上4个步骤,是不是很简单!好多,接下来我们一步一步来。
5.1 将App添加到GitHub
首先,你得有GitHub的账户,这一步省略。。这里是用Pycharm中将整个文件夹上传的哈。Pycharm关联GitHub和Git,这里也省略哈。
test文件夹包含两个文件,data_analysis.py为上述数据分析的代码,requirements.txt是APP需要装的依赖。
Step1:VCS --> Import into Version Control -->Share Project on GitHub
Step2:填写项目信息
Step3:初次提交的文件
Step4:上传成功
5.2 streamlit cloud上部署App
Step1:进入streamlit cloud关联GitHub账户,点击“New app”
Step3:配置APP。要么自己填,要么复制GitHub URL,一键部署。
将GitHub的URL复制上去就可以了:https://github.com/SooHooLee/test/blob/master/data_analysis.py
5.3 部署的高级设置
可以选择python的版本等,
Step4:等待部署
App正在部署,大多数只需几分钟即可部署,但如果很多依赖项,则首次部署可能需要一些时间。初始部署后,任何不涉及依赖项的更改都应立即显示。
等放气球就是部署好了,web app URL 的标准结构:
https://share.streamlit.io/[user name]/[repo name]/[branch name]/[app path]
例如:http://share.streamlit.io/streamlit/demo-self-driving/master/streamlit_app.py
文中代码请详见GitHub:
https://github.com/SooHooLee/test
项目的web app请详见:
https://share.streamlit.io/soohoolee/test/data_analysis.py
关于一些问题的碎碎念:
1、没有上传数据会出现ValueError,上传数据就好了(因为streamlit是从上到下依次执行的,没有上传数据的话,后面找不到data,所以报错)。
2、关于数据的格式:数据的属性名称需要按照给定的来选择,不然后面选择时间序列分析找不到相应的数据内容了。都是SCADA数据的常规标签。
数据不便给出,可以上传自己的数据试试,或者造数据测试一下。
3、也有使用其他方法来部署的,比如:docker+阿里服务器,heroku等,
参考:
1、Streamlit
2、Streamlit 部署指南 (wiki)
标签:数据分析,None,st,write,streamlit,scada,data,SCADA 来源: https://blog.csdn.net/weixin_39671962/article/details/121840161