簡體   English   中英

如何通過xarray在python中進行回歸?

[英]how to do regression in python via xarray?

我正在嘗試分別對我的時間序列數據X和Y進行逐日回歸,以當前日期的Y值回歸先前日期的X數據。 X是具有維日期,庫存和因子的3-D數據數組,Y是具有維日期和庫存的2-D數據數組。 有人可以告訴我如何有效地做到這一點嗎?

# -*- 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'))])
# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM