Home > Software engineering >  Find local maxima or peaks(index) in a numeric series using numpy and pandas Peak refers to the valu
Find local maxima or peaks(index) in a numeric series using numpy and pandas Peak refers to the valu

Time:01-03

Write a python program to find all the local maxima or peaks(index) in a numeric series using numpy and pandas Peak refers to the values surrounded by smaller values on both sides

Note

Create a Pandas series from the given input.

Input format:

First line of the input consists of list of integers separated by spaces to from pandas series.

Output format:

Output display the array of indices where peak values present.

Sample testcase

input1 12 1 2 1 9 10 2 5 7 8 9 -9 10 5 15

output1 [2 5 10 12]

How to solve this problem?

CodePudding user response:

Use:

data = [12, 1, 2, 1.1, 9, 10, 2.1, 5, 7, 8, 9.1, -9, 10.1, 5.1, 15]
s = pd.Series(data)

n = 3  # number of points to be checked before and after

from scipy.signal import argrelextrema

local_max_index = argrelextrema(s.to_frame().to_numpy(), np.greater_equal, order=n)[0].tolist()
print (local_max_index)
[0, 5, 14]

local_max_index = s.index[(s.shift() <= s) & (s.shift(-1) <= s)].tolist()
print (local_max_index)
[2, 5, 10, 12]

local_max_index = s.index[s == s.rolling(n, center=True).max()].tolist()
print (local_max_index)
[2, 5, 10, 12]

CodePudding user response:

import pandas as pd
a = [12, 1, 2, 1, 9, 10, 2, 5, 7, 8, 9, -9, 10, 5, 15]
angles = []
for i in range(len(a)):
    if i!=0:
        if a[i]>a[i-1]:
            angles.append('rise')
        else:
            angles.append('fall')
    else:
        angles.append('ignore')
prev=0
prev_val = "none"
counts = []
for s in angles:
    if s=="fall" and prev_val=="rise":
        prev_val = s
        counts.append(1)
    else:
        prev_val = s
        counts.append(0)

peaks_pd = pd.Series(counts).shift(-1).fillna(0).astype(int)
df = pd.DataFrame({
     'a':a,
     'peaks':peaks_pd
     })

peak_vals = list(df[df['peaks']==1]['a'].index)

This could be improved further. Steps I have followed:

  1. First find the angle whether its rising or falling
  2. Look at the index at which it starts falling after rising and call it as peaks
  • Related