Значение, которое вы выбираете для нижнего пика (df[10:11] = -0.933463
), слишком мало, чтобы отличать его от других минимумов без дополнительной информации.
Поэтому я изменил это значение на -7.
from scipy.signal import find_peaks
import pandas as pd
import numpy as np
# to create a dataframe
np.random.seed(42)
df=pd.DataFrame(np.random.randn(25), index=pd.date_range(start='2010-1-1',end='2010-1-2',freq='H'), columns=['value'])
# to manipulate the dataframe
df[10:11] = -7
df[11:12] = 15
df[12:13] = 15
df[13:14] = 15
peaks_up = find_peaks(df.value, prominence=4, plateau_size=1)
peaks_down = find_peaks(-df.value, prominence=4, plateau_size=1)
peaks_idx = np.unique(
np.concatenate(
[peaks_up[1]['left_edges'], peaks_up[0], peaks_up[1]['right_edges'],
peaks_down[1]['left_edges'], peaks_down[0], peaks_down[1]['right_edges']],
axis=0))
peaks_df = df.iloc[peaks_idx ]
На участок:
import matplotlib.pyplot as plt
import seaborn as sns
sns.lineplot(df.index, df.value)
plt.scatter(peaks_df.index, peaks_df.value, color="red")