如果为负则则加权平均值

时间:2016-09-05 17:16:05

标签: python pandas

我有一个DataFrame:

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。

我试过循环['Total']< 0然后['WAP'] = 0但这会影响整个列。

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

2 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:1)

作为一个完整的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'])