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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:35:29