按其他数据框对数据框的列进行分组并计算聚合列的加权平均值

Grouping columns of dataframe by other dataframe and calculate weighted average of aggregated columns

我有一个包含四个时间序列的 DataFrame df1。我想根据 DataFrame groups 将这些时间序列聚合起来,该数据帧将各个时间序列分为两组。此外,我有一个 DataFrame weights,它定义了组内时间序列的权重因子(随时间变化)。

我试图得到的是一个 DataFrame df2,它具有基于组聚合的时间序列并用加权因子加权。

这将是一个简单的例子:

import pandas as pd
df1 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[1.2, 2.3, 0.3, 0.5], 
    '02K W':[3.5, 0.1, 'nan', 'nan'], 
    '03K W':[4.2, 5.2, 2.5, 3.0], 
    '04K W':[1.5, 2.6, 8.2, 4.2]}) 

groups = pd.DataFrame({
    'ID':['01K W', '02K W', '03K W', '04K W'],
    'Group':['Group1', 'Group1', 'Group2', 'Group1']}) 

weights = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[0.5, 0.5, 0.25, 0.5], 
    '02K W':[0.25, 0.25, 'nan', 'nan'], 
    '03K W':[1, 1, 1, 1], 
    '04K W':[0.25, 0.25, 0.75, 0.5]}) 

df2 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    'Group1':[1.85, 1.82, 6.23, 2.35], 
    'Group2':[4.2, 5.2, 2.5, 3.0]})

df2中的第一个元素(=1.85)计算为: 1.2x0.5 + 3.5x0.25 + 1.5x0.25

组 1 的值:1.2、3.5 和 1.5 ('2021-01-01')

第 1 组的权重因子:0.5、0.25 和 0.25('2021-01-01')

  1. df1乘以weights
  2. stackmap 组的列名
  3. groupby“日期”和组 ("level_1") 和 sum
  4. unstack 并格式化为所需的输出
output = df1.set_index("Date").mul(weights.set_index("Date")).stack().reset_index(1)
output = (output.groupby([output.index, 
                          output["level_1"].map(dict(zip(groups["ID"],groups["Group"])))])
          .sum()
          .unstack()
          .droplevel(0,1)
          .rename_axis(None, axis=1)
          )

>>> output
            Group1  Group2
Date                      
2021-01-01   1.850     4.2
2021-01-02   1.825     5.2
2021-01-03   6.225     2.5
2021-01-04   2.350     3.0