2016-09-05 3 views
2

У меня есть 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

+1

У меня есть около недели опыта в Python, но не будет просто «a ['WAP'] = np.maximum.accumulate (a ['Cum Sum Amount']/a ['Total'])' работает для вас? –

ответ

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

В общем новичок 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']) 
+0

Вы можете изменить второй на 'a.loc [a ['WAP']. Diff() <0, 'WAP'] = max (a ['WAP'])', чтобы избежать предупреждения. – ayhan

+1

@ayhan спасибо, я как раз собирался прочитать это http://stackoverflow.com/questions/17071871/select-rows-from-a-dataframe-based-on-values-in-a-column-in-pandas –

+0

Спасибо всем. Все работает хорошо. – ben121