【问题标题】:Python pandas linear regression groupbyPython pandas 线性回归 groupby
【发布时间】:2017-05-21 14:02:07
【问题描述】:

我正在尝试通过 pandas python 数据框对组使用线性回归:

这是数据框df:

  group      date      value
    A     01-02-2016     16 
    A     01-03-2016     15 
    A     01-04-2016     14 
    A     01-05-2016     17 
    A     01-06-2016     19 
    A     01-07-2016     20 
    B     01-02-2016     16 
    B     01-03-2016     13 
    B     01-04-2016     13 
    C     01-02-2016     16 
    C     01-03-2016     16 

#import standard packages
import pandas as pd
import numpy as np

#import ML packages
from sklearn.linear_model import LinearRegression

#First, let's group the data by group
df_group = df.groupby('group')

#Then, we need to change the date to integer
df['date'] = pd.to_datetime(df['date'])  
df['date_delta'] = (df['date'] - df['date'].min())  / np.timedelta64(1,'D')

现在我想预测 2016 年 1 月 10 日每个组的值。

我想得到一个像这样的新数据框:

group      01-10-2016
  A      predicted value
  B      predicted value
  C      predicted value

这个How to apply OLS from statsmodels to groupby 不起作用

for group in df_group.groups.keys():
      df= df_group.get_group(group)
      X = df['date_delta'] 
      y = df['value']
      model = LinearRegression(y, X)
      results = model.fit(X, y)
      print results.summary()

我收到以下错误

ValueError: Found arrays with inconsistent numbers of samples: [ 1 52]

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and   willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.DeprecationWarning)

更新:

我改成

for group in df_group.groups.keys():
      df= df_group.get_group(group)
      X = df[['date_delta']]
      y = df.value
      model = LinearRegression(y, X)
      results = model.fit(X, y)
      print results.summary()

现在我得到这个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

  • @ayhan - 完成!谢谢
  • 你在循环中破坏了你的df
  • 我认为问题在于您的构造函数调用。您将 y 传递给构造函数的 fit_intercept 参数,该参数接受一个布尔值,并且您将另一个数组 X 传递给 copy_X 布尔值。
  • 您希望您的date_delta 相对于整个df 的最小日期计算?
  • 我想在未来(01-10-2016)为每个组计算一个 date_delta 的值

标签: python pandas dataframe group-by linear-regression


【解决方案1】:

