Helenr
我刚刚抓取了您的一些数据,向您展示您可以在整个数据集上找到点,而无需使用滑动窗口(但理论上您可以):局部极值(在原始数据中找到峰值)最大陡度(找到一阶导数的峰值)拐点(在二阶导数中找到峰值)首先,让我们看一下计算导数:import numpy as npimport pandas as pdimport matplotlib.pyplot as pltdf = 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 puix_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参数将为您提供所需的滑动窗口。