【问题标题】:Pandas reverse rolling sum using offset with varying windows sizesPandas 使用不同窗口大小的偏移量反向滚动总和
【发布时间】:2021-03-02 17:31:35
【问题描述】:

考虑以下数据框:

    date                    values
0   2020-01-07 09:00:00     5
1   2020-01-07 10:00:00     8
2   2020-01-07 11:00:00     9
3   2020-01-07 12:00:00     5
4   2020-01-07 13:00:00     0
5   2020-01-07 14:00:00     0
6   2020-01-07 15:00:00     1
7   2020-01-07 16:00:00     7
8   2020-01-08 09:00:00     6
9   2020-01-08 10:00:00     9
10  2020-01-08 11:00:00     2
11  2020-01-08 12:00:00     4
12  2020-01-08 13:00:00     5
13  2020-01-08 14:00:00     2
14  2020-01-08 15:00:00     4


df = pd.DataFrame({'date':pd.date_range(start='1/7/2020', freq='BH', periods=20),
             'values':np.random.randint(0, 10, 20)})

我想创建一个新列,其中包含未来 11 小时内 values 列的总和。我使用了df.rolling('11H', on='date').sum(),但是这会计算过去 11 小时内的sum

我遇到了像 How to Reverse Rolling Sum? 这样的解决方案,但由于我的日期列只包含营业时间,我不能简单地改变结果(因为我不知道我必须改变多少行,因为不同的窗口大小)。

它通过df.iloc[::-1].rolling('11H', on='date').sum().iloc[::-1] 起作用,但是将dataframe 反转两次感觉有点hacky。还有其他优雅的解决方案吗?

【问题讨论】:

    标签: python-3.x pandas rolling-computation


    【解决方案1】:

    您可以尝试以下解决方案:

    import pandas as pd
    import numpy as np
    from pandas.api.indexers import FixedForwardWindowIndexer
    df1 = pd.DataFrame({'date':pd.date_range(start='1/7/2020', freq='BH', periods=20),
                 'values':np.random.randint(0, 10, 20)})
    indexer = FixedForwardWindowIndexer(window_size = 11)
    df2 = df1.join(df1['values'].rolling(indexer, min_periods=1).sum(), rsuffix='11rollfwd')
    

    结果-

    资源: 日期值 0 2020-01-07 09:00:00 9 1 2020-01-07 10:00:00 7 2 2020-01-07 11:00:00 2 3 2020-01-07 12:00:00 4 4 2020-01-07 13:00:00 4 5 2020-01-07 14:00:00 7 6 2020-01-07 15:00:00 4 7 2020-01-07 16:00:00 8 8 2020-01-08 09:00:00 4 9 2020-01-08 10:00:00 0 10 2020-01-08 11:00:00 6 11 2020-01-08 12:00:00 8 12 2020-01-08 13:00:00 7 13 2020-01-08 14:00:00 0 14 2020-01-08 15:00:00 1 15 2020-01-08 16:00:00 1 16 2020-01-09 09:00:00 1 17 2020-01-09 10:00:00 6 18 2020-01-09 11:00:00 1 19 2020-01-09 12:00:00 2 目标 日期值 values11rollfwd 0 2020-01-07 09:00:00 9 55.0 1 2020-01-07 10:00:00 7 54.0 2 2020-01-07 11:00:00 2 54.0 3 2020-01-07 12:00:00 4 52.0 4 2020-01-07 13:00:00 4 49.0 5 2020-01-07 14:00:00 7 46.0 6 2020-01-07 15:00:00 4 40.0 7 2020-01-07 16:00:00 8 42.0 8 2020-01-08 09:00:00 4 35.0 9 2020-01-08 10:00:00 0 33.0 10 2020-01-08 11:00:00 6 33.0 11 2020-01-08 12:00:00 8 27.0 12 2020-01-08 13:00:00 7 19.0 13 2020-01-08 14:00:00 0 12.0 14 2020-01-08 15:00:00 1 12.0 15 2020-01-08 16:00:00 1 11.0 16 2020-01-09 09:00:00 1 10.0 17 2020-01-09 10:00:00 6 9.0 18 2020-01-09 11:00:00 1 3.0 19 2020-01-09 12:00:00 2 2.0

    【讨论】:

    • 我正在寻找一种解决方案,可以在接下来的 11 小时内获得总和。由于date 列中只有营业时间,因此不幸的是,大小为 11 的固定窗口无法解决问题(窗口大小会因窗口的起始行而异)。
    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 2016-03-12
    • 2020-07-04
    • 1970-01-01
    • 2018-12-17
    • 2023-02-17
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多