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
解决思路与修正代码
错误原因有两点:
- Pandas 1.5.2版本中
BaseIndexer的get_window_bounds方法要求必须包含offset参数,原代码缺少该参数导致签名不匹配; - 自定义属性
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
相关产品推荐
相关产品推荐

