2017-09-30 71 views
0

一列有沒有人曾與滾動標準偏差的問題不是在一個數據幀大熊貓工作只有一個列?滾動標準偏差大熊貓回到零點的

我有一個日期時間指數和相關的財務數據的數據幀。當我運行df.rolling()。std()(僞代碼,請參見下面的實際)時,我得到除一個之外的所有列的正確數據。該列返回0,其中應該有標準偏差值。我在使用.rolling_std()時也遇到同樣的錯誤,並且在嘗試運行df.rolling()。skew()時出現錯誤,所有其他列都工作,此列給出了NaN。

什麼扔我離開這個錯誤是其他列正確以及此列工作,df.rolling()。意思是()的作品。另外,該列有dtype float64,這不應該是一個問題。我也檢查過,沒有看到丟失的數據。我正在使用30天的滾動窗口,如果我嘗試使用系列[-30:]獲得最後的標準偏差值,則std()會得到正確的結果。所以它似乎是特別關於滾動部分的東西不起作用。我玩弄了.rolling()的參數,但無法改變任何東西。

# combine the return, volume and slope data 
raw_factor_data = pd.concat([fut_rets, vol_factors, slope_factors], axis=1) 

# create new dataframe for each factor type (mean, 
# std dev, skew) and combine 
mean_vals = raw_factor_data.rolling(window=past, min_periods=past).mean() 
mean_vals.columns = [column + '_mean' for column in list(mean_vals)] 

std_vals = raw_factor_data.rolling(window=past, min_periods=past).std() 
std_vals.columns = [column + '_std' for column in list(std_vals)] 

skew_vals = raw_factor_data.rolling(window=past, min_periods=past).skew() 
skew_vals.columns = [column + '_skew' for column in list(skew_vals)] 

fact_data = pd.concat([mean_vals, std_vals, skew_vals], axis=1) 

第一行將三個數據幀組合在一起。然後,我使用滾動平均值,std和skew(過去= 30)創建單獨的數據框,然後將這些數據框合併爲一個數據框。

我遇到問題的列的名稱是「TY1_slope」。所以我運行了一些代碼,看看有什麼錯誤。

print raw_factor_data['TY1_slope'][-30:].std() 
print raw_factor_data['TY1_slope'][-30:].mean() 

print raw_factor_data['TY1_slope'].rolling(window=30, min_periods=30).std() 
print raw_factor_data['TY1_slope'].rolling(window=30, min_periods=30).mean() 

前兩行代碼輸出正確的標準偏差和平均值(.08和.14)。但是,第三行代碼會生成零,但第四行會生成精確的平均值(這些系列中的最終值爲0.0和.14)。

如果任何人都可以如何看.rolling源代碼,這將是有益的太有幫助。我是新手,嘗試了以下方法,但只是看了幾行看起來不太有用的內容。

import inspect 
import pandas as pd 
print inspect.getsourcelines(pd.rolling_std) 
+2

想象一下,哪一個能調試代碼,而您的數據放心! –

+0

我明白了,但我還是無法用一個簡單的例子(我之前詢問是否有人曾經看到過這個問題,或者可以在查看源代碼時給出方向)的部分原因,用隨機數據重新創建問題。我完全願意發送完整的代碼,如果有人願意查看它,它會從數據庫中提取數據。 df1 = pd.DataFrame(np.random.randn(30,5),index = pd.date_range('20170101',句點= 30),columns = ['ES1_vol','TY1_vol','JY1_vol','EC1_vol' ,'YM1_vol'])是數據框的一般類型。 – airtraxam

+0

嘗試在列的子集上進行操作,直到您可以縮小到一些(希望很小的)數據子集並僅顯示該數據。似乎可能以某種方式與數據相關。您也可以嘗試在其他程序(excel,r,sas,stata等)上計算該列的std以查看在黑暗中拍攝的其他程序 – JohnE

回答

0

引用JohnE的評論,因爲它工作(雖然仍然不確定問題的根源)。 JohnE,隨時可以更改爲答案,我會贊成。

瞎猜,但你可以嘗試軋(30)。適用(拉姆達X:np.std(X,ddof = 1))的情況下,它的一些奇怪的語法錯誤與滾動+ STD - 強尼