计算值超过时间序列阈值的次数

时间:2018-06-06 07:07:34

标签: python pandas numpy time-series signal-processing

我有一个多项式特征的时间序列数据,多次超过上限和下限,

我想计算超过上限和下限的次数。

例如我的上阈值是35°C,我的下阈值是-45°C。

如何编写一个函数来计算数据超过阈值上限和下限的次数以及数据在范围内的时间?

有解决这个问题的pythonic方法吗?

3 个答案:

答案 0 :(得分:2)

如果您的数据可以在阈值之上,之下或之间包含连续值的“运行”,并且您希望计算运行而不是单个数据点,则可以标记数据,折叠连续标签,过滤和计数:

In [64]: df = pd.DataFrame({'Temp': [50, 47.7, 45, 0, 0, -1, -1, -2, -10, -30,
    ...:                             -45, -45, -46, -20, -1, 2, 2, 10, 10, 20,
    ...:                             35.5, 35, 36, 20, 0, -10, -45.1, -50]})

创建标签:

In [65]: df['Category'] = 0

In [66]: df.loc[df['Temp'] <= -45, 'Category'] = -1

In [67]: df.loc[df['Temp'] >= 35, 'Category'] = 1

In [68]: df
Out[68]: 
    Temp  Category
0   50.0         1
1   47.7         1
2   45.0         1
3    0.0         0
...
9  -30.0         0
10 -45.0        -1
11 -45.0        -1
12 -46.0        -1
13 -20.0         0
...
19  20.0         0
20  35.5         1
21  35.0         1
22  36.0         1
23  20.0         0
24   0.0         0
25 -10.0         0
26 -45.1        -1
27 -50.0        -1

然后使用Series.shift()compare and collapse consecutive values

In [69]: df[df['Category'].shift() != df['Category']]
Out[69]: 
    Temp  Category
0   50.0         1
3    0.0         0
10 -45.0        -1
13 -20.0         0
20  35.5         1
23  20.0         0
26 -45.1        -1

从那里可以很容易地根据类别进行过滤和计算:

In [70]: collapsed = df[df['Category'].shift() != df['Category']]

In [71]: (collapsed['Category'] != 0).sum()
Out[71]: 4

In [72]: (collapsed['Category'] == 0).sum()
Out[72]: 3

Series.value_counts()也可能有用:

In [73]: collapsed['Category'].value_counts()
Out[73]: 
 0    3
-1    2
 1    2
Name: Category, dtype: int64
  

如何编写一个函数......数据在范围内的时间?

如果您有时间序列数据,则可以轻松再次移动折叠数据以计算运行持续时间(此处使用整数索引演示):

In [74]: fake_time_series = collapsed.reset_index()

In [75]: fake_time_series
Out[75]: 
   index  Temp  Category
0      0  50.0         1
1      3   0.0         0
2     10 -45.0        -1
3     13 -20.0         0
4     20  35.5         1
5     23  20.0         0
6     26 -45.1        -1

In [76]: fake_time_series.shift(-1)['index'] - fake_time_series['index']
Out[76]: 
0    3.0
1    7.0
2    3.0
3    7.0
4    3.0
5    3.0
6    NaN
Name: index, dtype: float64

答案 1 :(得分:1)

我认为需要between表示布尔值掩码,将~sum反转为True

print ((~df['data'].between(-45, 35)).sum())

<强>示例

df = pd.DataFrame({'data':[-47,10,0,30,50]})
print (df)
   data
0   -47
1    10
2     0
3    30
4    50

print ((~df['data'].between(-45, 35)).sum())
2

<强>详情:

print (df['data'].between(-45, 35))
0    False
1     True
2     True
3     True
4    False
Name: data, dtype: bool

print (~df['data'].between(-45, 35))
0     True
1    False
2    False
3    False
4     True
Name: data, dtype: bool

答案 2 :(得分:-1)

我认为已经回答了一个类似的问题here。简而言之:使用生成器表达式,例如

sum(element > threshold for element in data)