我试图从包含变量的数据框x和y变量中删除异常值cond.
我已经创建了一个函数来根据boxplot统计信息删除异常值,并返回df没有异常值的函数.应用原始数据时,该功能运行良好.但是,如果应用于分组数据,该功能不起作用,我收到了一个错误:
Error in mutate_impl(.data, dots) :
Evaluation error: argument "df" is missing, with no default.
Run Code Online (Sandbox Code Playgroud)
请问,我如何纠正我的函数以获取向量df$x和df$y参数,并正确地删除组中的异常值?
我的虚拟数据:
set.seed(955)
# Make some noisily increasing data
dat <- data.frame(cond = rep(c("A", "B"), each = 22),
xvar = c(1:10+rnorm(20,sd=3), 40, 10, 11:20+rnorm(20,sd=3), 85, 115),
yvar = c(1:10+rnorm(20,sd=3), 200, 60, 11:20+rnorm(20,sd=3), 35, 200))
removeOutliers<-function(df, ...) {
# first, identify the outliers and store them in a vector
outliers.x<-boxplot.stats(df$x)$out
outliers.y<-boxplot.stats(df$y)$out
# remove …Run Code Online (Sandbox Code Playgroud) 我正在尝试将算法从 MATLAB 转换为 Python。该算法适用于大型数据集,并且需要应用异常值检测和消除技术。
在 MATLAB 代码中,我使用的异常值删除技术是movmedian:
Outlier_T=isoutlier(Data_raw.Temperatura,'movmedian',3);
Data_raw(find(Outlier_T),:)=[]
Run Code Online (Sandbox Code Playgroud)
它通过在三值移动窗口的中心查找不成比例的值来检测滚动中位数的异常值。因此,如果我在第 3 行有一个值为 40 的“Temperatura”列,则会检测到该列并删除整行。
Outlier_T=isoutlier(Data_raw.Temperatura,'movmedian',3);
Data_raw(find(Outlier_T),:)=[]
Run Code Online (Sandbox Code Playgroud)
据我了解,这是通过pandas.DataFrame.rolling实现的。我已经看到几篇文章举例说明了它的用法,但我无法使其与我的代码一起使用:
尝试A:
Dataframe.rolling(df["t_new"]))
Run Code Online (Sandbox Code Playgroud)
尝试B:
df-df.rolling(3).median().abs()>200
Run Code Online (Sandbox Code Playgroud)
#基于@Ami Tavory的回答
我在这里遗漏了一些明显的东西吗?这样做的正确方法是什么?感谢您的时间。
我正在研究异常值检测中的不同方法。我遇到了 sklearn 的 Isolation Forest 实现和 Amazon sagemaker 的 RRCF(Robust Random Cut Forest)实现。两者都是基于决策树的集成方法,旨在隔离每个点。隔离步骤越多,该点就越有可能成为内点,反之亦然。
但是,即使查看了算法的原始论文,我也无法准确理解两种算法之间的区别。它们的工作方式有何不同?它们中的一个比另一个更有效吗?
编辑:我正在添加研究论文的链接以获取更多信息,以及一些讨论这些主题的教程。
隔离森林:
健壮的随机砍伐森林:
python outliers scikit-learn anomaly-detection amazon-sagemaker
有谁知道 Python / PySpark 中的任何简单算法来检测 K 均值聚类中的异常值并创建这些异常值的列表或数据框?我不确定如何获得质心。我正在使用以下代码:
n_clusters = 10
kmeans = KMeans(k = n_clusters, seed = 0)
model = kmeans.fit(Data.select("features"))
Run Code Online (Sandbox Code Playgroud) 我正在尝试将通常的箱线图离群值形状(框上方的抖动)更改为默认情况下的圆形为菱形。到目前为止我正在使用以下代码:
import pandas as pd
import matplotlib.pyplot as plt
box = plt.boxplot([x1, x2], labels = ["Var1_Name",
"Var2_Name"], notch=True, patch_artist=True)
Run Code Online (Sandbox Code Playgroud)
有办法进行这种改变吗?
我正在处理一个在数据中有一些明显错误的数据集(即,1岁以下且信用卡余额为50,000美元的孩子).我不能一行一行地设置为> 100k行.有没有正式的工作如何在数据集中搜索这些类型的明显问题,甚至更好的R中的任何包?或者我应该开始做直方图?
我试图使用MATLAB从箱线图中识别异常值.该函数的默认晶须值为1.5,提供+ - 2.7*sigma或99.3覆盖率.但是,我想要99.7或3*sigma覆盖.在这种情况下,晶须的价值是什么?我不想随意猜测,所以需要你们的帮助.谢谢
我有一个数据框,假设这个:
names<-c("a","a","a","a","a","b","b","b","b","b","c","c","c","c","c","c","c","c")
var1<-c(0.942999593,0.935507266,0.973589623,0.969415912,0.95230801,0.935507266,0.888740961,0.91750551,0.944482672,0.945468585,1.457579147,0.922206277,0.941511433,0.954724791,0.941014244,0.941511433,0.941511433,1.50511433)
var2<-c(-0.012678088,0.014313763,0.001138275,-0.020568206,0.012987126,0.001217192,0.03360358,0.009758172,0.015066932,-0.037879492,0.020471157,0.010738162,0.010952531,0.019377213,0.027140572,0.031116892,-0.018530676,-8.90E-05)
as.data.frame(cbind(names,var1,var2))->df
Run Code Online (Sandbox Code Playgroud)
我想在列var1和var2中将异常值转换为Na.但是,我想为"名称"列中的每个类别独立计算离群值.因此var1中"a"的异常值将是仅使用var1中前5行发现的异常值.
我检测异常值的方式是分别低于或高于分位数0.25和0.75的所有值.
在R中有没有简单的方法呢?
非常感谢你提前.
蒂娜.
我有一个双值列表,我想在其中找到异常值.weka是否提供任何算法来解决问题?
我已经看到了几个解决我的问题的解决方案
但到目前为止他们还没有帮助我成功.
我相信以下解决方案是我需要的,但继续得到一个错误(我没有声誉点评论/问题):链接
(我收到以下错误,但在管理以下命令时我不明白在哪里.copy()或添加" inplace=True" df2=df.groupby('install_site').transform(replace):
SettingWithCopyWarning:尝试在DataFrame的切片副本上设置值.尝试使用.loc[row_indexer,col_indexer] = value替代
请参阅文档中的警告:链接
所以,我试图提出自己的版本,但我一直陷入困境.开始.
我有一个按时间索引的数据框,其中包含站点列(许多不同站点的字符串值)和浮点值.
time_index site val
Run Code Online (Sandbox Code Playgroud)
我想通过按站点分组的'val'列,并用NaN(每组)替换任何异常值(与平均值的+/- 3标准偏差).
当我使用以下函数时,我无法用我的True/Falses向量索引数据框:
def replace_outliers_with_nan(df, stdvs):
dfnew=pd.DataFrame()
for i, col in enumerate(df.sites.unique()):
dftmp = pd.DataFrame(df[df.sites==col])
idx = [np.abs(dftmp-dftmp.mean())<=(stdvs*dftmp.std())] #boolean vector of T/F's
dftmp[idx==False]=np.nan #this is where the problem lies, I believe
dfnew[col] = dftmp
return dfnew
Run Code Online (Sandbox Code Playgroud)
另外,我担心上面的函数需要花费很长时间才能生成700万行,这就是为什么我希望使用groupby函数选项.
outliers ×10
python ×4
r ×3
statistics ×3
boxplot ×2
apache-spark ×1
data-mining ×1
dataframe ×1
dplyr ×1
grouping ×1
java ×1
k-means ×1
matlab ×1
matplotlib ×1
pandas ×1
pyspark ×1
scikit-learn ×1
shapes ×1
weka ×1