将时间序列的最后n个峰值创建为列-(寻找性能计算)

时间:2019-06-18 18:14:57

标签: python pandas time-series

我正在分析时间序列,因此要创建最后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

此方法有效,但效果不佳,以这种方式使用熊猫也是不好的做法。这就是为什么我正在寻找一种高性能的方法来计算这一点。

我希望我对这个问题的解释足够好,让我知道我是否愿意,我将尝试改善我的问题。谢谢

0 个答案:

没有答案