【问题标题】:count the times that values exceed over a threshold in time series计算时间序列中值超过阈值的次数
【发布时间】:2018-06-06 07:07:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能添加一些数据样本和预期输出吗?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为需要between 用于布尔掩码,将其反转为~sumTrues:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-04
      • 2018-12-16
      • 2014-12-15
      • 1970-01-01
      • 2021-03-13
      • 2016-03-23
      • 1970-01-01
      • 2014-02-17
      相关资源
      最近更新 更多