使用python pandas

时间:2015-09-30 00:00:16

标签: python pandas scoring

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

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

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

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 |        |        |        |         |
+------------+-----------+----+------------+-----+------+--------+--------+--------+---------+

我想看看是否有任何类似函数的东西可以用来完成这个

谢谢 彩

1 个答案:

答案 0 :(得分:0)

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

例如,假设其中一名学生在10000列中获得C3的值。 10000大于100070009500。这意味着得分含糊不清。假设您要从此特定列中选择所有分数中的最高分。然后,当选择多个分数时,您需要另一个表格来指定每列的选择规则。

其次,您应该考虑存储在'REF_VAL'列中的Python变量的类型。如果>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应该不会很困难。