【问题标题】:Pandas: Calc. weighted-average price, using groupby / lambda or function?熊猫:计算。加权平均价格,使用 groupby / lambda 或函数?
【发布时间】:2018-10-13 16:04:41
【问题描述】:

我有 DataFrame,其中 4 个唯一订单被分成第 3-12 行。正如您在下面的步骤 1、2 和 3 中看到的那样,我使用 groupby 来实现 1 个订单 = 1 行。

但是,我错过了一个关键步骤,即计算每个订单的加权平均价格。目前第 2 步是计算平均价格。

我想做的事:

创建一个函数/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 步 - 原始数据帧:

| 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 步 - 最终结果:(但“价格”列显示的是平均价格,而不是加权平均价格)。

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

【问题讨论】:

    标签: python pandas lambda group-by weighted-average


    【解决方案1】:

    groupby 对象的 .apply 方法允许您在组级别处理数据并返回一个数据框。

    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))
    

    【讨论】:

    • 完美!非常感谢最后一行帮助我了解您是如何做到的,有助于培养如何思考解决此类问题。
    猜你喜欢
    • 2014-11-30
    • 2019-11-02
    • 2018-04-29
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多