标签: rolling-computation

快速滚动均值+总结

在R中,我试图使用不同的窗口宽度对一个大矢量(高达400k元素)进行非常快速的滚动均值,然后对于每个窗口宽度,按每年的最大值汇总数据.希望下面的例子很清楚.我已经尝试了几种方法,到目前为止最快的似乎是roll_mean从包RcppRoll中使用运行平均值,并aggregate选择最大值.请注意内存需求是一个问题:下面的版本需要非常少的内存,因为它一次只进行一次滚动均值和聚合; 这是首选.

#Example data frame of 10k measurements from 2001 to 2014
n <- 100000
df <- data.frame(rawdata=rnorm(n),
                 year=sort(sample(2001:2014, size=n, replace=TRUE))
                 ) 

ww <- 1:120 #Vector of window widths

dfsumm <- as.data.frame(matrix(nrow=14, ncol=121))
dfsumm[,1] <- 2001:2014
colnames(dfsumm) <- c("year", paste0("D=", ww))

system.time(for (i in 1:length(ww)) {
  #Do the rolling mean for this ww
  df$tmp <- roll_mean(df$rawdata, ww[i], na.rm=TRUE, fill=NA)
  #Aggregate maxima for each year
  dfsumm[,i+1] <- aggregate(data=df, tmp ~ year, max)[,2]
}) #28s on …
Run Code Online (Sandbox Code Playgroud)

aggregate r dataframe data.table rolling-computation

4
推荐指数
1
解决办法
393
查看次数

使用滚动中位数过滤掉Pandas数据框中的异常值

我试图从带有日期的GPS高程位移的散点图中滤除一些异常值

我正在尝试使用df.rolling来计算每个窗口的中位数和标准偏差,如果它大于3个标准差,则删除该点.

但是,我无法找到一种方法来遍历列并比较滚动计算的中值.

这是我到目前为止的代码

import pandas as pd
import numpy as np

def median_filter(df, window):
    cnt = 0
    median = df['b'].rolling(window).median()
    std = df['b'].rolling(window).std()
    for row in df.b:
      #compare each value to its median




df = pd.DataFrame(np.random.randint(0,100,size=(100,2)), columns = ['a', 'b'])

median_filter(df, 10)
Run Code Online (Sandbox Code Playgroud)

如何循环并比较每个点并将其删除?

median outliers pandas rolling-computation

4
推荐指数
1
解决办法
4306
查看次数

熊猫滚动窗口Spearman相关

我想使用滚动窗口计算DataFrame的两列之间的Spearman和/或Pearson Correlation.

我试过df['corr'] = df['col1'].rolling(P).corr(df['col2'])
(P是窗口大小)

但我似乎无法定义方法.(method='spearman'作为参数添加会产生错误:

File "main.py", line 29, in __init__
_df['corr'] = g['col1'].rolling(P).corr(g['col2'], method = corr_function)
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1287, in corr
**kwargs)
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1054, in corr
_get_corr, pairwise=bool(pairwise))
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1866, in _flex_binary_moment
return f(X, Y)
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1051, in _get_corr
return a.cov(b, **kwargs) / (a.std(**kwargs) * b.std(**kwargs))
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1280, in cov
ddof=ddof, **kwargs)
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1020, in cov
_get_cov, pairwise=bool(pairwise))
File "~\Python36\lib\site-packages\pandas\core\window.py", line 1866, in …
Run Code Online (Sandbox Code Playgroud)

python correlation pandas rolling-computation

4
推荐指数
1
解决办法
1282
查看次数

R 中哪个是“右”与“左”滚动平均值?

如果我想n用当前年份的滞后来计算以前的平均年份,我将如何做到这一点?它像“正确”滚动平均窗口一样简单吗?或者它是一个“左”滚动平均窗口?我不确定在这里使用哪个窗口。

样本数据

set.seed(1234)
dat <- data.frame(year = c(1990:2010), 
                  x = rnorm(21))
dat$x_lag1 <- lag(dat$x, 1)
Run Code Online (Sandbox Code Playgroud)

r mean moving-average rolling-computation

4
推荐指数
1
解决办法
2967
查看次数

Pandas: increase speed of rolling window (apply a custom function)

I'm using this code to apply a function (funcX) on my data-frame using a rolling window. The main issue is that the size of this data-frame (data) is very large, and I'm searching for a faster way to do this task.

import numpy as np

def funcX(x):
    x = np.sort(x)
    xd = np.delete(x, 25)
    med = np.median(xd)
    return (np.abs(x - med)).mean() + med

med_out = data.var1.rolling(window = 51, center = True).apply(funcX, raw = True)
Run Code Online (Sandbox Code Playgroud)

The only …

python performance median dataframe rolling-computation

4
推荐指数
1
解决办法
308
查看次数

pandas groupby 滚动平均值/中值并删除缺失值

