【问题标题】:if negative then with weighted average如果为负,则采用加权平均
【发布时间】:2016-09-06 01:59:54
【问题描述】:

我有一个数据框:

a = {'Price': [10, 15, 20, 25, 30], 'Total': [10000, 12000, 15000, 14000, 10000],
 'Previous Quarter': [0, 10000, 12000, 15000, 14000]}
a = pd.DataFrame(a)
print (a)

利用这些原始数据,我添加了一些额外的列,包括加权平均价格 (WAP)

a['Change'] = a['Total'] - a['Previous Quarter']
a['Amount'] = a['Price']*a['Change']
a['Cum Sum Amount'] = np.cumsum(a['Amount'])
a['WAP'] = a['Cum Sum Amount'] / a['Total']

这很好,但是随着总数开始减少,这会降低加权平均价格。

我的问题是,如果 Total 减少,我将如何让 WAP 反映上面的行?例如,在第 3 行,Total 为 1000,低于第 2 行。这使 WAP 从 12.6 下降到 11.78,但我希望它说 12.6 而不是 11.78。

我尝试循环遍历 a['Total']

最终,我正在寻找一个 WAP 专栏,内容如下: 10, 10.83, 12.6, 12.6, 12.6

【问题讨论】:

  • 我有大约一周的 Python 经验,但是 a['WAP'] = np.maximum.accumulate(a['Cum Sum Amount'] / a['Total']) 不适合你吗?

标签: python pandas


【解决方案1】:

你可以使用cummax

a['WAP'] = (a['Cum Sum Amount'] / a['Total']).cummax()

print (a['WAP'])

0    10.000000
1    10.833333
2    12.666667
3    12.666667
4    12.666667
Name: WAP, dtype: float64

【讨论】:

    【解决方案2】:

    作为一个 Python 初学者,我可以想到以下两个选项

    要么

    a['WAP'] = np.maximum.accumulate(a['Cum Sum Amount'] / a['Total'])
    

    或者在您已经创建 WAP 之后,您可以使用 diff 方法仅修改子集(感谢 @ayhan 的 loc,它将修改 a 到位)

    a.loc[a['WAP'].diff() < 0, 'WAP'] = max(a['WAP'])
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2016-11-09
    • 2017-01-07
    • 2015-06-02
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多