【问题标题】:Find the average of Quantity for last 30 days and 60 days in pandas groupby在 pandas groupby 中查找过去 30 天和 60 天的 Quantity 平均值
【发布时间】:2021-05-19 12:42:31
【问题描述】:

创建数据框的代码。

import pandas as pd

z = pd.DataFrame({'VENDOR':['A','A','A','A','B','B'],
                  'PO_DATE':['2020-12-16','2020-12-02','2020-11-23','2020-11-09','2020-12-16','2020-11-02'],
                  'PO_QTY':[18,5,77,6,20,5]})
z['PO_DATE'] = pd.to_datetime(z['PO_DATE'])
z = z.sort_values(['VENDOR','PO_DATE']).reset_index(drop=True)
 
z1 = z.groupby(['VENDOR']).agg({'PO_DATE':'last'}).rename(columns = {'PO_DATE':'MAX_PO_DATE'})
z2 = pd.merge(z,z1, on = 'VENDOR')
z2['DURATION'] = (z2['MAX_PO_DATE'] - z2['PO_DATE']).dt.days

Dataframe 如下所示。

此数据框按 VENDOR 和 PO_DATE 级别分组。

我已经创建了 MAX_PO_DATE 和 DURATION(通过取 MAX_PO_DATE 和 PO_DATE 的差异)。

我需要找到每条记录最近 30 天和最近 60 天的 PO_QTY 平均值。

例如:

在第一条记录中,第一条和第四条记录的日期差是 37,但对于第一条和第三条记录,是 23,小于 30 天,所以 AVG_PO_QTY_30_DAYS 是前 3 条记录的 PO_QTY 的平均值同一供应商,即 (6+77+5)/3。

对于 60 天,它将是 (6+77+5+18)/4,因为从第 1 条记录到第 4 条记录的日期差小于 60 天。

【问题讨论】:

    标签: pandas dataframe pandas-groupby aggregate average


    【解决方案1】:

    你可以这样做:

    首先,我更改了您的代码,因为我需要使用降序来轻松应用滚动窗口

    import pandas as pd
    
    z = pd.DataFrame({'VENDOR':['A','A','A','A','B','B'],
                      'PO_DATE':['2020-12-16','2020-12-02','2020-11-23','2020-11-09','2020-12-16','2020-11-02'],
                      'PO_QTY':[18,5,77,6,20,5]})
    z['PO_DATE'] = pd.to_datetime(z['PO_DATE'])
    z["MAX_PO_DATE"] = z.groupby(['VENDOR'])["PO_DATE"].transform("max")
    z['DURATION'] = (z['MAX_PO_DATE'] - z['PO_DATE']).dt.days
    
    #sort descending to use window correctly
    z = z.sort_values(['VENDOR','PO_DATE'],ascending=False).reset_index(drop=True)
    

    之后,如果我将日期设置为索引,我可以根据时间应用移动窗口。

    df = z # not necessary but i like the df name
    
    last_30_df = df.set_index("PO_DATE").groupby("VENDOR")["PO_QTY"].rolling("30d").mean().reset_index()
    last_30_df.rename(columns={"PO_QTY": "AVG_PO_QTY_30_DAYS"}, inplace=True)
    
    last_60_df = df.set_index("PO_DATE").groupby("VENDOR")["PO_QTY"].rolling("60d").mean().reset_index()
    last_60_df.rename(columns={"PO_QTY": "AVG_PO_QTY_60_DAYS"}, inplace=True)
    
    df = df.merge(last_30_df,  how='left', left_on=['VENDOR','PO_DATE'], right_on = ['VENDOR','PO_DATE'])
    df = df.merge(last_60_df,  how='left', left_on=['VENDOR','PO_DATE'], right_on = ['VENDOR','PO_DATE'])
    
    df = df.sort_values(['VENDOR','PO_DATE']).reset_index(drop=True)
    

    最后我们得到了这个:

    【讨论】:

    • 这仅给出每个供应商的平均值。每笔交易我都需要它。我已经编辑了这个问题以便更好地澄清。谢谢:)
    • 我觉得我有结果了,看看吧
    • 这行得通。非常感谢。我以前没有听说过滚动功能。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 2016-08-26
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多