【问题标题】:Finding the least squares linear regression for each row of a dataframe in python using pandas使用pandas在python中为数据框的每一行查找最小二乘线性回归
【发布时间】:2019-08-13 17:55:39
【问题描述】:

我有一个数据框:

(日/月/年)

df = pd.DataFrame({'Name': ['A', 'B', 'C'], 
                   'Date0': ['01/01/1999','01/06/1999','01/01/1979'], 'V0': [29,44,21],
                   'Date1': ['08/01/2000','07/01/2000','01/01/2000'],'V1': [35, 45, 47]})

我想插入每一行的年龄以使用线性回归找到“V_10”,它是 1999 年 8 月 10 日的值。 例如,在第一种情况下,我会得到类似:

Slope   0.01609
Y-intercept     29.00    
df = pd.DataFrame({'Name': ['A', 'B', 'C'], 
                   'Date0': ['01/01/1999','01/06/1999','01/01/1979'], 'V0': [29,44,21],
                   'Date1': ['08/01/2000','07/01/2000','01/01/2000'],'V1': [35, 45, 47], 
                   'V_10':[32.57]})

我希望我的计算是正确的。

如果我想要指数回归或更糟的是我拥有的自定义函数怎么办?

【问题讨论】:

  • 您有两个变量,V0 和 V1。你想用哪一个来获得V_10?
  • 每一行我都想找到V0和V1之间的线性插值

标签: python pandas linear-regression


【解决方案1】:

我不确定这是否是您所追求的,但对于线性插值,您可以执行以下操作:

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

df = pd.DataFrame({'Name': ['A', 'B', 'C'], 
               'Date0': ['01/01/1999','01/06/1999','01/01/1979'], 'V0': [29,44,21],
               'Date1': ['08/01/2000','07/01/2000','01/01/2000'],'V1': [35, 45, 47]})
df['Target'] = pd.to_datetime('10/08/1999')
df['Date0'] = pd.to_datetime(df['Date0'])
df['Date1'] = pd.to_datetime(df['Date1'])
df['Target'] = pd.to_datetime(df['Target'])

def regress(xs, ys, newx, reference=pd.to_datetime('1/1/1900'), retype='linear', fit_intercept=True, degree=None):
    xs = [(x - reference).days for x in xs]
    xs = np.array(xs).reshape(-1,1)
    ys = np.array(ys)
    if retype == 'linear':
        lm = LinearRegression(fit_intercept=fit_intercept)
    elif retype == 'polynomial':
        lm = Pipeline([('poly', PolynomialFeatures(degree=degree)),
                   ('linear', LinearRegression(fit_intercept=fit_intercept))])
    else:
        return print('Need to specify other regression type.')
    lm.fit(xs,ys)
    return lm.predict(np.array((newx - reference).days).reshape(-1, 1))[0]

# Linear regression example
df['V10'] = df.apply(lambda x: regress([x.Date0,x.Date1], [x.V0,x.V1], x.Target, retype='linear'), axis=1)
# 2nd-degree polynomial regression example
df['V11']=df.apply(lambda x: regress([x.Date0,x.Date1], [x.V0,x.V1], x.Target, retype='polynomial', degree=2), axis=1)

【讨论】:

  • 感谢它完美运行,但如果想要指数插值或更广泛的非线性插值怎么办?
  • 查看我的更新答案。我现在使用 scikit-learn 来执行回归。我天生就提供了运行线性和多项式回归的能力;但是,您可以通过调整 x 和 y 变量来执行幂和指数回归(即,取一个、另一个或两者的对数,这取决于您想要什么)。 (请务必相应地调整预测值。)
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2019-05-14
  • 1970-01-01
  • 2015-05-17
  • 2013-10-23
  • 1970-01-01
  • 2016-03-14
  • 2018-03-15
相关资源
最近更新 更多