熊猫滚动功能与特定的数字跨度?

时间:2017-08-25 20:03:10

标签: pandas

从Pandas 0.18.0开始,通过指定时间跨度,可以为时间序列设置可变滚动窗口大小。例如,数据帧dft中2秒窗口的求和代码如下所示:

dft.rolling('2s').sum()

非日期时间跨度可以做同样的事情吗?

例如,给定一个如下所示的数据框:

    A   B
0   1   1
1   2   2
2   3   3
3   5   5
4   6   6
5   7   7
6  10  10

是否可以在列' A'上指定3的窗口范围。并列有' B'计算,以便输出看起来像:

    A    B
0   1  NaN
1   2  NaN
2   3    5
3   5   10
4   6   14
5   7   18
6  10   17

2 个答案:

答案 0 :(得分:2)

不在rolling()。有关window参数的信息,请参阅documentation

  

[可变大小的窗口]仅对类似日期的索引有效。

全文:

  

window:int或offset
  移动窗口的大小。这是用于计算统计量的观测数。每个窗口都是固定的尺寸   如果是偏移量,那么这将是每个窗口的时间段。每个窗口将是基于时间段中包括的观察值而变化的大小。这仅适用于类似日期的索引。

答案 1 :(得分:1)

如果您有兴趣,可以采取以下解决方法。

df = pd.DataFrame({'A' : np.arange(10),
                   'B' : np.arange(10,20)},
                  index=[1,2,3,5,8,9,11,14,19,20])

def var_window(df, size, min_periods=None):
    """Operates on the index."""
    result = []
    df = df.sort_index()
    for i in df.index:
        start = i - size + 1
        res = df.loc[start:i].sum().tolist()
        result.append(res)
    result = pd.DataFrame(result, index=df.index)
    if min_periods:
        result.loc[:min_periods - 1] = np.nan
    return result

print(var_window(df, size=3, min_periods=3, inclusive=True))
       0     1
1    NaN   NaN
2    NaN   NaN
3    3.0  33.0
5    5.0  25.0
8    4.0  14.0
9    9.0  29.0
11  11.0  31.0
14   7.0  17.0
19   8.0  18.0
20  17.0  37.0

说明:遍历索引。在每个值处,将DataFrame截断为尾随窗口大小。这里'size'不是计数,而是你定义它的范围。

在上面,在索引值为8时,您将索引为8,7或6的A的值相加(即,即> 8 - 3 + 1)。属于该范围的唯一索引值是8,因此总和只是原始帧中的值。相比之下,对于指数值11,总和将包括9和11的值(5 + 6 = 11,A得到的总和)。

将此与标准滚动操作进行比较:

print(df.rolling(window=3).sum())
       A     B
1    NaN   NaN
2    NaN   NaN
3    3.0  33.0
5    6.0  36.0
8    9.0  39.0
9   12.0  42.0
11  15.0  45.0
14  18.0  48.0
19  21.0  51.0
20  24.0  54.0

如果我误解了你的问题,请告诉我如何解释。可以肯定的是它显着变慢了:

%timeit df.rolling(window=3).sum()
1000 loops, best of 3: 627 µs per loop

%timeit var_window(df, size=3, min_periods=3)
100 loops, best of 3: 3.59 ms per loop