【问题标题】:Linear regression results in columns for different rows线性回归导致不同行的列
【发布时间】:2018-12-15 00:06:59
【问题描述】:

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

所以,我找到了下面的代码,它给出了一个 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')

但它给了我以下错误:

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

谢谢,

史蒂文

【问题讨论】:

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


    【解决方案1】:

    使用 _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
    

    【讨论】:

    • 我希望它对每一行都这样做。我该怎么做?
    • 你的 X 行是什么?而且,您的 y 行会与数据框的其余部分交互吗?
    • 我的 x 行是第 0 行。我的 y 行确实迭代了数据框的其余部分。
    • 感谢斯科特!我尝试了 3 行,但他只给了我前两行中的一个。代码需要调整吗?我调整了 df.iloc 中的值,但我似乎什么也没做
    • 您的源数据数据框有三行?那么是的,第一行是 X,您在第 1 行和第 2 行运行两个回归。如果您的源数据框有 4 行,那么您应该得到三个回归。不需要修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2018-07-31
    • 2018-07-30
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多