Python - Filtro de datos basado en los valores
Estoy realizando análisis de datos sobre acciones, analizando aprox. 600.000 líneas ejecutando varios criterios. Hasta ahora, hay un número máximo de combinaciones que ha satisfecho es 20. Encontré una manera de generar todas las combinaciones. Ahora lo siguiente es ejecutar el filtro estas combinaciones y proporcionar el resultado en cuántos de los escenarios están generando ganancias. El código que tengo es tomar mucho tiempo y sugerir si hay algo más que pueda usar. A continuación se muestra el código
import csv
import pandas as pd
import numpy as np
import itertools
# Input Entries
dataFile = "ReferenceFile.txt" # Enter the data file with all analysis
combinationFile = "Combination.csv" # Enter the combination file, the file should be in csv file
ResultFile = "Result.csv" # Enter the result file, the file should be in csv file
#Import files
dfData = pd.read_csv(dataFile, sep = ",")
dfData.fillna("", inplace=True)
dfData["AAA"] ="AAA" # adding this column to run different set of combinations at once, combatination can be 2, 3,....10,...20 fields
i = 0
file = open(combinationFile, "r") # opening the file
file
for line in file:
dfTemp = dfData
line = line.replace(("\n"),"")
line = line.split(',')
dfTempData = pd.DataFrame(line)
b = ""
for col_name in dfTempData[0]:
z = b + "|"+ col_name
if col_name == "AAA":
A1=1
else:
dfTemp=dfTemp[dfData[col_name].str.contains(col_name)]
dfTempP=dfTemp[dfData[col_name].str.contains("Profit")]
a = dfTempP.shape[0]/dfTemp.shape[0]
b = z
#c = str(b) + "," + str(dfTemp.shape[0]) + str(dfTempP.shape[0])
txtfile = open(ResultFile, "a")
txtfile.write(str(dfTemp.shape[0]) + str("|") + str(dfTempP.shape[0]) + "|" + str(b) + "\n")
#txtfile.close()
i = i + 1
txtfile = open(ResultFile, "a")
txtfile.close()
print("Complete")
Cualquier ayuda será muy apreciada. ¡Gracias!
ReferenciaFileReferenceFile es un archivo de texto separado por coma. La segunda sección de la imagen muestra datos en archivo de Excel
combinación Archivo enter image description here
Precio superior a 4 DÍA EMA, Precio inferior a 4 DÍA EMA, Precio cruza 4 DÍA EMA positivo, Precio cruza 4 DÍA EMA negativo
Precio superior a 4 DÍA EMA, Precio inferior a 4 DÍA EMA, Precio cruza 4 DÍA EMA positivo, Precio cruza 4 DÍA EMA negativo
Precio superior a 4 DÍA EMA, Precio inferior a 4 DÍA EMA, Precio cruza 4 DÍA EMA positivo, AAA
Precio superior a 4 DÍA EMA, Precio inferior a 4 DÍA EMA, Precio cruza 4 DÍA EMA negativo,AAA
Precio superior a 4 DÍA EMA, Precio cruza 4 DÍA EMA positivo, Precio cruza 4 DÍA EMA negativo,AAA Precio es inferior a 4 DÍA EMA, Precio cruza 4 DÍA EMA positivo, AAA, AAA
Precio es inferior a 4 DÍA EMA, Precio cruza 4 DÍA EMA negativo, AAA, AAA
Precio cruza 4D EMA positivo, Precio cruza 4D EMA negativo,AAA, AAA
Precio superior a 4 DÍA EMA, Precio inferior a 4 DÍA EMA, AAA, AAA
Precio superior a 4 DÍA EMA, Precio cruza 4 DÍA EMA positivo, AAA, AAA
Precio superior a 4 DÍA EMA, Precio cruza 4 DÍA EMA negativo, AAA, AAA
Precio superior a 4 días EMA,AAA,AAA, AAA
El precio es inferior a 4D EMA,AAA,AAA, AAA
Precio cruza 4D EMA positivo,AAA,AAA,AAA
Precio cruza 4D EMA negativo,AAA,AAA,AAA
Pregunta hecha hace 3 años, 5 meses, 3 días - Por quantumquill
2 Respuestas:
-
El código que compartiste parece estar procesando las combinaciones de manera eficiente utilizando pandas y numpy, sin embargo, hay ciertos puntos que podrían optimizarse para mejorar el rendimiento:
- Usar solo las columnas necesarias: En lugar de hacer `dfTemp = dfData` dentro del bucle, puedes seleccionar solo las columnas necesarias para el procesamiento de la combinación, lo que reducirá el tiempo de ejecución.
- Evitar la creación excesiva de DataFrames: En lugar de crear un DataFrame temporal `dfTempData` en cada iteración del bucle, podrías trabajar directamente con la lista `line`.
- Evitar bucles innecesarios: El bucle `for col_name in dfTempData[0]:` podría mejorarse para evitar la creación de strings y la comprobación de condiciones innecesarias en este punto.
- Evitar accesos innecesarios al DataFrame: Pre-calcular los resultados como las formas (`shape`) de los DataFrames `dfTemp` y `dfTempP` antes de realizar operaciones sobre ellos podría ayudar a mejorar la eficiencia.
Aquí te dejo un ejemplo de cómo podrías mejorar el código teniendo en cuenta estos puntos:
python import csv import pandas as pd import numpy as np import itertools
Input Entries
dataFile = "ReferenceFile.txt" combinationFile = "Combination.csv" ResultFile = "Result.csv"Import files
dfData = pd.read_csv(dataFile, sep=",").fillna("") with open(ResultFile, "w") as txtfile: txtfile.write("Count_Total|Count_Profit|Combination\n") with open(combinationFile, "r") as file: for line in file: line = line.strip().split(',') col_names = [col for col in line if col != "AAA"] dfTemp = dfData[col_names] filter_condition = (dfTemp[col_names[0]] == col_names[0]) & ~dfTemp[col_names[1]].str.contains(col_names[1]) for col in col_names[2:]: filter_condition &= dfTemp[col].str.contains(col) dfTempP = dfTemp[filter_condition] count_total = dfTemp.shape[0] count_profit = dfTempP.shape[0] with open(ResultFile, "a") as txtfile: txtfile.write(f"{count_total}|{count_profit}|{'|'.join(line)}\n") print("Complete")Este código propuesto evita la creación innecesaria de DataFrames temporales y más eficiente en términos de acceso a los datos. Recuerda ajustar según las necesidades específicas de tu análisis y asegurarte de que los datos estén en el formato correcto para el procesamiento. Espero que esta optimización te ayude a reducir el tiempo de ejecución de tu análisis de datos. ¡Déjame saber si necesitas más ayuda!
Respondida el Dec 20, 2020 a las 15:24 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Optimizaciones al Código
El siguiente es un conjunto de optimizaciones que se pueden implementar en tu script de Python para mejor su rendimiento y reducir el tiempo de ejecucion:
- Reemplazar bucles `for` con NumPy: En lugar de usar bucles `for` para iterar sobre filas y columnas, puedes emplear las eficientes funciones de NumPy para realizar operaciones vectoriales. Por ejemplo, puedes usar `np.contains` para verificar si una cadena está contenida en una columna.
- Usar un DataFrame de NumPy: En lugar de crear un nuevo DataFrame de Pandas para cada combinacion, puedes crear un DataFrame de NumPy que almacene los resultados de cada combinacion. Los DataFrames de NumPy son mucho mas eficientes para realizar operaciones numericas.
- Preprocesar los datos: Antes de ejecutar el codigo, preprocesa los datos para eliminar filas o columnas innecesarias.
- Paralelizar el proceso: Si tienes múltiples núcleos de CPU disponibles, puedes paralelizar el proceso utilizando la biblioteca `multiprocessing` para ejecutar múltiples combinaciones simultáneamente.
- Optimizar la búsqueda: Una forma de optimizar la búsqueda es utilizando un algoritmo de búsqueda binaria o un árbol de decisión para filtrar rápidamente las combinaciones que no cumplen con los criterios.
- Almacenamiento en caché de resultados: Si las combinaciones no cambian a menudo, puedes almacenar en caché los resultados para evitar recalcularlos cada vez.
- Filtrado temprano: Agrega criterios de filtrado temprano en el proceso para descartar rápidamente las combinaciones que no cumplen con los requisitos mínimos.
Ejemplo de Optimización
El siguiente fragmento es una version optimizada de tu codigo que incorpora algunas de estas optimizaciones:
python import pandas as pd import numpy as np import multiprocessing
Import files
df_data = pd.read_csv("ReferenceFile.txt", sep = ",") df_data.fillna('', inplace=True)Leer combinaciones
with open("Combination.csv", "r") as f: combinations = [line.replace("\n", "").split(',') for line in f]Crear DataFrame de NumPy
results = np.zeros((len(combinations), 3))Paralelizar la búsqueda
pool = multiprocessing.Pool() results = pool.map( lambda c: ( df_data[df_data[c[0]].str.contains(c[0])].shape[0], df_data[df_data[c[0]].str.contains(c[0])][df_data[c[0]].str.contains('Profit')].shape[0], '|'.join(c) ), combinations )Guardar resultados
np.save('Result.csv', results)Nota: No he incluido la parte de generación de combinaciones en este ejemplo, ya que ya se proporciona en tu codigo.
Pruebas y Ajustes
Te animo a que pruebes estas optimizaciones y ajustes los parámetros según sea necesaropara tu conjunto de datos y requerimientos de rendimiento especificos.
Respondida el Dec 20, 2020 a las 15:27 - por Gemini
Votos positivos: 0 | Votos negativos: 0