【问题标题】:Row-wise score using weights for a subset of columns with missing values使用权重对具有缺失值的列子集进行逐行评分
【发布时间】:2019-09-24 00:47:13
【问题描述】:

我正在使用具有以下结构的 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)。具体来说,我想应用/实现的功能如下:

在哪里

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

我希望能够快速调整权重和参数alpha来测试不同的组合。

例如,设置 w_1 = 3、w_2 = 2w_3 = 1alpha = 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 的帖子中,我学习了如何在带有缺失值的 pandas DataFrame 上计算逐行操作;在this 帖子中,我看到了一个使用字典设置权重的示例。

很遗憾,我无法将发现的内容应用于我的具体问题。现在,我正在使用 Excel 进行不同的模拟,但我非常想在 Python 中进行实验。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas function dataframe


    【解决方案1】:

    你可以试试这样的:

    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)
    

    global_score 函数将在运行计算之前删除所有 nan 值。当axis = 1 时,apply 函数将计算应用于所有行。apply 函数遍历行,df[['size_ratio','weight_ratio','power_ratio']] 确保只有感兴趣的数字列传递给global_score 函数。

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多