скользящая сумма панд, если критерии соблюдены, но критерии указаны в столбце

Я пытаюсь сделать скользящую сумму из 1000 строк. Я хочу суммировать все строки, где ClosePrice находится между ClosePrice_low и ClosePrice_high для каждой соответствующей строки и 999 над ней.

Например:

скользящий счетчик 1000: проверьте строки 0: 1000 и просуммируйте, если они находятся в диапазоне от 0,0000189375 до 0,0000185625 (также как найти все строки от 0 до 1000, которые находятся между ClosePrice_low и ClosePrice_high в строке 1000 и суммируют ClosePrice)

скользящий счетчик 1001: проверьте строки 1: 1001 и просуммируйте, если между 0,0000189476 и 0,0000185724

сделать это ниже не сработает:

tempdf['ClosePrice'][np.where(tempdf['ClosePrice'] < tempdf['ClosePrice_high'] & \
    tempdf['ClosePrice'] > tempdf['ClosePrice_low'],tempdf['ClosePrice'],0)].rolling(1000).sum()

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

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

Любая помощь будет принята с благодарностью!

      ClosePrice  ClosePrice_high  ClosePrice_low
1000   0.00001875     0.0000189375    0.0000185625
1001   0.00001876     0.0000189476    0.0000185724
1002   0.00001868     0.0000188668    0.0000184932
1003   0.00001869     0.0000188769    0.0000185031
1004   0.00001864     0.0000188264    0.0000184536
1005   0.00001855     0.0000187355    0.0000183645
1006   0.00001859     0.0000187759    0.0000184041
1007   0.00001862     0.0000188062    0.0000184338
1008   0.00001875     0.0000189375    0.0000185625
1009   0.00001868     0.0000188668    0.0000184932
1010  0.00001867     0.0000188567    0.0000184833
1011  0.00001862     0.0000188062    0.0000184338
1012  0.00001859     0.0000187759    0.0000184041
1013  0.00001867     0.0000188567    0.0000184833
1014  0.00001871     0.0000188971    0.0000185229
1015  0.00001881     0.0000189981    0.0000186219
1016  0.00001879     0.0000189779    0.0000186021
1017  0.00001877     0.0000189577    0.0000185823
1018  0.00001878     0.0000189678    0.0000185922
1019  0.00001875     0.0000189375    0.0000185625

person Federico Marchese    schedule 11.09.2018    source источник
comment
Это неясно. Вы имеете в виду, что для строки 1000 вы хотите найти все строки от 0 до 1000, которые находятся между ClosePrice_low и ClosePrice_high в строке 1000? Или все строки, где ClosePrice находится между ClosePrice_low и ClosePrice_high для каждой соответствующей строки?   -  person piRSquared    schedule 11.09.2018
comment
все строки, где ClosePrice находится между ClosePrice_low и ClosePrice_high для каждой соответствующей строки и 999 над ней   -  person Federico Marchese    schedule 11.09.2018


Ответы (1)


В том маловероятном случае, если я правильно понимаю вопрос:

df['cpl'] = df.ClosePrice_low.rolling(1000).max()
df['cph'] = df.ClosePrice_high.rolling(1000).min()
df = df[(df.ClosePrice <= df.cph) & (df.ClosePrice >= df.cpl)]
df.drop(['cpl', 'cph'], inplace=True)
df.sum()
person Igor Rivin    schedule 11.09.2018