Я просто очистил некоторые из ваших данных , чтобы показать вам, что вы можете найти точки во всем наборе данных, не используя скользящее окно (но вы могли бы, теоретически):
- Локальные экстремумы (найти пики в необработанных данных)
- Макс. Крутизна (найти пики в 1-й производной)
- Точки перегиба (найти пики во 2-й производной)
Во-первых, давайте посмотрим на вычисление производных:
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()
Здесь я также интерполирую, чтобы получить равный интервал между точками данных.Далее, я вставляю 0
в положение 0
, используя функцию np.insert
после дифференцирования, чтобы обеспечить ту же форму, что и исходные данные.
![Comparison of raw, 1st deriv and 2nd deriv](https://i.stack.imgur.com/4NypK.png)
Далее мы найдем пики:
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')
![peaks in data](https://i.stack.imgur.com/7fbLR.png)
Я использую пакет peakutils , потому чтоэто работает хорошо почти во всех случаях.Вы видите, что не все точки, которые были указаны в вашем примере, были найдены.Вы можете поиграть с различными параметрами для threshold
и minimum distance
, чтобы найти лучшее решение.Но это должно стать хорошей отправной точкой для дальнейших исследований.Действительно, параметр minimum distance
даст вам желаемое скользящее окно .