线性回归导致不同行的列

时间:2018-12-14 15:16:41

标签: python python-3.x windows statistics anaconda

我的目标是对几行进行回归分析,并将结果存储在单独的列中,并附加到我加载的数据框中。

因此,我发现以下代码为我提供了带有一个x和一个y变量的结果。

import pandas as pd
import numpy as np
import scipy.stats
df = pd.read_excel("Directory\File.xlsx")
x = df.iloc[0,:]
y= df.iloc[1,:]
scipy.stats.linregress(x,y)

这给了我以下结果:

result

此示例的初始数据帧包含3行24列。

[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24];

[100 10 61 55 29 77 61 42 70 73 98 62 25 86 49 68 68 26 35 62 100 56 10 97];

[57 89 25 89 48 56 67 17 98 10 25 90 17 52 85 56 18 20 74 97 82 63 45 87]

零行始终是x轴:独立变量。第1和2行是 因变量,即y轴。现在,我想执行此回归分析,并且对于每一行(从第1行开始),它必须计算结果并将其附加到数据框。因此,最后,我们将有5个额外的列,每列分别包含斜率,截距,右值,p值和stderr。

我试图用这段代码遍历每一行(这使得新的数据框也可以):

def linreg(row):
z = scipy.stats.linregress(x,y)
linreg_df = pd.DataFrame(z)
return(linreg_df)

full_dataframe = None

for index,row in df.iterrows():
z = linreg(index)
if full_dataframe is None: 
    full_dataframe = z.T
else: 
    full_dataframe = full_dataframe.append([z.T])


full_dataframe.to_excel('Directory\\File.xlsx')

但是它给了我以下错误:

error

有人可以告诉我我做错了什么,什么是适当的解决办法?

谢谢

史蒂芬

1 个答案:

答案 0 :(得分:3)

使用_asdict方法将lineregress的结果转换为OrderedDictionary,然后可以在构造函数中将该字典用于熊猫数据框:

这是MCVE:

import pandas as pd
import scipy.stats


X = [1,2,3,4,7]
y = [2,4,6,9,13]

r = scipy.stats.linregress(X,y)

df = pd.DataFrame(r._asdict(), index=[0])
print(df)

输出:

      slope  intercept    rvalue    pvalue   stderr
0  1.858491   0.481132  0.989413  0.001306  0.15739

已更新:

from io import StringIO
import pandas as pd
import scipy.stats

txt = StringIO("""1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
100 10 61 55 29 77 61 42 70 73 98 62 25 86 49 68 68 26 35 62 100 56 10 97
57 89 25 89 48 56 67 17 98 10 25 90 17 52 85 56 18 20 74 97 82 63 45 87""")
df = pd.read_csv(txt, sep='\s', header=None, engine='python')

fullll_dataframe = pd.DataFrame()

for i,row in df.iloc[1:,:].iterrows():
    r = scipy.stats.linregress(df.iloc[0, :], row)
    full_dataframe = pd.concat([full_dataframe,pd.DataFrame(r._asdict(), index=[i])])

print(full_dataframe)

输出:

      slope  intercept    rvalue    pvalue    stderr
1  0.083478  58.123188  0.021827  0.919366  0.815204
2  0.399565  51.963768  0.096415  0.654034  0.879439