对不起我所造成的所有困惑。 shift
方法完美无缺。事实证明,rolling
实际上保留了所有指数,我们所要做的就是转回,无论指数是否规则。
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个索引),您将不获得所需的日期。
答案 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