我正在使用具有以下结构的DataFrame尝试使用Python / Pandas:
import pandas as pd
import numpy as np
df = pd.DataFrame({"item" : ["A", "B", "C", "D", "E"],
"size_ratio" : [0.3, 0.9, 1, 0.4, 0.7],
"weight_ratio" : [0.5, 0.7, 1, 0.5, np.nan],
"power_ratio" : [np.nan, 0.3, 0.5, 0.1, 1]})
print(df)
item size_ratio weight_ratio power_ratio
0 A 0.3 0.5 NaN
1 B 0.9 0.7 0.3
2 C 1.0 1.0 0.5
3 D 0.4 0.5 0.1
4 E 0.7 NaN 1.0
如您所见,每个项目都由三个规格化指标描述,即:size_ratio
,weight_ratio
和power_ratio
。同样,每个度量标准可能有NaN
值。
我的目标是将这些指标结合在一起,为每行创建一个全局分数( S )。具体来说,我要应用/实现的功能如下:
其中
我希望能够快速调整权重和参数 alpha 以测试不同的组合。
例如,设置 w_1 = 3, w_2 = 2 , w_3 = 1 和 alpha = 5,输出应为以下内容:
item size_ratio weight_ratio power_ratio global_score
0 A 0.3 0.5 NaN 0.36
1 B 0.9 0.7 0.3 0.88
2 C 1.0 1.0 0.5 0.99
3 D 0.4 0.5 0.1 0.44
4 E 0.7 NaN 1.0 0.70
请注意,对于分母,我们仅对与非缺失度量标准关联的权重求和(分子的逻辑相同)。
由于是Python编程语言的新手,所以我从这里搜索答案开始。在this帖子中,我学习了如何在缺少值的熊猫DataFrame上计算按行操作;在this帖子中,我看到了一个示例,其中有人使用字典来设置权重。
不幸的是,我无法将发现的内容应用于我的特定问题。现在,我正在使用Excel进行不同的模拟,但是我非常想在Python中进行试验。任何帮助将不胜感激。
答案 0 :(得分:2)
您可以尝试这样的事情:
docker-compose up
import pandas as pd
import numpy as np
def global_score(scores, weights, alpha):
# if we have nan values remove them before calculating the score
nan_vals = np.argwhere(np.isnan(scores))
weights = np.delete(weights, nan_vals)
scores = scores.dropna()
# calculate the score
numer = np.sum((scores * weights)**alpha)**(1/alpha)
denom = np.sum((weights)**alpha)**(1/alpha)
return numer/denom
weights = [3, 2, 1]
alpha = 5
df = pd.DataFrame({"item" : ["A", "B", "C", "D", "E"],
"size_ratio" : [0.3, 0.9, 1, 0.4, 0.7],
"weight_ratio" : [0.5, 0.7, 1, 0.5, np.nan],
"power_ratio" : [np.nan, 0.3, 0.5, 0.1, 1]})
# only utilize the 3 score columns for the calculation
df['global_score'] = df[['size_ratio','weight_ratio','power_ratio']].apply(lambda x: global_score(x, weights, alpha), axis=1)
函数将在运行计算之前删除所有nan值。当axis = 1时,apply函数将计算应用于所有行。apply函数对行进行迭代,并且global_score
确保仅将感兴趣的数字列传递给df[['size_ratio','weight_ratio','power_ratio']]
函数。