Streamlit实战手册:从数据应用到机器学习模型部署

Streamlit实战手册:从数据应用到机器学习模型部署

    • 简介
    • Streamlit核心功能介绍
      • Streamlit的安装
      • 创建第一个Streamlit应用
      • 界面布局与导航
      • 数据处理与展示
    • Streamlit的进阶应用
      • 交互式组件
        • 按钮
        • 复选框
        • 单选按钮
        • 滑块
      • 图表与可视化
        • 使用Matplotlib绘图
        • 使用Plotly创建交互式图表
      • 状态管理与会话状态
    • 实战项目
      • 案例分析:数据探索性分析应用
        • 项目步骤:
      • 案例分析:机器学习模型部署
        • 项目步骤:
    • Streamlit应用部署
      • 部署到Heroku
      • 部署到其他平台
    • 性能优化技巧
      • 使用缓存机制
      • 优化数据加载
      • 使用向量化操作而非循环
      • 减少图表的复杂性
      • 使用分批处理和异步加载
    • 安全最佳实践
      • 保护敏感数据
      • 使用环境变量管理敏感信息
      • 验证用户输入
      • 限制访问
      • 更新依赖
      • 监控与日志记录

在这里插入图片描述

简介

Streamlit 是一款开源的Python库,旨在帮助开发者快速构建数据应用。它通过简化数据应用的开发流程,让开发者能够专注于数据处理与分析逻辑,而不必花费大量时间在前端设计上。Streamlit 的出现极大地降低了数据科学家和开发者将数据分析结果转化为互动式Web应用的门槛。

该库通过一套简洁的API,支持各种数据可视化库,如Matplotlib、Plotly和Altair,使得在Web应用中展示动态图表变得轻而易举。用户只需用少量的代码,就可以实现数据的快速呈现和交互式控件,如滑块、按钮和选择器等,从而创建出既美观又功能强大的数据应用。

Streamlit 的核心优势在于其“写即展现”的特性。开发者通过编写Python脚本,就可以实时看到应用的变化,这大大加快了开发和迭代的速度。无论是数据分析师在探索性数据分析(EDA)中快速构建和分享结果,还是机器学习工程师需要部署模型进行实时预测,Streamlit 都能提供强大的支持。

接下来的章节将深入介绍Streamlit的安装、核心功能、进阶应用和部署,以及通过实战项目展示如何有效利用Streamlit进行数据应用开发。我们将从安装开始,逐步探索如何利用Streamlit的强大功能来构建交互式数据应用。

Streamlit核心功能介绍

Streamlit的安装

在深入探讨Streamlit的强大功能之前,首先需要确保Streamlit被正确安装在您的开发环境中。安装Streamlit非常简单,只需几个简单的步骤即可完成。以下是安装Streamlit的基本命令:

pip install streamlit

这条命令将会从Python包索引(PyPI)下载并安装最新版本的Streamlit。请确保您的开发环境已经安装了Python(版本3.6及以上),以及pip(Python的包管理器)。

安装完成后,可以通过在命令行中运行以下命令来验证Streamlit是否安装成功:

streamlit hello

这条命令会启动一个Streamlit的示例应用,如果您的浏览器自动打开了一个含有Streamlit欢迎界面的页面,恭喜您,Streamlit已成功安装并准备好使用了。

创建第一个Streamlit应用

有了Streamlit,创建一个基本的数据应用就像编写一个Python脚本一样简单。下面是一个简单的Streamlit应用示例:

import streamlit as stst.title('我的第一个Streamlit应用')
st.write('这是一个非常简单的应用,用来展示Streamlit的基本用法。')

将上述代码保存为app.py,然后在命令行中运行以下命令来启动应用:

streamlit run app.py

您的默认浏览器将自动打开一个新的标签页,展示了您的Streamlit应用。恭喜您,您已经成功创建了第一个Streamlit应用!

界面布局与导航

Streamlit提供了多种方式来组织您的应用界面,使其既美观又实用。例如,您可以使用侧边栏(sidebar)来添加输入控件,而不是将它们全部堆砌在主页面上:

import streamlit as stst.title('带有侧边栏的应用')# 在侧边栏添加一个滑块
number = st.sidebar.slider('选择一个数字', 0, 100, 50)# 在主页面显示选择的数字
st.write('您选择的数字是:', number)

数据处理与展示

Streamlit使得在应用中展示数据变得异常简单。无论是显示DataFrame还是绘制图表,Streamlit都能轻松应对。下面是一个展示DataFrame的例子:

