|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 老笨啊 于 2019-5-31 14:34 编辑
手头数据实例如下:
数据需要关联的标准数据如下:
要求:
1. 首先根据标准数据,将各个字段,生成新的等级数据列(我已完成,生成了多个x_level的字段)
2. 需要根据生成的等级数据,并继续结合标准数据值,进行计算,生成多个新的x_new字段。
要求公式为:
1)如果等级数据为缺失值(原始数据缺失),则也返回缺失值;
2)如果等级数据为1(即最高等级),返回1.0;
3)如果等级数据为6(即最低等级),则计算公式为 (x - x(6)) / x(6) ---x为原数据,x(6)为标准数据中第6等级的数据;
4)如果等级数据介于1和6之间,则计算公式为(x(下)-x)/(x(下) - x(上) ---x为原数据,x(上),x(下)即表示x所在位置对应的上下两级的标准数据值。假设X1 = 3.5,则x(上)=5,x(下)=3;
我的逻辑是为每个字段定义一个函数,放在for循环内,然后用apply命令来获得需要的值。我的代码如下:---这种做法,感觉十分耗时。。因为要生成多个函数。。
不知道有没更好的办法来处理呢。。求高手指点·~
- #先把标准数据文件中值提取出来,将每个指标的数值转成字典格式。
- std_level = {}
- for zb in data.columns[:5]: #确保选到的是数据中的字段
- std_level[zb] = []
- #需考虑到指标顺序的不一致,需确保每个指标的名称与其真正的数值能正确对应
- std_level[zb].append(std.loc[std['指标']==zb,'I':'IV'].values.tolist()[0])
- #对每个字段进行遍历,再定义函数。函数定义完一个,就应用一个。
- for i in std_level:
- l_1,l_2,l_3,l_4,l_5 = std_level[i][0] #一一对应,生成指定的数据表
- #对原x1_level的字段的空值填充为0,方便跳过数值0进行数据处理。同时便于后期与目标值比较。
- def tran_new(x):
- dj = x['%s_level'%i]
- if dj == 0:
- return np.NaN #务必要返回np.NaN,否则返回空字符串None,影响后面的计算。
- else:
- if dj not in [1,6]: #根据介于等级1和6之间时的单因子计算公式
- up = std_level[i][0][int(dj)] #提取上一级的数值
- dn = std_level[i][0][int(dj)+1] #提取下一级的数值
- return round(dj + (up - x[i]) / (up -dn),1) #保留小数点后1位数
- else:
- if dj == 1: #等级最高时,直接视为1.0,不再计算。
- return 1.0
- else: #水质等级最差情况下的计算公式
- return round((l_5 - x[i]) / l_5 * 4,1)
- data['%s_new'%i] = data.apply(tran_new,axis=1)
复制代码
|
|