pandas - 面板数据中的熊猫时间加权平均分组比
问题描述
嗨我有一个面板数据集看起来像
stock date time spread1 weight spread2
VOD 01-01 9:05 0.01 0.03 ...
VOD 01-01 9.12 0.03 0.05 ...
VOD 01-01 10.04 0.02 0.30 ...
VOD 01-02 11.04 0.02 0.05
... ... ... .... ...
BAT 01-01 0.05 0.04 0.03
BAT 01-01 0.07 0.05 0.03
BAT 01-01 0.10 0.06 0.04
我想计算spread1
每天每只股票的加权平均值。我可以将解决方案分为几个步骤。即我可以应用函数来获取dataframe1中每天每只股票的spread1*weight之和,然后计算dataframe2中每天每只股票的权重之和groupby
。agg
之后merge
两个数据集并获得spread1的加权平均值。
我的问题是有什么简单的方法来计算 spread1 的加权平均值吗?我也有spread2、spread3和spread4。所以我想写尽可能少的代码。谢谢
解决方案
IIUC,您需要transform
将结果恢复为原始结果,但是使用.transform
依赖于两列的输出很棘手。我们编写自己的函数,在其中传递一系列展开s
和原始 DataFrame df
,因此我们也可以使用权重:
import numpy as np
def weighted_avg(s, df):
return np.average(s, weights=df.loc[df.index.isin(s.index), 'weight'])
df['spread1_avg'] = df.groupby(['stock', 'date']).spread1.transform(weighted_avg, df)
输出:
stock date time spread1 weight spread1_avg
0 VOD 01-01 9:05 0.01 0.03 0.020526
1 VOD 01-01 9.12 0.03 0.05 0.020526
2 VOD 01-01 10.04 0.02 0.30 0.020526
3 VOD 01-02 11.04 0.02 0.05 0.020000
4 BAT 01-01 0.05 0.04 0.03 0.051000
5 BAT 01-01 0.07 0.05 0.03 0.051000
6 BAT 01-01 0.10 0.06 0.04 0.051000
如果需要多列:
gp = df.groupby(['stock', 'date'])
for col in [f'spread{i}' for i in range(1,5)]:
df[f'{col}_avg'] = gp[col].transform(weighted_avg, df)
或者,如果您不需要转换回来并且想要每个股票日期的价值:
def my_avg2(gp):
avg = np.average(gp.filter(like='spread'), weights=gp.weight, axis=0)
return pd.Series(avg, index=[col for col in gp.columns if col.startswith('spread')])
### Create some dummy data
df['spread2'] = df.spread1+1
df['spread3'] = df.spread1+12.1
df['spread4'] = df.spread1+1.13
df.groupby(['stock', 'date'])[['weight'] + [f'spread{i}' for i in range(1,5)]].apply(my_avg2)
# spread1 spread2 spread3 spread4
#stock date
#BAT 01-01 0.051000 1.051000 12.151000 1.181000
#VOD 01-01 0.020526 1.020526 12.120526 1.150526
# 01-02 0.020000 1.020000 12.120000 1.150000
推荐阅读
- regex - 正则表达式:匹配引号中字符集的第二次出现
- php - curl_init 函数返回空 php
- intellij-idea - IntelliJ:如何配置已经在版本控制下的字典?
- react-native - React Native:如何从子组件更改父组件的状态并重新渲染父组件?
- angular - 如何在角度 4 中验证日期
- java - 使用正确的数据值自动创建新的 Java 对象
- time - Fiware Cosmos OAuth2 Token 时间增加
- highcharts - Highchart:Flags 在设置极端时出现缺货图表
- excel - 在较长期间内找到较短的天数进行计算
- android - 为什么在 Constraintlayout 中为视图提供偏差约束会影响调整动画大小?