1 回答

TA貢獻1780條經驗 獲得超4個贊
我剛剛抓取了您的一些數據,向您展示您可以在整個數據集上找到點,而無需使用滑動窗口(但理論上您可以):
局部極值(在原始數據中找到峰值)
最大陡度(找到一階導數的峰值)
拐點(在二階導數中找到峰值)
首先,讓我們看一下計算導數:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("Default Dataset.csv",
sep=';',
decimal=",",
header=None)
### Interpolate linearily ###
x_new = np.linspace(0, df[0].iloc[-1], 2000)
y_new = np.interp(x_new, df[0], df[1])
### First and second derivative ###
diff1 = np.insert(np.diff(y_new), 0, 0)
diff2 = np.insert(np.diff(diff1), 0, 0)
### Plot everything ###
plt.figure(figsize=(12,3))
plt.subplot(131)
plt.plot(x_new, y_new)
plt.subplot(132)
plt.plot(x_new, diff1)
plt.subplot(133)
plt.plot(x_new, diff2)
plt.tight_layout()
在這里,我還進行了插值以在數據點之間具有相等的間距。此外,我在微分后使用函數插入一個0at 位置,以確保與原始數據的形狀相同。0np.insert
接下來,我們將找到峰值:
import peakutils as pu
ix_abs = pu.indexes(y_new, thres=0.5, min_dist=15)
ix_diff1 = pu.indexes(diff1, thres=0.5, min_dist=15)
ix_diff2 = pu.indexes(diff2, thres=0.5, min_dist=15)
plt.scatter(x_new[ix_abs], y_new[ix_abs], color='g', label='abs')
plt.scatter(x_new[ix_diff1], y_new[ix_diff1], color='r', label='first deriv')
plt.scatter(x_new[ix_diff2], y_new[ix_diff2], color='purple', label='second deriv')
plt.plot(x_new, y_new)
plt.legend(loc='best')
我正在使用peakutils包,因為它幾乎在所有情況下都能很好地工作。您會看到,并未找到示例中指示的所有點。你可以玩與周圍不同的參數threshold
,并minimum distance
找到更好的解決辦法。但這應該是進一步研究的良好起點。實際上,該minimum distance
參數將為您提供所需的滑動窗口。
添加回答
舉報