2015-08-19 58 views
5

將預測值和殘差作爲不同的列附加到數據框上,這是一種有用且常見的做法。我是熊貓新手,在執行這個非常簡單的操作時遇到了問題。我知道我錯過了一些明顯的東西。在一年半前被問到了a very similar question,但沒有真正回答。將預測值和殘差附加到熊貓數據框

數據幀目前看起來是這樣的:

y    x1   x2 
880.37   3.17   23 
716.20   4.76   26 
974.79   4.17   73 
322.80   8.70   72 
1054.25   11.45  16 

和所有我想是返回擁有從Y = X1 + X2每個觀測值的預測值和剩餘一個數據幀:

y    x1   x2  y_hat   res 
880.37   3.17   23  840.27  40.10 
716.20   4.76   26  752.60  -36.40 
974.79   4.17   73  877.49  97.30 
322.80   8.70   72  348.50  -25.70 
1054.25   11.45  16  815.15  239.10 

我試着用statsmodels和pandas解決這個問題,一直沒能解決。提前致謝!

回答

5

下面是使用來自statsmodels代替大熊貓OLS模型OLS模型亞歷山大的回答的變化。我們可以使用公式或數組/ DataFrame接口來模型。

fittedvaluesresid是正確索引的熊貓系列。 predict不返回熊貓系列。

import numpy as np 
import pandas as pd 
import statsmodels.api as sm 
import statsmodels.formula.api as smf 

df = pd.DataFrame({'x1': [3.17, 4.76, 4.17, 8.70, 11.45], 
        'x2': [23, 26, 73, 72, 16], 
        'y': [880.37, 716.20, 974.79, 322.80, 1054.25]}, 
        index=np.arange(10, 20, 2)) 

result = smf.ols('y ~ x1 + x2', df).fit() 
df['yhat'] = result.fittedvalues 
df['resid'] = result.resid 


result2 = sm.OLS(df['y'], sm.add_constant(df[['x1', 'x2']])).fit() 
df['yhat2'] = result2.fittedvalues 
df['resid2'] = result2.resid 

# predict doesn't return pandas series and no index is available 
df['predicted'] = result.predict(df) 

print(df) 

     x1 x2  y  yhat  resid  yhat2  resid2 \ 
10 3.17 23 880.37 923.949309 -43.579309 923.949309 -43.579309 
12 4.76 26 716.20 890.732201 -174.532201 890.732201 -174.532201 
14 4.17 73 974.79 656.155079 318.634921 656.155079 318.634921 
16 8.70 72 322.80 610.510952 -287.710952 610.510952 -287.710952 
18 11.45 16 1054.25 867.062458 187.187542 867.062458 187.187542 

    predicted 
10 923.949309 
12 890.732201 
14 656.155079 
16 610.510952 
18 867.062458 

作爲預覽,有在statsmodels主(0.7)模型結果的擴展預測方法,但是API尚未解決:

>>> print(result.get_prediction().summary_frame()) 
      mean  mean_se mean_ci_lower mean_ci_upper obs_ci_lower \ 
10 923.949309 268.931939 -233.171432 2081.070051 -991.466820 
12 890.732201 211.945165  -21.194241 1802.658643 -887.328646 
14 656.155079 269.136102 -501.844105 1814.154263 -1259.791854 
16 610.510952 282.182030 -603.620329 1824.642233 -1339.874985 
18 867.062458 329.017262 -548.584564 2282.709481 -1214.750941 

    obs_ci_upper 
10 2839.365439 
12 2668.793048 
14 2572.102012 
16 2560.896890 
18 2948.875858 
+0

謝謝,這是一個巨大的幫助! –

1

因此,形成你的問題很有禮貌,因爲貢獻者很容易運行你的代碼。

import pandas as pd 

y_col = [880.37, 716.20, 974.79, 322.80, 1054.25] 
x1_col = [3.17, 4.76, 4.17, 8.70, 11.45] 
x2_col = [23, 26, 73, 72, 16] 

df = pd.DataFrame() 
df['y'] = y_col 
df['x1'] = x1_col 
df['x2'] = x2_col 

然後調用df.head()產量:

  y  x1 x2 
0 880.37 3.17 23 
1 716.20 4.76 26 
2 974.79 4.17 73 
3 322.80 8.70 72 
4 1054.25 11.45 16 

現在對於你的問題,這是非常簡單與計算值添加列,但我不與你的樣本數據,同意:

df['y_hat'] = df['x1'] + df['x2'] 
df['res'] = df['y'] - df['y_hat'] 

對我來說,這些產量:

  y  x1 x2 y_hat  res 
0 880.37 3.17 23 26.17 854.20 
1 716.20 4.76 26 30.76 685.44 
2 974.79 4.17 73 77.17 897.62 
3 322.80 8.70 72 80.70 242.10 
4 1054.25 11.45 16 27.45 1026.80 

希望這有助於!

+1

要添加其是現有的算術組合列列你也可以做'df.eval('y_hat = x1 + y1')'這很好,特別是如果你的DataFrame名字很長 – JoeCondron

+0

非常有幫助。將來確保添加數據幀源代碼。謝謝! –

1

這應該是自我解釋。

import pandas as pd 

df = pd.DataFrame({'x1': [3.17, 4.76, 4.17, 8.70, 11.45], 
        'x2': [23, 26, 73, 72, 16], 
        'y': [880.37, 716.20, 974.79, 322.80, 1054.25]}) 
model = pd.ols(y=df.y, x=df.loc[:, ['x1', 'x2']]) 
df['y_hat'] = model.y_fitted 
df['res'] = model.resid 

>>> df 
     x1 x2  y  y_hat   res 
0 3.17 23 880.37 923.949309 -43.579309 
1 4.76 26 716.20 890.732201 -174.532201 
2 4.17 73 974.79 656.155079 318.634921 
3 8.70 72 322.80 610.510952 -287.710952 
4 11.45 16 1054.25 867.062458 187.187542 
+0

這很簡單,更好。 –