Pandas 0.8.1 を使用していますが、現時点ではバージョンを変更できません。新しいバージョンが以下の問題に役立つ場合は、回答ではなくコメントに記入してください。また、これは研究複製プロジェクトのためのものであるため、新しいデータ ポイントを 1 つだけ追加した後に回帰を再実行するのはばかげているかもしれませんが (データ セットが大きい場合)、それでも実行する必要があります。ありがとう!
Pandas には、引数 toのrolling
オプションがありますが、これにはウィンドウ サイズの選択またはデフォルトとしてデータ サンプル全体の使用が必要であることは暗示的に思われます。代わりに、すべてのデータを累積的に使用することを検討しています。window_type
pandas.ols
pandas.DataFrame
日付でソートされた で回帰を実行しようとしています。index ごとi
に、最小の日付から index の日付までのデータを使用して回帰を実行したいと考えていますi
。したがって、ウィンドウは反復ごとに効果的に 1 ずつ大きくなり、すべてのデータは最初の観測から累積的に使用され、ウィンドウからデータが削除されることはありません。
これを実行する関数 (以下) を書きましたapply
が、許容できないほど遅いです。pandas.ols
代わりに、この種の累積回帰を直接実行する方法はありますか?
ここに私のデータに関するいくつかの詳細があります。pandas.DataFrame
識別子の列、日付の列、左側の値の列、右側の値の列を含む があります。groupby
識別子に基づいてグループ化し、左側と右側の変数で構成される期間ごとに累積回帰を実行したいと考えています。
apply
識別子でグループ化されたオブジェクトで使用できる関数は次のとおりです。
def cumulative_ols(
data_frame,
lhs_column,
rhs_column,
date_column,
min_obs=60
):
beta_dict = {}
for dt in data_frame[date_column].unique():
cur_df = data_frame[data_frame[date_column] <= dt]
obs_count = cur_df[lhs_column].notnull().sum()
if min_obs <= obs_count:
beta = pandas.ols(
y=cur_df[lhs_column],
x=cur_df[rhs_column],
).beta.ix['x']
###
else:
beta = np.NaN
###
beta_dict[dt] = beta
###
beta_df = pandas.DataFrame(pandas.Series(beta_dict, name="FactorBeta"))
beta_df.index.name = date_column
return beta_df