如何计算趋势得分?寻求可让上升趋势商品得分更高的技术方案
趋势得分计算方案需求
我有两款商品的购买量数据如下:
- 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
相关产品推荐
相关产品推荐