这可能是一个迟到的回应,但如果有人遇到同样的问题,我还是会发布答案。实际上,显示的所有内容都是正确的,除了回归块。以下是实现的两个问题:

  • 请注意,model.fit(X, y) 为 X 获取一个形状为 (n_samples, n_features) 的输入 X{类数组,稀疏矩阵}。因此,model.fit(X, y) 的两个输入都应该是二维的。您可以通过reshape(-1, 1) 命令轻松地将一维序列转换为二维。

  • 第二个问题是回归拟合过程本身: y 和 X 不是model = LinearRegression(y, X) 的输入,而是`model.fit(X, y)' 的输入。

这里是回归块的修改:

for group in df_group.groups.keys():
      df= df_group.get_group(group)
      X = np.array(df[['date_delta']]).reshape(-1, 1) # note that series does not have reshape function, thus you need to convert to array
      y = np.array(df.value).reshape(-1, 1) 
      model = LinearRegression()  # <--- this does not accept (X, y)
      results = model.fit(X, y)
      print results.summary()

【讨论】:

    【解决方案2】:

    作为新手,我无法发表评论,因此我将其写为新答案。 解决错误:

    Runtime Error: ValueError : Expected 2D array, got scalar array instead
    

    您需要在行中重塑 delta 值:

    return np.squeeze(LinearRegression().fit(X, y).predict(np.array(delta).reshape(1, -1)))
    

    信用留给您piRSquared

    【讨论】:

      【解决方案3】:

      新答案

      def model(df, delta):
          y = df[['value']].values
          X = df[['date_delta']].values
          return np.squeeze(LinearRegression().fit(X, y).predict(delta))
      
      def group_predictions(df, date):
          date = pd.to_datetime(date)
          df.date = pd.to_datetime(df.date)
      
          day = np.timedelta64(1, 'D')
          mn = df.date.min()
          df['date_delta'] = df.date.sub(mn).div(day)
      
          dd = (date - mn) / day
      
          return df.groupby('group').apply(model, delta=dd)
      

      演示

      group_predictions(df, '01-10-2016')
      
      group
      A    22.333333333333332
      B     3.500000000000007
      C                  16.0
      dtype: object
      

      旧答案

      您使用 LinearRegression 错误。

      • 你不会用数据来调用它并且适合数据。像这样打电话给班级
        • model = LinearRegression()
      • 然后fit
        • model.fit(X, y)

      但所做的只是在model 中存储的对象中设置值没有很好的summary 方法。可能在某个地方有一个,但我知道statsmodels soooo 中的那个,见下文


      选项 1
      改用statsmodels

      from statsmodels.formula.api import ols
      
      for k, g in df_group:
          model = ols('value ~ date_delta', g)
          results = model.fit()
          print(results.summary())
      

                              OLS Regression Results                            
      ==============================================================================
      Dep. Variable:                  value   R-squared:                       0.652
      Model:                            OLS   Adj. R-squared:                  0.565
      Method:                 Least Squares   F-statistic:                     7.500
      Date:                Fri, 06 Jan 2017   Prob (F-statistic):             0.0520
      Time:                        10:48:17   Log-Likelihood:                -9.8391
      No. Observations:                   6   AIC:                             23.68
      Df Residuals:                       4   BIC:                             23.26
      Df Model:                           1                                         
      Covariance Type:            nonrobust                                         
      ==============================================================================
                       coef    std err          t      P>|t|      [95.0% Conf. Int.]
      ------------------------------------------------------------------------------
      Intercept     14.3333      1.106     12.965      0.000        11.264    17.403
      date_delta     1.0000      0.365      2.739      0.052        -0.014     2.014
      ==============================================================================
      Omnibus:                          nan   Durbin-Watson:                   1.393
      Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.461
      Skew:                          -0.649   Prob(JB):                        0.794
      Kurtosis:                       2.602   Cond. No.                         5.78
      ==============================================================================
      
      Warnings:
      [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
                                  OLS Regression Results                            
      ==============================================================================
      Dep. Variable:                  value   R-squared:                       0.750
      Model:                            OLS   Adj. R-squared:                  0.500
      Method:                 Least Squares   F-statistic:                     3.000
      Date:                Fri, 06 Jan 2017   Prob (F-statistic):              0.333
      Time:                        10:48:17   Log-Likelihood:                -3.2171
      No. Observations:                   3   AIC:                             10.43
      Df Residuals:                       1   BIC:                             8.631
      Df Model:                           1                                         
      Covariance Type:            nonrobust                                         
      ==============================================================================
                       coef    std err          t      P>|t|      [95.0% Conf. Int.]
      ------------------------------------------------------------------------------
      Intercept     15.5000      1.118     13.864      0.046         1.294    29.706
      date_delta    -1.5000      0.866     -1.732      0.333       -12.504     9.504
      ==============================================================================
      Omnibus:                          nan   Durbin-Watson:                   3.000
      Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.531
      Skew:                          -0.707   Prob(JB):                        0.767
      Kurtosis:                       1.500   Cond. No.                         2.92
      ==============================================================================
      
      Warnings:
      [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
                                  OLS Regression Results                            
      ==============================================================================
      Dep. Variable:                  value   R-squared:                        -inf
      Model:                            OLS   Adj. R-squared:                   -inf
      Method:                 Least Squares   F-statistic:                    -0.000
      Date:                Fri, 06 Jan 2017   Prob (F-statistic):                nan
      Time:                        10:48:17   Log-Likelihood:                 63.481
      No. Observations:                   2   AIC:                            -123.0
      Df Residuals:                       0   BIC:                            -125.6
      Df Model:                           1                                         
      Covariance Type:            nonrobust                                         
      ==============================================================================
                       coef    std err          t      P>|t|      [95.0% Conf. Int.]
      ------------------------------------------------------------------------------
      Intercept     16.0000        inf          0        nan           nan       nan
      date_delta -3.553e-15        inf         -0        nan           nan       nan
      ==============================================================================
      Omnibus:                          nan   Durbin-Watson:                   0.400
      Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.333
      Skew:                           0.000   Prob(JB):                        0.846
      Kurtosis:                       1.000   Cond. No.                         2.62
      ==============================================================================
      

      【讨论】:

      • 谢谢@piRSquared;有没有办法用线性回归来做到这一点?我正在尝试为将来的某个日期按组创建具有预测值的数据框。使用 OLS 汇总方法,我将不得不手动查找每个组的公式并计算 01-10-2016
      • 非常感谢;我还有一个问题,所以我完全理解你是如何解决这个问题的,如果我的日期在数据集中的格式为“2016-01-10”;它将如何更改代码?
      • 我得到这个错误类型错误:ufunc 减法不能使用类型为 dtype('
      • @jeangelj 我已经更新了帖子以确保df.date 实际上是datetime,以防万一它没有通过那种方式。另外,查看documentation for pd.to_datetime 你可能想要使用dayfirst 参数:pd.to_datetime(dayfirst=True)
      • 谢谢@piRSquared - 不幸的是,当我运行 group_predictions(df, '01-10-2016') 时,我遇到了同样的错误;它指向这条线 df['date_delta'] = df.date.sub(mn).div(day)
      猜你喜欢
      • 2019-10-14
      • 2023-03-13
      • 2016-07-21
      • 2020-07-21
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多