如何向熊猫数据框增量添加线性回归列

时间:2018-08-28 01:34:01

标签: python pandas

我有一个这样的示例熊猫数据框:

     a    b
0  6.0  0.6
1  1.0  0.3
2  3.0  0.8
3  5.0  0.1
4  7.0  0.4
5  2.0  0.2
6  0.0  0.9
7  4.0  0.7
8  8.0  0.0
9  9.0  0.5

我想向该列添加一个新列linear,这是拟合a在b上的线性回归输出。现在我得到了:

from sklearn.linear_model import LinearRegression
repr = LinearRegression()
repr.fit(df['a'].as_matrix().reshape(-1,1),df['b'].as_matrix().reshape(-1,1))
repr.predict(df['a'].as_matrix().reshape(-1,1)) # This will give the linear regression outcome for whole column

现在,我想对系列a进行线性回归,因此linear的第一个条目将是b[0],第二个条目将是b[0]/a[0]*a[1],并且第三个是前两个条目的线性回归结果,依此类推。除了遍历所有条目外,我不知道该如何处理大熊猫,是否有击球手方法?

1 个答案:

答案 0 :(得分:2)

您可以将expanding与某些自定义套用功能一起使用。做LR的有趣方式...

from io import StringIO
import pandas as pd
import numpy as np

df = pd.read_table(StringIO("""     a    b
0  6.0  0.6
1  1.0  0.3
2  3.0  0.8
3  5.0  0.1
4  7.0  0.4
5  2.0  0.2
6  0.0  0.9
7  4.0  0.7
8  8.0  0.0
9  9.0  0.5
10 10.0 0.4
11 11.0 0.35
12 12.0 0.3
13 13.0 0.28
14 14.0 0.27
15 15.0 0.22"""), sep='\s+')
df = df.sort_values(by='a')
ax = df.plot(x='a',y='b',kind='scatter')
m, b = np.polyfit(df['a'],df['b'],1)
lin_reg = lambda x, m, b : m*x + b 
df['lin'] = lin_reg(df['a'], m, b)
def make_m(x):
    y = df['b'].iloc[0:len(x)]
    return np.polyfit(x, y, 1)[0]
def make_b(x):
    y = df['b'].iloc[0:len(x)]
    return np.polyfit(x, y, 1)[1]
df['new'] = df['a'].expanding().apply(make_m, raw=True)*df['a'] + df['a'].expanding().apply(make_b, raw=True)
# df = df.sort_values(by='a')
ax.plot(df.a,df.lin)
ax.plot(df.a,df.new)

Iterative Linear Regression