面板(T * N)数据的熊猫加权平均值

时间:2019-03-06 18:32:54

标签: python pandas numpy group-by average

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

这是我无法使用的代码段:

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

enter image description here

2 个答案:

答案 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