您好我正在尝试开发一个通用评分模块,用于根据各种属性对学生进行评分。我正在尝试使用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 | | | | |
+------------+-----------+----+------------+-----+------+--------+--------+--------+---------+
我想看看是否有任何类似函数的东西可以用来完成这个
谢谢 彩
答案 0 :(得分:0)
如果我正确理解了这个问题,那么您正试图在df_ref
中存储一组规则,这些规则将应用于df_input
以生成分数。虽然这当然可以做到,但您应该确保您的规则定义明确。这也可以指导您编写相应的评分函数。
例如,假设其中一名学生在10000
列中获得C3
的值。 10000
大于1000
,7000
和9500
。这意味着得分含糊不清。假设您要从此特定列中选择所有分数中的最高分。然后,当选择多个分数时,您需要另一个表格来指定每列的选择规则。
其次,您应该考虑存储在'REF_VAL'列中的Python变量的类型。如果>7000
是一个字符串,则您需要做额外的工作来确定分数。考虑将其存储为7000
,并在其他地方指定比较运算符。
最后,看看你现在的规则,似乎有一种模式。每个分数都与NULL
,MISSING
或范围截止相关联。这可以捕获如下:
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应该不会很困难。