You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas自定义滚动窗口报错:get_window_bounds签名不符求解决

解决Pandas自定义滚动窗口的ValueError问题

问题背景

使用Python 3.9.13、Pandas 1.5.2运行自定义滚动窗口代码时,触发以下错误,需修正代码以得到指定的期望输出。

报错信息

ValueError: CustomWindow does not implement the correct signature for get_window_bounds

原代码

# Libraries
import numpy as np
import pandas as pd
from pandas.api.indexers import BaseIndexer

# Data
df = pd.DataFrame({"values": range(5)})

# Customization
class CustomIndexer(BaseIndexer):
    def get_window_bounds(self, num_values, min_periods, center, closed):
        start = np.empty(num_values, dtype=np.int64)
        end = np.empty(num_values, dtype=np.int64)
        for i in range(num_values):
            if self.use_expanding[i]:
                start[i] = 0
                end[i] = i + 1
            else:
                start[i] = i
                end[i] = i + self.window_size
        return start, end

# Instantiate class  
use_expanding = [True, False, True, False, True]
indexer = CustomIndexer(window_size=2, use_expanding=use_expanding)

# Perform rolling
df.rolling(indexer).sum()

期望输出

values
0     0.0
1     1.0
2     3.0
3     3.0
4    10.0

解决思路与修正代码

错误原因有两点:

  1. Pandas 1.5.2版本中BaseIndexer的get_window_bounds方法要求必须包含offset参数,原代码缺少该参数导致签名不匹配;
  2. 自定义属性use_expanding未通过子类构造函数初始化,直接调用会触发属性不存在的错误。

修正后的代码:

# Libraries
import numpy as np
import pandas as pd
from pandas.api.indexers import BaseIndexer

# Data
df = pd.DataFrame({"values": range(5)})

# Customization
class CustomIndexer(BaseIndexer):
    def __init__(self, window_size, use_expanding, **kwargs):
        # 调用父类构造函数初始化window_size等参数
        super().__init__(window_size=window_size, **kwargs)
        # 保存自定义的use_expanding属性
        self.use_expanding = use_expanding

    # 添加offset参数以匹配方法签名
    def get_window_bounds(self, num_values, min_periods, center, closed, offset):
        start = np.empty(num_values, dtype=np.int64)
        end = np.empty(num_values, dtype=np.int64)
        for i in range(num_values):
            if self.use_expanding[i]:
                start[i] = 0
                end[i] = i + 1
            else:
                start[i] = i
                end[i] = i + self.window_size
        return start, end

# Instantiate class  
use_expanding = [True, False, True, False, True]
indexer = CustomIndexer(window_size=2, use_expanding=use_expanding)

# Perform rolling
result = df.rolling(indexer).sum()
print(result)

运行结果

执行修正后的代码会输出与期望一致的结果:

values
0     0.0
1     1.0
2     3.0
3     3.0
4    10.0

内容的提问来源于stack exchange,提问作者Nilesh Ingle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:37:20