首页 > 解决方案 > 线性回归导致不同行的列

问题描述

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

所以,我发现下面的代码给了我一个 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)

这给了我以下结果:

结果

此示例的初始数据框包含 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 值和标准错误。

我试图用这段代码迭代每一行(这会产生一个新的数据框,这也可以):

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

但它给了我以下错误:

错误

有没有人可以告诉我我做错了什么以及正确的解决方案是什么?

谢谢,

史蒂文

标签: pythonpython-3.xwindowsstatisticsanaconda

解决方案


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

这是一个 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

推荐阅读