2017-07-07 51 views
1

我試圖根據列中以前的數據實現單個空單元格的線性迴歸計算。由於我不明白如何使用python庫,所以我逐步編寫了整個計算。計算大熊貓列中單個單元格的線性迴歸問題

這是我的數據框:

index value delta 
-52  0  42517 
-51  0  42524 
-50  216  42531 
-49  345  42538 
-48  237  42545 
... 
-2  367  42862 
-1  310  42869 
    0  226  42876 
    1  NaN  42883 
    2  NaN  42890 
... 
49  NaN  43213 
50  NaN  43220 
51  NaN  43227 
52  NaN  43234 

值,其中index = 0,下總是52。以上,可能有不同的數字,但在本例中我們事先知道它們的52。 未知的值總是從index = 1開始。

對於單個值,我就指望這樣(在這裏,我計數值deltadd = 42883):

x = dftest['delta'] 
y = dftest['value'] 
x_mean= np.mean(x) 
y_mean = np.mean(y) 
x_std = np.std(x) 
y_std = np.std(y) 
corr = np.corrcoef(y, x)[1,0] 
slope = corr * y_std/x_std 
intercept = y_mean - slope * x_mean 
n_vl = intercept + slope * dd 

所以他計算,但我不知道如何編寫一個循環,使他對所有空單元格(從index = 1開始)執行此操作,同時考慮到之前計算的值。

我試圖使用第一個響應here中的代碼並對其進行更改,但它不起作用。

下面的代碼的一部分:

vl = dftest['value'].values 
delta = dftest['delta'].values 
for index in range(0, vl.shape[0]): 
    if np.isnan(vl[index]): 
     x = delta.take(range(index-52,index+1),mode='wrap') 
     y = vl.take(range(index-52,index+1),mode='wrap') 
     y1 = np.nanmean(vl.take(range(index-52,index+1),mode='wrap')) 
     y2 = np.nanstd(vl.take(range(index-52,index+1),mode='wrap')) 
     x1 = np.nanmean(delta.take(range(index-52,index+1),mode='wrap')) 
     x2 = np.nanstd(delta.take(range(index-52,index+1),mode='wrap')) 
     corr = np.corrcoef(y, x)[1,0] 
     slope = corr * y2/x2 
     intercept = y1 - slope * x1 
     n_vl = intercept + slope * dd 
print (y) 
print (x)   
print (y1) 
print (y2) 
print (x1) 
print (x2) 
print (corr) 
print (slope) 
print (intercept) 
print (n_vl) 

但它需要的index = 0低於值,而不是上面。我不知道如何改變這種情況,以及如何編寫它,以便計算每個空單元格。

這就是我在一個值的輸出(從我的代碼循環)得到的。

[ 226. nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan nan nan nan nan nan nan nan nan 
nan nan nan nan nan] 
[42876 42883 42890 42897 42904 42911 42918 42925 42932 42939 42946 42953 
42960 42967 42974 42981 42988 42995 43002 43009 43016 43023 43030 43037 
43044 43051 43058 43065 43072 43079 43086 43093 43100 43107 43108 43115 
43122 43129 43136 43143 43150 43157 43164 43171 43178 43185 43192 43199 
43206 43213 43220 43227 43234] 
226.0 
0.0 
43055.8490566 
104.701263481 
nan 
nan 
nan 
nan 

我一直堅持這個很長時間,不能前進,我真的需要幫助。

+0

您是否試過使用dropna從數據集中簡單地刪除NaN? – FLab

+0

你會如何精確計算'NaN'的平均值? 'x_mean = np.mean(x)'如果'x'總是空的,就沒有意義了。 – mkos

回答

0

只是做

dftest['value'].fillna(52) 

這將填補所有的valueNaN的編號爲52。 如果你需要額外務必填寫NaN的只有index <= 0(換句話說,你希望NaN的在valueindex > 0)然後執行:

dftest.loc[index <= 0, 'value'].fillna(52) 

記住,如果你覺得你需要在Pandas中使用循環,你很可能做錯了。

0

因此,我決定使用基於已知數據的線性迴歸來填充列中的空單元格。

import statsmodels.formula.api as smf 
#Here I choose the known data and fit the model 
smresults = smf.ols('value ~ delta', df.iloc[:53]).fit() 
smresults.summary() 
#Here I fill empty cells using the model 
df.value[53:] = smresults.predict(df.iloc[53:]) 

這是我設法得到的最佳解決方案。