pandas滚动如何保留每个时间窗口的第一次索引

时间:2017-10-22 04:40:25

标签: python pandas date datetime

对不起我所造成的所有困惑。 shift方法完美无缺。事实证明,rolling实际上保留了所有指数,我们所要做的就是转回,无论指数是否规则。

<小时/> 似乎pandas rolling方法始终保留每个时间窗口的 last 索引。例如:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.randn(10, 2), columns=['a', 'b'], index=pd.date_range('20170101', periods=10))
rolling_spearmanr = df['a'].rank().rolling(window=3).corr(other=df['b'].rank())

print(rolling_spearmanr)

输出:

2017-01-01         NaN
2017-01-02         NaN
2017-01-03    0.654654
2017-01-04   -0.596040
2017-01-05    0.277350
2017-01-06    0.466321
2017-01-07    0.429838
2017-01-08   -0.921551
2017-01-09   -0.188982
2017-01-10   -0.277350
Freq: D, dtype: float64

但我想要的是一种让每个时间窗保持其第一个索引的方法。可能吗?

<小时/> 请注意,简单地移动时间索引轴将无济于事,因为时间窗口可能不是常规的(即使它们具有相同数量的索引)。例如,当时间索引是 business 天而不是连续的日历日时:

Index([2007-01-04, 2007-01-05, 2007-01-08, 2007-01-09, 2007-01-10, 2007-01-11], dtype='object', name='date')

现在,如果我们使用rolling执行window=3,我想要的就是

2017-01-04 ...
2017-01-09 ...

传统rolling method,它将是

2017-01-08 ...
2017-01-11 ...

如您所见,如果您只是将输出日期移回2(因为每个时间窗口的长度为3个索引),您将获得所需的日期。

1 个答案:

答案 0 :(得分:3)

创意1
通过首先反转数据帧然后再返回来实现Hack ...

(lambda d: d.a.rank().rolling(3).corr(d.b.rank()).iloc[::-1])(df.iloc[::-1])

2017-01-01    0.891042
2017-01-02    0.838628
2017-01-03    0.960769
2017-01-04   -0.897918
2017-01-05   -0.996616
2017-01-06    0.327327
2017-01-07    0.443533
2017-01-08   -0.178538
2017-01-09         NaN
2017-01-10         NaN
Freq: D, dtype: float64

创意2

使用pd.Series.shift

rolling_spearmanr.shift(-2)

2017-01-01    0.891042
2017-01-02    0.838628
2017-01-03    0.960769
2017-01-04   -0.897918
2017-01-05   -0.996616
2017-01-06    0.327327
2017-01-07    0.443533
2017-01-08   -0.178538
2017-01-09         NaN
2017-01-10         NaN
Freq: D, dtype: float64