关于series_outlier方法中异常值分数计算及Python实现的技术问询
关于series_outlier方法中异常值分数计算及Python实现的技术问询
看起来你正在尝试实现一个基于自定义分位数的异常值分数计算方法,我注意到你提供的代码存在一些小问题(比如缩进不规范、lambda表达式未闭合),先给你修正后的完整可运行版本,再逐个拆解关键逻辑:
import pandas as pd import numpy as np from scipy.stats import norm # Load the data into a DataFrame data = { 'series': [67.95675, 58.63898, 33.59188, 4906.018, 5.372538, 702.1194, 0.037261, 11161.05, 1.403496, 100.116] } df = pd.DataFrame(data) # Function to calculate the outlier score based on custom percentiles def custom_percentile_outliers(series, p_low=10, p_high=90): # Calculate custom percentiles percentile_low = np.percentile(series, p_low) percentile_high = np.percentile(series, p_high) # Calculate Z-scores for the percentiles assuming normal distribution z_low = norm.ppf(p_low / 100) z_high = norm.ppf(p_high / 100) # Calculate normalization factor normalization_factor = (2 * z_high - z_low) / (2 * z_high - 2.704) # Calculate outliers score return series.apply(lambda x: (x - percentile_high) / (percentile_high - percentile_low) * normalization_factor) # 测试函数并查看结果 df['outlier_score'] = custom_percentile_outliers(df['series']) print(df)
接下来拆解这个方法的核心逻辑:
- 数据准备:用字典构造包含目标序列的DataFrame,这是处理结构化数据的常规操作
- 自定义分位数计算:通过
np.percentile获取序列的低分位数(p_low)和高分位数(p_high),这一步是划定“正常数值范围”的边界 - Z分数转换:利用
norm.ppf(正态分布的分位数函数)将分位数百分比转换为对应的Z值,这是在假设数据近似正态分布的前提下,把分位数映射到标准正态分布的刻度 - 归一化因子计算:这个自定义公式是为了将异常值的偏离程度映射到特定区间,调整分数的缩放比例,让不同分位数设置下的异常值分数更具可比性
- 异常值分数计算:对每个元素,计算其超出高分位数的相对偏离程度,再乘以归一化因子得到最终分数——分数越高,说明该值越偏离正常范围的上限
备注:内容来源于stack exchange,提问作者New2015
相关产品推荐
相关产品推荐

