标签: rolling-computation

Python - GroupBy对象的滚动函数

我有一个grouped类型的时间序列对象<pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0>.grouped.sum()给出了期望的结果,但我无法使用rolling_sum来处理groupby对象.有没有办法将滚动功能应用于groupby对象?例如:

x = range(0, 6)
id = ['a', 'a', 'a', 'b', 'b', 'b']
df = DataFrame(zip(id, x), columns = ['id', 'x'])
df.groupby('id').sum()
id    x
a    3
b   12
Run Code Online (Sandbox Code Playgroud)

但是,我希望有类似的东西:

  id  x
0  a  0
1  a  1
2  a  3
3  b  3
4  b  7
5  b  12
Run Code Online (Sandbox Code Playgroud)

python pandas rolling-computation rolling-sum pandas-groupby

40
推荐指数
3
解决办法
4万
查看次数

Pandas 滚动应用使用多列

我正在尝试pandas.DataFrame.rolling.apply()在多列上使用滚动函数。Python 版本是 3.7,pandas 是 1.0.2。

import pandas as pd

#function to calculate
def masscenter(x):
    print(x); # for debug purposes
    return 0;

#simple DF creation routine
df = pd.DataFrame( [['02:59:47.000282', 87.60, 739],
                    ['03:00:01.042391', 87.51, 10],
                    ['03:00:01.630182', 87.51, 10],
                    ['03:00:01.635150', 88.00, 792],
                    ['03:00:01.914104', 88.00, 10]], 
                   columns=['stamp', 'price','nQty'])
df['stamp'] = pd.to_datetime(df2['stamp'], format='%H:%M:%S.%f')
df.set_index('stamp', inplace=True, drop=True)
Run Code Online (Sandbox Code Playgroud)

'stamp'是单调且唯一的,'price'是双精度'nQty'值且不包含 NaN,是整数且也不包含 NaN。

所以,我需要计算滚动的“质心”,即sum(price*nQty)/sum(nQty)

到目前为止我尝试过的:

df.apply(masscenter, axis = 1)
Run Code Online (Sandbox Code Playgroud)

masscenter 被单行调用 5 次,输出将类似于

price     87.6
nQty     739.0
Name: 1900-01-01 …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas rolling-computation

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

熊猫滚动适用于缺少数据

我想对丢失的数据进行滚动计算.

示例代码:( 为了简单起见,我给出了滚动总和的示例,但我想做一些更通用的事情.)

foo = lambda z: z[pandas.notnull(z)].sum() 
x = np.arange(10, dtype="float")    
x[6] = np.NaN
x2 = pandas.Series(x)    
pandas.rolling_apply(x2, 3, foo)
Run Code Online (Sandbox Code Playgroud)

产生:

0   NaN    
1   NaN
2     3    
3     6    
4     9    
5    12    
6   NaN    
7   NaN    
8   NaN    
9    24
Run Code Online (Sandbox Code Playgroud)

我认为在"滚动"期间,计算中忽略了缺少数据的窗口.我希望得到一个结果:

0   NaN    
1   NaN    
2     3    
3     6    
4     9    
5    12    
6     9    
7    12    
8    15    
9    24
Run Code Online (Sandbox Code Playgroud)

python missing-data pandas rolling-computation

10
推荐指数
1
解决办法
6957
查看次数

使用roll apply在R中滚动回归

我导入的数据包含7个变量:YX1,X2,X3,X4,X5,X6.我尝试应用该rollapply函数,zoo以便在样本内运行滚动回归,窗口为262 obs.(一年中的工作日).

         date             Y            X1            X2
1     10/1/07 -0.0080321720  4.690734e-03  3.333770e-03
2     10/2/07  0.0000000000 -2.818413e-03  5.418223e-03
3     10/3/07  0.0023158650 -4.178744e-03 -3.821100e-04
4     10/4/07 -0.0057491710 -5.071030e-03 -8.321550e-04
5     10/5/07  0.0073570500  3.065045e-03  5.179574e-03
6     10/8/07  0.0127708010 -7.278513e-03  1.145395e-03
7     10/9/07  0.0032661980  9.692267e-03  6.514035e-03
8    10/10/07  0.0013824430  1.161780e-04  2.676416e-03
9    10/11/07  0.0026607550  1.113179e-02  8.825719e-03
10   10/12/07 -0.0046362600 -2.453561e-03 -6.584070e-03
11   10/15/07 -0.0023757680 -7.829081e-03 -3.070540e-03
12 …
Run Code Online (Sandbox Code Playgroud)

