ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

streamlit快速部署-SCADA数据分析

2021-12-14 09:59:07  阅读:452  来源: 互联网

标签:数据分析 None st write streamlit scada data 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有