具有特定条件的 Pandas DataFrame 中的加权平均值

问题描述

我想动态创建一个指数衰减的移动平均线,为最近的测量赋予更多权重。例如,如果我有 5 个请求,而这 5 个请求是过去 4 周的结果,我想使用这 4 周(第 1 行)动态创建指数平均值。尽管如此,如果这 5 个请求是 4 周的结果,但其中一些周出现不止一次,那么我想以某种方式修改指数平均值,以免将重复的周视为单独的周并分配错误的权重。我的测量是以周为单位的。示例数据帧:

id requests day_of_week hour   weeks 
1    5        3       21   [1,2,3,4] 
2    5        3.      22   [2,4]

Expected output:
id requests day_of_week hour   weeks   output   
1    0        3       21   [1,4]   see_function
2    5        3.      22   [2,4]   see_function

I am defining the weighted mean function as follows:
# lambda function to compute the weighted mean:
r = 0.5
a = 1.0
wm = lambda x: np.average(x,weights=[a * r ** i for i in range(len(x))].reverse())

df['output'] = df['weeks'].apply(wm,axis=1)

尽管如此,我做的事情是错误的,因为它每周(重复与否)都完全一样。我试图找到一个聪明的解决方案,可以区分周是否重复,从而不分配虚构的权重。

我发布的加权平均值假设一个恒定的半衰期仅取决于测量的长度,并没有考虑我想要的。假设周的字典是 {2: 2,3:1,4:1},那么我会以某种方式利用出现的频率来调整我的加权平均值,以便比现在更多地关注最近的情况

解决方法

如果您想从周列表中删除重复项,那么您可以执行以下操作并在您的数据框和校准中添加新列。你加权平均。在它之上。

df = pd.DataFrame({'id':[1,4],'weeks':[[1,2,3,[2,4]]})
df['DistinctWeeks']=df['weeks'].apply(lambda x : list(set(x)))

输出:

enter image description here