【问题标题】:Calculate weighted average based on 2 columns using a pandas/dataframe使用 pandas/dataframe 基于 2 列计算加权平均值
【发布时间】:2019-08-29 21:28:45
【问题描述】:

我有以下数据框 df。我想计算按每个日期和部门级别分组的加权平均值

 date     Equity    value    Sector   Weight
2000-01-31  TLRA    20      RG Index     0.20
2000-02-28  TLRA    30      RG Index     0.20
2000-03-31  TLRA    40      RG Index     0.20
2000-01-31   RA     50      RG Index     0.30
2000-02-28   RA     60      RG Index     0.30
2000-03-31   RA     70      RG Index     0.30
2000-01-31  AAPL    80      SA Index     0.50
2000-02-28  AAPL    90      SA Index     0.50
2000-03-31  AAPL    100     SA Index     0.50
2000-01-31  SPL     110     SA Index     0.60
2000-02-28  SPL     120     SA Index     0.60
2000-03-31  SPL     130     SA Index     0.60

Sector 下可以有多个 Equity。我想要基于权重列的部门级别加权平均值。

预期输出:

date        RG Index       SA Index
2000-01-31  19               106  
2000-02-28  24               117
2000-03-31  29               138 

我尝试了下面的代码,但没有得到预期的输出。请帮忙

g = df.groupby('Sector')
df['wa'] = df.value / g.value.transform("sum") * df.Weight
df.pivot(index='Sector', values='wa')

【问题讨论】:

  • 每组中您的体重总和!= 1。所以不太确定你的输出真的是平均值。您是否想将它们重新归一化以求和为 1,这是 np.average 之类的默认行为

标签: python pandas dataframe


【解决方案1】:

更像pivot 问题第一assign 一个新列作为valueweight 的产物

df.assign(V=df.value*df.Weight).pivot_table(index='date',columns='Sector',values='V',aggfunc='sum')
Out[328]: 
Sector      RGIndex  SAIndex
date                        
2000-01-31     19.0    106.0
2000-02-28     24.0    117.0
2000-03-31     29.0    128.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2018-05-23
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2023-03-10
    相关资源
    最近更新 更多