导航菜单

  • 1.langchain.intro
  • 2.langchain.chat_models
  • 3.langchain.prompts
  • 4.langchain.example_selectors
  • 5.output_parsers
  • 6.Runnable
  • 7.memory
  • 8.document_loaders
  • 9.text_splitters
  • 10.embeddings
  • 11.tool
  • 12.retrievers
  • 13.optimize
  • 14.项目介绍
  • 15.启动HTTP
  • 16.数据与模型
  • 17.权限管理
  • 18.知识库管理
  • 19.设置
  • 20.文档管理
  • 21.聊天
  • 22.API文档
  • 23.RAG优化
  • 24.索引时优化
  • 25.检索前优化
  • 26.检索后优化
  • 27.系统优化
  • 28.GraphRAG
  • 29.图
  • 30.为什么选择图数据库
  • 31.什么是 Neo4j
  • 32.安装和连接 Neo4j
  • 33.Neo4j核心概念
  • 34.Cypher基础
  • 35.模式匹配
  • 36.数据CRUD操作
  • 37.GraphRAG
  • 38.查询和过滤
  • 39.结果处理和聚合
  • 40.语句组合
  • 41.子查询
  • 42.模式和约束
  • 43.日期时间处理
  • 44.Cypher内置函数
  • 45.Python操作Neo4j
  • 46.neo4j
  • 47.py2neo
  • 48.Streamlit
  • 49.Pandas
  • 50.graphRAG
  • 51.deepdoc
  • 52.deepdoc
  • 53.deepdoc
  • 55.deepdoc
  • 54.deepdoc
  • Pillow
  • 1. 什么是 Streamlit?
    • 1.1 Streamlit 简介
    • 1.2 Streamlit 能做什么?
    • 1.3 前置知识:Python 基础
  • 2. 安装和第一个应用
    • 2.1 安装 Streamlit
    • 2.2 创建第一个应用
  • 3. 文本显示组件
    • 3.1 标题和文本组件
    • 3.2 前置知识:Markdown 语法
  • 4. 数据展示组件
    • 4.1 数据表格
  • 5. 图表组件
    • 5.1 Streamlit 原生图表
    • 5.2 使用 Plotly 创建高级图表
  • 6. 交互组件
    • 6.1 基础交互组件
    • 6.2 日期和时间选择
    • 6.3 文件上传
  • 7. 布局组件
    • 7.1 列布局和选项卡
  • 8. 状态管理和会话状态
    • 8.1 会话状态基础
    • 8.2 表单和批处理
  • 9. 缓存优化性能
    • 9.1 数据缓存
  • 10. 实战示例:数据分析仪表盘
    • 10.1 完整的数据分析应用
  • 11. 最佳实践和技巧
    • 11.1 错误处理
    • 11.2 性能优化建议
  • 12. 学习资源
    • 12.1 官方资源
    • 12.2 练习项目建议
  • 13. 小结
    • 13.1 核心概念回顾
    • 13.2 关键要点
    • 13.3 下一步学习

1. 什么是 Streamlit? #

1.1 Streamlit 简介 #

Streamlit 是一个开源的 Python 框架,专门用于快速构建和共享数据科学和机器学习 Web 应用。

为什么选择 Streamlit?

想象一下,你写了一个 Python 脚本来分析数据,但想要把它展示给其他人看。传统方式需要:

  • 学习 HTML、CSS、JavaScript(前端技术)
  • 搭建 Web 服务器
  • 处理前后端交互

而使用 Streamlit,你只需要:

  • 写 Python 代码
  • 运行 streamlit run app.py
  • 自动生成漂亮的 Web 应用!

Streamlit 的核心理念:

  • 用 Python 脚本构建 Web 应用:不需要写 HTML/CSS/JavaScript
  • 无前端经验要求:专注于 Python 和数据分析
  • 实时更新:保存代码后自动刷新页面
  • 专注于数据应用:内置图表、数据表格等组件

1.2 Streamlit 能做什么? #

