gpt4 book ai didi

python - Pandas 滚动应用 Scipy FindPeaks 函数 : TypeError: only size-1 arrays can be converted

转载 作者:行者123 更新时间:2023-11-28 18:05:52 25 4
gpt4 key购买 nike

我正在使用 scipy 函数寻求帮助 Find_Peaks在 pandas.Series.Rolling.apply 功能中。我抛出 TypeError: only size-1 arrays can be converted to Python scalars in each attempts and I can't understand 1.) Why 2.) How to write properly

我的最终目标:从一个透视日期开始,找到信号中的历史峰值。

find_peaks 函数根据峰值属性识别信号内的峰值。我正在使用来自 Mathworks -> prominence methodology 的显着性方法有用示例

函数本身接受一个一维数组并返回一个元组(peaks:ndarray, properties:dict)。

期望的输出:

x = np.ones((12,))
x[3] = 10
x[7] = 10
x[11] = 10
x = pd.Series(x)
x.rolling(4).apply(lambda x: find_peaks(x,prominence=.2)[0])

0 []
1 []
2 []
3 [3]
4 [3]
5 [3]
6 [3]
7 [3,7]
8 [3,7]
9 [3,7]
10 [3,7]
11 [3,7]
dtype: float64

尝试/错误信息:

x.rolling(4).apply(lambda x: find_peaks(x,prominence=.2)[0])

类型错误:只有大小为 1 的数组可以转换为 Python 标量

来自 SO36680402当函数需要单个值但您传递的是数组时,会出现错误“只有长度为 1 的数组可以转换为 Python 标量”。

但是,SO45254174这个例子似乎与这个 TypeError 相矛盾:

import numpy as np
import pandas as pd

n = 3
a = np.arange(5)
df = pd.DataFrame(a, columns=['a'])

def keep(window, windows):
windows.append(window.copy())
return window[-1]

windows = list()
df['a'].rolling(n).apply(keep, args=(windows,))
df = df.tail(n)
df['a_window'] = windows

它向每个滚动 block 添加数组/向量,从而产生:

   a         a_window
2 2 [0.0, 1.0, 2.0]
3 3 [1.0, 2.0, 3.0]
4 4 [2.0, 3.0, 4.0]

第一次尝试:

x.rolling(4).apply(lambda x: find_peaks(x,prominence=.2)[0])

错误:类型错误:只有大小为 1 的数组可以转换为 Python 标量

第二次尝试:

def _find_peaks(array,prominence=.2):
peaks,_ = find_peaks(array,prominence=prominence)
return np.empty((0,0)) if peaks.shape[0]==0 else peaks

x.rolling(4).apply(_find_peaks)

类型错误:只有大小为 1 的数组可以转换为 Python 标量

任何关于如何编写以及我抛出错误的想法都将不胜感激!

最佳答案

您可以做的是使用数组代替,并使用 find_peaks 中的 wlen 参数设置窗口长度而不是使用 pd.rolling :

来自documentation :

wlen : int or float, optional: A window length in samples that optionally limits the evaluated area for each peak to a subset of x. The peak is always placed in the middle of the window therefore the given length is rounded up to the next odd integer. This parameter can speed up the calculation

因此,您可以这样做:

find_peaks(x.values, prominence=0.2, wlen=4)

(array([3, 7], dtype=int64),
{'left_bases': array([2, 6], dtype=int64),
'prominences': array([9., 9.]),
'right_bases': array([4, 8], dtype=int64)})

关于python - Pandas 滚动应用 Scipy FindPeaks 函数 : TypeError: only size-1 arrays can be converted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560485/

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