手头有份数据,需要根据另一份标准指标(数据有含有几个指标,每个指标都各自的等级划分,示意图如下)
我需要将手头的数据,根据这个标准值,将对应的数值全部转换成对应的等级。自己写了份代码,但是运行速度太慢(1000个数据,运行了居然2-3分钟)。。
想请问下高手们,有什么办法改进没?
具体代码如下:
for zb in list(data_std['指标']):
for num in range(data.shape[0]):
if zb !='DISSOLVED_O2': #某指标比较特殊,数值越大越好。其余指标是数值越小越好。因此要单独设置
if (data[zb][num]) <= float(data_std[data_std['指标'] ==zb]['I']):
data['%s_wq'%zb][num] = 1
elif float(data_std[data_std['指标'] ==zb]['I']) < data[zb][num] <= float(data_std[data_std['指标'] ==zb]['II']):
data['%s_wq'%zb][num] = 2
elif float(data_std[data_std['指标'] ==zb]['II']) < data[zb][num] <= float(data_std[data_std['指标'] ==zb]['III']):
data['%s_wq'%zb][num] = 3
elif float(data_std[data_std['指标'] ==zb]['III']) < data[zb][num] <= float(data_std[data_std['指标'] ==zb]['IV']):
data['%s_wq'%zb][num] = 4
elif float(data_std[data_std['指标'] ==zb]['IV']) < data[zb][num] <= float(data_std[data_std['指标'] ==zb]['V']):
data['%s_wq'%zb][num] = 5
elif (data[zb][num]) > float(data_std[data_std['指标'] ==zb]['V']):
data['%s_wq'%zb][num] = 6
else:
data['%s_wq'%zb][num] = np.NaN
if zb =='DISSOLVED_O2':
if (data[zb][num]) >= float(data_std[data_std['指标'] ==zb]['I']):
data['%s_wq'%zb][num] = 1
elif float(data_std[data_std['指标'] ==zb]['I']) > data[zb][num] >= float(data_std[data_std['指标'] ==zb]['II']):
data['%s_wq'%zb][num] = 2
elif float(data_std[data_std['指标'] ==zb]['II']) > data[zb][num] >= float(data_std[data_std['指标'] ==zb]['III']):
data['%s_wq'%zb][num] = 3
elif float(data_std[data_std['指标'] ==zb]['III']) > data[zb][num] >= float(data_std[data_std['指标'] ==zb]['IV']):
data['%s_wq'%zb][num] = 4
elif float(data_std[data_std['指标'] ==zb]['IV']) > data[zb][num] >= float(data_std[data_std['指标'] ==zb]['V']):
data['%s_wq'%zb][num] = 5
elif (data[zb][num]) < float(data_std[data_std['指标'] ==zb]['V']):
data['%s_wq'%zb][num] = 6
else:
data['%s_wq'%zb][num] = np.NaN
data.head()
刚刚自己试验了下,应该成功了,在这里贴下我改进的代码。
就是循环设置函数,用apply的命令,把数值转换掉。(当然,为了简化处理,我提取了那个特殊的指标,单独处理)
谢谢刚才答复的那几位朋友~~
for n,zb in zip(range(1,d_std.shape[0]),d_std['指标'][1:]): #从第2行开始进行转换。
def tran(y):
if y <= d_std.loc[n]['I']:
return 1
elif y <= d_std.loc[n]['II']:
return 2
elif y <= d_std.loc[n]['III']:
return 3
elif y <= d_std.loc[n]['IV']:
return 4
elif y <= d_std.loc[n]['V']:
return 5
elif y > d_std.loc[n]['V']:
return 6
else:
return np.NaN
data['%s_X1'%zb] = data[zb].apply(tran)
data.head()
这句if zb =='DISSOLVED_O2':直接换成else试试
-不需要每次都做float(data_std[data_std['指标'] 这个转换,用个临时变量先保存,然后再判断;
-先把数据和指标预处理一下,最后的指标匹配,只做简单的数值比较;
还有,看不到你的数据结构,这个写法目的是啥:
float(data_std[data_std['指标'] ==zb]['I'])
里面的
data_std[data_std['指标'] ==zb]
试一下有限状态机 ,推荐https://blog.csdn.net/gzlaiyonghao/article/details/1510688