r rollapply rolling-computation

8
推荐指数
2
解决办法
2万
查看次数

在tidyverse中按组滚动回归?

关于在R中滚动回归有很多问题,但在这里我特意寻找使用的东西dplyr,broom并且(如果需要的话)purrr.

这就是使这个问题与众不同的原因.我希望tidyverse保持一致.是否可以使用诸如purrr:map和之类的整洁工具进行适当的运行回归dplyr

请考虑这个简单的例子:

library(dplyr)
library(purrr)
library(broom)
library(zoo)
library(lubridate)

mydata = data_frame('group' = c('a','a', 'a','a','b', 'b', 'b', 'b'),
                     'y' = c(1,2,3,4,2,3,4,5),
                     'x' = c(2,4,6,8,6,9,12,15),
                     'date' = c(ymd('2016-06-01', '2016-06-02', '2016-06-03', '2016-06-04',
                                    '2016-06-03', '2016-06-04', '2016-06-05','2016-06-06')))

  group     y     x date      
  <chr> <dbl> <dbl> <date>    
1 a      1.00  2.00 2016-06-01
2 a      2.00  4.00 2016-06-02
3 a      3.00  6.00 2016-06-03
4 a      4.00  8.00 2016-06-04
5 b      2.00  6.00 2016-06-03
6 b      3.00 …
Run Code Online (Sandbox Code Playgroud)

r dplyr rolling-computation broom purrr

8
推荐指数
1
解决办法
928
查看次数

使用 pandas Rolling 对象创建列表的滑动窗口

这篇出色的文章非常清楚地说明了如何使用cumsum()Pandas DataFrame 方法构建一个 3D 张量,该张量包含一个包含列表列表的列,这些列表的维度使其适合用作 LSTM 的时间序列输入。我想做一些非常相似的事情,但使用列表滚动列表而不是列表的累积聚合。

例如。假设您有一个包含 3 个时间序列的 DataFrame:

 A   B   C
 1   2   3
 4   5   6
 7   8   9
10  11  12
Run Code Online (Sandbox Code Playgroud)

我上面链接的文章向您展示了如何使用cumsum()Pandas 构建一个嵌套列表的 DataFrame 列,如下所示:

[[1, 2, 3]]
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)

完成此操作的 Python 代码的关键行如下:

input_cols =  list(df.columns)
df['single_list'] = df[input_cols].apply(
                       tuple, axis=1).apply(list)
df['double_encapsulated'] = df.single_list.apply(
                                      lambda x: [list(x)])
Run Code Online (Sandbox Code Playgroud)

但我想要一个滚动的列表窗口,而不是列表的累积总和。它应该是这样的:

