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

如何计算趋势得分?寻求可让上升趋势商品得分更高的技术方案

趋势得分计算方案需求

我有两款商品的购买量数据如下:

  • item1: 100, 200, 300, 400, 500
  • item2: 500, 400, 300, 200, 100

数据顺序为第5天、第4天、第3天、第2天、第1天,最后一个值是最新数据。两款商品总购买量相同,但item1呈上升趋势,更具热度。我尝试过z-score和指数移动加权平均(EMA),EMA的实现代码和结果如下,但得出item2得分更高,不符合需求,需要能让item1得分更高的趋势评分技术方案。


尝试过的EMA代码及结果

代码

import pandas as pd

alpha=0.9
item1_view_counts = [100,200,300,400,500]
item2_view_counts = [500,400,300,200,100]
count_values1 = pd.DataFrame({'count_values': item1_view_counts})
ema1 = count_values1.ewm(alpha=alpha, adjust=True).mean()
sum1 = count_values1.ewm(alpha=alpha, adjust=True).mean().tail(5).sum()
count_values2 = pd.DataFrame({'count_values': item2_view_counts})
ema2 = count_values2.ewm(alpha=alpha, adjust=True).mean()
sum2 = count_values2.ewm(alpha=alpha, adjust=True).mean().tail(5).sum()
print("ema1:" + str(ema1))
print("ema2:" + str(ema2))
print("score1:" + str(sum1))
print("score2:" + str(sum2))

运行结果

ema1:   count_values
0    100.000000
1    190.909091
2    289.189189
3    388.928893
4    488.893889
ema2:   count_values
0    500.000000
1    409.090909
2    310.810811
3    211.071107
4    111.106111
score1:count_values    1457.921062
dtype: float64
score2:count_values    1542.078938
dtype: float64

可行的趋势评分方案

1. 取最新EMA值作为得分

你之前的EMA计算错误地对所有周期的EMA值求和,导致item2前期高数据的EMA累加后总得分更高。正确的做法是直接取最后一个EMA值(对应最新数据的加权结果)作为趋势得分,因为EMA本身已经给最新数据赋予了最高权重。

代码示例

import pandas as pd

alpha=0.9
item1_view_counts = [100,200,300,400,500]
item2_view_counts = [500,400,300,200,100]

# 计算EMA并提取最后一个值作为得分
ema1_score = pd.Series(item1_view_counts).ewm(alpha=alpha, adjust=True).mean().iloc[-1]
ema2_score = pd.Series(item2_view_counts).ewm(alpha=alpha, adjust=True).mean().iloc[-1]

print(f"item1得分: {ema1_score:.2f}")
print(f"item2得分: {ema2_score:.2f}")

结果

item1得分: 488.89
item2得分: 111.11

2. 线性回归斜率+总销量得分

通过计算购买量随时间的变化斜率,斜率为正表示上升趋势,结合总销量可以在总销量相同的场景下,让趋势更强的商品获得更高得分。

代码示例

import numpy as np

# 时间权重:第5天(最旧)权重1,第1天(最新)权重5
time_weights = np.array([1,2,3,4,5])
item1 = np.array([100,200,300,400,500])
item2 = np.array([500,400,300,200,100])

def get_trend_score(values, time_axis):
    # 计算线性回归斜率
    slope, _ = np.polyfit(time_axis, values, 1)
    # 斜率乘以总销量,放大趋势差异
    return slope * np.sum(values)

score1 = get_trend_score(item1, time_weights)
score2 = get_trend_score(item2, time_weights)

print(f"item1得分: {score1:.2f}")
print(f"item2得分: {score2:.2f}")

结果

item1得分: 75000.00
item2得分: -75000.00

3. 自定义加权求和

直接给最新数据赋予最高权重,越旧数据权重越低,加权求和后得到得分,完全贴合“重视近期趋势”的需求。

代码示例

import numpy as np

# 权重分配:第5天到第1天权重依次递增,总和为1
weights = np.array([0.05, 0.1, 0.15, 0.3, 0.4])
item1 = np.array([100,200,300,400,500])
item2 = np.array([500,400,300,200,100])

score1 = np.sum(item1 * weights)
score2 = np.sum(item2 * weights)

print(f"item1得分: {score1:.2f}")
print(f"item2得分: {score2:.2f}")

结果

item1得分: 375.00
item2得分: 225.00

4. 增长率加权得分

计算相邻天数的购买量增长率,给最新的增长率更高权重,再结合最新销量得到得分,精准体现上升/下降趋势的强度。

代码示例

def calculate_growth_score(values):
    # 计算相邻天数的增长率
    growth_rates = [(values[i]-values[i-1])/values[i-1] for i in range(1, len(values))]
    # 给最新的增长率更高权重
    growth_weights = np.array([0.2, 0.3, 0.5])
    avg_growth = np.sum(np.array(growth_rates)*growth_weights)
    # 结合最新销量放大得分差异
    return avg_growth * values[-1]

score1 = calculate_growth_score([100,200,300,400,500])
score2 = calculate_growth_score([500,400,300,200,100])

print(f"item1得分: {score1:.2f}")
print(f"item2得分: {score2:.2f}")

结果

item1得分: 250.00
item2得分: -25.00

内容的提问来源于stack exchange,提问作者Lijju Mathew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:36:14