从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 :(得分: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