gpt4 book ai didi

python - pandasrolling如何保留每个时间窗口的第一个时间索引

转载 作者:行者123 更新时间:2023-11-30 22:27:35 24 4
gpt4 key购买 nike

对于我造成的所有困惑,我们深表歉意。 shift 方法工作得很好。事实证明,滚动实际上保留了所有索引,而我们所要做的就是向后移动,无论索引是否规则。

<小时/>看来 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

不过,我想要的是一种让每个时间窗口保留其第一个索引的方法。是否可以?

<小时/>请注意,简单地移动时间索引轴不会有帮助,因为时间窗口可能不规则(即使它们具有相同数量的索引)。例如,当时间索引为 工作日而不是连续的日历日时:

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 执行rolling,我想要的是这样的

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

采用传统的滚动方法,将会是

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

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

最佳答案

想法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

关于python - pandasrolling如何保留每个时间窗口的第一个时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com