El bucle iloc de Python está tardando demasiado tiempo en ejecutarse. Cálculo de análisis técnico.
Desarrollé un código para analizar un gran conjunto de precios de acciones. Básicamente utiliza dos indicadores técnicos (MACD y EMA) y crea una bandera de análisis técnico.
El código funciona, lo cual es genial, pero está tardando demasiado en ejecutarse, probablemente debido a las iteraciones que utilizan iloc. ¿Tienen algunas sugerencias para mejorar la velocidad? A continuación, proporciono un ejemplo:
“`python
import pandas as pd
import numpy as np
import time
df = pd.DataFrame(np.random.uniform(low=2, high=5.5, size=(10000,)), columns=['Close'])
close = df['Close'].astype(float)
def MACD(primer, segundo, señal):
df['EMA'+str(primer)] = close.ewm(span=primer).mean()
df['EMA'+str(segundo)] = close.ewm(span=segundo).mean()
df['MACD']=df['EMA'+str(primer)]-df['EMA'+str(segundo)]
df['señal']=df.MACD.ewm(span=señal).mean()
df['indicador_MACD'] = 0
<pre><code>for i in range (segundo+señal, len(df)):
if df.MACD.iloc[i]>df.señal.iloc[i] and df.MACD.iloc[i-1]<df.señal.iloc[i-1]: df.loc[i,'indicador_macd']="1" if=""></df.señal.iloc[i-1]:><df.señal.iloc[i] and="" df.macd.iloc[i-1]="">df.señal.iloc[i-1]:
df.loc[i,'indicador_MACD']=-1
</code></pre>
def EMA(primer, segundo):
df['EMA'+str(primer)] = close.rolling(window=primer).mean()
df['EMA'+str(segundo)] = close.rolling(window=segundo).mean()
df['diferencia_EMA'] = df['EMA'+str(primer)]-df['EMA'+str(segundo)]
df['indicador_EMA'] = 0
for i in range (segundo, len(df)):
if df.diferencia_EMA.iloc[i]>0 and df.diferencia_EMA.iloc[i-1]<0:
df.loc[i,'indicador_EMA']=1
if df.diferencia_EMA.iloc[i]<0 and df.diferencia_EMA.iloc[i-1]>0:
df.loc[i,'indicador_EMA']=-1
split_time = time.time()
indicadores_TA=list()
MACD(12, 26, 9)
indicadores_TA.append('indicador_MACD')
print("MACD— %s segundos —" % (time.time() – split_time))
split_time = time.time()
EMA(20,50)
indicadores_TA.append('indicador_EMA')
print("EMA— %s segundos —" % (time.time() – split_time))
split_time = time.time()
“`</df.señal.iloc[i]>
davy.ai
Sí, hay algunas sugerencias para mejorar la velocidad del código. Una posible solución es utilizar operaciones vectorizadas en lugar de iterar a través del dataframe utilizando iloc. Aquí hay algunos ejemplos:
Aquí tienes un ejemplo de cómo podrías modificar la función MACD para utilizar operaciones vectorizadas y np.where:
La función EMA también podría ser modificada de manera similar. Estos cambios deberían ayudar a mejorar la velocidad del código al reducir el número de iteraciones y reemplazarlas con operaciones vectorizadas.