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)

streamlit快速部署-SCADA数据分析

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)

streamlit快速部署-SCADA数据分析

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

streamlit快速部署-SCADA数据分析

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

streamlit快速部署-SCADA数据分析
然后依葫芦画瓢,先画玫瑰图,再显示图。
(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)

streamlit快速部署-SCADA数据分析

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)

streamlit快速部署-SCADA数据分析

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

streamlit快速部署-SCADA数据分析

4. 本地运行

Step1:打开CMD,在命令行模式进入文件夹路径
我的文件位置是:D:\project\test\data_analysis.py
Step2:运行streamlit文件streamlit run 文件名.py
Step3:会显示URL,在浏览器打开URL,就可以本地打开了。
streamlit快速部署-SCADA数据分析
还有一种方法,是在pycharm的terminal中打开streamlit run 文件名.py,这样就不用在cmd内进入文件夹位置了。
streamlit快速部署-SCADA数据分析
我们可以看到,本地部署的url是8502的端口,如果需要展示的话,不能关掉程序哦,要保持程序开着,url才能打开,这样是不是很不方便,接下来我们就快速部署,不用本地也能打开链接了。
streamlit快速部署-SCADA数据分析

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
streamlit快速部署-SCADA数据分析
Step2:填写项目信息

streamlit快速部署-SCADA数据分析

Step3:初次提交的文件

streamlit快速部署-SCADA数据分析
Step4:上传成功

streamlit快速部署-SCADA数据分析
streamlit快速部署-SCADA数据分析

5.2 streamlit cloud上部署App

Step1:进入streamlit cloud关联GitHub账户,点击“New app”
streamlit快速部署-SCADA数据分析
Step3:配置APP。要么自己填,要么复制GitHub URL,一键部署。
streamlit快速部署-SCADA数据分析
将GitHub的URL复制上去就可以了:https://github.com/SooHooLee/test/blob/master/data_analysis.py
streamlit快速部署-SCADA数据分析

5.3 部署的高级设置

可以选择python的版本等,
streamlit快速部署-SCADA数据分析

Step4:等待部署
App正在部署,大多数只需几分钟即可部署,但如果很多依赖项,则首次部署可能需要一些时间。初始部署后,任何不涉及依赖项的更改都应立即显示。
streamlit快速部署-SCADA数据分析
等放气球就是部署好了,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,所以报错)。

streamlit快速部署-SCADA数据分析
2、关于数据的格式:数据的属性名称需要按照给定的来选择,不然后面选择时间序列分析找不到相应的数据内容了。都是SCADA数据的常规标签。streamlit快速部署-SCADA数据分析
数据不便给出,可以上传自己的数据试试,或者造数据测试一下。
3、也有使用其他方法来部署的,比如:docker+阿里服务器,heroku等,

参考:
1、Streamlit
2、Streamlit 部署指南 (wiki)

上一篇:取消文本框被选中时边框的默认样式


下一篇:el-table多选框根据条件隐藏显示