import streamlit as st
import pandas as pd
import numpy as np# 创建一个简单的DataFrame
data = pd.DataFrame({'第一列': np.random.randn(10),'第二列': np.random.rand(10)
})st.write('这是一个DataFrame示例:')
st.dataframe(data)

通过上述简介和核心功能的介绍,我们已经初步了解了Streamlit的安装、创建应用、界面布局与数据展示等基础知识。接下来的章节将深入探讨Streamlit的进阶应用,包括交互式组件的使用、图表与可视化技巧、状态管理等内容。

Streamlit的进阶应用

交互式组件

Streamlit的交互式组件允许用户与应用进行互动,极大地增强了应用的可用性和互动性。以下是一些常用的交互式组件及其使用示例:

按钮
import streamlit as stif st.button('显示消息'):st.write('Streamlit 是真的很酷!')
复选框
import streamlit as stif st.checkbox('显示图表'):st.line_chart([0, 1, 2, 3, 4])
单选按钮
import streamlit as stgenre = st.radio("你最喜欢哪种类型的音乐?",('流行', '摇滚', '爵士'))st.write(f'你选择的是:{genre}')
滑块
import streamlit as stage = st.slider('你的年龄', 0, 130, 25)
st.write("我 ", age, ' 岁')

图表与可视化

Streamlit内置了对多种图表和数据可视化库的支持,包括但不限于Matplotlib、Plotly和Altair。这让开发者能够轻松地将复杂的数据可视化集成到他们的应用中。

使用Matplotlib绘图
import streamlit as st
import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 10, 30)
y = np.sin(x)fig, ax = plt.subplots()
ax.plot(x, y)st.pyplot(fig)
使用Plotly创建交互式图表
import streamlit as st
import plotly.express as pxdf = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")st.plotly_chart(fig)

状态管理与会话状态

在复杂的Streamlit应用中,管理应用状态变得尤为重要。Streamlit 提供了会话状态(session state)功能,允许开发者在多次运行之间保持变量状态。

import streamlit as st# 初始化一个计数器
if 'count' not in st.session_state:st.session_state.count = 0# 创建一个增加计数的按钮
if st.button('增加'):st.session_state.count += 1st.write('计数器:', st.session_state.count)

通过这些进阶功能,开发者可以构建出更加复杂和功能丰富的Streamlit应用。接下来,我们将通过实战项目深入探索Streamlit的实际应用,包括如何进行数据探索性分析和机器学习模型的部署。

实战项目

在本节中,我们将通过两个实战项目深入探索Streamlit的强大功能:一个是数据探索性分析应用,另一个是机器学习模型部署。这些项目将帮助你理解如何在实际场景中应用Streamlit。

案例分析:数据探索性分析应用

在这个项目中,我们将使用Streamlit构建一个数据探索性分析(EDA)应用,允许用户上传数据集,进行基本的数据探索,包括查看数据集的概览、统计信息、以及生成各种图表来可视化数据。

项目步骤:
  1. 数据上传功能

    import streamlit as st
    import pandas as pduploaded_file = st.file_uploader("上传你的CSV或Excel文件", type=['csv', 'xlsx'])
    if uploaded_file is not None:df = pd.read_csv(uploaded_file)st.write(df)
    
  2. 数据集概览

    提供数据的基本信息,如行数、列数、缺失值统计等。

    if uploaded_file is not None:st.write("数据集概览:")st.write("行数:", df.shape[0])st.write("列数:", df.shape[1])st.write("缺失值统计:", df.isnull().sum())
    
  3. 数据可视化

    使用Streamlit内置的图表功能,例如折线图、柱状图、箱型图等,来展示数据的分布情况。

    import streamlit as st
    import pandas as pd
    import numpy as np# 示例:生成并展示一个随机数据的直方图
    if uploaded_file is not None:st.write("数据分布:")selected_column = st.selectbox("选择一个列来展示其分布", df.columns)hist_values = np.histogram(df[selected_column], bins=20, range=(0,100))[0]st.bar_chart(hist_values)
    

案例分析:机器学习模型部署

在这个项目中,我们将展示如何使用Streamlit部署一个简单的机器学习模型,使用户能够输入数据并获得预测结果。

