我正在寻找以下问题的解决方案,但是它根本无法按我想要的方式工作。
所以我的目标是计算回归分析并获取多行的斜率,截距,rvalue,pvalue和stderr(这可能会达到10000)。在这个例子中,我有一个15行的文件。这是前两行:
array([
[ 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]]
)
完整的试验数据集:
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
192 371 47 173 202 144 17 147 174 483 170 422 285 13 77 116 500 136 276 392 220 121 441 268
第一行是x变量,这是自变量。遍历下一行时,必须保持此状态不变。
对于下一行,y变量,因此是因变量,我想计算斜率,截距,rvalue,pvalue和stderr,并将它们放在一个数据框中(如果可能,添加到同一数据框中,但这是不必要)。
我尝试了以下代码:
import pandas as pd
import scipy.stats
import numpy as np
df = pd.read_excel("Directory\\file.xlsx")
def regr(row):
r = scipy.stats.linregress(df.iloc[1:, :], row)
return r
full_dataframe = None
for index,row in df.iterrows():
x = regr(index)
if full_dataframe is None:
full_dataframe = x.T
else:
full_dataframe = full_dataframe.append([x.T])
full_dataframe.to_excel('Directory\\file.xlsx')
但这失败了,并出现以下错误:
ValueError: all the input array dimensions except for the concatenation axis
must match exactly
我真的在这里迷路了。
因此,我想实现的是,从第二行开始,每行都有斜率,截距,pvalue,rvalue和stderr,因为第一行是x变量。
任何人都知道如何执行此操作,并告诉我为什么我的系统无法正常工作以及代码应为什么样?
谢谢!
答案 0 :(得分:1)
最有可能的问题是数字的格式,而不是整数或浮点数,而是使用Unicode字符串dtype('<U21')
。
始终检查类型:
df.dtypes
使用以下方法铸造数据框:
df = df.astype(np.float64)
下面显示问题的一个小示例:
import numpy as np
import pandas as pd
# DataFrame without numbers (will not work for Math):
df = pd.DataFrame(['1', '2', '3'])
df.dtypes # object: placeholder for everything that is not number or timestamps (string, etc...)
# Casting DataFrame to make it suitable for Math Operations:
df = df.astype(np.float64)
df.dtypes # float64
但是如果没有要使用的原始文件或数据,很难确定这一点。
这与您获得的异常一致:
TypeError: ufunc 'add' did not contain a loop with signature matching types
dtype('<U21') dtype('<U21') dtype('<U21')
方法scipy.stats.linregress
引发一个TypeError
(所以它与类型有关),并告诉您不能执行add
操作,因为添加字符串dtype('<U21')
不会产生任何作用线性回归的意义。
加载数据:
import io
fh = io.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
192 371 47 173 202 144 17 147 174 483 170 422 285 13 77 116 500 136 276 392 220 121 441 268""")
df = pd.read_fwf(fh).astype(np.float)
然后我们可以regress the second row vs the first:
scipy.stats.linregress(df.iloc[0,:].values, df.iloc[1,:].values)
它返回:
LinregressResult(slope=0.12419744768547877, intercept=49.60998434527584, rvalue=0.11461693561751324, pvalue=0.5938303095361301, stderr=0.22949908667668056)
组装在一起:
result = pd.DataFrame(columns=["slope", "intercept", "rvalue"])
for i, row in df.iterrows():
fit = scipy.stats.linregress(df.iloc[0,:], row)
result.loc[i] = (fit.slope, fit.intercept, fit.rvalue)
返回:
slope intercept rvalue
0 1.000000 0.000000 1.000000
1 0.124197 49.609984 0.114617
2 -1.095801 289.293224 -0.205150
据我所知,您的期望是什么?
您收到的第二个异常是由于以下原因:
x = regr(index)
您将行的索引而不是行本身发送给了回归方法。