группировка по нескольким столбцам и применение различных функций - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь урезать некоторые торговые отчеты: оригинальный отчет выглядит следующим образом:

AssetClass  Symbol  UnderlyingSymbol    Multiplier  Strike  Expiry  Put/Call    DateTime     
Quantity    TradePrice  Commission  Buy/Sell
OPT ADBE  200221C00385000   ADBE    100 385 20200221    C   20200218,114515 1   1.4 2.5 BUY
OPT ADBE  200221C00385000   ADBE    100 385 20200221    C   20200218,114515 2   1.31    4.5 BUY

Я хотел бы объединить его следующим образом:

AssetClass  Symbol  UnderlyingSymbol    Multiplier  Strike  Expiry  Put/Call    DateTime     
Quantity    TradePrice  Commission  Buy/Sell
OPT ADBE  200221C00385000   ADBE    100 385 20200221    C   20200218,114515 3   1.34    7   BUY

Таким образом, группировка по столбцам Символ и Buy / Sell с функцией суммы, примененной к количеству и комиссии, и средневзвешенным значением для столбца TradePrice.

df = pd.read_csv(filename)
wm = lambda x: np.average(x, weights=df.loc[x.index, "Quantity"])
f = {'Quantity': 'sum', 'Commission': 'sum'}
df.groupby(['Symbol', 'Buy/Sell']).agg(f)

У меня несколько выпусков

  1. выход забывает "другие столбцы, и если я добавлю эти столбцы в группу, я получу некоторые пробелы тут и там

  2. как я могу применить функцию wm к столбцу TradePrice?

  3. для столбца DateTime (формат «гггммдд, ччммсс»), я хотел бы получить только дату (которая одинакова для всех строк)

Вот вывод, когда я добавляю столбец AssetClass, например:

                                               Quantity  Commission
AssetClass Symbol                Buy/Sell                                     
OPT        ACN   200221P00212500 SELL            -3      0.003649
           ACN   200320C00215000 BUY              9     -6.694200
           ACN   200320P00215000 BUY              9     -6.694200
           XYZ  200221C00385000 BUY              2     -1.677600
                                 SELL            -4     -1.794891

1 Ответ

1 голос
/ 23 февраля 2020

Для удаления времен из столбца Datetime используйте Series.str.split:

df['DateTime'] = df['DateTime'].str.split(',').str[0]

Для добавления новой функции добавьте ее в словарь, как другие функции:

wm = lambda x: np.average(x, weights=df.loc[x.index, "Quantity"])
f = {'Quantity': 'sum', 'Commission': 'sum', 'TradePrice':wm}

Последнее, если необходимо, избежать потерянных столбцов и одинаковых значений для групп из столбцов Symbol и Buy/Sell. Добавьте его в groupby:

cols = ['AssetClass', 'Symbol', 'UnderlyingSymbol', 'Multiplier', 'Strike',
         'Expiry', 'Put/Call', 'DateTime', 'Buy/Sell']
df1 = df.groupby(cols).agg(f).reset_index()
print (df1)
  AssetClass                Symbol UnderlyingSymbol  Multiplier  Strike  \
0        OPT  ADBE 200221C00385000             ADBE         100     385   

     Expiry Put/Call  DateTime Buy/Sell  Quantity  Commission  TradePrice  
0  20200221        C  20200218      BUY         3         7.0        1.34 

Если имена столбцов не совпадают группы столбцов Symbol и Buy/Sell необходимо указать для каждой функции агрегирования столбцов и добавить в словарь, например, для AssetClass добавлено first и для Multiplier используется mean:

df['DateTime'] = df['DateTime'].str.split(',').str[0]

wm = lambda x: np.average(x, weights=df.loc[x.index, "Quantity"])

f = {'Quantity': 'sum', 
     'Commission': 'sum', 
     'TradePrice':wm, 
     'AssetClass':'first', 
     'Multiplier':'mean', ....}

df2 = df.groupby(['Symbol', 'Buy/Sell']).agg(f).reset_index()
print (df2)
                 Symbol Buy/Sell  Quantity  Commission  TradePrice AssetClass  \
0  ADBE 200221C00385000      BUY         3         7.0        1.34        OPT   

   Multiplier  
0         100   
...