gpt4 book ai didi

python - pandas 中的滚动窗口多项式拟合

转载 作者:行者123 更新时间:2023-12-01 04:51:05 26 4
gpt4 key购买 nike

我正在尝试从应用于时间序列的 t 天窗口的 n 次多项式计算系数。但是,我收到异常 TypeError: only length-1 arrays can be conversion to Python scalars

我的版本是:

  • Python 3.6
  • pandas 版本 0.22.0
  • numpy 版本 1.13.3

代码:

import pandas as pd
import numpy as np
my_ts = pd.Series(data = np.random.normal(size = 365 * 2), index = pd.date_range(start = '2013-01-01', periods = 365 * 2))
coefs = pd.rolling_apply(my_ts, 21, lambda x: np.polyfit(range(len(x)), x, 3))

但是,当我包装 np.polyfit 使其仅返回一个系数时,rolling_apply 没有问题。

def pf_wrapper(x):
coef_lst = np.polyfit(range(len(x)), x, 3)
return coef_lst[0]
coefs = pd.rolling_apply(my_ts, 21, pf_wrapper)

更新:

由于 pd.rolling_apply() 无法返回非标量,我当前的解决方案如下:

def get_beta(ts, deg):
coefs = polyfit(range(len(ts)), ts, deg = 3)[::-1]
return coefs[deg]

b0 = pd.rolling_apply(my_ts, 21, lambda x: get_beta(x, 0))
...
b3 = pd.rolling_apply(my_ts, 21, lambda x: get_beta(x, 3))

最佳答案

我认为 rolling_apply 不可能实现这一点。 documentation表示应用的函数“必须从 ndarray 输入生成单个值”。它的实际含义似乎是“必须产生一个可以转换为单个 float 的值”。如果您跟踪完整的异常回溯,它会引导您在 algos.pyx 中找到以下代码:

output = np.empty(n, dtype=float)
counts = roll_sum(np.isfinite(input).astype(float), win, minp)

bufarr = np.empty(win, dtype=float)
oldbuf = <float64_t*> bufarr.data

n = len(input)
for i from 0 <= i < int_min(win, n):
if counts[i] >= minp:
output[i] = func(input[int_max(i - win + 1, 0) : i + 1], *args,
**kwargs)
else:
output[i] = NaN

该错误是在 output[i] = func(...) 行上引发的。您可以看到输出数组被硬编码为具有 float 据类型。您收到的错误与尝试将 numpy 数组(长度超过 1)转换为 float 时收到的错误相同:

>>> float(np.array([1, 2, 3]))
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
float(np.array([1, 2, 3]))
TypeError: only length-1 arrays can be converted to Python scalars

所以发生的情况是,它尝试将polyfit的输出分配给float ndarray的单个元素,但失败了,因为polyfit的输出是一个无法转换为的数组一个 float 。

这可以通过使 output 具有 dtype 对象来“修复”,但这会减慢速度。

我认为您必须考虑 rolling_apply 仅适用于返回单个 float 的函数。要支持非标量输出,您必须滚动 (har har) 您自己的 rolling_apply 版本。

关于python - pandas 中的滚动窗口多项式拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28465850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com