我正在分析时间序列,因此要创建最后n个峰的多列(n应该是可变的)。
我知道可以像这样对上一个峰进行简单的计算:
df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]
此代码摘自以下问题:Pandas finding local max and min,它是由用户“ fuglede”创建的。
但是我不仅想要最后一个峰,还想要最后n个峰。例如,如果n = 3,我的列将如下所示:df.columns = ['data','min_0','min_1','min_2','max_0','max_1','max_2']
计算所有峰(对于min_0和max_0)并在以后进行平移是没有选择的,因为我需要唯一的峰。如果在两者之间未达到新的峰值,则将它们移位将导致min_0等于min_1和min_2的结果。
我想到这个问题的唯一想法是:
n = 3
# Store all peaks in a series
min_vals = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
max_vals = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]
# Iterate over all values in my dataframe
for idx, row in df.iterrows():
# get all peaks that appeared before the current row (avoid look ahead)
tmp_min = min_vals.loc[(idx >= min_vals.index)]
tmp_max = max_vals.loc[(idx >= max_vals.index)]
# Test if at least n mins and max peaks already appeared
if len(tmp_min) >= n and len(tmp_max) >= n:
#create counter for min values (needed to create column name)
min_ctr = 0
# iterate over last n entries in tmp_min by using tail function
for x in tmp_min.tail(n):
df.loc[idx, 'min_' + str(min_ctr)] = row.data
min_ctr += 1
max_ctr = 0
for x in tmp_min.tail(n):
df.loc[idx, 'max_' + str(max_ctr)] = row.data
max_ctr += 1
此方法有效,但效果不佳,以这种方式使用熊猫也是不好的做法。这就是为什么我正在寻找一种高性能的方法来计算这一点。
我希望我对这个问题的解释足够好,让我知道我是否愿意,我将尝试改善我的问题。谢谢