请求协助在CDF图中高亮异常值区域及排查空输出问题
嘿,我来帮你搞定这两个问题——先是outliers_iqr(days)返回空数组的排查,再是CDF图异常值区域的高亮填充!
一、解决
outliers_iqr(days) 返回空数组的问题 - 大概率是你的
outliers_iqr函数实现不符合标准IQR规则,或者你的数据确实没有超出IQR阈值的异常值。先给你一个标准的IQR异常值检测函数:
import numpy as np def outliers_iqr(data): q1 = np.percentile(data, 25) q3 = np.percentile(data, 75) iqr = q3 - q1 # 标准IQR异常值阈值:上下界为Q1/Q3 ± 1.5*IQR lower_bound = q1 - 1.5 * iqr upper_bound = q3 + 1.5 * iqr # 筛选出超出范围的异常值 outliers = data[(data < lower_bound) | (data > upper_bound)] return outliers
- 排查步骤:
- 先运行
print(np.percentile(days, [25, 75]))查看Q1和Q3的数值,手动计算上下边界,检查你的数据有没有落在边界外的 - 如果确实没有异常值,你可以调整阈值(比如把1.5改成3,检测极端异常值),或者换用Z-score等其他异常值检测方法
- 先运行
二、CDF图高亮异常值区域的实现
假设你用matplotlib绘制CDF,这里给你完整的可运行代码,包含浅红色填充异常值区域的逻辑:
import numpy as np import matplotlib.pyplot as plt # 先定义标准的IQR异常值检测函数(返回边界+异常值) def outliers_iqr(data): q1 = np.percentile(data, 25) q3 = np.percentile(data, 75) iqr = q3 - q1 lower_bound = q1 - 1.5 * iqr upper_bound = q3 + 1.5 * iqr outliers = data[(data < lower_bound) | (data > upper_bound)] return lower_bound, upper_bound, outliers # 替换成你自己的days数据 days = np.random.normal(loc=30, scale=10, size=1000) # 手动添加几个异常值做测试(可删除) days = np.append(days, [80, 90, -20]) # 获取异常值的上下边界 lower_bound, upper_bound, outliers = outliers_iqr(days) # 计算CDF sorted_days = np.sort(days) cdf = np.arange(1, len(sorted_days)+1) / len(sorted_days) # 绘制CDF并高亮异常区域 plt.figure(figsize=(10,6)) plt.plot(sorted_days, cdf, label='CDF Curve') # 填充低于下界的异常区域 plt.fill_between( sorted_days[sorted_days < lower_bound], 0, cdf[sorted_days < lower_bound], color='lightcoral', alpha=0.3, label='Outlier Region' ) # 填充高于上界的异常区域 plt.fill_between( sorted_days[sorted_days > upper_bound], 0, cdf[sorted_days > upper_bound], color='lightcoral', alpha=0.3 ) # 添加图表元素 plt.xlabel('Days') plt.ylabel('Cumulative Probability') plt.title('CDF with Highlighted Outlier Regions') plt.legend() plt.grid(True, alpha=0.3) plt.show()
- 代码说明:
- 用
fill_between分别填充低于下界和高于上界的区域,浅红色+半透明的样式既醒目又不会遮挡原始CDF曲线 - 如果你的数据没有异常值,填充区域会自动消失,不会报错
- 用
内容的提问来源于stack exchange,提问作者user8834780
相关产品推荐
相关产品推荐

