es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Considera todas las posibles combinaciones, elimina las entradas NaN y obtén la regresión lineal.

Estoy trabajando con Python por primera vez, así que tengo algunas dificultades.

Tengo un archivo CSV con datos que tiene 6 columnas y 20 filas, algunas entradas son ‘NaN’. Lo que estoy tratando de hacer es una interacción que considere la primera columna con las otras (A vs B, C, D, E y F), luego la segunda columna con todas las demás (B vs C, D, E y F), etc. (es decir, comparar todas las posibles parejas de las 6 columnas), para cada pareja eliminar las entradas ‘NaN’ (por lo que el número de filas para cada pareja final sería diferente) y calcular la regresión lineal.

Puedo obtener los resultados que estoy buscando considerando cada pareja “manualmente”, pero como tengo bastantes DataFrames para los cuales debo hacer este procedimiento, llevaría mucho tiempo, por lo que espero que alguien me ayude con un método más rápido.

Parte de mis datos:

| A | B | C | D | E | F |
| 70.385 | 1316.0 | NaN | 1.84 | 1.021059e+37 | 1.284026e+41 |
| 13.183 | 800.0 | 11549.0 | 1.66 | 4.710032e+35 | Nan |
| 9.750 | NaN | NaN | 1.55 | 1.437108e+36 | 5.070657e+40 |
| 12.302 | NaN | 547.7 | 1.56 | 2.149507e+36 | 2.294859e+40 |
| NaN | 2784.2 | 29984.4 | 1.87 | NaN | 2.294859e+40 |

Lo que puedo hacer es:

import pandas as pd
from scipy.stats import linregress

df = data1.dropna(subset=['A','B']) 
lr_AB = linregress(df['A'], df['B'])

Y lo que estoy tratando de obtener es: LinregressResult(slope= , intercept=, rvalue=, pvalue=, stderr=) para cada pareja. Entonces, ¿cómo itero estos dos comandos para cada posible pareja de columnas?

Mi intento fue este, pero sin muchos resultados:

for i in range(len(data1.columns)-1):
    if data1.iloc[:, :] is 'NaN':
        df = data1.dropna()
        print(df)
        lr = linregress(df.iloc[:, i], df.iloc[:, i+1])
    else:
        print('no nan') 
        lr1 = linregress(data1.iloc[:, i], data1.iloc[:, i+1])

Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para iterar a través de cada posible par de columnas y calcular la regresión lineal, puedes utilizar bucles anidados. El bucle externo iterará a través de cada columna, y el bucle interno iterará a través de todas las demás columnas. De esta manera, puedes comparar cada par de columnas.

    Aquí tienes un ejemplo de código que puedes utilizar:

    import pandas as pd
    from scipy.stats import linregress
    
    df = pd.read_csv('data.csv')  # reemplaza con tu archivo csv
    
    for i, col1 in enumerate(df.columns):
        for j, col2 in enumerate(df.columns):
            if i < j and col1 != 'NaN' and col2 != 'NaN':  # solo compara pares únicos y columnas no NaN
                temp_df = df[[col1, col2]].dropna()  # elimina filas con valores NaN
                lr = linregress(temp_df[col1], temp_df[col2])  # calcula la regresión lineal
                print(f'Regresión lineal de {col1} vs {col2}: {lr}')
    

    Este código iterará a través de cada posible par de columnas y calculará la regresión lineal, excluyendo cualquier par que involucre valores NaN. Ten en cuenta que estoy asumiendo que los nombres de las columnas se almacenan como cadenas de texto en el archivo csv. Si son numéricos, puedes eliminar las comillas alrededor de ‘NaN’.

Comments are closed.