gpt4 book ai didi

python - 如何在 Pandas 的时间段内迭代

转载 作者:太空狗 更新时间:2023-10-29 21:42:56 30 4
gpt4 key购买 nike

假设我有一个 pandas Series 和一个每日频率的 DatetimeIndex。我想以任意频率和任意回溯窗口迭代此 Series。例如:每半年迭代一次,回溯窗口为 1 年。

像这样的东西是理想的:

for df_year in df.timegroup(freq='6m', lookback='1y'):
# df_year will span one year of daily prices and be generated every 6 months

我知道 TimeGrouper 但还没有弄清楚它是如何做到这一点的。不管怎样,我只能手动编写代码,但希望有一个聪明的 pandas 单行代码。

编辑:这越来越近了:

pd.rolling_apply(df, 252, lambda s: s.sum(), freq=pd.datetools.BMonthEnd())

这不太有效,因为它应用了 252*BMonthEnd() 的回溯窗口,而我希望它是独立的并且在每个结束时都有一个 252 的回溯窗口月。

最佳答案

我想这就是你要找的

构建一系列频率。此处使用 1 进行说明。

In [77]: i = pd.date_range('20110101','20150101',freq='B')

In [78]: s = Series(1,index=i)

In [79]: s
Out[79]:
2011-01-03 1
2011-01-04 1
2011-01-05 1
2011-01-06 1
2011-01-07 1
..
2014-12-26 1
2014-12-29 1
2014-12-30 1
2014-12-31 1
2015-01-01 1
Freq: B, dtype: int64

In [80]: len(s)
Out[80]: 1044

使索引符合另一个频率。这使得每个索引元素在这里都是月末。

In [81]: s.index = s.index.to_period('M').to_timestamp('M')

In [82]: s
Out[82]:
2011-01-31 1
2011-01-31 1
2011-01-31 1
2011-01-31 1
2011-01-31 1
..
2014-12-31 1
2014-12-31 1
2014-12-31 1
2014-12-31 1
2015-01-31 1
dtype: int64

然后直接重新采样到另一个频率。在这种情况下,这会为您提供该期间的工作日数。

In [83]: s.resample('3M',how='sum')
Out[83]:
2011-01-31 21
2011-04-30 64
2011-07-31 65
2011-10-31 66
2012-01-31 66
..
2014-01-31 66
2014-04-30 63
2014-07-31 66
2014-10-31 66
2015-01-31 44
Freq: 3M, dtype: int64

关于python - 如何在 Pandas 的时间段内迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29100599/

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