Streamlit 特别适合以下场景:

  • 数据可视化:快速创建数据仪表盘
  • 机器学习演示:展示模型预测结果
  • 数据分析工具:上传数据文件,自动生成分析报告
  • 原型开发:快速验证想法,创建概念验证应用
  • 教学演示:创建交互式教学工具

1.3 前置知识:Python 基础 #

在学习 Streamlit 之前,你需要掌握:

  • Python 基础语法:变量、函数、条件语句、循环
  • Python 常用库:pandas(数据处理)、numpy(数值计算)
  • 基本概念:函数、模块导入

如果你还不熟悉这些,建议先学习 Python 基础。

2. 安装和第一个应用 #

2.1 安装 Streamlit #

在开始之前,我们需要先安装 Streamlit。

安装步骤:

# 使用 pip 安装 Streamlit
# pip 是 Python 的包管理工具,用于安装第三方库
pip install streamlit

验证安装:

# 运行 Streamlit 的示例应用,验证安装是否成功
# 如果安装成功,会自动打开浏览器显示示例应用
streamlit hello

常见问题:

  • 如果提示 pip 命令不存在,可能需要使用 pip3 或 python -m pip
  • 如果安装速度慢,可以使用国内镜像:pip install streamlit -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 创建第一个应用 #

让我们创建一个最简单的 Streamlit 应用,体验一下它的强大功能。

创建文件 app.py:

# 导入 Streamlit 库
# streamlit 是 Streamlit 框架的主要模块,通常简写为 st
import streamlit as st

# 显示标题
# title() 函数用于显示大标题,会自动应用样式
st.title("Hello Streamlit!")

# 显示文本内容
# write() 函数是 Streamlit 最常用的显示函数,可以显示文本、数字、列表等
st.write("这是我的第一个 Streamlit 应用")

# 显示 Markdown 格式的文本
# markdown() 函数支持 Markdown 语法,可以显示格式化文本
st.markdown("**恭喜!** 你已经成功创建了第一个 Streamlit 应用!")

运行应用:

# 在命令行中运行以下命令
# streamlit run 是运行 Streamlit 应用的命令
# app.py 是你的 Python 文件名
streamlit run app.py

运行后,会自动打开浏览器,显示你的应用。每次修改代码并保存后,页面会自动刷新。

应用结构说明:

  • 每个 Streamlit 应用都是一个 Python 脚本
  • 从上到下执行代码,按顺序显示内容
  • 不需要定义 main() 函数,直接写代码即可

3. 文本显示组件 #

3.1 标题和文本组件 #

Streamlit 提供了多种文本显示组件,让我们来学习如何使用它们。

标题组件:

  • st.title():显示大标题(一级标题)
  • st.header():显示二级标题
  • st.subheader():显示三级标题

文本组件:

  • st.write():最常用的显示函数,可以显示任何内容
  • st.text():显示固定宽度的文本
  • st.markdown():显示 Markdown 格式的文本
  • st.code():显示代码块

完整示例:

# 导入 Streamlit 库
import streamlit as st

# 显示大标题
# title() 会显示一个大的标题,通常用于页面主标题
st.title("我的数据分析应用")

# 显示二级标题
# header() 显示中等大小的标题,用于章节标题
st.header("第一章:数据概览")

# 显示三级标题
# subheader() 显示较小的标题,用于小节标题
st.subheader("1.1 数据基本信息")

# 显示普通文本
# write() 是最灵活的显示函数,可以显示文本、数字、列表、字典等
st.write("这是普通文本内容")

# 显示固定宽度文本
# text() 使用等宽字体显示文本,适合显示代码或数据
st.text("这是固定宽度的文本")

# 显示 Markdown 格式文本
# markdown() 支持 Markdown 语法,可以显示粗体、斜体、列表等
st.markdown("**这是粗体文本**,*这是斜体文本*")
st.markdown("- 列表项 1")
st.markdown("- 列表项 2")

# 显示代码块
# code() 用于显示代码,可以指定语言类型
st.code("""
def hello():
    print("Hello, Streamlit!")
""", language='python')

# 显示状态消息
# 这些函数用于显示不同类型的提示信息
st.success("操作成功!")  # 绿色成功消息
st.error("发生错误!")    # 红色错误消息
st.warning("警告信息!")  # 黄色警告消息
st.info("提示信息!")     # 蓝色信息消息

3.2 前置知识:Markdown 语法 #

Markdown 是一种轻量级标记语言,用于格式化文本。Streamlit 的 st.markdown() 支持 Markdown 语法。

常用 Markdown 语法:

  • **粗体**:显示粗体文本
  • *斜体*:显示斜体文本
  • # 标题:显示标题(1-6 个 # 表示不同级别)
  • - 列表项:显示无序列表
  • 1. 列表项:显示有序列表
  • [链接文本](URL):显示链接

4. 数据展示组件 #

4.1 数据表格 #

Streamlit 提供了强大的数据展示功能,可以轻松显示数据表格、指标和 JSON 数据。

前置知识:pandas DataFrame

在展示数据之前,我们需要了解 pandas 的 DataFrame:

  • DataFrame:pandas 中的二维表格数据结构,类似 Excel 表格
  • 列(Column):表格的列,每列有名称
  • 行(Row):表格的行,每行是一条记录

数据展示组件:

  • st.dataframe():显示交互式数据表格(可排序、筛选)
  • st.table():显示静态数据表格(不可交互)
  • st.metric():显示指标卡片(带数值和变化)
  • st.json():显示 JSON 格式数据

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np

# 创建示例数据
# DataFrame 是 pandas 中的表格数据结构
# 这里创建一个包含姓名、年龄、城市的表格
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 28],
    '城市': ['北京', '上海', '广州', '深圳'],
    '薪资': [8000, 12000, 10000, 15000]
})

# 显示交互式数据表格
# dataframe() 显示可交互的表格,用户可以排序、筛选
# use_container_width=True 表示表格占满容器宽度
st.dataframe(df, use_container_width=True)

# 显示静态数据表格
# table() 显示静态表格,不可交互,但样式更简洁
st.table(df)

# 显示指标卡片
# metric() 用于显示关键指标
# label: 指标名称
# value: 指标值
# delta: 变化量(可选,显示绿色上升或红色下降箭头)
st.metric(
    label="平均年龄",
    value="29.5岁",
    delta="+2.5岁"  # 显示上升趋势
)

# 显示多个指标(使用列布局)
# columns() 创建多列布局,参数是列数
col1, col2, col3 = st.columns(3)

# 在第一列显示指标
with col1:
    st.metric("总人数", "4人", "+1人")

# 在第二列显示指标
with col2:
    st.metric("平均薪资", "¥11,250", "+¥500")

# 在第三列显示指标
with col3:
    st.metric("城市数", "4个", "0")

# 显示 JSON 数据
# json() 用于显示 JSON 格式的数据,会自动格式化
data_dict = {
    "姓名": "张三",
    "年龄": 25,
    "城市": "北京",
    "技能": ["Python", "数据分析", "机器学习"]
}
st.json(data_dict)

# 显示进度条
# progress() 用于显示进度条
# 参数是 0-100 之间的数值,表示完成百分比
progress_bar = st.progress(0)

# 模拟进度更新
for i in range(100):
    # 更新进度条,i+1 表示当前进度(1-100)
    progress_bar.progress(i + 1)
    # 这里可以添加实际的处理逻辑

5. 图表组件 #

5.1 Streamlit 原生图表 #

Streamlit 内置了简单的图表功能,可以快速创建折线图、柱状图等。

原生图表类型:

  • st.line_chart():折线图
  • st.bar_chart():柱状图
  • st.area_chart():面积图

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np

# 创建示例数据
# 生成 100 个数据点,x 从 0 到 99,y 是随机数
np.random.seed(42)  # 设置随机种子,确保每次运行结果一致
data = pd.DataFrame({
    'x': np.arange(100),  # x 轴:0 到 99
    'y': np.random.randn(100)  # y 轴:100 个随机数
})

