Streamlit在数据可视化与机器学习模型展示中的应用研究

Streamlit是一个开源框架,专为数据科学家和机器学习工程师设计,旨在简化数据应用程序的构建过程。通过Streamlit,用户可以在短时间内将Python代码转化为交互式网页应用程序,极大地提升了数据可视化与交互的效率。本篇文章将深入介绍如何使用Streamlit快速构建数据应用程序,并通过实际的代码实例帮助你理解如何实现数据展示和交互。

1. Streamlit简介

Streamlit的设计理念是让数据科学家能够在不需要编写前端代码的情况下,创建功能丰富且具有互动性的Web应用。用户只需要编写Python代码,Streamlit会自动生成网页界面。Streamlit支持多种数据可视化方式,如图表、表格、地图等,适用于数据展示、机器学习模型展示以及快速原型设计等场景。

1.1 Streamlit的安装

要使用Streamlit,首先需要在Python环境中进行安装。可以通过以下命令进行安装:

pip install streamlit

安装完成后,可以通过以下命令启动Streamlit应用:

streamlit run app.py

app.py 是你的Streamlit应用程序脚本,Streamlit会在浏览器中打开该应用。

1.2 运行环境

Streamlit适用于Python 3.6及以上版本,且可以在大部分操作系统上运行,包括Windows、macOS和Linux。

2. 基础应用:展示数据框

在这一部分,我们将创建一个简单的Streamlit应用来展示一个数据框(DataFrame)。这个应用将展示如何加载数据、展示表格并进行简单的交互。

2.1 创建数据框

我们首先创建一个包含简单数据的数据框。Streamlit提供了st.dataframe()方法来展示Pandas数据框。我们将使用Pandas库来创建数据框。

import streamlit as st
import pandas as pd

# 创建一个简单的DataFrame
data = {
    '姓名': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    '年龄': [24, 27, 22, 32, 29],
    '城市': ['New York', 'San Francisco', 'Los Angeles', 'Chicago', 'Houston']
}

df = pd.DataFrame(data)

# 展示数据框
st.title('简单数据展示')
st.dataframe(df)

2.2 运行应用

将上述代码保存为app.py,然后使用以下命令启动应用:

streamlit run app.py

你将在浏览器中看到一个表格,展示了包含“姓名”、“年龄”和“城市”三列的数据。通过st.dataframe()方法,Streamlit自动为我们生成了一个交互式的表格,用户可以滚动和筛选。

3. 增强功能:数据可视化

除了展示数据表格,Streamlit还允许我们快速添加数据可视化图表。以下示例演示了如何使用st.line_chart()绘制简单的折线图。

3.1 绘制折线图

import streamlit as st
import pandas as pd
import numpy as np

# 创建一个时间序列数据
time = pd.date_range(start='1/1/2022', periods=100)
data = np.random.randn(100).cumsum()

# 创建DataFrame
df = pd.DataFrame(data, columns=['Value'], index=time)

# 绘制折线图
st.title('数据可视化示例')
st.line_chart(df)

3.2 运行应用

将上述代码保存为app.py并运行,浏览器中将显示一张折线图,展示了基于随机数据的累积和。Streamlit自动为我们绘制了折线图,并根据数据更新图表。

4. 高级应用:交互功能

Streamlit的强大之处在于它能够轻松添加交互功能。以下示例展示了如何使用Streamlit的控件(如按钮、文本输入框和选择框)来与用户交互,并基于用户输入动态展示数据。

4.1 使用按钮和文本输入框

import streamlit as st

# 显示标题
st.title('交互式应用')

# 添加文本输入框
user_input = st.text_input('请输入您的名字')

# 添加按钮
if st.button('提交'):
    st.write(f'您好,{user_input}!欢迎使用Streamlit!')

4.2 运行应用

在浏览器中,用户将看到一个文本输入框和一个按钮。用户可以在文本框中输入名字,并点击按钮,应用会根据输入的名字显示问候信息。这个简单的交互示例展示了Streamlit的易用性。

4.3 使用选择框和滑块

# 使用选择框选择数字
number = st.slider('选择一个数字', 0, 100, 50)

# 显示选择的数字
st.write(f'您选择的数字是:{number}')

这个代码段演示了如何使用滑块选择数字,并实时更新显示的数字。

5. 集成机器学习模型

Streamlit的另一个优势是可以轻松集成机器学习模型并进行实时预测。我们将展示如何将训练好的机器学习模型集成到Streamlit应用中,进行实时预测。

5.1 加载模型并进行预测

假设我们已经训练了一个简单的线性回归模型,并将其保存为model.pkl。我们将在Streamlit应用中加载该模型,并通过用户输入进行预测。

import streamlit as st
import pickle
import numpy as np

# 加载模型
model = pickle.load(open('model.pkl', 'rb'))

# 获取用户输入
user_input = st.number_input('请输入一个数字进行预测')

# 预测
if st.button('预测'):
    prediction = model.predict(np.array([[user_input]]))
    st.write(f'预测结果:{prediction[0]}')

5.2 运行应用

用户输入一个数字并点击“预测”按钮后,应用将加载模型并输出预测结果。这使得Streamlit非常适合展示和分享机器学习模型。

6. 进阶应用:布局和自定义UI

Streamlit不仅仅支持简单的交互,它还提供了丰富的布局控制和自定义界面元素,使得用户可以创建复杂的应用界面。在这一部分,我们将介绍如何使用Streamlit的布局功能和自定义样式来提升应用的用户体验。

6.1 使用列布局

Streamlit提供了st.columns()方法,允许用户将页面分为多个列,从而实现更加灵活的布局。以下示例展示了如何创建两个并排的列,并在其中展示不同的内容。

import streamlit as st

