我正在使用 pandas.Series.Rolling.apply 功能中的scipy函數Find_Peaks尋求幫助。我拋出 TypeError: only size-1 arrays can be convert to Python scalars in my每次嘗試,我無法理解 1.) 為什么 2.) 如何正確編寫我的最終目標:從透視日期開始,找到信號中的歷史峰值。find_peaks 函數根據峰值屬性識別信號內的峰值。我正在使用 Mathworks -> prominence 方法中的突出方法有用示例該函數本身接受一個一維數組并返回一個元組(peaks:ndarray, properties:dict)。期望的輸出:x = np.ones((12,))x[3] = 10x[7] = 10x[11] = 10x = 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似乎與此示例相矛盾:import numpy as npimport pandas as pdn = 3a = 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_window2 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 peaksx.rolling(4).apply(_find_peaks)類型錯誤:只有大小為 1 的數組可以轉換為 Python 標量關于如何寫作以及為什么我會拋出錯誤的任何想法將不勝感激!
2 回答

犯罪嫌疑人X
TA貢獻2080條經驗 獲得超4個贊
您可以做的是使用數組代替,并使用wlen參數 infind_peaks設置窗口長度而不是使用pd.rolling:
從文檔:
wlen :int 或 float,可選: 樣本中的窗口長度,可選擇將每個峰的評估區域限制為 x 的子集。峰值始終位于窗口的中間,因此給定的長度四舍五入為下一個奇數。這個參數可以加快計算
因此,您可以這樣做:
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)})
添加回答
舉報
0/150
提交
取消