2017-09-30 7 views
0

標準偏差のローリングに関する問題は誰もパンダのデータフレームの1つのカラムでしか動かないのですか?パンダのローリング標準偏差1カラムのゼロを返す

私はdatetimeインデックスと関連する財務データを持つデータフレームを持っています。 df.rolling()。std()(擬似コード、以下を参照)を実行すると、1つを除くすべての列に対して正しいデータが得られます。この列は標準偏差値があるべきところに0を返します。 .rolling_std()を使用しても同じエラーが発生し、df.rolling()を実行しようとするとエラーが発生します。skew()、他のすべてのカラムが動作し、このカラムはNaNを返します。

このエラーについて私を捨てているのは、他の列が正しく動作し、この列のdf.rolling()。mean()が機能していることです。さらに、この列には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) 

最初の行は、3つのデータフレームを結合しています。次に、ローリング平均、標準偏差、スキュー(過去= 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() 

最初の2行のコードは、正しい標準偏差と平均(.08と.14)を出力します。しかし、コードの3行目はゼロを生成しますが、4行目は正確な平均値を生成します(これらの系列の最終値は0.0と.14です)。

誰かが役立つと思われる.rollingソースコードの見方を手伝うことができれば誰でも助けてください。私はこれをやっていることを初めてやっていて、次のことを試してみましたが、ちょっとした手間がかかりました。

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

データなしでコードをデバッグすることが簡単にできると想像してください。 –

+0

私は理解していますが、単純な例ではランダムなデータを使って問題を再現することができませんでした(前に誰かがこのコードを見たことがあるのか​​、ソースコードを見ているのかを尋ねていた理由の一部)。私は誰かがそれを見て喜んでいる場合は、それが引っ張っているdbで完全なコードを送信することを完全に喜んでいる。 dp1 = pd.DataFrame(np.random.randn(30,5)、index = pd.date_range( '20170101'、periods = 30)、columns = ['ES1_vol'、 'TY1_vol'、 'JY1_vol'、 'EC1_vol' 、 'YM1_vol'])はデータフレームの一般的な型です。 – airtraxam

+0

データの一部(うまくいくら小さい)のサブセットに絞り込み、そのデータだけを表示するまで、列のサブセットでそれを実行してみてください。何らかの形でデータに関連する可能性が高いと思われます。他のプログラムで何が起きているのかを見るために、他のプログラム(excel、r、sas、stataなど)でその列のstdを計算してみることもできます。 – JohnE

答えて

0

(問題の根本原因はまだ分かっていませんが)動作して以来、JohnEのコメントを引用しています。 JohnE、自由に答えに変えてください。私はupvoteします。

暗闇の中でのショットに、しかし、あなたは.apply(30)ローリング試みることができる(ラムダX:np.std(X、DDOF = 1))の場合には、それはローリング+のstdといくつかの奇妙な構文のバグです - ヨーネ