首页 > 解决方案 > 熊猫:找到正确的时间窗口

问题描述

我有一个 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 可能会或可能不会在一天内违反此标准。任何想法,我该如何解决这个问题?

标签: python-3.xpandasdataframedatetime

解决方案


请原谅我,如果我误解了你的问题。据我了解,您有一个每小时更新的数据框。此数据帧的示例如下所示为df。从此数据框中,您只想过滤满足以下两个条件的行:

  1. PR_Rate > 50 和 CNT_12571 < 30
  2. 当且仅当连续三个小时超过阈值

鉴于这些假设,我将按如下方式进行:
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  

推荐阅读