Суммируйте значение по группам и кумулятивно добавляйте к отдельному списку или массиву кумулятивно и используйте последнее значение в условном выражении - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу суммировать значения для многоуровневого индекса панд данных.Затем я хотел бы добавить это значение к другому значению в совокупности.Затем я хотел бы использовать условный оператор, который зависит от последнего значения этого накопительного списка, для следующего значения индекса того же уровня.

Я смог суммировать значения для многоуровневогоиндекс, но не могу добавить это кумулятивно в список, который я сохранил отдельно.

Вот фрагмент моего фрейма данных.Кодов довольно много, но я чувствую, что необходимо полностью объяснить мою проблему:


import pandas as pd
import numpy as np

balance = [20000]

data = {'EVENT_ID': [112335580,112335580,112335580,112335580,112335580,112335580,112335580,112335580, 112335582,
                     112335582,112335582,112335582,112335582,112335582,112335582,112335582,112335582,112335582,
                     112335582,112335582,112335582],

 'SELECTION_ID': [6356576,2554439,2503211,6297034,4233251,2522967,5284417,7660920,8112876,7546023,8175276,8145908,
                  8175274,7300754,8065540,8175275,8106158,8086265,2291406,8065533,8125015],

     'BSP': [5.080818565,6.651493872,6.374683435,24.69510797,7.776082305,11.73219964,270.0383021,4,8.294425408,335.3223613,
         14.06040142,2.423340019,126.7205863,70.53780982,21.3328554,225.2711962,92.25113066,193.0151362,3.775394142,
         95.3786641,17.86333041],

        'WIN_LOSE':[0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0],

        'INDICATOR': [1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0],

        'POT_BET': [2.258394,2.257205,2.255795,2.255495,2.254286,2.250119,2.237375,2.120843,2.256831,2.253802,2.244174,2.232902,
                  2.226021,2.220088,2.160382,2.143235,2.141063,2.122452,2.095736,2.086548,2.065200],

 'LIABILITY': [2.258394,2.257205,12.124184,12.746919,15.275225,24.148729,53.014851,570.587899,2.256831,6.255188,
         16.369963,29.162601,37.538122,45.140722,150.228225,195.572610,202.070630,266.835913,402.412997,
         467.952670,690.442601]}


df = pd.DataFrame(data, columns=['EVENT_ID','SELECTION_ID','BSP','WIN_LOSE','INDICATOR','POT_BET','LIABILITY'])

df = df.sort_values(["EVENT_ID",'BSP'])  
df.set_index(['EVENT_ID', 'SELECTION_ID'], inplace=True) 


df['BET'] = np.where(df.groupby(level = 0)['LIABILITY'].transform('sum') < 0.75*balance[-1], df['POT_BET'], 0)

df.loc[(df.INDICATOR == 1) & (df.WIN_LOSE == 1), 'RESULT'] = df['BSP'] * df['BET'] - df['BET']
df.loc[(df.INDICATOR == 1) & (df.WIN_LOSE == 0), 'RESULT'] = - df['BET']

df.loc[(df.INDICATOR == 0) & (df.WIN_LOSE == 0), 'RESULT'] = df['BET']
df.loc[(df.INDICATOR == 0) & (df.WIN_LOSE == 1), 'RESULT'] = -df['BSP'] * df['BET'] + df['BET']

results = df.groupby('EVENT_ID')['RESULT'].sum()
balance.append(results)

Это дает следующий результат для списка баланса:


[20000, EVENT_ID
 112335580    23.872099
 112335582   -22.304487
 Name: RESULT, dtype: float64]

Я ожидаюСписок баланса должен быть:

balance = [20000, 20023.8721, 20001.56761]

Важно отметить, что значение баланса должно меняться для каждой итерации, и это новое значение используется в условном выражении.

Я также не уверен, чтосписок - самый эффективный способ достижения моих целей, но это немного другой вопрос.

Ура, Сэнди

1 Ответ

3 голосов
/ 02 апреля 2019

Давайте изменим баланс на pd.Series:

balance = pd.Series([20000])

Your code
#change this line
df['BET'] = np.where(df.groupby(level = 0)['LIABILITY'].transform('sum') < 0.75*balance.values.tolist()[-1], df['POT_BET'], 0)
Your code

balance = pd.concat([balance, results]).cumsum().tolist()

Вывод:

[20000.0, 20023.872099225347, 20001.567612410585]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...