for scipy.stats.linregress中的循环

时间:2015-12-09 13:48:55

标签: python numpy pandas scipy

我正在使用scipy stats模块来计算线性回归。即

 slope, intercept, r_value, p_value, std_err 
= stats.linregress(data['cov_0.0075']['num'],data['cov_0.0075']['com'])

其中data是一个字典,其中包含多个'cov_x'个键,这些键对应于列'num''com'的数据框

我希望能够遍历此字典并对每个'cov_x'进行线性回归。我不知道该怎么做。我试过了:

for i in data:
    slope_+str(i), intercept+str(i), r_value+str(i),p_value+str(i),std_err+str(i)= stats.linregress(data[i]['num'],data[i]['com'])

基本上我想要len(x)slope_x值。

2 个答案:

答案 0 :(得分:3)

您可以使用a list comprehension收集所有stats.linregress返回值:

result = [stats.linregress(df['num'],df['com']) for key, df in data.items()]

result是一个包含5元组的列表。要将每个5元组中的所有第一,第二,第三等元素收集到单独的列表中,请使用zip(*[...])

slopes, intercepts, r_values, p_values, stderrs = zip(*result)

答案 1 :(得分:0)

你应该能够做你想做的事,但有几点你应该注意。

首先,您无法将字符串添加到变量名称并以此方式存储。等号左边没有加号。如初。

但是,您应该能够完成您尝试做的事情。如果您想要字符串索引,请确保使用dict数据类型。

import scipy.stats as stats
import pandas as pd
import numpy as np
data = {}
l = ['cov_0.0075','cov_0.005']
for i in l:
    x = np.random.random(100)
    y = np.random.random(100)+15
    d = {'num':x,'com':y}
    df = pd.DataFrame(data=d)
    data[i] = df
slope = {}
intercept = {}
r_value = {}
p_value = {}
std_error = {}
for i in data:
    slope[str(i)], \
    intercept[str(i)], \
    r_value[str(i)],\
    p_value[str(i)], std_error[str(i)]= stats.linregress(data[i]['num'],data[i]['com'])
print(slope,intercept,r_value,p_value,std_error)

应该工作得很好。否则,您可以存储单个值并稍后将它们放入列表中。