在处理异常值环节的一次失败探索

前言

像这样的表格,其行和列都有许多组数据。当我们需要对其进行数据预处理时,数据是庞大的,需要能够识别出大量数据的异常值的方法。同时还需要对异常值进行条件替换。所以,我们可以使用函数和条件替换。为此,本人做了一些尝试。

项目ValueWeightABZ
电脑$1600
手机$12
导管$1

(1)寻找到需要的两个代码

(两个代码都非本人原创)

第一个:箱型图识别异常值

优点:
能够识别异常值并且直观,采用函数能够识别大量数据。
缺点:
把异常值删掉了,导致样本缺失并且无法补值。

这是以下代码作者的博客链接##以下代码本人仅为转载,如有侵权请联系本人删除

例子:

def box_plot_outliers(data_ser, box_scale):
##IQR即尺度*(上四分位点-下四分位点)
IQR = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
val_low = data_ser.quantile(0.25) - IQR #计算上边缘
val_up = data_ser.quantile(0.75) + IQR #计算上下边缘
rule_low = (data_ser < val_low) #小于下边缘的值
rule_up = (data_ser > val_up) #大于上边缘的值
return (rule_low, rule_up), (val_low, val_up)

data_n = data.copy()
data_series = data_n[col_name]
rule, value = box_plot_outliers(data_series, box_scale=scale)
index = np.arange(data_series.shape[0])[rule[0] | rule[1]] ##对满足在rule_low以下或rule_up以上条件计数
print("删除了: {} 个数据".format(len(index))) 
data_n.reset_index(drop=True, inplace=True)##取删除离群点后的数据
print("剩余: {} 个数据".format(data_n.shape[0]))
index_low = np.arange(data_series.shape[0])[rule[0]]
outliers = data_series.iloc[index_low]#计在下边缘以下的点
print("小于下边缘线的数据详细:")
print(pd.Series(outliers).describe())
index_up = np.arange(data_series.shape[0])[rule[1]]#计在上边缘以上的点
outliers = data_series.iloc[index_up]
print("大于上边缘线的数据详细:")
print(pd.Series(outliers).describe())
##可视化数据
fig, ax = plt.subplots(1, 2, figsize=(10, 7))
sns.boxplot(y=data[col_name], data=data,ax=ax[0])
sns.boxplot(y=data_n[col_name], data=data_n,ax=ax[1])
return data_n

第二个:“利用Numpy对特征中的异常值进行替换及条件替换”

优点:
能对大量数据进行条件替换,且与上面代码同是利用Numpy
缺点:
不清楚能否与箱型图结合。

这是以下代码作者的博客链接##以下代码本人仅为转载,如有侵权请联系本人删除

例子:

data[:, 1][data[:, 1] < 5] = 5 # 对第2列小于 5 的替换为5
print(data)

(2)构想

结合两者的优点,利用箱型图识别出异常值并添加条件替换,把异常值替换成需要的值。

实践进过

第一次尝试:
输入数据;计算上边缘和下边缘;拿数据的第16列进行条件替换,条件是“>”上边缘或者"<"下边缘的值为0。
在这里插入图片描述在这里插入图片描述
分析:
"v_0"是列名,看到这个报错,我当时是一头雾水。

第二次尝试:
虽然不知道问题出在哪里,但是我可以简化问题。我单独使用条件替换,如果不行的话,问题就可能出在这个替换无法应用到函数中。
在这里插入图片描述
分析:
我尝试过在“data”后不加“values”、加或者加在其他地方,报错要么是“不可切”要么是“不是有效索引”。由于没学习到相关知识,我只能大概分析到问题出在我的列索引是个变量上。因为原本的代码的列索引是数字,而且不存在变量。可能是该替换不能应用在函数中。也有可能是进入切片之后,列名就没了,所以“col_name”没有起到作用。

第三次尝试:
由于应用所选的条件替换出现的问题无法解决,我打算使用其他条件替换,并且做循环:先把一列的数据提取出来,再对该组数据作替换,然后下一列,重复。

分析:
原理不成立;我能搜到的使用np的条件替换,它们所作用的对象都是数组(简单来说一组数据中的数之间有“逗号”隔开),而使用箱型图所提取的数之间是没有“逗号”的。就目前本人所掌握的知识来看,无法用箱型图来有效处理数据,只能用于分析数据。

经验总结

1.不能乱修改表头,否则可能会弄混数据。
2.就目前来看,对于本人来说,箱型图只能用于观察分析数据。
3.使用函数和循环对处理庞大数据会有很大帮助,但目前本人没有掌握一类可以应用的这样的方法,需要以后学习。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值