如何按组比较最近 2 周的平均值与前 6 周的平均值

How to compare average value from recent 2 weeks to average of previous 6 weeks by group

我正在尝试创建一个函数,该函数可以有效地分析不同时间的商业银行余额交易平均值,以确定可以通知贷方错过付款的可能性增加的趋势。

因此,如果商家最近 2 周的平均银行余额明显低于他们自己的 6 周平均值,那么我想发送符合此条件的商家的自动报告。

本质上,我希望能够计算并比较每个商家 2 周的平均银行余额与同一商家 6 周的平均值。我能够计算出平均余额不能将最近 2 周与 6 周之前

我会在这里展示我的尝试以及出了什么问题:

import pandas as pd
import numpy as np

df = pd.DataFrame({'date': pd.to_datetime(['2021-12-20','2021-10-20','2021-12-24','2021-12-19','2021-12-01','2021-12-12','2021-10-29','2021-11-09','2021-11-16']), 
                       'credits': [0,1,0,0,1,1,0,1,0],
                       'debits': [1,0,1,1,0,0,1,0,1],
                       'merchant': ['target','target','target','costco','costco','costco','publix','publix','publix'],
                       'amount': [-230, 558,-185,-899,1009,564,-741,199,-187]})

df.index = df.date 分组 = df.groupby(['merchant']).resample('W')[['amount']].mean()

df["Average Credits in the last 2 weeks"] = df.rolling("7D", on="date").mean()["credits"]
df["Average Credits in the last 6 weeks"] = df.rolling("42D", on="date").mean()["credits"]
df['flag'] = df.apply(lambda row: row["Average Credits in the last 6 weeks"] > row["Average Credits in the last 2 weeks"], axis=1)

所以我没能用这些函数计算商户的信用滚动平均值。我以学分为例,因为当尝试将滚动功能与 mean()['amount'] 而不是 mean()['credits] 一起使用时会给我一个错误。

如果我以错误的方式解决这个问题,我希望您能给我任何帮助。提前致谢!

我了解到您的问题是您无法根据类别“商家”获得滚动平均值。如果是这样,一种方法就是这个:

  1. 第一个带重采样的groupby 编写重采样,与您已经拥有的方式相同,我只是添加了一个 ffill(如果您没有数据点之一,请填写以避免 nans):
    df.index = df.date
    grouped = df.groupby(['merchant']).resample('W')[['amount']].mean()
    grouped.ffill(axis = 0,inplace = True)

  2. 再次应用 groupby,在“金额”列上滚动 2 周和 6 周。请注意,此示例中会有 nans,因为例如要计算 2 周的滚动,如果至少需要前一周:

grouped = grouped.reset_index()
grouped.index = grouped.date
mean_2 = grouped.groupby(["merchant"]).rolling(2).amount.mean()
mean_6 = grouped.groupby(["merchant"]).rolling(6).amount.mean()

  1. 连接系列
    result=pd.concat([mean_2,mean_6],axis=1)
    result.columns = ["mean2","mean6"]

结果是这样的: