Pandas滚动窗口apply获取多项式回归系数报错,如何获取全部系数?
解决Pandas滚动窗口多项式拟合获取所有系数的问题
问题原因
pd.Series.rolling().apply() 默认要求处理函数返回单个标量值,但np.polyfit()返回的是包含所有多项式系数的数组,因此触发TypeError: only size-1 arrays can be converted to Python scalars。
解决方法
方法1:将系数展开为多列(推荐)
利用apply的result_type='expand'参数,直接将每个窗口的系数数组展开为独立列,操作更直观,便于后续分析:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({'Col': np.random.randn(100)}) window_size = 10 # 9次多项式需要至少10个样本点,窗口大小必须≥次数+1 def fit_poly(x): # 生成窗口内的x轴坐标(0到window_size-1) x_axis = np.arange(window_size) # 返回9次多项式的系数数组(从高次到低次) return np.polyfit(x_axis, x, 9) # 执行滚动拟合并展开为多列 coeff_df = df['Col'].rolling(window=window_size).apply( fit_poly, raw=True, result_type='expand' ) # 给系数列命名,对应9次到0次项的系数 coeff_df.columns = [f'poly_deg_{d}' for d in range(9, -1, -1)] # 合并回原DataFrame df = pd.concat([df, coeff_df], axis=1)
方法2:将系数存入单列(作为列表)
如果需要把所有系数保存在同一列中,可以将系数数组转为元组(避开Pandas的标量检测),再转为列表:
df['poly_coeffs'] = df['Col'].rolling(window=window_size).apply( lambda x: tuple(np.polyfit(np.arange(window_size), x, 9)), raw=True ).apply(list)
注意事项
- 窗口大小必须≥多项式次数+1(比如9次多项式需要至少10个样本点),否则
np.polyfit会抛出线性代数错误。 np.polyfit返回的系数顺序是从最高次项到常数项,比如返回的第一个值是9次项系数,最后一个是常数项。
内容的提问来源于stack exchange,提问作者EM1
相关产品推荐
相关产品推荐

