Как вернуть значение столбца на основе целочисленного индекса и другого значения столбца в пандах? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть df, который я хочу сгруппировать Date и применить к нему функцию.

          Date      Symbol    Shares 
0   1990-01-01      A         0.0        
1   1990-01-01      B         0.0        
2   1990-01-01      C         0.0         
3   1990-01-01      D         0.0  
4   1990-01-02      A         50.0     
5   1990-01-02      B         100.0      
6   1990-01-02      C         66.0      
7   1990-01-02      D         7.0       
8   1990-01-03      A         11.0      
9   1990-01-03      B         123.0      
10  1990-01-03      C         11.0      
11  1990-01-03      D         11.0      

Я смогу получить доступ к значению Shares для Symbol изпредыдущий Date в функции.Как я могу это сделать?Создание df[prev_shares] наподобие df.groupby('Symbol')['Shares'].shift(1) перед применением функции не вариант, потому что функция вычисляет Shares строка за строкой.
Это должно выглядеть следующим образом:

def calcs(x):
    x.loc[some_condition, 'Shares'] = ...
    x.loc[other_condition, 'Shares'] = # return 'Shares' from previous 'Date' for this 'Symbol'

df = df.groupby('Date').apply(calcs)

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ:

Я отправляю созданную мной функцию.

Equity = 10000

def calcs(x):

    global Equity

    if x.index[0]==0: return x

    x.loc[x['condition'] == True, 'Shares'] = np.floor((Equity * 0.02 / x['ATR']).astype(float))

    x.loc[x['condition'] == False, 'Shares'] = # locate Symbol for the previous Date and return its Shares value

    x['Closed_P/L'] = x['Shares'] * x['Close']
    Equity += x['Closed_P/L'].sum()

    return x

data = data.groupby('Date').apply(calcs)

1 Ответ

0 голосов
/ 27 ноября 2018

IIUC что-то вроде этого может помочь, хотя то, что вы пытаетесь достичь в итоге, неясно.Ниже вы найдете данные, сгруппированные по символам и датам.Колонка 'diff' показывает инкрементальное P / L.

, пожалуйста, сообщите, что вам нужно дополнительно.

df =  data.set_index(['Symbol', 'Date']).sort_index()[['Shares']]
df['diff'] = np.nan
idx = pd.IndexSlice

for ix in df.index.levels[0]:
    df.loc[ idx[ix,:], 'diff'] = df.loc[idx[ix,:], 'Shares' ].diff()

df.fillna(0)

                   Shares   diff
Symbol Date                     
A      1990-01-01     0.0    0.0
       1990-01-02    50.0   50.0
       1990-01-03    11.0  -39.0
B      1990-01-01     0.0    0.0
       1990-01-02   100.0  100.0
       1990-01-03   123.0   23.0
C      1990-01-01     0.0    0.0
       1990-01-02    66.0   66.0
       1990-01-03    11.0  -55.0
D      1990-01-01     0.0    0.0
       1990-01-02     7.0    7.0
       1990-01-03    11.0    4.0
...