【问题标题】:Aggregation based on previous month from eventdate基于从 eventdate 开始的上个月的聚合
【发布时间】:2023-03-27 04:05:01
【问题描述】:

我遇到了一个问题,如果您能帮助我,那就太好了 :) 我用熊猫创建了一个数据框: 看起来像这样:

HostName Date
A 2021-01-01 12:30
B 2021-01-01 12:42
B 2021-02-01 12:30
A 2021-02-01 12:40
A 2021-02-25 12:40
A 2021-03-01 12:41
A 2021-03-01 12:42

我尝试根据上个月进行聚合,但它不起作用。 最终结果应如下所示:

HostName Date previous month
A 2021-01-01 12:30 Nan
B 2021-01-01 12:42 Nan
B 2021-02-01 12:30 1
A 2021-02-01 12:40 Nan
A 2021-02-25 12:40 1
A 2021-03-01 12:41 2
A 2021-03-01 12:42 3

对于每一行,日期应在一个月前查看,并汇总找到的主机名数量。 例如行号 6 计数 HostName A 从 2021-02-01 12:41 到 2021-03-01 12:41

我尝试做的事情却失败了:

  1. 提取上个月:
 df['Date Before'] = df['Date'] - pd.DateOffset(months=1)
  1. 和本月之间的汇总
 df.resample('M', on='Date').HostName.count()
 df.groupby('HostName').resample('M', on='Date Before').HostName.count()

请帮帮我,非常感谢!!!

【问题讨论】:

    标签: python pandas machine-learning deep-learning feature-extraction


    【解决方案1】:

    使用 shift 来回顾数据框列的 n 行。 df 是按结果分组。

     data1="""HostName  Date
    A   2021-01-01 12:30
    B   2021-01-01 12:42
    B   2021-02-01 12:30
    A   2021-02-01 12:40
    A   2021-02-25 12:40
    A   2021-03-01 12:41
    A   2021-03-01 12:42"""
        
    df = pd.read_table(StringIO(data1), sep='\t')    
    df['Date']=pd.to_datetime(df['Date'])
    
    grouped=df.groupby('HostName')['Date']
    
    def previous_date(group):
        return group.sort_values().shift(1)
    
    df['Previous Date']=grouped.apply(previous_date)
    
    df['Previous Count']=df.apply(lambda x: x['Date']-x['Previous Date'],axis=1)
    
    print(df.sort_values(by=["HostName","Date"]))
    
    
    df['Con'] = np.where( (df['Previous Date'].notnull() & df['Previous Count']>0) , 1, 0)
    
    print(df.sort_values(by=["HostName","Date"]))
    

    输出:

         HostName                Date       Previous Date  Previous Count  Con
    0        A 2021-01-01 12:30:00                 NaT             NaN    0
    3        A 2021-02-01 12:40:00 2021-01-01 12:30:00            31.0    1
    4        A 2021-02-25 12:40:00 2021-02-01 12:40:00            24.0    1
    5        A 2021-03-01 12:41:00 2021-02-25 12:40:00             4.0    1
    6        A 2021-03-01 12:42:00 2021-03-01 12:41:00             0.0    0
    1        B 2021-01-01 12:42:00                 NaT             NaN    0
    2        B 2021-02-01 12:30:00 2021-01-01 12:42:00            30.0    1
    

    使用 cumsum 按主机名创建运行总计 ​

    【讨论】:

    • 它很好,但“Previous Count”应该计算主机名找到的次数而不是天数,例如索引 3 列“Previous Count”应该得到 0
    • 您可以使用数据帧转换并从当前行回溯到开头或主机名更改并计算天数 = 0
    • 是的,我知道,但结果将适用于索引 0,3,4,5,6 - 5 和索引 1,2 - 2 但情况并非如此,因为只有在A 在日期之前的真实月份中找到,例如索引 4,日期是 2021-02-25 12:40:00,所以之前的真实月份是 2021-01-25 12:40:00,所以它是 2,因为 A 在2021-02-25 12:40:00 和 2021-02-01 12:40:00 但不是 2021-01-01 12:30:00,因为它比一个月前
    【解决方案2】:

    我找到了解决方案: 原文:

    HostName    Date
    0   A   2021-01-01 12:30:00
    1   B   2021-01-01 12:42:00
    2   B   2021-02-01 12:30:00
    3   A   2021-02-01 12:40:00
    4   A   2021-02-25 12:40:00
    5   A   2021-03-01 12:41:00
    6   A   2021-03-01 12:42:00
    

    获取前一个月

    df['Month Before'] = df['Date'] - pd.DateOffset(months=1)
    

    订购数据农场

    df = df.sort_values(['HostName','Date'])
    

    按主人转移

    df['prev_value'] = df.groupby('HostName')['Date'].shift()
    

    检查

    df['Con'] = np.where((df['Month Before'] <= df['prev_value']) | (df['prev_value'].notnull()) , 1, 0)
    

    和组

    gpc = df.groupby(['HostName','Con'])['HostName']
    df['Count Per Host'] = gpc.cumcount() 
    

    看起来像这样

        HostName    Date    Month Before                 prev_value        Con   CountPerHost
    0   A   2021-01-01 12:30:00 2020-12-01 12:30:00     NaT                 0      0
    3   A   2021-02-01 12:40:00 2021-01-01 12:40:00 2021-01-01 12:30:00     0      0
    4   A   2021-02-25 12:40:00 2021-01-25 12:40:00 2021-02-01 12:40:00     1      1
    5   A   2021-03-01 12:41:00 2021-02-01 12:41:00 2021-02-25 12:40:00     1      2
    6   A   2021-03-01 12:42:00 2021-02-01 12:42:00 2021-03-01 12:41:00     1      3
    1   B   2021-01-01 12:42:00 2020-12-01 12:42:00     NaT                 0      0
    2   B   2021-02-01 12:30:00 2021-01-01 12:30:00 2021-01-01 12:42:00     1     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多