You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Streamlit ProgressColumn中实现行级自定义最值进度条?

解决Streamlit中每行自定义进度条最值的问题

Streamlit原生的ProgressColumn确实仅支持全局统一的min_value和max_value,无法为每行单独配置对应的52周高低点。你可以通过以下两种方案实现需求:

方案一:计算相对百分比后用ProgressColumn展示

先为每行计算收盘价相对于自身52周高低点的百分比,再用ProgressColumn展示这个百分比,同时保留原始收盘价列供查看:

import streamlit as st
import pandas as pd

# 模拟股票数据(替换成你的真实数据)
df = pd.DataFrame({
    "股票代码": ["AAPL", "MSFT", "GOOG"],
    "52周低点": [150.00, 300.00, 100.00],
    "52周高点": [200.00, 400.00, 150.00],
    "最新收盘价": [180.00, 350.00, 120.00]
})

# 计算相对进度百分比,避免除以0的情况
df["进度百分比"] = df.apply(
    lambda row: ((row["最新收盘价"] - row["52周低点"]) / (row["52周高点"] - row["52周低点"])) * 100 
    if row["52周高点"] != row["52周低点"] else 0,
    axis=1
)

st.data_editor(
    df,
    column_config={
        "进度百分比": st.column_config.ProgressColumn(
            "收盘价位置",
            min_value=0,
            max_value=100,
            format="%.1f%%",  # 显示百分比
            tooltip=df["最新收盘价"].apply(lambda x: f"${x:.2f}")  # 鼠标悬停显示收盘价
        ),
        "最新收盘价": st.column_config.NumberColumn("最新收盘价", format="$%.2f"),
        "52周低点": st.column_config.NumberColumn("52周低点", format="$%.2f"),
        "52周高点": st.column_config.NumberColumn("52周高点", format="$%.2f")
    },
    hide_index=True
)

方案二:自定义HTML进度条(更灵活)

通过生成每行专属的HTML进度条,利用TextColumn的unsafe_allow_html=True渲染,完全自定义样式和逻辑:

import streamlit as st
import pandas as pd

df = pd.DataFrame({
    "股票代码": ["AAPL", "MSFT", "GOOG"],
    "52周低点": [150.00, 300.00, 100.00],
    "52周高点": [200.00, 400.00, 150.00],
    "最新收盘价": [180.00, 350.00, 120.00]
})

# 生成自定义HTML进度条
def get_progress_html(row):
    low = row["52周低点"]
    high = row["52周高点"]
    price = row["最新收盘价"]
    
    if high == low:
        progress_width = 100
    else:
        progress_width = ((price - low) / (high - low)) * 100
    
    return f"""
    <div style="display: flex; align-items: center; gap: 10px;">
        <div style="width: 220px; height: 22px; background: #f0f2f6; border-radius: 11px; overflow: hidden;">
            <div style="width: {progress_width}%; height: 100%; background: #10b981; border-radius: 11px;"></div>
        </div>
        <span style="font-weight: 500;">${price:.2f}</span>
    </div>
    """

df["收盘价进度条"] = df.apply(get_progress_html, axis=1)

st.data_editor(
    df,
    column_config={
        "收盘价进度条": st.column_config.TextColumn(
            "收盘价位置",
            width="large",
            unsafe_allow_html=True
        ),
        "52周低点": st.column_config.NumberColumn("52周低点", format="$%.2f"),
        "52周高点": st.column_config.NumberColumn("52周高点", format="$%.2f")
    },
    hide_index=True
)

两种方案都能实现“每行基于自身52周高低点展示收盘价位置”的需求,方案二的样式自由度更高,适合需要定制视觉效果的场景。

内容的提问来源于stack exchange,提问作者engineer-x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:47:17