# 显示折线图
# line_chart() 创建折线图,自动识别 DataFrame 的列
st.line_chart(data)

# 显示柱状图
# bar_chart() 创建柱状图
st.bar_chart(data)

# 显示面积图
# area_chart() 创建面积图(填充的折线图)
st.area_chart(data)

5.2 使用 Plotly 创建高级图表 #

虽然 Streamlit 原生图表简单易用,但功能有限。我们可以使用 Plotly 创建更丰富的交互式图表。

前置知识:Plotly

Plotly 是一个强大的数据可视化库,可以创建交互式图表:

  • 交互式:可以缩放、平移、悬停查看数据
  • 美观:默认样式就很漂亮
  • 功能丰富:支持多种图表类型

安装 Plotly:

pip install plotly

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px

# 创建示例数据
# 生成销售数据:日期、销售额、地区
np.random.seed(42)
dates = pd.date_range('2023-01-01', '2023-12-31', freq='D')
data = pd.DataFrame({
    '日期': np.random.choice(dates, 100),
    '销售额': np.random.randint(1000, 10000, 100),
    '地区': np.random.choice(['北京', '上海', '广州', '深圳'], 100)
})

# 使用 Plotly 创建散点图
# px.scatter() 创建散点图
# x, y: 指定 x 轴和 y 轴的列
# color: 根据某个列的值给点着色
# title: 图表标题
fig = px.scatter(
    data,
    x='日期',
    y='销售额',
    color='地区',
    title='销售额散点图'
)

# 显示图表
# plotly_chart() 用于显示 Plotly 图表
# use_container_width=True 表示图表占满容器宽度
st.plotly_chart(fig, use_container_width=True)

# 创建柱状图
# px.bar() 创建柱状图
region_sales = data.groupby('地区')['销售额'].sum().reset_index()
fig2 = px.bar(
    region_sales,
    x='地区',
    y='销售额',
    title='各地区总销售额'
)
st.plotly_chart(fig2, use_container_width=True)

# 创建折线图
# px.line() 创建折线图
daily_sales = data.groupby('日期')['销售额'].sum().reset_index()
fig3 = px.line(
    daily_sales,
    x='日期',
    y='销售额',
    title='每日销售额趋势'
)
st.plotly_chart(fig3, use_container_width=True)

6. 交互组件 #

6.1 基础交互组件 #

Streamlit 提供了丰富的交互组件,让用户可以与应用进行交互。

常用交互组件:

  • st.button():按钮
  • st.checkbox():复选框
  • st.radio():单选按钮
  • st.selectbox():下拉选择框
  • st.multiselect():多选框
  • st.slider():滑块
  • st.text_input():文本输入框
  • st.number_input():数字输入框

完整示例:

# 导入 Streamlit 库
import streamlit as st

# 按钮
# button() 创建一个按钮,点击返回 True,否则返回 False
if st.button("点击我"):
    # 如果按钮被点击,执行这里的代码
    st.write("按钮被点击了!")

# 复选框
# checkbox() 创建复选框,选中返回 True,否则返回 False
agree = st.checkbox("我同意用户协议")
if agree:
    # 如果复选框被选中,显示消息
    st.write("感谢您的同意!")

# 单选按钮
# radio() 创建单选按钮组
# 第一个参数是标签,第二个参数是选项列表
# 返回选中的选项值
genre = st.radio(
    "你最喜欢什么电影类型?",
    ('喜剧', '动作', '爱情', '科幻')
)
# 显示选中的选项
st.write(f"你选择了:{genre}")

# 下拉选择框
# selectbox() 创建下拉选择框
# 第一个参数是标签,第二个参数是选项列表
option = st.selectbox(
    "选择城市",
    ['北京', '上海', '广州', '深圳', '杭州']
)
st.write(f"你选择了:{option}")

