我有一只熊猫的数据,每小时更新一次。我必须根据阈值筛选出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小时。每一个身份都可能在一天内被破坏,也可能没有。知道吗,我怎么解决这个问题?
发布于 2021-06-20 14:43:19
请原谅,如果我误解了你的问题。正如我所理解的问题,您有一个每小时更新的数据。下面以df的形式说明了此数据的一个示例。从这个dataframe中,您只希望过滤那些满足以下两个条件的行:
基于这些假设,我将按以下方式进行:
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 https://stackoverflow.com/questions/68014463
复制相似问题