如何通过滚动平均值/中位数并删除缺失值来进入熊猫组?即输出应该在计算平均值/中位数之前删除缺失值,而不是在存在缺失值时给我 NaN。

import pandas as pd
t = pd.DataFrame(data={v.date:[0,0,0,0,1,1,1,1,2,2,2,2],
                         'i0':[0,1,2,3,0,1,2,3,0,1,2,3],
                         'i1':['A']*12,
                         'x':[10.,20.,30.,np.nan,np.nan,21.,np.nan,41.,np.nan,np.nan,32.,42.]})
t.set_index([v.date,'i0','i1'], inplace=True)
t.sort_index(inplace=True)

print(t)
print(t.groupby('date').apply(lambda x: x.rolling(window=2).mean()))
Run Code Online (Sandbox Code Playgroud)

               x
date i0 i1      
0    0  A   10.0
     1  A   20.0
     2  A   30.0
     3  A    NaN
1    0  A    NaN
     1  A   21.0
     2  A    NaN
     3  A   41.0
2    0  A    NaN
     1  A    NaN
     2  A   32.0
     3  A   42.0

               x
date i0 i1      
0    0  A    NaN
     1  A   15.0
     2  A   25.0
     3  A    NaN …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas rolling-computation pandas-groupby

4
推荐指数
1
解决办法
303
查看次数

r中data.table中的部分滚动总和

我正在寻找一种在大型数据库上实现滚动总和的快速方法。我想要的是一个支持左(和右)对齐和最小观察论证的快速函数。

本质上,即使样本大小小于指定的宽度,我也想计算滚动总和。在下面的示例中,只要有下 5 个值可用,我就想要下 5 个值的总和,并且如果前导值的大小小于 5,则对剩余的所有值求和。

例子: x <- seq(1:10)

期望的输出:

15 20 25 30 35 40 34 27 19 10

我知道这rollapply(x,5, sum, align = "left", partial=1)会产生所需的输出,但我正在寻找更快的解决方案。

frollsum来自包 data.table 的速度很快,但似乎没有对最小观察的争论。roll_sum从包装卷也很快,并接受最小观察值,但不支持左对齐。

提前致谢。

r data.table rolling-computation

4
推荐指数
1
解决办法
345
查看次数

确定动态窗口宽度:满足条件的值的有效滚动计数

我有一个包含两列a和的 data.frame b,在哪里a排序。我想要得到的滚动平均b,其中窗口的范围a - 5,以a(即从当前值a到哪里a - 5是)。

使用不同的窗口宽度执行滚动平均值是微不足道的data.table::frollmean()adaptive = TRUE;“每个单独的观察都有自己对应的滚动窗口宽度”),所以唯一的问题是计算这些窗口宽度。

那么,给定以下 data.frame,如何确定每个均值的窗口大小?

set.seed(42)
x <- data.frame(
    a = sort(runif(10, 0, 10)),
    b = 1:10
)
x
#>           a  b
#> 1  1.346666  1
#> 2  2.861395  2
#> 3  5.190959  3
#> 4  6.417455  4
#> 5  6.569923  5
#> 6  7.050648  6
#> 7  7.365883  7
#> 8  8.304476  8 …
Run Code Online (Sandbox Code Playgroud)

r data.table rolling-computation

4
推荐指数
2
解决办法
161
查看次数

计算 30 天滚动窗口内的观察值

我需要创建一个变量来计算每个 id 在过去 30 天内发生的观察次数。

例如,假设 id“a”在 1/2/2021 (d/m/y) 发生的观察。如果此观察是 2021 年 1 月 1 日至 2021 年 1 月 2 日期间 id“a”的第一个观察,则变量必须给出 1。如果是第二个,则为 2,依此类推。

这是一个更大的例子:

dat <- tibble::tribble(
  ~id,  ~q,   ~date,
  "a",   1,   "01/01/2021",
  "a",   1,   "01/01/2021",
  "a",   1,   "21/01/2021",
  "a",   1,   "21/01/2021",
  "a",   1,   "12/02/2021",
  "a",   1,   "12/02/2021",
  "a",   1,   "12/02/2021",
  "a",   1,   "12/02/2021",
  "b",   1,   "02/02/2021",
  "b",   1,   "02/02/2021",
  "b",   1,   "22/02/2021",
  "b",   1,   "22/02/2021",
  "b",   1,   "13/03/2021",
  "b",   1,   "13/03/2021",
  "b",   1,   "13/03/2021",
  "b",   1,   "13/03/2021") …
Run Code Online (Sandbox Code Playgroud)

r windowing dplyr rolling-computation tidyverse

4
推荐指数
1
解决办法
679
查看次数

Python中基于移动均值的异常值检测

我正在尝试将算法从 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的回答

我在这里遗漏了一些明显的东西吗?这样做的正确方法是什么?感谢您的时间。

python outliers pandas rolling-computation

3
推荐指数
1
解决办法
4818
查看次数