# 多选框
# multiselect() 创建多选框,可以选择多个选项
# 第一个参数是标签,第二个参数是选项列表,default 是默认选中的选项
options = st.multiselect(
    "选择技能(可多选)",
    ['Python', 'JavaScript', 'SQL', 'Java', 'C++'],
    default=['Python']  # 默认选中 Python
)
st.write(f"你选择了:{options}")

# 滑块
# slider() 创建滑块,用于选择数值范围
# 第一个参数是标签,min_value 是最小值,max_value 是最大值,value 是默认值
age = st.slider("选择年龄", min_value=0, max_value=100, value=25)
st.write(f"你选择的年龄是:{age}")

# 数字输入框
# number_input() 创建数字输入框
# min_value 和 max_value 限制输入范围
number = st.number_input("输入数字", min_value=0, max_value=100, value=50)
st.write(f"你输入的数字是:{number}")

# 文本输入框
# text_input() 创建单行文本输入框
name = st.text_input("请输入姓名")
if name:
    st.write(f"你好,{name}!")

# 文本区域
# text_area() 创建多行文本输入框
text = st.text_area("请输入评论", height=100)
if text:
    st.write(f"你的评论:{text}")

6.2 日期和时间选择 #

Streamlit 还提供了日期和时间选择组件。

完整示例:

# 导入必要的库
import streamlit as st
from datetime import datetime, date, time

# 日期选择
# date_input() 创建日期选择器
# 可以返回单个日期或日期范围
selected_date = st.date_input("选择日期")
st.write(f"你选择的日期是:{selected_date}")

# 日期范围选择
# 传入一个包含两个日期的列表,可以创建日期范围选择器
date_range = st.date_input(
    "选择日期范围",
    value=[date(2023, 1, 1), date(2023, 12, 31)]
)
if len(date_range) == 2:
    st.write(f"开始日期:{date_range[0]}")
    st.write(f"结束日期:{date_range[1]}")

# 时间选择
# time_input() 创建时间选择器
selected_time = st.time_input("选择时间")
st.write(f"你选择的时间是:{selected_time}")

6.3 文件上传 #

Streamlit 支持文件上传功能,可以上传 CSV、图片等文件。

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd

# 文件上传
# file_uploader() 创建文件上传组件
# type 参数指定允许的文件类型
uploaded_file = st.file_uploader(
    "选择文件",
    type=['csv', 'txt', 'xlsx']
)

# 如果文件已上传,处理文件
if uploaded_file is not None:
    # 显示文件信息
    st.write(f"文件名:{uploaded_file.name}")
    st.write(f"文件大小:{uploaded_file.size} 字节")

    # 如果是 CSV 文件,读取并显示
    if uploaded_file.name.endswith('.csv'):
        # 读取 CSV 文件
        df = pd.read_csv(uploaded_file)
        # 显示数据表格
        st.dataframe(df)
        # 显示数据统计信息
        st.write(f"数据行数:{len(df)}")
        st.write(f"数据列数:{len(df.columns)}")

7. 布局组件 #

7.1 列布局和选项卡 #

Streamlit 提供了多种布局组件,帮助我们组织页面内容。

布局组件:

  • st.columns():创建多列布局
  • st.tabs():创建选项卡
  • st.expander():创建可展开的内容区域
  • st.container():创建容器

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np

# 创建示例数据
data = pd.DataFrame({
    'x': np.arange(100),
    'y': np.random.randn(100)
})

# 列布局
# columns() 创建多列布局,参数是列数
# 返回一个列对象的列表
col1, col2, col3 = st.columns(3)

# 在第一列显示内容
with col1:
    st.metric("温度", "25°C", "+1°C")

# 在第二列显示内容
with col2:
    st.metric("湿度", "65%", "-2%")

# 在第三列显示内容
with col3:
    st.metric("气压", "1013 hPa", "0")

# 选项卡
# tabs() 创建选项卡,参数是选项卡标签列表
# 返回选项卡对象的列表
tab1, tab2, tab3 = st.tabs(["图表", "数据", "设置"])

