Pandas滚动窗口多列取最大值报错:列长度不匹配
滚动窗口多列最大值问题解析
编辑2:问题已解决
由于High列本身就是每一行的最大值,无需遍历所有列计算,直接对High列做滚动窗口最大值即可:
_high[f'Highest {n1}'] = price_df['High'].rolling(n1).max()
错误原因分析
此前尝试从多列获取滚动窗口最大值时,使用了以下代码:
_high[f'Highest {n1}'] = price_df[['Open', 'Close', 'High', 'Low']].rolling(n1).max()
触发了错误:
File "C:\Users\...\main.py", line 1282, in chop_zone _high[f'Highest {n1}'] = price_df[['Open', 'Close', 'High', 'Low']].rolling(n1).max() File "C:\Users\...\venv\lib\site-packages\pandas\core\frame.py", line 3968, in __setitem__ self._set_item_frame_value(key, value) File "C:\Users\...\venv\lib\site-packages\pandas\core\frame.py", line 4098, in _set_item_frame_value raise ValueError("Columns must be same length as key") ValueError: Columns must be same length as key Process finished with exit code 1
核心原因是:rolling(n1).max()默认按列计算滚动最大值,返回的是包含4列的DataFrame,而你试图将其赋值给_high中的一个单列,列数不匹配导致报错。
修复方法(多列滚动最大值场景)
如果确实需要从多列的滚动窗口中提取全局最大值并生成单列结果,需要先对每个滚动窗口计算跨列的最大值。可以通过rolling.apply()实现:
def get_window_global_max(window): # window为当前滚动窗口的DataFrame,先按列取max再取全局max,得到窗口内所有值的最大值 return window.max().max() _high[f'Highest {n1}'] = price_df[['Open', 'Close', 'High', 'Low']].rolling(n1).apply(get_window_global_max)
期望输出示例
假设price_df[['Open', 'Close', 'High', 'Low']].tail(10)的数据如下:
Open Close High Low 5168 14010.0 14016.00 14024.05 14005.50 5169 14016.0 14018.00 14018.50 14007.50 5170 14018.0 14015.50 14021.50 14012.50 5171 14015.5 14007.00 14018.00 14004.50 5172 14007.0 14013.00 14013.50 13999.50 5173 14013.0 14007.00 14013.50 14002.00 5174 14007.0 14009.60 14017.60 14003.55 5175 14009.6 14013.60 14015.00 14004.60 5176 14013.6 14020.00 14021.60 14009.00 5177 14020.0 14015.55 14022.60 14013.60
当窗口大小n1=3时,期望得到单列结果:
- 索引5170对应值:5168-5170窗口内所有列的最大值
14024.05 - 索引5171对应值:5169-5171窗口内所有列的最大值
14021.50
内容的提问来源于stack exchange,提问作者Jakub Szurlej
相关产品推荐
相关产品推荐

