2017-08-25 67 views
1

从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 
+0

你能提供一个数据的例子吗?你是指时间栏还是任何数字栏? – Vaishali

+0

我要说不。 [根据文档](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html#pandas-dataframe-rolling)...“窗口:int或偏移量 大小这是用于计算统计的 的观测值的数量,每个窗口都是固定的大小。“ –

回答

2

不与rolling()。为window参数看到documentation

[A可变大小的窗口]是仅适用于datetimelike索引。

全文:

窗口:int或偏移
移动窗口的大小。这是用于计算统计量的观察值的数量。每个窗口将是一个固定的大小。
如果它是一个偏移量,那么这将是每个窗口的时间段。每个窗口将根据该时间段内包含的观察值进行调整。这仅适用于日期时间类型的索引。

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截断为尾部窗口大小。这里的'大小'不是一个计数,而是你定义的一个范围。

在上面的索引值为8时,您正在对索引为8,7或6(即> 8 - 3 + 1)的值A进行求和。该范围内唯一的索引值是8,因此总和就是原始帧的值。相对而言,对于指数值11,总和将包括9和11的值(5 + 6 = 11,由此产生的总和为A)。

这个比较标准的滚动OPS:

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