Как переслать филлну с помощью индекса времени - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь подсчитать общее количество транзакций (ex) B, W, S, R, D ..) для каждой транзакции, используя идентификатор группы и tradeType за последние 1 час, используя временной индекс.

Я использовал groupby (['Id', 'tradeType']) и Rolling ('60T') для подсчета каждого типа накопленной сделки для каждой транзакции в час.

DataFrame

index               Id  tradeType  
timestamp           
2018-07-17 16:59:57 1   D     
2018-07-17 17:30:31 1   W     
2018-07-16 15:18:18 2   B     
2018-07-16 15:20:19 2   S     
2018-07-16 15:21:37 2   B     
2018-07-16 15:21:47 2   S    
2018-07-16 15:24:01 2   B    
2018-07-16 15:24:07 2   S    
2018-07-16 15:24:29 2   B    
2018-07-16 15:24:35 2   S     
2018-07-16 15:24:47 2   B     
2018-07-16 15:24:54 2   S    
2018-07-16 15:29:23 2   R     
2018-07-16 15:39:24 2   R     
2018-07-16 15:48:23 2   R     
2018-07-16 16:23:24 2   D     
2018-07-17 12:02:39 2   D    
2018-07-17 12:03:34 2   W    
2018-07-17 12:22:39 2   B    
2018-07-17 12:23:44 2   S
df['B_count_60T'] = df[df['trade']=='B'].groupby(['Id','tradeType'])['memberId'].transform(lambda x: x.rolling('60T').count())
df['S_count_60T'] = df[df['trade']=='S'].groupby(['Id','tradeType'])['memberId'].transform(lambda x: x.rolling('60T').count())
df['D_count_60T'] = df[df['trade']=='D'].groupby(['Id','tradeType'])['memberId'].transform(lambda x: x.rolling('60T').count())
df['W_count_60T'] = df[df['trade']=='W'].groupby(['Id','tradeType'])['memberId'].transform(lambda x: x.rolling('60T').count())
df['R_count_60T'] = df[df['trade']=='R'].groupby(['Id','tradeType'])['memberId'].transform(lambda x: x.rolling('60T').count())

После скользящего кода

                    Id  tradeType   B   S   D   W   R   (_count_60T)
timestamp                           
2018-07-17 16:59:57 1   D           nan nan 1   nan nan
2018-07-17 17:30:31 1   W           nan nan nan 1   nan
2018-07-16 15:18:18 2   B           1   nan nan nan nan
2018-07-16 15:20:19 2   S           nan 1   nan nan nan
2018-07-16 15:21:37 2   B           2   nan nan nan nan
2018-07-16 15:21:47 2   S           nan 2   nan nan nan
2018-07-16 15:24:01 2   B           3   nan nan nan nan
2018-07-16 15:24:07 2   S           nan 3   nan nan nan
2018-07-16 15:24:29 2   B           4   nan nan nan nan
2018-07-16 15:24:35 2   S           nan 4   nan nan nan
2018-07-16 15:24:47 2   B           5   nan nan nan nan
2018-07-16 15:24:54 2   S           nan 5   nan nan nan
2018-07-16 15:29:23 2   R           nan nan nan nan 1
2018-07-16 15:39:24 2   R           nan nan nan nan 2
2018-07-16 15:48:23 2   R           nan nan nan nan 3
2018-07-16 16:23:24 2   D           nan nan 1   nan nan
2018-07-17 12:02:39 2   D           nan nan 1   nan nan
2018-07-17 12:03:34 2   W           nan nan nan 1   nan
2018-07-17 12:22:39 2   B           1   nan nan nan nan
2018-07-17 12:23:44 2   S           nan 1   nan nan nan     

А затем я попытался заполнить nan правильным значением, учитывая, что все значения подсчитываются транзакцией 1 час. но это не было легко решено.

Есть ли какой-нибудь хороший способ сделать эту таблицу, используя скользящий код?

Я хочу создать таблицу, как показано ниже

                    Id  tradeType   B   S   D   W   R   (_count_60T)
