【问题标题】:generic scoring module using python pandas使用 python pandas 的通用评分模块
【发布时间】:2015-12-27 14:57:03
【问题描述】:

您好,我正在尝试开发一个通用评分模块,用于根据各种属性对学生进行评分。我正在尝试使用 python pandas 开发一种通用方法 输入: 带有学生 ID 和 UG 专业以及评分属性的输入数据框(我称为 df_input) 输入参考。包含评分参数的数据框

流程:根据变量类型,开发一个流程来计算每个属性的分数

输出:输入数据框,添加了捕获属性分数的列 示例:

df_input

+

------------+-----------+----+------------+-----+------+
| STUDENT_ID | UG_MAJOR  | C1 |     C2     | C3  |  C4  |
+------------+-----------+----+------------+-----+------+
|        123 | MATH      | A  | 8000-10000 | 12% | 9000 |
|        234 | ALL_OTHER | B  | 1500-2000  | 10% | 1500 |
|        345 | ALL_OTHER | A  | 2800-3000  | 8%  | 2300 |
|        456 | ALL_OTHER | A  | 8000-10000 | 12% | 3200 |
|        980 | ALL_OTHER | C  | 1000-2500  | 15% | 2700 |
+------------+-----------+----+------------+-----+------+

df_ref +

---------+---------+---------+
| REF_COL | REF_VAL | REF_SCR |
+---------+---------+---------+
| C1      | A       |      10 |
| C1      | B       |      20 |
| C1      | C       |      30 |
| C1      | NULL    |       0 |
| C1      | MISSING |       0 |
| C1      | A       |      20 |
| C1      | B       |      30 |
| C1      | C       |      40 |
| C1      | NULL    |      10 |
| C1      | MISSING |      10 |
| C2      | <1000   |       0 |
| C2      | >1000   |      20 |
| C2      | >7000   |      30 |
| C2      | >9500   |      40 |
| C2      | MISSING |       0 |
| C2      | NULL    |       0 |
| C3      | <3%     |       5 |
| C3      | >3%     |      10 |
| C3      | >5%     |     100 |
| C3      | >7%     |     200 |
| C3      | >10%    |     300 |
| C3      | NULL    |       0 |
| C3      | MISSING |       0 |
| C4      | <5000   |      10 |
| C4      | >5000   |      20 |
| C4      | >10000  |      30 |
| C4      | >15000  |      40 |
+---------+---------+---------+

+------------+-----------+----+------------+-----+------+--------+--------+--------+---------+
| Req.Output |           |    |            |     |      |        |        |        |         |
+------------+-----------+----+------------+-----+------+--------+--------+--------+---------+
| STUDENT_ID | UG_MAJOR  | C1 | C2         | C3  | C4   | C1_SCR | C2_SCR | C3_SCR | TOT_SCR |
| 123        | MATH      | A  | 8000-10000 | 12% | 9000 |        |        |        |         |
| 234        | ALL_OTHER | B  | 1500-2000  | 10% | 1500 |        |        |        |         |
| 345        | ALL_OTHER | A  | 2800-3000  | 8%  | 2300 |        |        |        |         |
| 456        | ALL_OTHER | A  | 8000-10000 | 12% | 3200 |        |        |        |         |
| 980        | ALL_OTHER | C  | 1000-2500  | 15% | 2700 |        |        |        |         |
+------------+-----------+----+------------+-----+------+--------+--------+--------+---------+

我想看看是否开发了类似函数之类的东西来完成这个

谢谢 帕里

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读所需的帮助文档,尤其是stackoverflow.com/help/how-to-askstackoverflow.com/help/mcve。计算属性分数听起来像是某种机器学习过程。你研究过那些吗?或者你只是想要一些东西来计算成绩百分比?那是简单的代数。无论哪种情况,您都需要提供您编写的代码、获得的输出以及问题描述。

标签: python pandas scoring


【解决方案1】:

如果我正确理解了这个问题,您正在尝试将一组规则存储在 df_ref 中,这些规则将应用于 df_input 以生成分数。虽然这当然可以做到,但您应该确保您的规则定义明确。这也将指导您编写相应的评分函数。

例如,假设其中一名学生在C3 列中获得了10000 的值。 10000 大于 100070009500。这意味着分数是模棱两可的。假设您想从该特定列中选择所有分数中的最高值。然后,在选择多个分数时,需要另一个表指定每个列的选择规则。

其次,您应该考虑存储在“REF_VAL”列中的 Python 变量的类型。如果&gt;7000 是一个字符串,您将不得不做额外的工作来确定分数。考虑将其存储为 7000 并在其他位置指定比较运算符。

最后,看看你目前的规则,似乎有一个模式。每个分数都与NULLMISSING 或范围截止相关联。这可以如下捕获:

import pandas as pd
import numpy as np
from itertools import dropwhile

# stores values and scores for special values and cutoff values
sample_range_rule = {
    'MISSING' : 0,
    'NULL'    : 0,
    'VALS'    : [
        (0, 0),
        (10, 50),
        (70, 75),
        (90, 100),
        (100, 100)
    ]
}

# takes a dict with rules and produces a scoring function
def getScoringFunction(range_rule):
    def score(val):
        if val == 'MISSING':
            return range_rule['MISSING']
        elif val == 'NULL':
            return range_rule['NULL']
        else:
            return dropwhile(lambda (cutoff, score): cutoff < val,
                range_rule['VALS']).next()[1]
    return score

sample_scoring_function = getScoringFunction(sample_range_rule)

for test_value in ['MISSING', 'NULL', 0, 12, 55, 66, 99]:
    print 'Input', test_value,
    print 'Output', sample_scoring_function(test_value)

在你有一个为每一列指定规则的 dict 之后,你可以执行以下操作:

df['Ck_SCR'] = df['Ck'].apply(getScoringFunction(Ck_dct))

将具有两列的 pandas DataFrame 转换为这种形式的 dict 应该不难。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2016-09-06
    • 2016-04-04
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多