price_range / app.py
XiangJinYu's picture
Update app.py
42492c6
import streamlit as st
# Layout
st.set_page_config(page_title='报价计算器')
# 设定参数
st.sidebar.header('参数设置')
k = st.sidebar.slider('设定最低价', min_value=0, max_value=100, value=10)
h = st.sidebar.slider('设定最高价', min_value=0, max_value=100, value=76)
max_score = st.sidebar.slider('设定满分', min_value=0, max_value=10, value=2)
high_penalty = st.sidebar.slider('设定高价扣分值', min_value=0.00, max_value=0.08, value=0.03, step=0.01)
low_penalty = st.sidebar.slider('设定低价扣分值', min_value=0.00, max_value=0.08, value=0.02, step=0.01)
step = st.sidebar.slider('设定迭代步长', min_value=0.01, max_value=1.00, value=0.01, step=0.01)
def score(price, base_price):
deviation_rate = (price - base_price) / base_price
if price == base_price:
return max_score
elif price > base_price:
return max(max_score - deviation_rate * 100 * high_penalty, 0)
else:
return max(max_score - abs(deviation_rate) * 100 * low_penalty, 0)
def find_range():
max_score_diff = max_score / 3 # 最大分数差距
A0_range = [k, h]
for A6_price in [k, (k+h)/2, h]:
temp_range = [0.0, 0.0]
for A0_price in [k + x*step for x in range(int((h-k)/step) + 1)]:
base_price = (h * 2 + k * 2 + A6_price + A0_price) / 6
A6_score = score(A6_price, base_price)
A0_score = score(A0_price, base_price)
if A0_score >= A6_score - max_score_diff:
temp_range[0] = A0_price
break
for A0_price in [h - x*step for x in range(int((h-k)/step) + 1)]:
base_price = (h * 2 + k * 2 + A6_price + A0_price) / 6
A6_score = score(A6_price, base_price)
A0_score = score(A0_price, base_price)
if A0_score >= A6_score - max_score_diff:
temp_range[1] = A0_price
break
A0_range = [max(A0_range[0], temp_range[0]), min(A0_range[1], temp_range[1])]
return A0_range
# Display
A0_range = find_range()
st.header(f'A0的报价范围是 {A0_range[0]:.2f}{A0_range[1]:.2f}')