项目步骤:
  1. 模型准备

    假设我们已经有一个训练好的模型,这里以一个线性回归模型为例。

  2. 构建Streamlit应用

    创建一个应用界面,用户可以输入他们想要预测的数据,应用将展示模型的预测结果。

    import streamlit as st
    from sklearn.linear_model import LinearRegression# 模拟一个已训练的模型
    model = LinearRegression()
    model.coef_ = np.array([1.0])  # 假设的权重
    model.intercept_ = 0  # 假设的截距st.title('简单线性回归模型部署')# 用户输入
    X_test = st.number_input("输入X的值来预测Y")# 预测并展示结果
    if st.button('预测'):y_pred = model.predict([[X_test]])st.write(f'预测的Y值为: {y_pred[0]}')
    

通过这两个实战项目,你应该对如何使用Streamlit来处理实际数据和部署模型有了更深的理解。接下来,我们将讨论如何将Streamlit应用部署到云平台,使其可以被公开访问。

Streamlit应用部署

将Streamlit应用部署到云端,可以让更多的用户访问您的应用。本节将介绍如何将Streamlit应用部署到Heroku,以及其他流行的部署平台。

部署到Heroku

Heroku是一个支持多种编程语言的云平台,适合快速部署应用。部署Streamlit应用到Heroku需要以下几个步骤:

  1. 准备应用
    确保您的Streamlit应用已经在本地测试通过,且项目根目录中包含requirements.txt文件,列出了所有的依赖。

  2. 创建Procfile
    在项目的根目录下创建一个名为Procfile的文件(没有文件扩展名),并写入以下内容:

    web: sh setup.sh && streamlit run app.py
    

    其中app.py是您的Streamlit应用的主文件。

  3. 创建setup.sh
    同样在项目根目录下创建setup.sh文件,以配置正确的Streamlit设置。示例内容如下:

    mkdir -p ~/.streamlit/
    echo "\
    [server]\n\
    headless = true\n\
    enableCORS=false\n\
    port = $PORT\n\
    " > ~/.streamlit/config.toml
    
  4. 使用Git将应用推送到Heroku
    如果您还没有Heroku账号,需要先注册一个。然后,使用Heroku CLI(命令行工具)登录,并创建一个新的应用。最后,使用Git将您的应用推送到Heroku上。

  5. 访问您的应用
    推送完成后,Heroku会自动构建并部署您的Streamlit应用。构建完成后,您可以通过Heroku提供的链接访问您的应用。

部署到其他平台

除了Heroku,还有许多其他平台支持Streamlit应用的部署,例如:

  • Google Cloud Platform (GCP)
  • Amazon Web Services (AWS)
  • Microsoft Azure

这些平台可能需要更复杂的配置,但它们提供了更多的灵活性和控制权,适合规模较大或需要更多定制的应用。

部署到这些云平台通常涉及到容器化应用(如使用Docker),然后在目标平台上配置相应的服务。由于每个平台的具体步骤有所不同,建议查阅相应平台的官方文档来获取详细指导。

性能优化技巧

当您的Streamlit应用开始变得复杂并处理大量数据时,性能优化成为了一个不可忽视的问题。以下是一些性能优化的技巧,可以帮助您的应用运行得更快,更流畅。

使用缓存机制

Streamlit提供了一个强大的缓存机制,允许您缓存函数的输出,避免在每次用户互动时重新计算数据。使用st.cache装饰器,可以显著提高应用的性能。

import streamlit as st@st.cache
def expensive_computation(a, b):# 假设这是一个耗时的计算return a * b + 10result = expensive_computation(2, 3)
st.write(result)

优化数据加载

如果您的应用需要从外部数据源(如数据库或API)加载数据,确保尽可能地减少数据传输量。例如,只查询需要的数据,而不是加载整个数据库表。

@st.cache
def load_data(query):# 根据需要执行查询,而不是加载整个数据集return run_query(query)data = load_data("SELECT * FROM table WHERE condition = True")

使用向量化操作而非循环

在处理数据时,尽量使用向量化操作,这通常比Python的循环更快。Pandas和NumPy库在这方面非常有用。

import numpy as np
import pandas as pd# 向量化操作示例
data = pd.DataFrame({'A': np.random.rand(1000), 'B': np.random.rand(1000)})
data['C'] = data['A'] + data['B']  # 向量化操作

减少图表的复杂性

虽然复杂的图表看起来很酷,但它们可能会显著降低应用的性能。尝试简化图表的设计,减少绘图所用的数据点数量。

使用分批处理和异步加载

对于处理大量数据或执行复杂计算的应用,考虑使用分批处理或异步加载技术。这可以提高应用的响应性,改善用户体验。

import asyncioasync def async_expensive_computation(a, b):# 异步执行耗时操作await asyncio.sleep(1)  # 模拟耗时操作return a * b + 10result = await async_expensive_computation(2, 3)
st.write(result)

