Мне нужны более быстрые методы для оптимизации моего цикла - PullRequest
0 голосов
/ 18 марта 2020

Итак, я python новичок ie, ищу человека с идеей о том, как оптимизировать мой код. Я работаю с электронной таблицей с более чем 6000 строк, и эта часть моего кода кажется действительно неэффективной.

for x in range(0,len(df):
  if df.at[x,'Streak_currency'] != str(df.at[x,'Currency']):
      df.at[x, 'Martingale']  = df.at[x-1, 'Martingale'] + (df.at[x-1, 'Martingale'] )/64
      x+=1
      if df.at[x,'Streak_currency'] == str(df.at[x,'Currency']):
        x+=1

Это может занять до 8 минут. С моим ограниченным знанием мне удается изменить только df.lo c на df.at, и это очень помогло. Но я х

ОБНОВЛЕНИЕ

В этом разделе кода я пытаюсь применить функцию на основе предыдущего значения, пока не будет выполнено определенное условие, в в этом случае df.at [x, 'Streak_currency']! = str (df.at [x, 'Currency']):

Я действительно не понимаю Не знаю, почему эта итерация занимает так много времени. Теоретически, он должен смотреть только на предыдущее значение и применять функцию. Вот пример вывода:

Periodo Currency ... Agrupamento Martingale 0 1 GBPUSD 1 1.583720 <--- starts aplying a function over and over. 1 1 GBPUSD 1 1.608466 2 1 GBPUSD 1 1.633598 3 1 GBPUSD 1 1.659123 4 1 GBPUSD 1 1.685047 5 1 GBPUSD 1 1.711376 <- stops aplying, since Currency changed 6 1 EURCHF 2 1.256550 7 1 USDCAD 3 1.008720 <- starts applying again until currency changes 8 1 USDCAD 3 1.024481 9 1 USDCAD 3 1.040489 10 1 GBPAUD 4 1.603080

1 Ответ

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

Pandas поиски типа df.at[x,'Streak_currency'] не эффективны. Действительно, для каждой оценки выражения такого типа (несколько раз за l oop итерацию) pandas извлекает столбец относительно его имени и затем извлекает значение в списке. Вы можете избежать этих затрат на вычисления, просто сохраняя столбцы в переменных до l oop. Кроме того, вы можете поместить столбец в массив numpy, чтобы можно было извлечь значение более эффективным способом (при условии, что все значения имеют одинаковый тип). Наконец, использование преобразования строк и сравнения строк на целых числах неэффективно. Их можно избежать здесь (при условии, что целые числа не слишком велики).

Вот пример:

import numpy as np
streakCurrency = np.array(df['Streak_currency'], dtype=np.int64)
currency = np.array(df['Currency'], dtype=np.int64)
martingale = np.array(df['Martingale'], dtype=np.float64)
for x in range(len(df)):
    if streakCurrency[x] != currency[x]:
        martingale[x] = martingale[x-1] * (65./64.)
        x+=1
        if streakCurrency[x] == currency[x]:
            x+=1
# Update the pandas dataframe
df['Martingale'] = martingale

Это должно быть как минимум на порядок быстрее.

Обратите внимание, что второе условие бесполезно, поскольку сравниваемые значения не могут быть одинаковыми и разными в одно и то же время (это может быть ошибкой в ​​вашем коде) ...

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