Данные доступны в этом списке.
Результат ошибки: если я напрямую используйте find_peaks:
find_peaks(series, prominence=np.max(series) * 0.1, distance=48)
а затем выбираю 7 верхних точек с самым высоким значением, в результате у меня остаются некоторые нежелательные точки.
Неуклюжий метод: я могу сначала сгладить данные:
percentile_80 = series.rolling(
window=61, center=True, min_periods=1
).apply(lambda x: np.percentile(x, 80))
smoothed_series = series - percentile_80
Затем используйте find_peaks(smoothed_series, prominence=np.max(smoothed_series) * 0.1, distance=48) и выберите 7 верхних точек с наибольшей известностью, которые дает ожидаемые результаты.
Однако этот подход работает намного медленнее.

Изменить в 2025.1.9:
Спасибо, mozway, это хороший метод.И я нашел другой способ ускориться: сначала найти все вершины, затем сравнить вершины с соседними вершинами, найти вершины выдающихся вершин с соседними. это хороший метод?
def find_significant_peaks(x, prominence_diff_ratio=0.1, initial_distance=3):
# Step 1: Get all candidate peaks and their properties
peaks, properties = find_peaks(
x, distance=initial_distance, prominence=np.max(x) * 0.01
)
if len(peaks) == 0:
return peaks, properties
# Get prominences of all peaks
prominences = properties["prominences"]
# Calculate prominence differences using vectorized operations
diffs = np.abs(np.subtract.outer(prominences, prominences))
threshold_values = prominences * prominence_diff_ratio
valid_peaks_mask = np.ones(len(peaks), dtype=bool)
# For each peak, check prominence difference with neighbors and local maximality
compare_num = 10
for i in range(len(peaks)):
# Get local window range
start_idx = max(0, i - compare_num)
end_idx = min(len(peaks), i + 1 + compare_num)
# Get prominence values within local window
local_prominences = prominences[start_idx:end_idx]
current_prominence = prominences
# Condition 1: Check if it's a local maximum
if current_prominence < np.max(local_prominences):
valid_peaks_mask = False
continue
# Condition 2: Get prominence differences with neighbors
neighbor_diffs = diffs[i, start_idx:end_idx]
neighbor_diffs = neighbor_diffs[neighbor_diffs != 0] # Remove self-difference
# Check if all neighboring differences are greater than threshold
if np.any(neighbor_diffs
Подробнее здесь: https://stackoverflow.com/questions/793 ... -s-find-pe
Мобильная версия