# 在第一个选项卡中显示内容
with tab1:
    st.subheader("数据图表")
    st.line_chart(data)

# 在第二个选项卡中显示内容
with tab2:
    st.subheader("数据表格")
    st.dataframe(data)

# 在第三个选项卡中显示内容
with tab3:
    st.subheader("参数设置")
    # 在选项卡中添加交互组件
    value = st.slider("参数调节", 0, 100, 50)
    st.write(f"当前参数值:{value}")

# 可展开框
# expander() 创建可展开的内容区域,默认折叠
# 点击标题可以展开或折叠内容
with st.expander("点击查看详情"):
    st.write("这里是详细信息...")
    st.write("可以包含任何内容,如图表、表格等")

# 侧边栏
# sidebar 是 Streamlit 的特殊区域,用于放置控制面板
with st.sidebar:
    st.header("控制面板")
    # 在侧边栏中添加交互组件
    option = st.selectbox("选择选项", ["选项1", "选项2", "选项3"])
    st.write(f"当前选择:{option}")

8. 状态管理和会话状态 #

8.1 会话状态基础 #

在 Streamlit 中,每次用户交互(如点击按钮)都会重新运行整个脚本。为了保存状态,我们需要使用 st.session_state。

会话状态的作用:

  • 保存用户输入的数据
  • 保存计算结果
  • 实现计数器、购物车等功能

完整示例:

# 导入 Streamlit 库
import streamlit as st

# 初始化会话状态
# session_state 是 Streamlit 提供的状态存储对象
# 类似于字典,可以存储任意数据
# 检查 'counter' 键是否存在,如果不存在则初始化为 0
if 'counter' not in st.session_state:
    st.session_state.counter = 0

# 显示当前计数
st.write(f"当前计数:{st.session_state.counter}")

# 增加按钮
# 点击按钮时,counter 加 1
if st.button("增加"):
    st.session_state.counter += 1
    # rerun() 重新运行脚本,更新显示
    st.rerun()

# 减少按钮
if st.button("减少"):
    st.session_state.counter -= 1
    st.rerun()

# 重置按钮
if st.button("重置"):
    st.session_state.counter = 0
    st.rerun()

# 使用会话状态保存用户输入
if 'user_name' not in st.session_state:
    st.session_state.user_name = ""

# 文本输入框
name = st.text_input("请输入姓名", value=st.session_state.user_name)

# 如果输入改变,更新会话状态
if name != st.session_state.user_name:
    st.session_state.user_name = name

# 显示保存的姓名
if st.session_state.user_name:
    st.write(f"你好,{st.session_state.user_name}!")

8.2 表单和批处理 #

表单可以将多个输入组件组合在一起,只有点击提交按钮时才会处理所有输入。

完整示例:

# 导入 Streamlit 库
import streamlit as st

# 创建表单
# form() 创建一个表单容器
# 表单内的组件不会立即触发脚本重新运行
# 只有点击提交按钮时才会处理
with st.form("my_form"):
    st.header("用户注册")

    # 在表单中添加输入组件
    username = st.text_input("用户名")
    password = st.text_input("密码", type="password")
    email = st.text_input("邮箱")

    # 提交按钮
    # form_submit_button() 创建表单提交按钮
    # 只有点击这个按钮,submitted 才会变为 True
    submitted = st.form_submit_button("提交")

    # 如果表单被提交,处理数据
    if submitted:
        # 验证输入
        if username and password and email:
            st.success(f"注册成功!用户名:{username}")
            # 这里可以添加保存到数据库的逻辑
        else:
            st.error("请填写所有字段!")

9. 缓存优化性能 #

9.1 数据缓存 #

当应用需要加载大量数据或执行耗时计算时,可以使用缓存来提高性能。

缓存的作用:

  • 避免重复加载数据
  • 避免重复执行耗时计算
  • 提高应用响应速度

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd
import time

