python - 计算时间序列中值超过阈值的次数
问题描述
我有一个多项式特征的时间序列数据多次超过上限和下限,
我想计算超出上限和下限的次数。
例如,我的上限是 35°C,我的下限是 -45°C。
如何编写一个函数来计算数据超过上限和下限阈值的次数以及数据在范围内的时间?
有没有解决这个问题的pythonic方法?
解决方案
如果您的数据可以包含高于、低于或介于阈值之间的连续值的“运行”,并且您希望计算运行而不是单个数据点,则可以标记数据、折叠连续标签、过滤和计数:
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
推荐阅读
- c - C中的字符串连接
- javascript - 赛普拉斯 - 如何等待两个元素中的第二个出现?
- python - 在 macOS 上编译时输入字段不可编辑 + 不稳定的箭头
- r - 如何测试 LMER 模型中的自变量之间是否存在共线性?
- python - 主导 RGB 分析视频
- html - 如何使用 Css 设置缩放默认值
- javascript - 使用 js 映射来自两个 Firestore 集合的数据
- flutter - Flutter 通用 REST API 调用函数
- reactjs - 在 mapbox-gl-js 中使用填充挤出时有什么问题吗
- java - Spring Data Specification API - 单向连接 OneToMany