2017-11-13 10 views
0

私は時系列データXとYをそれぞれ毎日回帰させようとしています。これは、前回のXデータを現在のY値で回帰します。 Xは次元の日付、在庫および因子を持つ3次元データ配列、Yは次元の日付および在庫を持つ2次元データ配列です。誰でも効率的な方法でそれを行う方法を教えてもらえますか?xarrayを使ってPythonで回帰を行う方法は?

# -*- coding: utf-8 -*- 
import pandas as pd 
import numpy as np 
import xarray as xr 
import os 
import warnings 
from functools import reduce 
import math as mt 
import statsmodels.api as sm 
from lib.gftTools import gftIO 
import datetime 
import logging 

time = pd.date_range('2000-01-01', freq='D', periods=365) 
X = xr.DataArray(
    np.random.randn(365, 10, 3), [('date', time), ('stock', list('abcdefghij')), 
            ('factor', list('xyz'))]) 

Y = xr.DataArray(
    np.random.randn(365, 10), [('date', time), ('stock', list('abcdefghij'))]) 

答えて

0
# create regression result dateframe 
params = pd.DataFrame(index=X.date, columns=X.factor) 
residuals = pd.DataFrame(index=X.date, columns=X.symbol) 

# get the datetimeindex 
idx_date = y.get_index('date') 
idx_symbol = X.get_index('symbol') 

for dt in y.date.values: 
    logger.debug('regression on %s', dt) 
    cur_date = pd.Timestamp(dt) 
    # get the position of current date 
    dt_pos = idx_date.get_loc(cur_date) 
    if dt_pos == 0: 
     continue 
    dt_pre_pos = dt_pos - 1 
    # symbols having valid value(not nan) 
    s = X[:, dt_pre_pos].notnull().all(axis=0) 
    valid_x = X[:, dt_pre_pos, s].symbol.values 

    w = y.loc[cur_date].notnull() 
    valid_y = y.loc[cur_date, w].symbol.values 

    valid_symbol = np.intersect1d(valid_x, valid_y) 
    try: 
     model = sm.RLM(
      y.loc[cur_date, valid_symbol].values, 
      X.isel(
       date=dt_pre_pos, 
       symbol=idx_symbol.get_indexer(valid_symbol)).values.T, 
      M=sm.robust.norms.HuberT()) 
     results = model.fit() 
    except ValueError: 
     continue 
    params.loc[cur_date] = results.params 
    residuals.loc[cur_date, valid_symbol] = results.resid 
関連する問題