我有一个数据框,其中有一个 MultiIndex,其中索引的最后一列是日期。我正在尝试以特定频率对列进行滚动操作。据我了解,如果我有 TimeIndex,通常的 pandas 方法是使用频率字符串调用滚动函数(例如,如果我希望窗口为两天,则为“2D”)。建议的另一种方法是对 TimeIndex 重新采样,然后使用整数 2 应用滚动函数。本质上,我想要做的是按除最后一列之外的所有列进行分组,然后告诉滚动列使用最后一列timedelta 特定的滚动。下面是一个示例来演示这一点:
from datetime import datetime
import pandas as pd
multi_index = pd.MultiIndex.from_tuples([
("A", datetime(2017, 1, 1)),
("A", datetime(2017, 1, 2)),
("A", datetime(2017, 1, 3)),
("A", datetime(2017, 1, 4)),
("B", datetime(2017, 1, 1)),
("B", datetime(2017, 1, 3)),
("B", datetime(2017, 1, 4))])
df = pd.DataFrame(index=multi_index, data={"colA": [1, 1, 1, 1, 1, 1, 1]})
display(df)
df.groupby([df.index.get_level_values(0), pd.Grouper(freq="1D", level=-1)]).sum().rolling(2).sum
上面的代码不会为 (B, datetime(2017, 1, 2)) 创建行,因此滚动总和将全部为两个。
解决这个问题的一种丑陋的方法是在滚动之前进行 unstack、fillna 和 stack,这种方法只有在有一个组拥有所有时间的情况下才有效:
df.groupby([df.index.get_level_values(0), pd.Grouper(freq="1D", level=-1)]
).sum().unstack().fillna(0).stack().rolling(2).sum()
不用说,这是一个丑陋的黑客行为,缓慢且容易出错。有没有一种好的方法可以在不进行大量操作的情况下实现我在这里需要的东西?理想情况下,有什么方法可以告诉石斑鱼获取时间戳列或自行填充缺失值?