考虑每一个可能的对,删除 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.stats
的 linregress
,这里有一种方法可以做到这一点。并不比您的代码效率高多少,因为它还会遍历列的组合:
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
我是第一次使用 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.stats
的 linregress
,这里有一种方法可以做到这一点。并不比您的代码效率高多少,因为它还会遍历列的组合:
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