Necesito usar aplicar o emisión y enmascaramiento para iterar sobre un DataFrame.
Tengo un marco de datos que necesito recorrer. Quiero usar tanto apply como broadcasting y enmascaramiento. Este es el pseudocódigo que estoy tratando de mejorar.
2 El algoritmo
Algoritmo 1: El algoritmo
Inicializa la población (de tamaño n) de forma uniformemente aleatoria, respetando los límites;
mientras no se complete un número predefinido de iteraciones, haz lo siguiente:
Establece los parámetros aleatorios (dos parámetros independientes para cada una de las d variables); encuentra los mejores y peores vectores en la población;
para cada vector en la población, crea un nuevo vector usando el vector actual, el mejor vector, el peor vector y los parámetros aleatorios;
si el nuevo vector es al menos tan bueno como el vector actual, entonces el vector actual es igual al nuevo vector;
Este es el código que tengo hasta ahora.
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.uniform(-5.0, 10.0, size=(20, 5)), columns=list(‘ABCDE’))
pd.set_option(‘display.max_columns’, 500)
df
Sección while del pseudocódigo
f_func = np.square(df).sum(axis=1)
final_func = np.square(f_func)
xti_best = final_func.idxmin()
xti_worst = final_func.idxmax()
print(final_func)
print(df.head())
print(df.tail())
*# Sección for loop del pseudocódigo
#for row in df.iterrows():
implementar ecuación de la tarea
#definir operaciones de matrices
#xi_new = row.to_numpy() + np.random.uniform(0, 1, size=(1, 5)) * (df.iloc[xti_best].values – np.absolute(row.to_numpy())) – np.random.uniform(0, 1, size=(1, 5)) * (df.iloc[xti_worst].values – np.absolute(row.to_numpy()))
#print(xi_new)*
df2 = df.apply(lambda row: 0 if row == 0 else row + np.random.uniform(0, 1, size=(1, 5)) * (df.iloc[xti_best].values – np.absolute(axis=1)))
print(df2)
La fórmula que estoy intentando usar para xi_new es:
xi_new = xi_actual + valor aleatorio entre 0 y 1 (xti_mejor – abs(xi_actual)) – valor aleatorio (xti_peor – abs(xi_actual))
davy.ai
Para mejorar el código anterior, podemos utilizar directamente la transmisión (broadcasting) y el enmascaramiento (masking) de numpy en lugar de usar apply e iterar sobre filas. La transmisión en numpy nos permite realizar operaciones elemento a elemento entre arrays de diferentes formas, lo que puede acelerar considerablemente el código. El enmascaramiento en numpy nos permite filtrar elementos en función de alguna condición.
Aquí está el código mejorado:
Explicación:
Este código es mucho más eficiente que el código original ya que no utiliza apply ni itera sobre filas. Utiliza el poder de la transmisión y el enmascaramiento de numpy para realizar operaciones elemento a elemento y filtrado. Este código también se ajusta mejor a los data frames más grandes ya que las operaciones de numpy están optimizadas para arrays grandes.