Как я могу перебрать этот кадр данных панд быстрее? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть этот цикл, который перебирает фрейм данных и создает накопленное значение.У меня есть около 450 тыс. Строк в моем фрейме данных, и на его завершение уходит более 30 минут.

Вот заголовок моего фрейма данных:

timestamp  open   high  low     close   volume  vol_thrs    flg

1970-01-01 09:30:59 136.01  136.08  135.94  136.030 5379100 0.0 0.0
1970-01-01 09:31:59 136.03  136.16  136.01  136.139 759900  0.0 0.0
1970-01-01 09:32:59 136.15  136.18  136.10  136.180 609000  0.0 0.0
1970-01-01 09:33:59 136.18  136.18  136.07  136.100 510900  0.0 0.0
1970-01-01 09:34:59 136.11  136.15  136.05  136.110 306400  0.0 0.0

Столбец метки времени - это индекс.

Есть мысли о том, как мне сделать это быстрее?

for (i, (idx, row)) in enumerate(df.iterrows()):
    if i == 0:
        tmp_cum = df.loc[idx, 'volume']
    else:
        tmp_cum = tmp_cum + df.loc[idx, 'volume']

    if tmp_cum >= df.loc[idx, 'vol_thrs']:
        tmp_cum = 0
        df.loc[idx, 'flg'] = 1

1 Ответ

0 голосов
/ 10 мая 2018

Попробуйте использовать df.at вместо df.loc, вот так:

for (i, (idx, row)) in enumerate(df.iterrows()):
if i == 0:
    tmp_cum = df.at[idx, 'volume']
else:
    tmp_cum = tmp_cum + df.at[idx, 'volume']

if tmp_cum >= df.at[idx, 'vol_thrs']:
    tmp_cum = 0
    df.at[idx, 'flg'] = 1

df.at теоретически должен работать лучше. df.at лучше, если вы обращаетесь к единственному значению данных, как в вашей функции. df.loc позволит вам делать нарезку, а df.at - нет.

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