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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:09:00