我想计算一些日常观察的年度加权平均值。因此,我需要首先计算每天的加权平均值,然后找到一年中所有天的常规(均等加权)均值(下面是数据图和所需的输出)。
这是我无法使用的代码段:
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)我收到NaN
是什么错,(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
答案 0 :(得分: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']
答案 1 :(得分:0)
按照ecortazar的建议和数据示例,我认为下面的代码段是一种解决方法。
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