1

对于时间序列数据集:

A,如何找到每个 ID 的局部最小值(最低点值)?(当地分钟)

B,我如何找到比每个局部最小值大 2 的任何后续值。(当地分钟 + 2)

import pandas as pd
df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'value': [8,5,3,2,1,2,3,5, 1.5, 3, 1, 1.5, 2, 3, 4, 0.4]})

对于 A,我能够使用以下代码从数据集中找到所有最低点/局部最小值,但它们没有按每个 id 分组。如何修改它以按 id 对它们进行分组?

nadir_min = df.value[(df.value.shift(1) > df.value) & (df.value.shift(-1) > df.value)]
nadir_min
Out[1]: 
4     1.0
8     1.5
10    1.0
Name: value, dtype: float64

对于 B,我想取回比最低点/局部最小值大两倍的最低点/局部最小值之后的后续值。对于上面的示例数据,我会回来:

index  id value 
 6      1   3.0
 13     2   3.0
 14     2   4.0 

也许条件循环可以解决问题,因为它可以存储每个本地最小值并比较后续值(如果它们比它大 2)。但是,工作数据集非常庞大,运行时间太长,所以我正在尝试这样的事情:

df['min_plus2'] = (df['value'] >= nadir_min + 2) & (df.index > nadir_min_index)
4

1 回答 1

1

你用下一个代码来做:

import pandas as pd
import numpy as np

df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'value': [8,5,3,2,1,2,3,5, 1.5, 3, 1, 1.5, 2, 3, 4, 0.4]})    
df['loc_min'] = df.value[(df.value.shift(1) > df.value) & (df.value.shift(-1) > df.value)]
df['if_A'] = np.where(df['loc_min'].isna(), False, True)    
df['loc_min'].fillna(method='ffill', inplace=True)    
df['if_B'] = np.where(df['value'] - df['loc_min'] >= 2, True, False)

A的答案:

df[df['if_A']==True]

B的答案:

df[df['if_B']==True]
于 2018-07-26T16:50:41.440 回答