[[1, 2, 3], [4, 5, …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas cumsum rolling-computation

8
推荐指数
1
解决办法
3632
查看次数

如何将不返回数值的函数应用于熊猫滚动窗口?

我有一个日期时间系列的 dtype:float64。我正在尝试将自定义函数应用于该系列的滚动窗口。我希望这个函数返回字符串。但是,这会生成 TypeError。为什么这会产生错误,有没有办法直接通过应用一个函数来使这个工作?

下面是一个例子:

import numpy as np
import pandas as pd

np.random.seed(1)
number_series = pd.Series(np.random.randint(low=1,high=100,size=100),index=[pd.date_range(start='2000-01-01',freq='W',periods=100)])
number_series = number_series.apply(lambda x: float(x))

def func(s):
    
    if s[-1] > s[-2] > s[-3]:
        return 'High'
    elif s[-1] > s[-2]:
        return 'Medium'
    else:
        return 'Low'

new_series = number_series.rolling(5).apply(func)
Run Code Online (Sandbox Code Playgroud)

结果是以下错误:

TypeError: must be real number, not str
Run Code Online (Sandbox Code Playgroud)

我目前采用的解决方法是修改 func 以将整数输出到一个系列,然后将另一个函数应用于该系列以生成新系列。按照下面的例子:

def func_float(s):
    
    if s[-1] > s[-2] > s[-3]:
        return 1
    elif s[-1] > s[-2]:
        return 2
    else:
        return 3
    
float_series = number_series.rolling(5).apply(func_float)

def func_text(s):

    if s …
Run Code Online (Sandbox Code Playgroud)

python series apply pandas rolling-computation

8
推荐指数
2
解决办法
166
查看次数

使用熊猫滚动相关时如何处理不一致的结果?

让我先说一下,为了重现这个问题,我需要一个大数据,这是问题的一部分,我无法预测什么时候会出现这种特殊性。无论如何,数据太大(~13k 行,2 列)无法粘贴到问题中,我在帖子末尾添加了一个 pastebin 链接


在过去的几天里,我遇到了一个奇怪的问题pandas.core.window.rolling.Rolling.corr。我有一个数据集,我试图在其中计算滚动相关性。这就是问题:

在计算window_size=100两列 ( aand b)之间的滚动 ( ) 相关性时:一些索引(一个这样的索引是12981)给出接近的0值(顺序1e-10),但理想情况下它应该返回nanor inf,(因为一列中的所有值都是常数)。但是,如果我只是计算与该索引有关的独立相关性(包括所述索引的最后 100 行数据),或者对较少数量的行(例如 300 或 1000 而不是 13k)执行滚动计算,我得到正确的结果( naninf。)

期待:

>>> df = pd.read_csv('sample_corr_data.csv') # link at the end,  ## columns = ['a', 'b']
>>> df.a.tail(100).value_counts()

 0.000000    86
-0.000029     3
 0.000029     3
-0.000029     2
 0.000029     2
-0.000029     2
 0.000029     2
Name: a, dtype: int64 …
Run Code Online (Sandbox Code Playgroud)

python numpy pandas rolling-computation pearson-correlation

8
推荐指数
1
解决办法
356
查看次数

滚动回归多列

我有一个问题是找到一种最有效的方法来计算具有多列的xts对象的滚动线性回归.我已经在stackoverflow上搜索并阅读了之前的几个问题.

这个问题和答案很接近,但在我看来还不够,因为我想计算所有回归中因变量不变的多元回归.我试图用随机数据重现一个例子:

require(xts)
require(RcppArmadillo)  # Load libraries

data <- matrix(sample(1:10000, 1500), 1500, 5, byrow = TRUE)  # Random data
data[1000:1500, 2] <- NA  # insert NAs to make it more similar to true data
data <- xts(data, order.by = as.Date(1:1500, origin = "2000-01-01"))

NR <- nrow(data)  # number of observations
NC <- ncol(data)  # number of factors
obs <- 30  # required number of observations for rolling regression analysis
info.names <- c("res", "coef")

info <- array(NA, dim = …
Run Code Online (Sandbox Code Playgroud)

r apply linear-regression xts rolling-computation

7
推荐指数
1
解决办法
3857
查看次数

如何有效地计算熊猫时间序列中的滚动唯一计数?

我有一系列时间访问建筑物的人.每个人都有一个唯一的身份证.对于时间序列中的每条记录,我想知道过去365天内访问建筑物的唯一人数(即滚动的唯一人数,窗口为365天).

pandas似乎没有用于此计算的内置方法.当存在大量唯一访问者和/或大窗口时,计算变得计算密集.(实际数据大于此示例.)

有没有比我在下面做的更好的计算方法?我不确定为什么我制作的快速方法windowed_nunique(在"速度测试3"下)偏离1.

谢谢你的帮助!

相关链接:

初始化

In [1]:

# Import libraries.
import pandas as pd
import numba
import numpy as np
Run Code Online (Sandbox Code Playgroud)

In [2]:

# Create data of people visiting a building.

np.random.seed(seed=0)
dates = pd.date_range(start='2010-01-01', end='2015-01-01', freq='D')
window = 365 # days
num_pids = 100
probs = np.linspace(start=0.001, stop=0.1, num=num_pids)

df = pd\
    .DataFrame(
        data=[(date, pid)
              for (pid, prob) in zip(range(num_pids), probs)
              for date in np.compress(np.random.binomial(n=1, p=prob, size=len(dates)), …
Run Code Online (Sandbox Code Playgroud)

python time-series distinct-values pandas rolling-computation

7
推荐指数
1
解决办法
3272
查看次数