如何按组比较最近 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
] 一起使用时会给我一个错误。
如果我以错误的方式解决这个问题,我希望您能给我任何帮助。提前致谢!
我了解到您的问题是您无法根据类别“商家”获得滚动平均值。如果是这样,一种方法就是这个:
第一个带重采样的groupby
编写重采样,与您已经拥有的方式相同,我只是添加了一个 ffill(如果您没有数据点之一,请填写以避免 nans):
df.index = df.date
grouped = df.groupby(['merchant']).resample('W')[['amount']].mean()
grouped.ffill(axis = 0,inplace = True)
再次应用 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()
- 连接系列
result=pd.concat([mean_2,mean_6],axis=1)
result.columns = ["mean2","mean6"]
结果是这样的:
我正在尝试创建一个函数,该函数可以有效地分析不同时间的商业银行余额交易平均值,以确定可以通知贷方错过付款的可能性增加的趋势。
因此,如果商家最近 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
] 一起使用时会给我一个错误。
如果我以错误的方式解决这个问题,我希望您能给我任何帮助。提前致谢!
我了解到您的问题是您无法根据类别“商家”获得滚动平均值。如果是这样,一种方法就是这个:
第一个带重采样的groupby 编写重采样,与您已经拥有的方式相同,我只是添加了一个 ffill(如果您没有数据点之一,请填写以避免 nans):
df.index = df.date
grouped = df.groupby(['merchant']).resample('W')[['amount']].mean()
grouped.ffill(axis = 0,inplace = True)
再次应用 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()
- 连接系列
result=pd.concat([mean_2,mean_6],axis=1)
result.columns = ["mean2","mean6"]
结果是这样的: