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, 4 meses, 26 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