1.使用中位数替换的示例代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 读取 Excel 文件
data = pd.read_excel("input.xlsx")
# 定义要处理的特征列列表
feature_cols = ['feature1', 'feature2', 'feature3', ...] # 替换为你的特征列名
# 遍历特征列,进行异常值替换,并绘制差别图
for feature_col in feature_cols:
# 备份原始数据
original_data = data[feature_col].copy()
# 计算 Z-Score 值
z_scores = stats.zscore(data[feature_col])
# 设置 Z-Score 阈值和替换值
threshold = 3
replace_value = np.median(data[feature_col])
# 替换异常值为中位数
data[feature_col][np.abs(z_scores) > threshold] = replace_value
# 绘制差别图
plt.figure(figsize=(10, 6))
plt.plot(original_data, label='Original')
plt.plot(data[feature_col], label='Processed')
plt.xlabel('Index')
plt.ylabel('Value')
plt.title(f'{feature_col} - Before and After')
plt.legend()
plt.show()
# 将处理后的数据保存为新的 Excel 文件
data.to_excel("output.xlsx", index=False)
2.使用均值替换的示例代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 读取 Excel 文件
data = pd.read_excel("input.xlsx")
# 定义要处理的特征列列表
feature_cols = ['feature1', 'feature2', 'feature3', ...] # 替换为你的特征列名
# 遍历特征列,进行异常值替换,并绘制差别图
for feature_col in feature_cols:
# 备份原始数据
original_data = data[feature_col].copy()
# 计算 Z-Score 值
z_scores = stats.zscore(data[feature_col])
# 设置 Z-Score 阈值和替换值
threshold = 3
replace_value = np.mean(data[feature_col])
# 替换异常值为均值
data[feature_col][np.abs(z_scores) > threshold] = replace_value
# 绘制差别图
plt.figure(figsize=(10, 6))
plt.plot(original_data, label='Original')
plt.plot(data[feature_col], label='Processed')
plt.xlabel('Index')
plt.ylabel('Value')
plt.title(f'{feature_col} - Before and After')
plt.legend()
plt.show()
# 将处理后的数据保存为新的 Excel 文件
data.to_excel("output.xlsx", index=False)
3.回归模型替换
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from scipy import stats
# 读取 Excel 文件
data = pd.read_excel("input.xlsx")
# 定义要处理的特征列列表
feature_cols = ['feature1', 'feature2', 'feature3', ...] # 替换为你的特征列名
# 遍历特征列,进行异常值替换,并绘制差别图
for feature_col in feature_cols:
# 备份原始数据
original_data = data[feature_col].copy()
# 计算 Z-Score 值
z_scores = stats.zscore(data[feature_col])
# 设置 Z-Score 阈值
threshold = 3
# 使用回归模型替换异常值
X = data.drop(feature_col, axis=1) # 输入特征,剔除当前特征列
y = data[feature_col] # 目标特征,当前特征列
reg_model = LinearRegression()
reg_model.fit(X, y)
predicted_values = reg_model.predict(X)
data[feature_col][np.abs(z_scores) > threshold] = predicted_values[np.abs(z_scores) > threshold]
# 绘制差别图
plt.figure(figsize=(10, 6))
plt.plot(original_data, label='Original')
plt.plot(data[feature_col], label='Processed')
plt.xlabel('Index')
plt.ylabel('Value')
plt.title(f'{feature_col} - Before and After')
plt.legend()
plt.show()
# 将处理后的数据保存为新的 Excel 文件
data.to_excel("output.xlsx", index=False)
4.KNN(K-最近邻)替换import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors
from scipy import stats
# 读取 Excel 文件
data = pd.read_excel("input.xlsx")
# 定义要处理的特征列列表
feature_cols = ['feature1', 'feature2', 'feature3', ...] # 替换为你的特征列名
# 遍历特征列,进行异常值替换,并绘制差别图
for feature_col in feature_cols:
# 备份原始数据
original_data = data[feature_col].copy()
# 计算 Z-Score 值
z_scores = stats.zscore(data[feature_col])
# 设置 Z-Score 阈值
threshold = 3
# 使用KNN替换异常值
X = data.drop(feature_col, axis=1) # 输入特征,剔除当前特征列
knn_model = NearestNeighbors(n_neighbors=5) # 设置K值
knn_model.fit(X)
distances, indices = knn_model.kneighbors(X)
mean_values = np.mean(data.iloc[indices[:, 1:], :][feature_col], axis=1) # 取K个邻居样本的平均值
data[feature_col][np.abs(z_scores) > threshold] = mean_values[np.abs(z_scores) > threshold]
# 绘制差别图
plt.figure(figsize=(10, 6))
plt.plot(original_data, label='Original')
plt.plot(data[feature_col], label='Processed')
plt.xlabel('Index')
plt.ylabel('Value')
plt.title(f'{feature_col} - Before and After')
plt.legend()
plt.show()
# 将处理后的数据保存为新的 Excel 文件
data.to_excel("output.xlsx", index=False)
5.非参数方法
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取 Excel 文件
data = pd.read_excel("input.xlsx")
# 定义要处理的特征列列表
feature_cols = ['feature1', 'feature2', 'feature3', ...] # 替换为你的特征列名
# 遍历特征列,进行异常值替换,并绘制差别图
for feature_col in feature_cols:
# 备份原始数据
original_data = data[feature_col].copy()
# 计算百分位数
p10 = np.percentile(data[feature_col], 10) # 第10百分位数
p90 = np.percentile(data[feature_col], 90) # 第90百分位数
# 替换异常值为百分位数
data[feature_col][data[feature_col] < p10] = p10
data[feature_col][data[feature_col] > p90] = p90
# 绘制差别图
plt.figure(figsize=(10, 6))
plt.plot(original_data, label='Original')
plt.plot(data[feature_col], label='Processed')
plt.xlabel('Index')
plt.ylabel('Value')
plt.title(f'{feature_col} - Before and After')
plt.legend()
plt.show()
# 将处理后的数据保存为新的 Excel 文件
data.to_excel("output.xlsx", index=False)
6.机器学习的方法
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
# 读取 Excel 文件
data = pd.read_excel("input.xlsx")
# 定义要处理的特征列列表
feature_cols = ['feature1', 'feature2', 'feature3', ...] # 替换为你的特征列名
# 遍历特征列,进行异常值替换,并绘制差别图
for feature_col in feature_cols:
# 备份原始数据
original_data = data[feature_col].copy()
# 使用孤立森林算法识别异常值
clf = IsolationForest(contamination=0.1) # 设置异常值比例
clf.fit(data[feature_col].values.reshape(-1, 1))
is_outlier = clf.predict(data[feature_col].values.reshape(-1, 1))
# 替换异常值为中位数
median_value = np.median(data[feature_col])
data[feature_col][is_outlier == -1] = median_value
# 绘制差别图
plt.figure(figsize=(10, 6))
plt.plot(original_data, label='Original')
plt.plot(data[feature_col], label='Processed')
plt.xlabel('Index')
plt.ylabel('Value')
plt.title(f'{feature_col} - Before and After')
plt.legend()
plt.show()
# 将处理后的数据保存为新的 Excel 文件
data.to_excel("output.xlsx", index=False)