通过以上技巧,您可以显著提高Streamlit应用的性能。始终记得,优化的关键是识别瓶颈所在并针对性地解决问题。在进行任何优化之前,了解您的应用在哪些地方最耗时是很有帮助的。

安全最佳实践

随着您的Streamlit应用变得越来越复杂,确保应用的安全性也同样重要。这部分将探讨一些保护Streamlit应用的安全最佳实践。

保护敏感数据

当您的应用处理敏感数据(例如个人信息或商业秘密)时,确保数据在传输和存储过程中都是加密的。使用HTTPS协议可以保护数据在客户端和服务器之间的传输过程不被窃听。

# 确保Streamlit应用部署在支持HTTPS的服务器上

使用环境变量管理敏感信息

不要在代码中硬编码敏感信息(如数据库密码或API密钥)。使用环境变量来管理这些敏感信息,这样可以避免将它们暴露在版本控制系统中。

# 设置环境变量(示例在Linux/MacOS上)
export DATABASE_PASSWORD="your_secure_password"
import os# 在应用中使用环境变量
database_password = os.getenv("DATABASE_PASSWORD")

验证用户输入

对于所有用户输入,包括文件上传,都应进行验证,以防止注入攻击或其他恶意活动。确保验证输入的有效性,并对任何异常输入采取措施。

import streamlit as st# 示例:简单的输入验证
user_input = st.text_input("请输入您的名字")
if not user_input.isalpha():st.error("请不要输入数字或特殊字符。")

限制访问

如果您的应用不是公开的,考虑添加认证机制来限制访问。虽然Streamlit默认不提供内置的认证功能,但您可以通过第三方服务或使用前端代理服务器来实现这一功能。

# 考虑使用像Streamlit Sharing或者其他支持基本认证的托管平台

更新依赖

定期更新Streamlit及其依赖项至最新版本,以确保您的应用受到最新安全补丁的保护。使用依赖管理工具,如pip--upgrade选项,可以帮助您保持依赖的最新状态。

pip install --upgrade streamlit

监控与日志记录

实现监控和日志记录机制,以便于追踪任何异常行为或性能问题。日志记录对于诊断安全事件和确保应用健康运行来说非常关键。

# 使用标准的Python日志记录模块
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)logger.info("应用启动")

通过实施这些安全最佳实践,您可以增强Streamlit应用的安全性,保护您和您用户的数据免受威胁。安全是一个持续的过程,需要定期审查和更新您的应用以应对新出现的安全威胁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【题目】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷

极安云科专注职业教育技能竞赛培训4年,包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点,提供完整全面的系统性理论教学与技能培训,成立至今持续优化教学资源与讲师结构&#xff0…

Springboot 整合 Knife4j (API文档生成工具)

目录 一、Knife4j 介绍 二、Springboot 整合 Knife4j 1、pom.xml中引入依赖包 2、在application.yml 中添加 Knife4j 相关配置 3、打开 Knife4j UI界面 三、关于Knife4j框架中常用的注解 1、Api 2、ApiOperation ​3、ApiOperationSupport(order X) ​4、ApiImplici…

Leetcode 994. 腐烂的橘子

心路历程: 一开始以为和刚做过的岛屿问题很像,只不过是把岛屿问题换成BFS去做,然后再加上一些计数的规则。结果做完后发现只能通过一半左右的测试用例,发现有一个逻辑错误在于,当腐烂的橘子位于两端时,可以…

C#探索之路基础篇(2):接口Interface的概念、实现、应用范围

文章目录 1 概念2 示例代码:2.1 简单接口的实现2.2 简单的使用接口2.3 使用接口呈现多态性2.4 通过接口实现一个数组迭代器2.5 通过接口来实现松耦合的关系2.6 使用接口实现可扩展、便利性 3 使用范围与时机4 注意事项 不知道大家在学习的过程中,有没有反…

笔试总结01

1、spring原理 1、spring原理 spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中,程序在运行时根据配置文件动态加载依赖的类,降低的类与类之间的藕合度。它的原理是在applicationContext.xml加入bean标记,在bean标记中通过class属性说明具体类…

vue3+threejs新手从零开发卡牌游戏(二):初始化场景

在删掉初始化中一些没用的代码后,在views目录下新建game文件夹,在里面新建一个index.vue,这里就当成游戏的主入口。 目录结构如下: 下面开始尝试创建场景: 一、添加一个div作为threejs的画布对象,之后整个…

