Группа By с sumproduct - PullRequest
       19

Группа By с sumproduct

0 голосов
/ 03 февраля 2019

Я работаю с df со следующей структурой:

df = DataFrame({'Date' : ['1', '1', '1', '1'],
            'Ref' : ['one', 'one', 'two', 'two'],
            'Price' : ['50', '65', '30', '35'],
            'MktPrice' : ['63', '63', '32', '32'],
            'Quantity' : ['10', '15', '20', '10'],
            'MarketQuantity': ['50', '50', '100', '100'],
            'Weightings' : ['2', '2', '4', '4'],
            'QxWeightings' : ['20', '30', '80', '40'],
            'MktQxWeightings': ['100', '100', '400', '400'],
            })   

Мне удалось получить взвешенный процент, который представляет мое количество из MarketQuantity, когда цена выше Mkt Price (и показать его какДата и ссылка)

def percentage(x):
    return (x.loc[x['Price'] >= x['MktPrice'], ['QxWeightings']].sum()/(x['MktQxWeightings'].sum()/len(x)))

df.groupby(['Date', 'Ref']).apply(percentage)

Date  Ref   Output 
1     one   0.3
1     two   0.1

Однако, когда я пытаюсь сгруппировать его только по дате, я получаю:

Date  Output 
1     0.4

, которая является суммой предыдущих выходных данных, когда она должна быть 0,14(30 + 40) / (100 + 400).

Как я могу сделать это с групповым?Большое спасибо заранее

1 Ответ

0 голосов
/ 03 февраля 2019

IIUC, может быть что-то вроде этого:

def percentage(x):
    return (x.loc[x['Price'] >= x['MktPrice'], ['QxWeightings']].sum()/(x['MktQxWeightings'].sum()/len(x)))

df_new=df.groupby(['Date', 'Ref','MktQxWeightings']).apply(percentage).reset_index()
print(df_new)

  Date  Ref  MktQxWeightings  QxWeightings
0    1  one              100           0.3
1    1  two              400           0.1

df_new.groupby('Date')['MktQxWeightings','QxWeightings'].apply(lambda x: x['QxWeightings'].\
                                                           cumsum().sum()*100/x['MktQxWeightings'].sum())

Date
1    0.14
...