python-3.x - 熊猫:找到正确的时间窗口
问题描述
我有一个 pandas 数据框,它每小时更新一次最新的每小时数据。我必须根据阈值过滤掉 ID,即 PR_Rate > 50 和 CNT_12571 < 30 从 5 小时的回溯期连续 3 小时。我正在使用以下语句来完成此操作:
df_thld=df[(df['Date'] > df['Date'].max() - pd.Timedelta(hours=5))& (df.PR_Rate>50) & (df.CNT_12571 < 30)]
df_thld.loc[:,'HR_CNT'] = df_thld.groupby('ID')['Date'].nunique().to_frame('HR_CNT').reset_index()
df_thld[(df_thld['HR_CNT'] >3]
这种方法的问题在于,由于回溯期要求是 5 小时,因此,此 HR_CNT 可以计算任何违反此标准的非连续小时。我的数据集如下: DataFrame
Date IDs CT_12571 PR_Rate
16/06/2021 10:00 A1 15 50.487
16/06/2021 11:00 A1 31 40.806
16/06/2021 12:00 A1 25 52.302
16/06/2021 13:00 A1 13 61.45
16/06/2021 14:00 A1 7 73.805
在上面的 Dataframe 中,阈值在 1100 小时没有被突破,但是在计算小时数时,10、12 和 13 是违反阈值的小时数,而不是要求的 12、13、14 小时。每个 id 可能会或可能不会在一天内违反此标准。任何想法,我该如何解决这个问题?
解决方案
请原谅我,如果我误解了你的问题。据我了解,您有一个每小时更新的数据框。此数据帧的示例如下所示为df。从此数据框中,您只想过滤满足以下两个条件的行:
- PR_Rate > 50 和 CNT_12571 < 30
- 当且仅当连续三个小时超过阈值
鉴于这些假设,我将按如下方式进行:
df:
Date IDs CT_1257 PR_Rate
0 2021-06-16 10:00:00 A1 15 50.487
1 2021-06-16 12:00:00 A1 31 40.806
2 2021-06-16 14:00:00 A1 25 52.302
3 2021-06-16 15:00:00 A1 13 61.450
4 2021-06-16 16:00:00 A1 7 73.805
请注意,在此数据帧中,满足上述条件的唯一时间 fr5ame 是 14:00、15:00 和 16:00 的条目。
def filterFrame(df, dur, pr_threshold, ct_threshold):
ff = df[(df['CT_1257']< ct_threshold) & (df['PR_Rate'] >pr_threshold) ].reset_index()
ml = list(ff.rolling(f'{dur}h', on='Date').count()['IDs'])
r = len(ml)- 1
rows= []
while r >= 0:
end = r
start = None
if int(ml[r]) < dur:
r -= 1
else:
k = int(ml[r])
for i in range(k):
rows.append(r-i)
r -= k
rows = rows[::-1]
return ff.filter(items= rows, axis = 0).reset_index()
运行filterFrame(df, 3, 50, 30)
产量:
level_0 index Date IDs CT_1257 PR_Rate
0 1 2 2021-06-16 14:00:00 A1 25 52.302
1 2 3 2021-06-16 15:00:00 A1 13 61.450
2 3 4 2021-06-16 16:00:00 A1 7 73.805
推荐阅读
- c - 如何将 Amazon SNS api 与 c 一起使用
- nosql - 将测量数据导入 influxdb、nosql 数据库
- javascript - 在Javascript中从数组中删除一个键
- git - 将bert作为子模块添加到我的git repo后找不到错误“版本”
- arrays - MATLAB-单元格数组数值数据拆分和提取
- javascript - Firestore:无法从查询中获取文档 - doc.data 不是函数
- php - PHP循环遍历数组并填写缺失值
- vba - MSAccess - 在表中查找值 - DoCmd.SearchForRecord
- python - 如何使用 tf.einsum 正确地乘以 N 维张量?
- php - 使用@scope 指令的正确方法是什么?