考虑每一个可能的对,删除 NaN 条目并获得线性回归

Consider every possible pair, remove NaN entries and obtain the linear regression

我是第一次使用 Python,所以我遇到了一些困难。

我有一个包含 6 列和 20 行的数据的 csv 文件,一些条目是 'NaN'。我想要做的是一种交互,考虑第一列与其他列(A 与 B、C、D、E 和 F),然后是第二列与所有其他列(B 与 C、D、E 和F) 等(即比较 6 列中的每一对可能),对于每一对删除 NaN 条目(因此每对最终对的行数将不同)并计算线性回归。

我可以通过“手动”考虑每一对来获得我正在寻找的结果,但是由于我有相当多的数据帧需要执行此过程,因此需要很多时间时间,所以我希望有人能用更快的方法帮助我。

我的部分数据:

| 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 |

我能做的是:

import pandas as pd
from scipy.stats import linregress

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

我想要获得的是:每对的 LinregressResult(slope= , intercept=, rvalue=, pvalue=, stderr=) 。那么,如何为每一对可能的列重复这两个命令?

我的尝试是这样的,但没有太多结果:

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])

非常感谢。

假设您想要使用 scipy.statslinregress,这里有一种方法可以做到这一点。并不比您的代码效率高多少,因为它还会遍历列的组合:

from scipy.stats import linregress
from itertools import combinations

for a, b in combinations(df, 2):
    ab = df[[a, b]].dropna()
    lr[(a, b)] = dict(zip(
        'slope intercept r_value p_value std_err'.split(),
        linregress(ab[a], ab[b])
    ))
    lr[(a, b)]['n_points'] = ab.shape[0]

result = pd.DataFrame(lr).T

示例数据 运行 -

>>> result
            slope     intercept   r_value   p_value       std_err  n_points
A B  9.020664e+00  6.810806e+02  1.000000  0.000000  0.000000e+00       2.0
  C  1.248729e+04 -1.530709e+05  1.000000  0.000000  0.000000e+00       2.0
  D  4.316155e-03  1.538532e+00  0.942012  0.057988  1.087230e-03       4.0
  E  1.503028e+35 -4.016931e+35  0.984424  0.015576  1.898085e+34       4.0
B C  9.291100e+00  4.116120e+03  1.000000  0.000000  0.000000e+00       2.0
  D  8.706011e-05  1.647796e+00  0.789115  0.421079  6.776741e-05       3.0
  E  1.887517e+34 -1.462913e+37  1.000000  0.000000  0.000000e+00       2.0
C D  1.061987e-05  1.547701e+00  0.998360  0.036468  6.090086e-07       3.0
  E -1.525732e+32  2.233071e+36 -1.000000  0.000000  0.000000e+00       2.0
D E  2.896150e+37 -4.429182e+37  0.869114  0.130886  1.165450e+37       4.0
A F  1.525539e+39  2.034718e+40  0.957112  0.187122  4.617784e+38       3.0
B F -7.182537e+37  2.229248e+41 -1.000000  0.000000  0.000000e+00       2.0
C F  0.000000e+00  2.294859e+40  0.000000  1.000000  0.000000e+00       2.0
D F  1.097658e+41 -1.308991e+41  0.382452  0.617548  1.875151e+41       4.0
E F  1.061306e+04  1.854240e+40  0.946081  0.210009  3.633822e+03       3.0