Python 如何保留每个时间窗口的第一时间索引

Python 如何保留每个时间窗口的第一时间索引,python,pandas,date,datetime,Python,Pandas,Date,Datetime,对不起,我弄得这么混乱移位方法工作得非常好。事实证明,rolling实际上保留了所有的指数,我们所要做的就是向后移动,不管指数是否规则。 熊猫rolling方法似乎总是保持每个时间窗口的最后一个索引。例如: 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', period

对不起,我弄得这么混乱<代码>移位方法工作得非常好。事实证明,
rolling
实际上保留了所有的指数,我们所要做的就是向后移动,不管指数是否规则。
熊猫
rolling
方法似乎总是保持每个时间窗口的最后一个索引。例如:

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
不过,我想要的是一种方法,它允许每个时间窗口保持其第一个索引。可能吗?
请注意,简单地移动时间索引轴不会有帮助,因为时间窗口可能不规则(即使它们具有相同数量的索引)。例如,当时间指数为工作日而不是连续日历日时:

Index([2007-01-04, 2007-01-05, 2007-01-08, 2007-01-09, 2007-01-10, 2007-01-11], dtype='object', name='date')
现在,如果我们使用
window=3
执行
滚动
,我想要的是

2017-01-04 ...
2017-01-09 ...
使用传统的
滚动方法
,它将

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

如您所见,如果您只是将输出日期向后移动
2
(因为每个时间窗口都有3个索引长),您将无法获得所需的日期。

Idea 1
通过先反转数据帧,然后再返回来进行黑客攻击

(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

想法1
通过先反转数据帧,然后再返回来进行黑客攻击

(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


@Bharathshetty如我所说,例如,如果索引是
[2007-01-042007-01-052007-01-082007-01-092007-01-10207-01-11]
并且时间窗口是
3
,那么我希望输出具有索引
['2017-01-04','2017-01-09']
,在放弃nan之后,我认为在滚动中根本没有考虑指数function@Bharathshetty但是
rolling
会在每个时间窗口中保留最后一个索引。为什么不能使用相同的方法反转数据帧
df.iloc[:-1]
你能添加那个代码吗?我指的是传统的滚动法said@Bharathshetty如我所说,例如,如果索引是
[2007-01-042007-01-052007-01-082007-01-092007-01-10207-01-11]
并且时间窗口是
3
,那么我希望输出具有索引
['2017-01-04','2017-01-09']
,在放弃nan之后,我认为在滚动中根本没有考虑指数function@Bharathshetty但是
rolling
会在每个时间窗口中保留最后一个索引。为什么不能使用相同的方法反转数据帧
df.iloc[:-1]
你能添加那个代码吗?我指的是你说的那种传统的滚动法,它很难理解Op想要什么。高度不明确使用
pd.Series.rolling
时,聚合值将附加到窗口中的最后一个索引。OP询问如何将其附加到第一个索引。@Bharathshetty对我造成的混乱表示抱歉。。我在想,
rolling
将在“跳跃”中工作,而不是连续工作。结果证明这是一个愚蠢的错误。@Pirsquare你知道我,温家宝之前也使用过这种方法。我看产出指数时感到困惑。我以为这是Op想要的输出。我正在努力理解Op想要什么。高度不明确使用
pd.Series.rolling
时,聚合值将附加到窗口中的最后一个索引。OP询问如何将其附加到第一个索引。@Bharathshetty对我造成的混乱表示抱歉。。我在想,
rolling
将在“跳跃”中工作,而不是连续工作。结果证明这是一个愚蠢的错误。@Pirsquare你知道我,温家宝之前也使用过这种方法。我看产出指数时感到困惑。我以为这是Op想要的结果。