Я пытаюсь ускорить тестирование своей торговой стратегии.
Прямо сейчас у меня есть
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, так что это было просто и работало, но теперь я плачу за это тем, сколько времени занимает тестирование на истории.
Есть ли способ сделать это быстрее?
вы можете использовать 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
Хм, я думаю да, я сравнивал время, пожалуйста, смотрите редактирование
Теперь я вижу, у меня действительно это работало раньше, но теперь у меня проблемы, потому что остальная часть кода затем правильно вычисляет процент, и этот код не работает с типом данных, в который он преобразуется np.where
. Любая идея, как это исправить, или я должен задать другой вопрос?
Хммм, я думаю, что это может быть хорошо для другого вопроса, но я мог бы помочь, какой тип данных был раньше по сравнению с тем, который он есть сейчас?
Это был просто столбец данных pandas, который я создал, выполнив correct = df['correct']
. Type() возвращает <class 'pandas.core.series.Series'>
, если это поможет. После этого я использую код num_incorrect = correct.str.count("INCORRECT").sum()
, и он больше не работает с более быстрым способом numpy.
Кажется, медленнее, к сожалению. Может я что-то не так делаю?