# 使用 @st.cache_data 装饰器缓存数据
# 这个装饰器会缓存函数的返回值
# 如果函数参数相同,直接返回缓存的结果,不重新执行函数
@st.cache_data
def load_data():
    """
    加载数据函数
    使用缓存后,这个函数只会在第一次调用时执行
    后续调用会直接返回缓存的结果
    """
    # 模拟耗时操作(如读取大文件、查询数据库)
    st.write("正在加载数据...")
    time.sleep(2)  # 模拟 2 秒的加载时间

    # 创建示例数据
    data = pd.DataFrame({
        'id': range(1000),
        'value': range(1000)
    })

    return data

# 调用函数
# 第一次调用会执行函数并缓存结果
data = load_data()
st.dataframe(data)

# 再次调用(参数相同)
# 这次会直接使用缓存,不会重新执行函数
data2 = load_data()
st.write(f"数据行数:{len(data2)}")

# 手动清除缓存
# 如果需要重新加载数据,可以清除缓存
if st.button("清除缓存并重新加载"):
    # clear() 清除所有缓存
    st.cache_data.clear()
    st.rerun()

10. 实战示例:数据分析仪表盘 #

10.1 完整的数据分析应用 #

让我们创建一个完整的数据分析仪表盘,整合前面学到的所有知识。

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px

# 页面配置
# set_page_config() 必须在脚本最前面调用
# page_title: 浏览器标签页标题
# layout: 布局方式,"wide" 表示宽屏布局
# initial_sidebar_state: 侧边栏初始状态,"expanded" 表示展开
st.set_page_config(
    page_title="销售数据分析",
    layout="wide",
    initial_sidebar_state="expanded"
)

# 标题
st.title("📊 销售数据分析仪表盘")
st.markdown("---")  # 分隔线

# 侧边栏:筛选条件
with st.sidebar:
    st.header("筛选条件")

    # 地区选择(多选)
    regions = st.multiselect(
        "选择地区",
        ["华东", "华南", "华北", "华中", "西南", "西北", "东北"],
        default=["华东", "华南", "华北"]
    )

    # 产品类别选择
    categories = st.selectbox(
        "产品类别",
        ["全部", "电子产品", "服装", "食品", "家居"]
    )

    # 更新按钮
    update_button = st.button("更新数据", type="primary")

# 加载数据(使用缓存)
@st.cache_data
def load_data():
    """
    生成模拟销售数据
    使用缓存避免每次重新生成数据
    """
    np.random.seed(42)
    dates = pd.date_range("2023-01-01", "2023-12-31", freq='D')

    # 生成 1000 条销售记录
    data = pd.DataFrame({
        'date': np.random.choice(dates, 1000),
        'region': np.random.choice(["华东", "华南", "华北", "华中", "西南", "西北", "东北"], 1000),
        'category': np.random.choice(["电子产品", "服装", "食品", "家居"], 1000),
        'sales': np.random.randint(100, 10000, 1000),
        'profit': np.random.randint(10, 2000, 1000),
        'quantity': np.random.randint(1, 50, 1000)
    })

    return data

# 加载数据
data = load_data()

# 根据筛选条件过滤数据
if regions:
    filtered_data = data[data['region'].isin(regions)]
else:
    filtered_data = data

if categories != "全部":
    filtered_data = filtered_data[filtered_data['category'] == categories]

# 关键指标(KPI)
st.subheader("关键指标")
col1, col2, col3, col4 = st.columns(4)

# 计算指标
total_sales = filtered_data['sales'].sum()
avg_sales = filtered_data['sales'].mean()
total_orders = len(filtered_data)
avg_profit = filtered_data['profit'].mean()

# 显示指标
with col1:
    st.metric("总销售额", f"¥{total_sales:,.0f}")

with col2:
    st.metric("平均销售额", f"¥{avg_sales:,.0f}")

with col3:
    st.metric("总订单数", f"{total_orders}")

with col4:
    st.metric("平均利润", f"¥{avg_profit:,.0f}")

# 图表区域
col1, col2 = st.columns(2)

