Я пытаюсь подсчитать общее количество транзакций (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])