【问题标题】:Pandas weighted average for panel (T*N) data面板 (T*N) 数据的 Pandas 加权平均值
【发布时间】:2019-07-28 12:34:40
【问题描述】:

我想计算一些日常观察的年度加权平均值。因此,我需要首先计算每一天的加权平均值,然后找到一年中所有日子的常规(同等加权)平均值(数据图片和所需输出如下。)

这是我不工作的代码 sn-p:

def ave_annual(s):
    return s.groupby(s.index.year).mean()


wav = lambda x: np.average(x['premium'], weights=x.tna)

df.groupby('date').apply(wav).pipe(ave_annual)

第一个聚合(在日期(天)级别)返回所有NaN

我设法以逐步缓慢的方式计算平均值:

master_2 = (master_1.assign(tna_sum =  master_1.groupby('date')
.tna.transform('sum'))[lambda x: x['tna_sum'] > 0 ]

res_premium = master_2.groupby(
'date')['prem_wieghted2'].sum().pipe(ave_annual)

我想知道 (1) 我收到 NaNs 有什么问题,以及 (2) 我如何使用这种方法 (np.average) 来计算两个变量的平均值。

数据:

date	ticker	premium	spread	tna
3/4/2013	x	-0.69	0.1261	7.2329
3/4/2013	y	0.096	0.296	49.496
3/4/2013	x	0.142	0.4352	167.5251
3/6/2013	x	-0.69	0.1261	7.2329
3/6/2013	z	0.096	0.296	49.496
3/6/2013	y	0.084	0.21	110
3/4/2019	x	NaN	0.1392	16.431
3/4/2019	y	NaN	NaN	100.6774

【问题讨论】:

  • 如果你需要帮助,你应该建立一个最小的样本数据......

标签: python pandas numpy group-by average


【解决方案1】:

我想你要找的操作是groupby(...).transform(...)

你的例子很难学。这是一个更简单的示例:在这种情况下,我从 weight_source 列计算年度权重,并将其应用于 data 列。

df = pd.DataFrame({'data': np.random.rand(1000), 
                   'weight_source': np.random.rand(1000)},
                  index=pd.date_range(start=dt.datetime(2010, 1, 1), periods=1000, freq='D'))

year_sum = df['weight_source'].groupby(df.index.year).transform('sum')

weights = df['weight_source'] / year_sum

weights * df['data']

【讨论】:

    【解决方案2】:

    根据 ecortazar 的建议和数据样本,我认为下面的 sn-p 是一种解决方法。

    df = pd.DataFrame({'data': np.random.rand(1000), 
                       'weight_source': np.random.rand(1000)},
                      index=pd.date_range(start="2010/01/01", periods=1000, freq='D'))
    def ave_annual(s):
        return s.groupby(s.index.year).mean()
    
    
    (df.groupby(df.index).apply(lambda x: (x['data'] * x['weight_source']
    .div(x['weight_source'].sum())).sum())
    .pipe(ave_annual))
    

    结果:

        2010    0.535598
        2011    0.493956
        2012    0.517653
    

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 2019-10-05
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      相关资源
      最近更新 更多