# 使用st.columns()方法创建两列布局
col1, col2 = st.columns(2)

# 在第一列中显示一个文本
with col1:
    st.header('列1: 数据展示')
    st.write('这是第一列,展示数据或其他内容。')

# 在第二列中显示一个图表
with col2:
    st.header('列2: 数据可视化')
    st.line_chart([1, 2, 3, 4, 5, 6])

通过st.columns()方法,Streamlit会自动为我们分配合适的宽度,并且允许我们在每列中嵌入不同的内容。你可以根据需求调整列的数量和布局。

6.2 自定义样式

虽然Streamlit默认提供了简洁直观的UI,但你也可以使用HTML和CSS自定义应用的外观。Streamlit的st.markdown()支持渲染HTML内容,这让我们能够自定义页面的样式。例如:

import streamlit as st

# 使用Markdown展示自定义HTML
st.markdown(
    """
    <style>
        .big-font {
            font-size: 50px;
            color: green;
        }
    </style>
    <div class="big-font">
        这是一个自定义样式的文本
    </div>
    """,
    unsafe_allow_html=True
)

通过这种方式,你可以在应用中灵活地插入CSS样式,甚至加载外部的CSS文件来改变页面的整体布局和设计风格。

7. 数据库和外部数据源集成

Streamlit非常适合展示数据分析结果,但在实际应用中,数据通常存储在外部数据库中。Streamlit支持与多种数据源集成,包括关系型数据库、NoSQL数据库和API。以下示例展示了如何通过SQLite数据库获取数据并将其展示在Streamlit应用中。

7.1 从SQLite数据库读取数据

import sqlite3
import streamlit as st
import pandas as pd

# 连接SQLite数据库
conn = sqlite3.connect('example.db')

# 执行查询并将结果加载到Pandas DataFrame
query = "SELECT * FROM users"
df = pd.read_sql(query, conn)

# 在Streamlit中展示DataFrame
st.title('从数据库加载的数据')
st.dataframe(df)

7.2 实时更新数据

Streamlit支持与数据库进行实时交互。你可以通过按钮或输入框来更新数据库内容,Streamlit会即时反映数据变化。例如,以下代码演示了如何通过用户输入的内容插入新数据:

# 插入数据到数据库
def insert_data(name, age, city):
    cursor = conn.cursor()
    cursor.execute("INSERT INTO users (name, age, city) VALUES (?, ?, ?)", (name, age, city))
    conn.commit()

# 用户输入
name = st.text_input('姓名')
age = st.number_input('年龄', min_value=0)
city = st.text_input('城市')

# 提交按钮
if st.button('添加数据'):
    insert_data(name, age, city)
    st.success('数据已添加!')

通过这些交互,用户可以直接通过Streamlit应用添加数据,并在页面上实时更新显示。

8. 部署与分享应用

构建完Streamlit应用后,通常需要将其部署到服务器上,以便其他人可以访问。在这一部分,我们将介绍如何将Streamlit应用部署到云平台上,并与他人共享。

8.1 使用Streamlit Cloud部署

Streamlit提供了自己的云平台Streamlit Cloud,可以非常方便地将应用部署到云端。你只需要将你的代码上传到GitHub,并将其链接到Streamlit Cloud。以下是部署的步骤:

  1. 在GitHub上创建一个仓库,并将Streamlit应用代码上传到该仓库。
  2. 访问Streamlit Cloud
  3. 登录并选择“New app”。
  4. 连接你的GitHub仓库并选择应用脚本(例如app.py)。
  5. 点击“Deploy”按钮,Streamlit Cloud将自动部署你的应用,并生成一个可公开访问的URL。

8.2 使用Heroku部署

除了Streamlit Cloud,Heroku也是一个流行的云平台,可以用于部署Streamlit应用。你可以通过以下步骤将应用部署到Heroku:

  1. 安装Heroku CLI并登录账户。

  2. 在应用文件夹中创建Procfile,并指定Streamlit应用的启动命令:

    web: streamlit run app.py
    
  3. 使用Git将应用推送到Heroku:

    git init
    heroku create your-app-name
    git add .
    git commit -m "Initial commit"
    git push heroku master
    
  4. 部署完成后,Heroku会为你的应用分配一个URL,用户可以通过该URL访问应用。

9. 性能优化

随着应用的复杂性增加,性能可能成为一个关键问题。Streamlit本身已进行了一些优化,但为了确保应用高效运行,仍然有一些技巧可以提升性能。

9.1 缓存数据

Streamlit提供了st.cache装饰器,允许用户缓存函数结果,从而避免不必要的重复计算。例如:

import streamlit as st

@st.cache
def expensive_computation(a, b):
    return a * b  # 假设这个操作很耗时

# 使用缓存的函数
result = expensive_computation(10, 20)
st.write(result)

通过缓存,Streamlit会在第一次运行时执行计算并存储结果,后续相同的请求将直接返回缓存的结果,从而大幅提高性能。

9.2 优化数据加载

当数据集非常大时,加载整个数据集可能会影响应用的响应速度。在这种情况下,可以考虑只加载数据的子集,或使用分页来分批显示数据。

import streamlit as st
import pandas as pd

# 加载部分数据
df = pd.read_csv('large_data.csv', nrows=100)  # 只加载前100行

# 展示数据
st.dataframe(df)

这样可以避免一次性加载整个庞大的数据集,提升应用的加载速度。

10. 高级功能:实时数据流与WebSocket

Streamlit还支持通过WebSocket进行实时数据流处理,这使得Streamlit能够处理实时数据和事件。例如,结合WebSocket和Streamlit,可以实现实时股票行情、实时传感器数据展示等功能。

虽然Streamlit本身不直接提供WebSocket支持,但可以通过Python的websockets库与Streamlit结合,实时推送数据。

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