使用权重对缺少值的列的子集进行行式评分

时间:2019-09-23 16:04:05

标签: python pandas function dataframe

我正在使用具有以下结构的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_ratioweight_ratiopower_ratio。同样,每个度量标准可能有NaN值。

我的目标是将这些指标结合在一起,为每行创建一个全局分数( S )。具体来说,我要应用/实现的功能如下:

enter image description here

其中

  • s_i 是个人得分;
  • w_i 是与每个指标相关的用户定义的权重;
  • alpha 是用户定义的参数(正整数)。

我希望能够快速调整权重和参数 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中进行试验。任何帮助将不胜感激。

1 个答案:

答案 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']]函数。