Я пытаюсь вычислить средневзвешенную цену в сводной таблице Pandas.
Я пытался использовать групповую передачу, которая отлично работает с np.average
.Однако я не смог воспроизвести его с помощью pd.pivot_table
.
У меня есть DataFrame, построенный из словаря:
dict_data = {
'Contract' : ['Contract 1', 'Contract 2', 'Contract 3', 'Contract 4', 'Contract 5', 'Contract 6', 'Contract 7', 'Contract 8', 'Contract 9', 'Contract 10', 'Contract 11', 'Contract 12'],
'Contract_Date': ['01/01/2019', '02/02/2019', '03/03/2019', '04/03/2019', '01/01/2019', '02/02/2019', '03/03/2019', '04/03/2019', '01/01/2019', '02/02/2019', '03/03/2019', '04/03/2019'],
'Product': ['A','A','A','A','B','B','B','B', 'C','C','C','C'],
'Delivery' : ['2019-01', '2019-01', '2019-02', '2019-03', '2019-01', '2019-01', '2019-02', '2019-03', '2019-01', '2019-01', '2019-02', '2019-03'],
'Price' : [90, 95, 100, 105, 90, 95, 100, 105, 90, 95, 100, 105],
'Balance': [50, 100, 150, 200, 50, 100, 150, 200, 50, 100, 150, 200]
}
df = pd.DataFrame.from_dict(dict_data)
df
Contract Contract_Date Product Delivery Price Balance
0 Contract 1 01/01/2019 A 2019-01 90 50
1 Contract 2 02/02/2019 A 2019-01 95 100
2 Contract 3 03/03/2019 A 2019-02 100 150
3 Contract 4 04/03/2019 A 2019-03 105 200
4 Contract 5 01/01/2019 B 2019-01 90 50
5 Contract 6 02/02/2019 B 2019-01 95 100
6 Contract 7 03/03/2019 B 2019-02 100 150
7 Contract 8 04/03/2019 B 2019-03 105 200
8 Contract 9 01/01/2019 C ` 2019-01 90 50
9 Contract 10 02/02/2019 C 2019-01 95 100
10 Contract 11 03/03/2019 C 2019-02 100 150
11 Contract 12 04/03/2019 C 2019-03 105 200
Средневзвешенное вычисление с использованием groupby:
df.groupby(['Product', 'Delivery']).apply(lambda x: np.average(x.Price, weights=x.Balance))
Вывод:
Product Delivery
A 2019-01 93.333333
2019-02 100.000000
2019-03 105.000000
B 2019-01 93.333333
2019-02 100.000000
2019-03 105.000000
C 2019-01 93.333333
2019-02 100.000000
2019-03 105.000000
Пробовал и застрял на следующем:
# Define a dictionary with the functions to apply for a given column:
f = {'Balance': ['sum'], 'Price': [np.average(df.Price, weights=df.Balance)] }
# Construct a pivot table, applying the weighted average price function to 'Price'
df.pivot_table(
columns='Delivery',
values=['Balance', 'Price'],
index='Product',
aggfunc=f
).swaplevel(1,0,axis=1).sort_index(axis=1)
Ожидаемый вывод (который показывает 2 значения Balance
и Price
) подобщий столбец Delivery
:
Delivery 2019-01 2019-02 2019-03
Balance Price Balance Price Balance Price
Product
A 150 93.333 150 100 200 105
B 150 93.333 150 100 200 105
C 150 93.333 150 100 200 105