为了账号安全,请及时绑定邮箱和手机立即绑定

Python pandas - 按缺少日期的组在滚动窗口上有效地应用函数

Python pandas - 按缺少日期的组在滚动窗口上有效地应用函数

青春有我 2022-09-06 16:41:27
注意:我已经知道这个问题的答案,我发布它只是因为我在堆栈溢出上找不到正确的答案,我花了惊人的时间来弄清楚它。话虽如此,请随时建议其他选项。问题我有一个带有三列的pandas DataFrame,一个跟踪日期,一个跟踪相关观察结果(即我的分组列),第三个变量存储一些数值。对于我的数据帧中的每个组,我想计算日期列上的滚动总和。警告:数据帧中缺少一些日期,我想将它们视为值为0的观测值。我不想使用交叉联接来添加所有日期。可重现示例让我们有一个这样的数据帧:df = pd.DataFrame({'id_col' : np.array([1,1,1,1,1,1,2,2,2,2,2,3,3,3]),                  'value_col' : np.random.randint(0,5,size=14),                  'dates' : pd.to_datetime(np.array([                  '2018-01-01',                  '2018-02-01',                  '2018-03-01',                  '2018-05-01',                  '2018-06-01',                  '2018-09-01',                  '2018-01-01',                  '2018-02-01',                  '2018-05-01',                  '2018-06-01',                  '2018-07-01',                  '2018-01-01',                  '2018-02-01',                  '2018-03-01'])                  )}                 )数据如下所示:    id_col  value_col   dates0   1   0   2018-01-011   1   1   2018-02-012   1   4   2018-03-013   1   0   2018-05-014   1   3   2018-06-015   1   3   2018-09-016   2   4   2018-01-017   2   3   2018-02-018   2   2   2018-05-019   2   0   2018-06-0110  2   2   2018-07-0111  3   4   2018-01-0112  3   2   2018-02-0113  3   3   2018-03-01我尝试过的方法不起作用:选项 1:完全忽略缺失的日期df.groupby(['id_col']).rolling(2)['value_col'].sum().reset_index()选项 2:基于 pandas 滚动文档,使用 pandas 偏移参数替换窗口宽度(返回)。如果将日期列用作数据帧的索引,则此方法将起作用。不幸的是,我们不能在这里使用简单的索引,因为来自id_col的2个不同的ID可以包含相同的日期。(我们可以创建 MultiIndex,但随后得到相同的值错误)。ValueError: window must be an integerdf.groupby(['id_col']).rolling('60d')['value_col'].sum().reset_index()什么有效,但不是很简单:选项 1:交叉联接以填写所有缺失的日期(如果数据量很大,可能很难)选项 2:从可迭代对象的笛卡尔积构建多索引,如这个答案所示。这实际上与上述选项非常相似。
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

使用 参数 。文档实际上提到了它,尽管没有示例来查看适当的用法。幸运的是,有pandas github和这个问题,如果你仔细阅读评论,可以提供有关如何正确使用偏移窗口的滚动功能的一些见解。onrolling

因此,解决方案是:

df.groupby(['id_col']).rolling('60d', on = 'dates')['value_col'].sum().reset_index()

请注意,作为代理的 2 个月而不是这样,因为会给你以下错误:.有关此问题的详细信息,请查看此处的堆栈溢出问题。60d2m2mValueError: <2 * MonthEnds> is a non-fixed frequency


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信