首页 > 解决方案 > 计算时间序列中值超过阈值的次数

问题描述

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

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

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

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

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

标签: pythonpandasnumpytime-seriessignal-processing

解决方案


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

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()比较和折叠连续值

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

推荐阅读