我第一次尝试 Streamlit 并构建了 MLB 棒球棒追踪仪表板

发布: (2026年2月12日 GMT+8 12:49)
4 分钟阅读
原文: Dev.to

Source: Dev.to

我构建的内容

我构建了一个网页仪表板,用于可视化来自 Baseball Savant 的 MLB 球棒追踪数据。

👉 MLB Bat Tracking Dashboard

仪表板首页

该仪表板包含五个标签页:

标签页显示内容
排行榜按球棒速度、攻击角度等进行排名
球员比较雷达图和条形图,比较最多 6 名球员
WBC 国家实力所有 20 个 2026 年 WBC 参赛国的击球和投球得分
球队阵容构建器每支 MLB 球队 9 人阵容的球棒追踪指标
月度趋势任意球员的月度球棒速度趋势

它还支持英语/日语语言切换。

数据来源

我使用了自己的开源库 savant‑extras 来获取数据。

pip install savant-extras
from savant_extras import bat_tracking, bat_tracking_monthly

# Batter bat tracking data for 2025 season
df = bat_tracking(year=2025, player_type="batter")

# Monthly breakdown
df_monthly = bat_tracking_monthly(year=2025)
  • GitHub:
  • PyPI:

为什么选择 Streamlit

我想以可视化、易于访问的方式分享我的数据分析。Streamlit 吸引我的原因有三点:

  • 纯 Python – 无需 HTML、CSS 或 JavaScript。
  • 免费托管 在 Streamlit Community Cloud(只需连接你的 GitHub 仓库)。
  • 一行代码的 UI 组件 – 如 st.selectbox()st.slider()

示例:向侧边栏添加下拉框。

import streamlit as st

year = st.sidebar.selectbox("Season", [2024, 2025], index=1)
player_type = st.sidebar.selectbox("Player type", ["batter", "pitcher"])

关键实现要点

缓存 API 调用

在每次交互时都去获取数据会太慢。@st.cache_data 会缓存结果,对使用相同参数的重复调用即时返回。

@st.cache_data(ttl=3600)
def load_bat_data(year: int, player_type: str):
    return bat_tracking(year=year, player_type=player_type)

在标签页之间共享数据

Streamlit 在每次交互时都会重新运行脚本。使用 st.session_state 可以在点击按钮后保持已加载的数据。

if load_btn:
    st.session_state["df_raw"] = load_bat_data(year, player_type)

if "df_raw" in st.session_state:
    df = st.session_state["df_raw"]

日文字体支持

为了在 Matplotlib 图表中渲染日文标签,我使用了 matplotlib-fontja

import matplotlib_fontja  # noqa: F401  ← 导入后即可启用日文字体

我遇到的问题:Python 3.13 上的 japanize_matplotlib

部署到 Streamlit Community Cloud 时出现错误,因为 Python 3.13 已移除 distutils

File "japanize_matplotlib/japanize_matplotlib.py", line 5, in 
    from distutils.version import LooseVersion
ModuleNotFoundError

解决办法是将 japanize-matplotlib 替换为 matplotlib-fontja

- japanize-matplotlib>=1.1
+ matplotlib-fontja

数据注意事项

  • 仅包括 MLB 阵容的球员;NPB 和小联盟球员被排除。
  • 姓名匹配限制——拼写变体或同名球员可能无法正确匹配。
  • WBC 2026 分数为临时值——名单基于 Baseball America 2025 年 2 月的预测,可能与实际名单不同。
  • 球棒追踪精度取决于 Baseball Savant 数据的质量。

将结果视为参考,而非权威来源。

摘要

  • 使用 savant‑extras(我自己的 OSS 库)进行数据获取。
  • 使用 Streamlit 构建了一个包含 5 个标签页的仪表板。
  • Streamlit Community Cloud 上免费部署。

Streamlit 比预期更容易使用。使用 st.tabs() 创建标签页,st.expander() 创建折叠面板,st.columns() 实现列布局,基本满足了所需的功能。如果你想把数据分析成果分享出去,Streamlit 是一个很好的选择。

链接

  • 应用:
  • savant‑extras (PyPI):
  • savant‑extras (GitHub):
  • Baseball Savant:
0 浏览
Back to Blog

相关文章

阅读更多 »

我的函数

用户自定义函数 Function:为执行特定任务而编写的代码块 函数的声明定义 - 参数 argument = 形参 parameter - 执行语句 - 返回值 return python def 函数_名称 参数1, 参数2, …: 执行语句 1 执行语句 2 return 参数的种类…