ubuntu - 编译 linphone-sdk

业务需求需要定制sdk,首先声明我们需要的是在Android4.4上跑的sdk,因此本次编译的sdk最低支持为19(不同版本需要的环境不一致),编译过程较容易,难点在于环境配置 环境准备 Ubuntu 18.04.6 android-sdk_r24.…

mysql分页查询多用GitCode平台

目录 一、在GitCode平台AI搜索结果(这个更优) 二、在百度搜索输入“mysql Java分页查询”的输出结果: 三、推荐的文章 四、GitCode的使用 1)如搜索jdk11可以直接下载jdk11的包 2)搜索开源项目 3)如搜…

步进电机驱动器的接线与使用(接线详细)

今天小编就来继续学习与使用步行电机的学习,如果位置对你有帮助,评论收藏,点赞一下 步进电机驱动器 步进电机驱动器是一种专用于控制步进电机的电子设备,用于控制步进电机的转动和位置。步进电机是一种将电信号转换为机械运动的电…

Compose UI 之 Segmented buttons 分段按钮

Segmented buttons SegmentedButton 是一种分段式按钮组件,它允许用户在一组相关的选项中选择一个或几个。 上图中:① 单选的分段式按钮。② 多选的分段式按钮。 分段式按钮的几个特点: 分段式按钮是带有状态的按钮,又有单选和多选之分。 从设计上将,不论是单选或是多选…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数(通常使用输入函数),确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和,该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系,而传统的固定序列处理方法可能会遗漏这…

虚拟机扩展:虚拟机快照

虚拟机快照 在学习阶段我们无法避免的可能损坏Linux操作系统。如果损坏的话,重新安装一个Linux操作系统就会十分麻烦。 那我们就可以通过快照将当前虚拟机的状态保存下来,在以后系统损坏时通过快照恢复虚拟机到保存的状态。 制作并还原快照 在VMware …

SAP HCM 0008信息类型间接评估与直接评估

如果在间接评估模块输入就是间接评估(tarif是读取下图中的数据 a代表不需要输入工资项,b表示需要找工资相) 不输入就是直接评估需要客户自己输入数字 第2个情况 summe求和 (比如在0008中输入9000与9001 那么自动求出9002工资项数…

C# WPF编程-布局

C# WPF编程-布局 布局WPF布局原则布局过程布局容器布局属性Border控件StackPanel布局WrapPanel布局DockPanel布局Grid布局UniformGrid布局Canvas布局 布局 WPF布局原则 WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面,需要在窗口…

SpringBoot项目如何打包成war包,并部署在tomcat上运行

项目场景: 正常情况下,我们开发 SpringBoot 项目,由于内置了Tomcat,所以项目可以直接启动,部署到服务器的时候,直接打成 jar 包,就可以运行了。 有时我们会需要打包成 war 包,放入外…

Redis进阶(持久化、复制、集群、多线程、缓存)

Redis进阶 1.Redis持久化1.1 什么是Redis持久化?为什么需要持久化?1.2 Redis持久化方式——RDB(Redis DataBase)1.2.1 什么是RDB?1.2.2 备份文件位置1.2.3 触发RDB的方式1.2.3.1 自动触发1.2.3.2 手动触发1.2.3.3 其他触发方式 1.2.4 RDB优缺…

【GPT概念04】仅解码器(only decode)模型的解码策略

一、说明 在我之前的博客中,我们研究了关于生成式预训练转换器的整个概述,以及一篇关于生成式预训练转换器(GPT)的博客——预训练、微调和不同的用例应用。现在让我们看看所有仅解码器模型的解码策略是什么。 二、解码策略 在之前…

【Linux】多线程编程基础

💻文章目录 📄前言🌺linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 🌻linux线程冲突概念互斥锁函数介绍加锁的缺点 📓总结 📄前言 无论你是否为程序员,相信多线程这个词汇应…

量子计算机

近日,在AWS re:Invent全球大会上,亚马逊官宣AWS三箭齐发量子计算组合拳:Braket、AWS量子计算中心和量子解决方案实验室。 随着亚马逊的强势入局,加上此前鼓吹量子霸权的谷歌、起步最早的IBM、暗自发力的微软&#xff…

react-jsx

react04 jsx语法 - 01 基础知识: jsx javascript xml(html) 把js和heml标签混合到一起 react视图编写及构建的简要流程 : 如何在react中使vs code支持格式化和快捷键提示:1, 2,修改文件后缀为jsx,因为webpack的打包规则中可以…