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

Я пытаюсь ускорить тестирование своей торговой стратегии.

Прямо сейчас у меня есть

for i in trange(1, len(real_choice), disable=not backtesting, desc = "Converting HOLDs and calculating backtest correct/incorrect... [3/3]"):
      if (advice[i] == "HOLD"):
        advice[i] = advice[i-1]
      if (real_choice[i] == "HOLD"):
        real_choice[i] = real_choice[i-1]

      if advice[i] == real_choice[i]:
        correct[i] = "CORRECT"
      else:
        correct[i] =  "INCORRECT"

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

Я изучаю Python, так что это было просто и работало, но теперь я плачу за это тем, сколько времени занимает тестирование на истории.

Есть ли способ сделать это быстрее?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

correct = np.where( advice == real_choice
                     , "CORRECT", "INCORRECT)

но чтобы это выглядело больше панд, это было бы

df['correct'] = np.where( df['advice'] == df['real_choice']
                     , "CORRECT", "INCORRECT)

с некоторыми временными сравнениями (Полный код)

A = randint(0, 10, 10000)

B = randint(0, 10, 10000)

df = pd.DataFrame({'A': A, 'B':B, 'C': "INCORRECT"})
print(df)


start = time.process_time()
for i in range(0, len(real_choice)):
      if df['A'][i] == df['B'][i]:
        df['C'][i] = "CORRECT"
      else:
        df['C'][i] =  "INCORRECT"
print("method 1", time.process_time() - start)


start = time.process_time()
df['C2'] = np.where( df['A'] == df['B'], "CORRECT", "INCORRECT")
print("method 2", time.process_time() - start)

метод 2 занял меньше времени для вычисления

method 1 1.0530679999999997
method 2 0.0022619999999999862

Кажется, медленнее, к сожалению. Может я что-то не так делаю?

jangles 11.12.2020 04:25

Хм, я думаю да, я сравнивал время, пожалуйста, смотрите редактирование

Norton409 15.12.2020 02:48

Теперь я вижу, у меня действительно это работало раньше, но теперь у меня проблемы, потому что остальная часть кода затем правильно вычисляет процент, и этот код не работает с типом данных, в который он преобразуется np.where. Любая идея, как это исправить, или я должен задать другой вопрос?

jangles 16.12.2020 00:27

Хммм, я думаю, что это может быть хорошо для другого вопроса, но я мог бы помочь, какой тип данных был раньше по сравнению с тем, который он есть сейчас?

Norton409 16.12.2020 02:36

Это был просто столбец данных pandas, который я создал, выполнив correct = df['correct']. Type() возвращает <class 'pandas.core.series.Series'>, если это поможет. После этого я использую код num_incorrect = correct.str.count("INCORRECT").sum() , и он больше не работает с более быстрым способом numpy.

jangles 16.12.2020 03:44

Другие вопросы по теме