【问题标题】:Consider every possible pair, remove NaN entries and obtain the linear regression考虑每个可能的对,删除 NaN 条目并获得线性回归
【发布时间】:2021-12-31 12:39:23
【问题描述】:

我是第一次使用 Python,所以没有什么困难。

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

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

我的部分数据:

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

非常感谢。

【问题讨论】:

  • 请提供minimal reproducible example,包括一个小的输入示例数据和相应的预期结果。
  • @PierreD 希望我的编辑足够好
  • 干得好,谢谢。您可以更进一步,让您的数据更易于复制/粘贴(这样我们就可以更轻松地开始帮助您)。此外,您还没有准确定义 linregress,如果您显示预期结果是什么(以及以什么形式),这将有所帮助。

标签: python pandas loops linear-regression


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 2014-02-23
    • 1970-01-01
    • 2021-03-21
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多