web-dev-qa-db-ja.com

Python pandas線形回帰groupby

pandas python dataframe:

これはデータフレーム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

これ statsmodelsからgroupbyにOLSを適用する方法 は機能しません

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().
11
jeangelj

初心者なのでコメントはできないので新しい回答として書きます。エラーを解決するには:

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

あなたはラインでデルタ値を再形成する必要があります:

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

クレジットは残りますpiRSquared

1
Wizytor