Pandas:计算。加权平均价格,使用 groupby / lambda 还是函数?
Pandas: Calc. weighted-average price, using groupby / lambda or function?
我有 DataFrame,其中 4 个不同的订单被分成第 3-12 行。正如您在下面的第 1、2 和 3 步中看到的那样,我正在使用 groupby 来实现 1 个订单 = 1 行。
但是我错过了一个关键步骤,计算每个订单的加权平均价格。目前第 2 步正在计算平均价格。
我想做的事情:
创建一个 function/lambda 可以计算每个订单的加权平均价格(可能基于 groupby 'Time' 列)。
- 订单 1 = 第 3、4 行
- 订单 2 = 第 5、6、7 行
- 订单 3 = 第 8、9 行
- 订单 4 = 第 10、11、10 行
加权平均价格的计算公式 = ((首价*金额)+(次价*金额))/总金额
订单 1 的加权平均价格 = ((660.33 * 0.0130) + (659.58 * 0.0070)) / 0.02 = 660.06750
第 1 步 - 原始 DataFrame:
| 1| Time | Market | Type | Price | Amount | Total | Fee | Acc |
| 2|-----------|-----------|-------|----------|---------|----------|----------|---------|
| 3| 22:12:15 | Market 1 | Buy | 660.33 | 0.0130 | 8.58429 | 0.00085 | MXG_33 |
| 4| 22:12:15 | Market 1 | Buy | 659.58 | 0.0070 | 4.61706 | 0.00055 | MXG_33 |
| 5| 19:36:08 | Market 1 | Sell | 670.00 | 0.0082 | 5.49400 | 0.00070 | MXG_33 |
| 6| 19:36:08 | Market 1 | Sell | 670.33 | 0.0058 | 3.88791 | 0.00048 | MXG_33 |
| 7| 19:36:08 | Market 1 | Sell | 671.23 | 0.0060 | 4.02738 | 0.00054 | MXG_33 |
| 8| 13:01:41 | Market 1 | Buy | 667.15 | 0.0015 | 1.00073 | 0.00011 | MXG_33 |
| 9| 13:01:41 | Market 1 | Buy | 667.10 | 0.0185 | 12.3414 | 0.00132 | MXG_33 |
|10| 07:14:36 | Market 1 | Sell | 657.55 | 0.0107 | 7.03579 | 0.00079 | MXG_33 |
|11| 07:14:36 | Market 1 | Sell | 657.08 | 0.0005 | 0.32854 | 0.00004 | MXG_33 |
|12| 07:14:36 | Market 1 | Sell | 656.59 | 0.0088 | 5.77799 | 0.00071 | MXG_33 |
第 2 步:将订单合并回 1 行 pr 订单:
d_agg = {'Market':'first'
,'Type':'first'
,'Price':'mean'
,'Amount':'sum'
,'Total':'sum'
,'Fee':'sum'
,'Acc':'first'}
(df.groupby('Time', sort=False)['Market','Type','Price','Amount','Total','Fee','Acc'].agg(d_agg).reset_index())
第 3 步 - 最终结果:(但 'Price' 列显示平均价格而不是加权平均价格)。
| 1| Time | Market | Type | Price | Amount | Total | Fee | Acc |
| 2|-----------|-----------|-------|----------|---------|-----------|----------|---------|
| 3| 22:12:15 | Market 1 | Buy | 659.955 | 0.0200 | 13.20135 | 0.00140 | MXG_33 |
| 4| 19:36:08 | Market 1 | Sell | 670.520 | 0.0200 | 13.40929 | 0.00172 | MXG_33 |
| 5| 13:01:41 | Market 1 | Buy | 667.125 | 0.0200 | 13.34213 | 0.00242 | MXG_33 |
| 6| 07:14:36 | Market 1 | Sell | 657.073 | 0.0200 | 13.14232 | 0.00154 | MXG_33 |
groupby 对象的 .apply 方法将允许您在组级别和 return 数据帧处理数据。
def fn(group):
group['weighted_avg'] = group['Price'] * group['Amount'] / group['Amount'].sum()
return group
d_agg = {'Market':'first'
,'Type':'first'
,'weighted_avg':'sum'
,'Amount':'sum'
,'Total':'sum'
,'Fee':'sum'
,'Acc':'first'}
df.groupby('Time', sort=False).apply(fn).groupby('Time').agg(d_agg)
# if you don't understand what the code is doing, try:
print(df.groupby('Time', sort=False).apply(fn))
我有 DataFrame,其中 4 个不同的订单被分成第 3-12 行。正如您在下面的第 1、2 和 3 步中看到的那样,我正在使用 groupby 来实现 1 个订单 = 1 行。
但是我错过了一个关键步骤,计算每个订单的加权平均价格。目前第 2 步正在计算平均价格。
我想做的事情:
创建一个 function/lambda 可以计算每个订单的加权平均价格(可能基于 groupby 'Time' 列)。
- 订单 1 = 第 3、4 行
- 订单 2 = 第 5、6、7 行
- 订单 3 = 第 8、9 行
- 订单 4 = 第 10、11、10 行
加权平均价格的计算公式 = ((首价*金额)+(次价*金额))/总金额
订单 1 的加权平均价格 = ((660.33 * 0.0130) + (659.58 * 0.0070)) / 0.02 = 660.06750
第 1 步 - 原始 DataFrame:
| 1| Time | Market | Type | Price | Amount | Total | Fee | Acc |
| 2|-----------|-----------|-------|----------|---------|----------|----------|---------|
| 3| 22:12:15 | Market 1 | Buy | 660.33 | 0.0130 | 8.58429 | 0.00085 | MXG_33 |
| 4| 22:12:15 | Market 1 | Buy | 659.58 | 0.0070 | 4.61706 | 0.00055 | MXG_33 |
| 5| 19:36:08 | Market 1 | Sell | 670.00 | 0.0082 | 5.49400 | 0.00070 | MXG_33 |
| 6| 19:36:08 | Market 1 | Sell | 670.33 | 0.0058 | 3.88791 | 0.00048 | MXG_33 |
| 7| 19:36:08 | Market 1 | Sell | 671.23 | 0.0060 | 4.02738 | 0.00054 | MXG_33 |
| 8| 13:01:41 | Market 1 | Buy | 667.15 | 0.0015 | 1.00073 | 0.00011 | MXG_33 |
| 9| 13:01:41 | Market 1 | Buy | 667.10 | 0.0185 | 12.3414 | 0.00132 | MXG_33 |
|10| 07:14:36 | Market 1 | Sell | 657.55 | 0.0107 | 7.03579 | 0.00079 | MXG_33 |
|11| 07:14:36 | Market 1 | Sell | 657.08 | 0.0005 | 0.32854 | 0.00004 | MXG_33 |
|12| 07:14:36 | Market 1 | Sell | 656.59 | 0.0088 | 5.77799 | 0.00071 | MXG_33 |
第 2 步:将订单合并回 1 行 pr 订单:
d_agg = {'Market':'first'
,'Type':'first'
,'Price':'mean'
,'Amount':'sum'
,'Total':'sum'
,'Fee':'sum'
,'Acc':'first'}
(df.groupby('Time', sort=False)['Market','Type','Price','Amount','Total','Fee','Acc'].agg(d_agg).reset_index())
第 3 步 - 最终结果:(但 'Price' 列显示平均价格而不是加权平均价格)。
| 1| Time | Market | Type | Price | Amount | Total | Fee | Acc |
| 2|-----------|-----------|-------|----------|---------|-----------|----------|---------|
| 3| 22:12:15 | Market 1 | Buy | 659.955 | 0.0200 | 13.20135 | 0.00140 | MXG_33 |
| 4| 19:36:08 | Market 1 | Sell | 670.520 | 0.0200 | 13.40929 | 0.00172 | MXG_33 |
| 5| 13:01:41 | Market 1 | Buy | 667.125 | 0.0200 | 13.34213 | 0.00242 | MXG_33 |
| 6| 07:14:36 | Market 1 | Sell | 657.073 | 0.0200 | 13.14232 | 0.00154 | MXG_33 |
groupby 对象的 .apply 方法将允许您在组级别和 return 数据帧处理数据。
def fn(group):
group['weighted_avg'] = group['Price'] * group['Amount'] / group['Amount'].sum()
return group
d_agg = {'Market':'first'
,'Type':'first'
,'weighted_avg':'sum'
,'Amount':'sum'
,'Total':'sum'
,'Fee':'sum'
,'Acc':'first'}
df.groupby('Time', sort=False).apply(fn).groupby('Time').agg(d_agg)
# if you don't understand what the code is doing, try:
print(df.groupby('Time', sort=False).apply(fn))