print('='*20,'删除异常值之前','='*20,'\n', data3.shape)优化代码
时间: 2024-01-12 19:03:11 浏览: 30
可以使用链式操作来优化代码,同时输出结果。具体如下:
```python
# 删除异常值前
print('='*20,'删除异常值之前','='*20)
print('数据形状:', data3.shape)
# 删除异常值
data3 = data3.drop(data3[data3['Age'] > 100].index)
data3 = data3.drop(data3[data3['Fare'] > 500].index)
# 删除异常值后
print('='*20,'删除异常值之后','='*20)
print('数据形状:', data3.shape)
```
这样的代码更加简洁明了,并且能够直接输出删除异常值前后的数据形状。
相关问题
def outliers_proc(data, col_name, scale = 3): # data:原数据 # col_name:要处理异常值的列名称 # scale:用来控制删除尺度的 def box_plot_outliers(data_ser, box_scale): iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25)) # quantile是取出数据对应分位数的数值 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, values = box_plot_outliers(data_series, box_scale = scale) index = np.arange(data_series.shape[0])[rule[0] | rule[1]] # 先产生0到n-1,然后再用索引把其中处于异常值的索引取出来 print("Delete number is {}".format(len(index))) data_n = data_n.drop(index) # 整行数据都丢弃 data_n.reset_index(drop = True, inplace = True) # 重新设置索引 print("Now column number is:{}".format(data_n.shape[0])) index_low = np.arange(data_series.shape[0])[rule[0]] outliers = data_series.iloc[index_low] # 小于下界的值 print("Description of data less than the lower bound is:") print(pd.Series(outliers).describe()) index_up = np.arange(data_series.shape[0])[rule[1]] outliers = data_series.iloc[index_up] print("Description of data larger than the lower bound is:") print(pd.Series(outliers).describe()) fig, axes = plt.subplots(1,2,figsize = (10,7)) ax1 = sns.boxplot(y = data[col_name], data = data, palette = "Set1", ax = axes[0]) ax1.set_title("处理异常值前") ax2 = sns.boxplot(y = data_n[col_name], data = data_n, palette = "Set1", ax = axes[1]) ax2.set_title("处理异常值后") return data_n代码每一行解析
这是一个用于处理异常值的函数,其输入为原始数据、要处理异常值的列名称和处理异常值的尺度。函数内部定义了一个嵌套函数 box_plot_outliers,用于通过箱型图的方法找出异常值的索引,并返回删除异常值后的数据、删除的样本数、小于下界的值的描述统计和大于上界的值的描述统计。主函数中先将原始数据复制到一个新的变量 data_n 中,然后取出要处理的列数据 data_series,调用 box_plot_outliers 函数找到要删除的异常值的索引,再根据索引从 data_n 中删除异常值,并重新设置索引。最后,将处理前后的箱型图绘制出来,返回处理后的数据。
使用马氏距离进行异常值删除python
马氏距离是一种用于测量向量之间的相似度的统计方法。它是基于权重的欧几里得距离,考虑了数据的协方差矩阵。在异常值检测中,使用马式距离可以将未知样本与已知样本的距离进行标准化,从而判断未知样本是否为异常值。
Python中,可以使用scipy库中的mahalanobis()函数来计算马式距离。该函数需要提供两个numpy数组x和y,分别表示未知样本和已知样本。
具体操作流程如下:
1. 假设我们有一个含有N个样本的数据集,每个样本包含M个特征值(即M维向量),可以将这个数据集表示为一个NxM的numpy数组X。
2. 我们需要计算X中每个样本与其他样本的马式距离,并将其存储在一个N×N的距离矩阵D中。
3. 对于每个样本,我们将其与其他样本的距离进行排序,取出其中前k个距离。这里的k是一个自定义的参数,可以根据实际情况进行调整。
4. 接下来,我们需要计算每个样本的马式距离得分(即异常值分数)。可以将前k个距离的平均值作为该样本的得分,得分越高表示越有可能是异常值。
5. 最后,我们可以根据设定的阈值来判断哪些样本为异常值。一般情况下,可以将得分高于某一阈值的样本判定为异常值。
在Python中,可以使用以下代码进行异常值检测:
1. 导入必要的库和数据集
import numpy as np
from scipy.spatial.distance import mahalanobis
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
2. 计算距离矩阵
# 计算距离矩阵D
D = np.zeros((X.shape[0], X.shape[0]))
for i in range(X.shape[0]):
for j in range(X.shape[0]):
D[i,j] = mahalanobis(X[i], X[j], np.linalg.inv(np.cov(X.T)))
3. 计算得分
# 计算每个样本的得分
k = 10 # 取前10个距离
scores = np.zeros(X.shape[0])
for i in range(X.shape[0]):
distances = sorted(D[i,:])[:k]
scores[i] = np.mean(distances)
4. 判定异常值
# 判断哪些样本为异常值
threshold = 2.5 # 设定阈值为2.5
outliers = np.where(scores > threshold)[0]
print(outliers) # 输出异常值的下标