【问题标题】:Pandas rolling function with specific numeric span?具有特定数字跨度的熊猫滚动功能?
【发布时间】:2018-02-03 22:23:50
【问题描述】:

从 Pandas 0.18.0 开始,可以通过指定时间跨度来为时间序列设置可变滚动窗口大小。例如,在数据帧dft 中对 2 秒窗口求和的代码如下所示:

dft.rolling('2s').sum()

可以对非日期时间跨度做同样的事情吗?

例如,给定一个如下所示的数据框:

    A   B
0   1   1
1   2   2
2   3   3
3   5   5
4   6   6
5   7   7
6  10  10

是否可以在“A”列上指定一个窗口跨度为 3,并计算“B”列的总和,以便输出看起来像:

    A    B
0   1  NaN
1   2  NaN
2   3    5
3   5   10
4   6   14
5   7   18
6  10   17

【问题讨论】:

  • 你能提供一个数据的例子吗?您是指时间列还是任何数字列?
  • 我会说不。 Per the documentation... "window : int, or offset 移动窗口的大小。这是用于计算统计数据的观察次数。每个窗口的大小都是固定的。"

标签: pandas


【解决方案1】:

不适用于rolling()。有关 window 参数,请参见 documentation

[A variable-sized window] 仅对 datetimelike 索引有效。

全文:

窗口:整数或偏移量
移动窗口的大小。这是用于计算统计量的观察数。每个窗口的大小都是固定的。
如果它是一个偏移量,那么这将是每个窗口的时间段。每个窗口的大小将根据时间段中包含的观察结果变化。这仅对 datetimelike 索引有效。

【讨论】:

    【解决方案2】:

    如果您有兴趣,这里有一个解决方法。

    df = pd.DataFrame({'A' : np.arange(10),
                       'B' : np.arange(10,20)},
                      index=[1,2,3,5,8,9,11,14,19,20])
    
    def var_window(df, size, min_periods=None):
        """Operates on the index."""
        result = []
        df = df.sort_index()
        for i in df.index:
            start = i - size + 1
            res = df.loc[start:i].sum().tolist()
            result.append(res)
        result = pd.DataFrame(result, index=df.index)
        if min_periods:
            result.loc[:min_periods - 1] = np.nan
        return result
    
    print(var_window(df, size=3, min_periods=3, inclusive=True))
           0     1
    1    NaN   NaN
    2    NaN   NaN
    3    3.0  33.0
    5    5.0  25.0
    8    4.0  14.0
    9    9.0  29.0
    11  11.0  31.0
    14   7.0  17.0
    19   8.0  18.0
    20  17.0  37.0
    

    解释:循环遍历索引。在每个值处,将 DataFrame 截断为尾随窗口大小。这里的“大小”不是计数,而是您定义的范围。

    在上面,在索引值为 8 时,您对索引为 8、7 或 6 的 A 的值求和。(即 > 8 - 3 + 1)。落在该范围内的唯一索引值是 8,因此总和就是原始帧的值。相比之下,对于索引值 11,总和将包括 9 和 11 的值(5 + 6 = 11,A 的结果总和)。

    将此与标准滚动操作进行比较:

    print(df.rolling(window=3).sum())
           A     B
    1    NaN   NaN
    2    NaN   NaN
    3    3.0  33.0
    5    6.0  36.0
    8    9.0  39.0
    9   12.0  42.0
    11  15.0  45.0
    14  18.0  48.0
    19  21.0  51.0
    20  24.0  54.0
    

    如果我误解了您的问题,请告诉我怎么做。诚然,它的速度要慢得多:

    %timeit df.rolling(window=3).sum()
    1000 loops, best of 3: 627 µs per loop
    
    %timeit var_window(df, size=3, min_periods=3)
    100 loops, best of 3: 3.59 ms per loop
    

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多