np.percentile()函数超详解 异常值极端值百分位四分位数

本文详细解析了四分位数的计算方法,包括在数列中确定上四分位数的具体步骤,以及如何使用numpy库进行准确计算,避免常见错误。通过实例说明,帮助读者理解四分位数在数据分析中的应用。

20211115

当有空值存在时,四分位数会是空值

20211019

https://www.zhihu.com/question/58421946
https://baike.baidu.com/item/%E5%9B%9B%E5%88%86%E4%BD%8D%E6%95%B0/5040599?fr=aladdin
上四分位数是大的那端

https://jingyan.baidu.com/article/20095761f8299dcb0621b455.html
计算步骤

https://zhuanlan.zhihu.com/p/235345817?utm_source=wechat_session
四分位数
顺序从1开始计数 这里的计算也是不对的,最好按numpy默认的配置计算的结果为准

在这里插入图片描述
举例 数列 1 2 3 4 5 6 7 8

上四分位=2x(3-2)*0.75=2.75

第一步 (n+1)/4=求的位置

aa=ndarray=[[1,2,3,4,5,6,7,8,9,10,100],[1,2,2,4,4,4,5,5,5,5,100]]
bb=pd.DataFrame(aa)
min=np.percentile(bb,1,axis=1,interpolation=‘higher’)
max=np.percentile(bb,99,axis=1,interpolation=‘higher’)
1,99 是索引的比例位置
higher lower,是取索引的小值还是大值

官方文档入口:https://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html

import pandas as pd import numpy as np from scipy.spatial.distance import euclidean from sklearn.preprocessing import StandardScaler def detect_timeseries_anomalies(df): # 1. 数据预处理:转换为时间序列格式 ts_df = df.pivot_table( index=['EQP_G', 'EQ_ID', 'EQ_ID_PRE'], columns='SHIFT_DATE', values='EQ_CN', fill_value=0 ).reset_index() print(ts_df) # 2. 计算群组和机型大小 ts_df['group_size'] = ts_df.groupby('EQP_G')['EQ_ID'].transform('count') ts_df['model_size'] = ts_df.groupby(['EQP_G', 'EQ_ID_PRE'])['EQ_ID'].transform('count') # 3. 提取时间序列特征 def extract_time_features(row): series = row.drop(['EQP_G', 'EQ_ID', 'EQ_ID_PRE', 'group_size', 'model_size']).values.astype(float) features = { 'mean': np.mean(series), 'std': np.std(series), 'max': np.max(series), 'min': np.min(series), 'trend': np.polyfit(range(len(series)), series, 1)[0], # 线性趋势斜率 'volatility': np.mean(np.abs(np.diff(series))), # 波动性 'zero_days': np.sum(series == 0), # 零异常天数 'spike_days': np.sum(series > np.percentile(series, 90)) # 异常峰天数 } return features ts_df['time_features'] = ts_df.apply(extract_time_features, axis=1) # 4. 初始化结果列 ts_df['isdetected'] = False ts_df['isanomaly'] = False ts_df['anomaly_score'] = np.nan # 5. 处理满足条件的组 condition = (ts_df['group_size'] >= 2) & (ts_df['model_size'] >= 2) & (ts_df['model_size'] <= 10) detected_groups = ts_df[condition].copy() if not detected_groups.empty: # 按群组和机型分组处理 grouped = detected_groups.groupby(['EQP_G', 'EQ_ID_PRE']) for (EQP_G, model), group in grouped: if len(group) < 2: continue # 提取特征矩阵 feature_names = list(group.iloc[0]['time_features'].keys()) feature_matrix = np.array([ list(device_features['time_features'].values()) for _, device_features in group.iterrows() ]) # 标准化特征 scaler = StandardScaler() scaled_features = scaler.fit_transform(feature_matrix) # 计算设备间的欧氏距离 n_devices = len(group) distance_matrix = np.zeros((n_devices, n_devices)) for i in range(n_devices): for j in range(i + 1, n_devices): dist = euclidean(scaled_features[i], scaled_features[j]) distance_matrix[i, j] = dist distance_matrix[j, i] = dist # 计算每个设备的平均距离(异常评分) avg_distances = np.sum(distance_matrix, axis=1) / (n_devices - 1) # 使用IQR方法确定异常阈 q1 = np.percentile(avg_distances, 25) q3 = np.percentile(avg_distances, 75) iqr = q3 - q1 upper_bound = q3 + 1.5 * iqr # 标记异常设备 is_anomaly = avg_distances > upper_bound # 更新结果 group_indices = group.index ts_df.loc[group_indices, 'isdetected'] = True ts_df.loc[group_indices, 'isanomaly'] = is_anomaly ts_df.loc[group_indices, 'anomaly_score'] = avg_distances # 6. 合并回原始数据格式 result_df = df.merge( ts_df[['EQP_G', 'EQ_ID', 'EQ_ID_PRE', 'isdetected', 'isanomaly', 'anomaly_score', 'time_features']], on=['EQP_G', 'EQ_ID', 'EQ_ID_PRE'], how='left' ) return result_df df = pd.read_csv('../0923.csv') df = pd.DataFrame(df) # 执行检测 result = detect_timeseries_anomalies(df) # 显示结果 result.to_excel('result_time_926.xlsx', index=False) #print(result_df[['EQP_G', 'EQ_ID', 'EQ_ID_PRE', 'total_cn', 'SHIFT_DATE', 'is_detected', 'is_anomaly', # 'anomaly_score']]),解释一下以上代码
最新发布
11-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值