# 各地区销售额柱状图
with col1:
    st.subheader("各地区销售额")
    region_sales = filtered_data.groupby('region')['sales'].sum().reset_index()
    fig1 = px.bar(
        region_sales,
        x='region',
        y='sales',
        color='region',
        title='各地区销售额对比'
    )
    st.plotly_chart(fig1, use_container_width=True)

# 销售趋势折线图
with col2:
    st.subheader("销售趋势")
    daily_sales = filtered_data.groupby('date')['sales'].sum().reset_index()
    fig2 = px.line(
        daily_sales,
        x='date',
        y='sales',
        title='每日销售额趋势'
    )
    st.plotly_chart(fig2, use_container_width=True)

# 详细数据表格
st.subheader("详细数据")
st.dataframe(filtered_data, use_container_width=True)

# 下载按钮
# download_button() 创建下载按钮
# 可以将数据转换为 CSV 格式供用户下载
csv = filtered_data.to_csv(index=False)
st.download_button(
    label="下载 CSV 数据",
    data=csv,
    file_name="sales_data.csv",
    mime="text/csv"
)

11. 最佳实践和技巧 #

11.1 错误处理 #

在实际应用中,我们需要处理可能出现的错误,提供友好的错误提示。

完整示例:

# 导入必要的库
import streamlit as st
import pandas as pd

# 文件上传
uploaded_file = st.file_uploader("上传 CSV 文件", type=['csv'])

if uploaded_file is not None:
    try:
        # 尝试读取文件
        df = pd.read_csv(uploaded_file)
        st.dataframe(df)
        st.success("文件加载成功!")
    except pd.errors.EmptyDataError:
        # 处理空文件错误
        st.error("文件为空,请上传有效的 CSV 文件")
    except pd.errors.ParserError:
        # 处理解析错误
        st.error("文件格式错误,请检查 CSV 文件格式")
    except Exception as e:
        # 处理其他未知错误
        st.error(f"发生错误:{str(e)}")
else:
    st.info("请上传 CSV 文件")

11.2 性能优化建议 #

  1. 使用缓存:对耗时操作使用 `@st.cache_data或@st.cache_resource`
  2. 分页显示:对于大量数据,使用分页显示而不是一次性显示所有数据
  3. 避免重复计算:将计算结果存储在 st.session_state 中

12. 学习资源 #

12.1 官方资源 #

  • 官方文档:https://docs.streamlit.io
  • API 参考:https://docs.streamlit.io/library/api-reference
  • 示例应用:https://streamlit.io/gallery
  • 社区论坛:https://discuss.streamlit.io

12.2 练习项目建议 #

  1. 个人简历网站:用 Streamlit 创建交互式简历
  2. 数据可视化工具:上传 CSV 文件,自动生成图表
  3. 计算器应用:创建简单的计算器
  4. 待办事项应用:使用会话状态管理待办事项列表

13. 小结 #

13.1 核心概念回顾 #

  • Streamlit:用 Python 快速构建 Web 应用的框架
  • 组件:文本、数据、图表、交互组件
  • 布局:列布局、选项卡、侧边栏
  • 状态管理:使用 st.session_state 保存状态
  • 缓存:使用 `@st.cache_data` 优化性能

13.2 关键要点 #

  1. Streamlit 让 Python 开发者无需前端知识就能创建 Web 应用
  2. 每个 Streamlit 应用都是一个 Python 脚本
  3. 从上到下执行代码,按顺序显示内容
  4. 使用会话状态保存用户输入和计算结果
  5. 使用缓存提高应用性能

13.3 下一步学习 #

掌握了 Streamlit 基础后,你可以:

  • 深入学习高级组件和功能
  • 学习多页面应用开发
  • 学习部署 Streamlit 应用到云端
  • 结合数据科学和机器学习创建更复杂的应用

恭喜! 你已经掌握了 Streamlit 的基础知识。现在可以开始创建自己的 Web 应用了!

← 上一节 47.py2neo 下一节 49.Pandas →

访问验证

请输入访问令牌

Token不正确,请重新输入