Невозможно точно обнаружить 7 наиболее заметных пиков в данных с помощью функции Python find_peaksPython

Программы на Python
Ответить
Anonymous
 Невозможно точно обнаружить 7 наиболее заметных пиков в данных с помощью функции Python find_peaks

Сообщение Anonymous »

Я надеюсь выявить пики в сегменте данных (выбрав 7 верхних точек с наибольшей заметностью), которые хорошо видны невооруженным глазом. Однако мне не удалось успешно получить результаты с помощью функции find_peaks.
Данные доступны в этом списке.
Результат ошибки: если я напрямую используйте 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»