基于时间序列数据,计算连续下降次数

在时间序列数据,尤其是传感器类数据中连续下降或连续增加,对判断传感器监测是真异常还是假异常,有重要的参考作用。如何实现计算呢?

>>> import pandas as pd
>>> times = ['11:55', '12:00', '12:05', '12:10', '12:15', '12:20', '12:25', '12:30', '12:35', '12:40', '12:45', '12:50', '12:55', '13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30']
>>> values = [0.940353, 0.919144, 0.909454, 0.904968, 0.867957, 0.901426, 0.94733, 0.770106, 0.741985, 0.671444, 0.558297, 0.496972, 0.457803, 0.446388, 0.430217, 0.379902, 0.321828, 0.298304, 0.442079, 0.634764, ]
>>> df = pd.DataFrame(data={'time': times, 'value': values})
>>> df['is_decline'] = df.value.diff() < 0
>>> df['is_decline_num'] = df['is_decline'] * 1
>>> y = df['is_decline_num']
>>> df['decline_continuity'] = y * (y.groupby((y != y.shift()).cumsum()).cumcount() + 1)
notimevalueis_declineis_decline_numdecline_continuity
011:550.940353False00
112:000.919144True11
212:050.909454True12
312:100.904968True13
412:150.867957True14
512:200.901426False00
612:250.94733False00
712:300.770106True11
812:350.741985True12
912:400.671444True13
1012:450.558297True14
1112:500.496972True15
1212:550.457803True16
1313:000.446388True17
1413:050.430217True18
1513:100.379902True19
1613:150.321828True110
1713:200.298304True111
1813:250.442079False00
1913:300.634764False00

上述代码中最核心的就属y * (y.groupby((y != y.shift()).cumsum()).cumcount() + 1):
Step 1: y!=y.shift()
这一步很好理解,不再赘述。

>>> y != y.shift()
0      True
1      True
2     False
3     False
4     False
5      True
6     False
7      True
8     False
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18     True
19    False
Name: is_decline_num, dtype: bool

Step 2: (y != y.shift()).cumsum()

>>> (y != y.shift()).cumsum()
0     1
1     2
2     2
3     2
4     2
5     3
6     3
7     4
8     4
10    4
11    4
12    4
13    4
14    4
15    4
16    4
17    4
18    5
19    5
Name: is_decline_num, dtype: int32

Step 3: y.groupby((y != y.shift()).cumsum()).cumcount()

>>> y.groupby((y != y.shift()).cumsum()).cumcount()
0      0
1      0
2      1
3      2
4      3
5      0
6      1
7      0
8      1
10     3
11     4
12     5
13     6
14     7
15     8
16     9
17    10
18     0
19     1
dtype: int64

这一步是比较关键的,首先理解y.groupby((y != y.shift()).cumsum()),要理解此,运行y.groupby((y != y.shift()).cumsum()).sum()会比较清楚。

>>> y.groupby((y != y.shift()).cumsum()).sum()
is_decline_num
1     0
2     4
3     0
4    11
5     0
Name: is_decline_num, dtype: int32

要理解上述结果,需要参照下述DataFrame,以shift_cumsum列来分组,对相应y列的值做加和。

>>> pd.DataFrame(data = {'y':y.values, 'shift_cumsum': (y != y.shift()).cumsum().values})
    y  shift_cumsum
0   0             1
1   1             2
2   1             2
3   1             2
4   1             2
5   0             3
6   0             3
7   1             4
9   1             4
10  1             4
11  1             4
12  1             4
13  1             4
14  1             4
15  1             4
16  1             4
17  1             4
18  0             5
19  0             5

最关键的就是cumcount()的理解,按照帮助文档中的叙述**Number each item in each group from 0 to the length of that group - 1.**此句话的意思是:
1、自上而下对group数数
2、group的产生是以(y != y.shift()).cumsum()的生成结果为分组原则,对y进行分组;然后利用cumcount对每个分组中y的值,自上而下数数(从0开始计数)。

Step 4: +1y*
+1:确保连续下降是从1开始计数
y*:因为原始y就是01两个数值,相乘便仅剩下了下降的连续度。

Reference

  1. pandas Dataframe Consistently falling column values
  2. Counting consecutive positive value in Python array
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值