如何使用OneClassSVM检测股价涨跌幅离群值并为DataFrame新增标识列
正确添加离群点标识列的方案
报错原因
你遇到的报错由两个问题导致:
np.where(pred==-1)返回的是元组类型,第一个元素才是离群点对应的索引数组,直接把整个元组传入isin()方法会导致匹配逻辑异常np.select要求传入的第一个参数是条件列表,第二个参数是和条件一一对应的返回值列表,你传入单个条件和单个值,又没有指定默认值,就会触发长度不匹配的错误
最优实现方案
因为你已经拿到了和原数据行数完全对齐的预测结果pred,直接用np.where生成标识列即可,逻辑最简单且不会出现长度匹配问题:
import numpy as np # pred为-1标记为outlier,其余标记为normal df['isoutlier'] = np.where(pred == -1, 'outlier', 'normal')
基于已提取的离群点索引实现
如果你一定要用已经生成的outliers变量来实现,先提取出有效索引数组,再批量赋值即可,在离群点数量远少于正常点的场景下效率很高:
# 提取np.where返回的离群点索引数组 outlier_indexes = outliers[0] # 先默认所有行都是正常样本 df['isoutlier'] = 'normal' # 仅修改离群行的标识 df.loc[df.index.isin(outlier_indexes), 'isoutlier'] = 'outlier'
原np.select写法的修正方案
如果要保留np.select的写法,需要按规则传入参数即可:
outlier_indexes = outliers[0] # 条件和返回值都要包装为列表,同时指定默认值 df['isoutlier'] = np.select( condlist=[df.index.isin(outlier_indexes)], choicelist=['outlier'], default='normal' )
内容的提问来源于stack exchange,提问作者user3062448
相关产品推荐
相关产品推荐