timestamp                           
2018-07-17 16:59:57 1   D           0   0   1   0   0
2018-07-17 17:30:31 1   W           0   0   1   1   0
2018-07-16 15:18:18 2   B           1   0   0   0   0
2018-07-16 15:20:19 2   S           1   1   0   0   0
2018-07-16 15:21:37 2   B           2   1   0   0   0
2018-07-16 15:21:47 2   S           2   2   0   0   0
2018-07-16 15:24:01 2   B           3   2   0   0   0
2018-07-16 15:24:07 2   S           3   3   0   0   0
2018-07-16 15:24:29 2   B           4   3   0   0   0
2018-07-16 15:24:35 2   S           4   4   0   0   0
2018-07-16 15:24:47 2   B           5   4   0   0   0
2018-07-16 15:24:54 2   S           5   5   0   0   0
2018-07-16 15:29:23 2   R           5   5   0   0   1
2018-07-16 15:39:24 2   R           5   5   0   0   2
2018-07-16 15:48:23 2   R           5   5   0   0   3
2018-07-16 16:23:24 2   D           3   3   1   0   3
2018-07-17 12:02:39 2   D           0   0   1   0   0
2018-07-17 12:03:34 2   W           0   0   1   1   0
2018-07-17 12:22:39 2   B           1   0   1   1   0
2018-07-17 12:23:44 2   S           1   1   1   1   0   

Еще Попробуй создать эту таблицу без использования скользящего кода

Это сработало, но это заняло так много времени только для делает 1 столбец ..

df_cnt = pd.DataFrame()

df = df.reset_index()
df['timestamp_before_60T'] = df['timestamp'] - timedelta(hours=1)

for row in df.itertuples():
    col_Id = getattr(row, 'Id')
    col_timestamp = getattr(row, 'timestamp')
    col_timestamp_before_60T = getattr(row, 'timestamp_before_60T')

    tmp = df[(df['memberId']==col_Id)&(df['timestamp']<=col_timestamp)&(df['timestamp']>=col_timestamp_before_60T)]
    tmp_2 = tmp.groupby(['Id']).apply(lambda x: (x['tradeType']=='B').sum())
    df_cnt = pd.concat([df_cnt, tmp_2])        

1 Ответ

0 голосов
/ 19 марта 2020

IIU C используйте get_dummies, затем groupby ID и rolling:

s = (df.join(pd.get_dummies(df["tradeType"]))).sort_index()

print (s.groupby("Id").rolling("60T").sum().drop("Id",1).reset_index())

    Id             level_1    B    D    R    S    W
0    1 2018-07-17 16:59:57  0.0  1.0  0.0  0.0  0.0
1    1 2018-07-17 17:30:31  0.0  1.0  0.0  0.0  1.0
2    2 2018-07-16 15:18:18  1.0  0.0  0.0  0.0  0.0
3    2 2018-07-16 15:20:19  1.0  0.0  0.0  1.0  0.0
4    2 2018-07-16 15:21:37  2.0  0.0  0.0  1.0  0.0
5    2 2018-07-16 15:21:47  2.0  0.0  0.0  2.0  0.0
6    2 2018-07-16 15:24:01  3.0  0.0  0.0  2.0  0.0
7    2 2018-07-16 15:24:07  3.0  0.0  0.0  3.0  0.0
8    2 2018-07-16 15:24:29  4.0  0.0  0.0  3.0  0.0
9    2 2018-07-16 15:24:35  4.0  0.0  0.0  4.0  0.0
10   2 2018-07-16 15:24:47  5.0  0.0  0.0  4.0  0.0
11   2 2018-07-16 15:24:54  5.0  0.0  0.0  5.0  0.0
12   2 2018-07-16 15:29:23  5.0  0.0  1.0  5.0  0.0
13   2 2018-07-16 15:39:24  5.0  0.0  2.0  5.0  0.0
14   2 2018-07-16 15:48:23  5.0  0.0  3.0  5.0  0.0
15   2 2018-07-16 16:23:24  3.0  1.0  3.0  3.0  0.0
16   2 2018-07-17 12:02:39  0.0  1.0  0.0  0.0  0.0
17   2 2018-07-17 12:03:34  0.0  1.0  0.0  0.0  1.0
18   2 2018-07-17 12:22:39  1.0  1.0  0.0  0.0  1.0
19   2 2018-07-17 12:23:44  1.0  1.0  0.0  1.0  1.0
...