Я ищу помощь с помощью функции scipy Find_Peaks в пределах функциональности pandas.Series.Rolling.apply.Я бросаю TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python в каждой из моих попыток, и я не могу понять 1.) Почему 2.) Как правильно писать
Моя конечная цель: Начиная сПерспективная дата, найти исторические вершины в сигнале.
Функция find_peaks определяет пики внутри сигнала на основе свойств пиков.Я использую полезный пример методологии выдаемости из Mathworks -> методология выдачи
Сама функция принимает одномерный массив и возвращает кортеж (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
from 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
, который добавляет массивы / векторы к каждому подвижному блоку, в результате чего получается:
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])
Ошибка: Ошибка типа: в скаляры Python могут быть преобразованы только массивы размера 1
Вторая попытка:
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 скаляры
Буду очень признателен за любые мысли о том, как писать и почему я выкидываю ошибки!