我第一次尝试 Streamlit 并构建了 MLB 棒球棒追踪仪表板
Source: Dev.to
我构建的内容
我构建了一个网页仪表板,用于可视化来自 Baseball Savant 的 MLB 球棒追踪数据。

该仪表板包含五个标签页:
| 标签页 | 显示内容 |
|---|---|
| 排行榜 | 按球棒速度、攻击角度等进行排名 |
| 球员比较 | 雷达图和条形图,比较最多 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: