You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:25:44