dataset.groupby (unique_identifier) ​​.apply (my_func) выполняет цикл по каждой группе в кадре данных - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь вычислить 12-месячные скользящие регрессионные коэффициенты для каждой группы по: 1) сгруппировать набор данных по уникальному идентификатору запаса ("PERMNO") 2) применить функцию (roll_betas2), которую я определил для каждой группы 3) вернуть новую группу с добавленной информацией.

Я хотел бы получить отзыв / предложение о том, как улучшить код, чтобы сделать его более эффективным!

from itertools import chain

def rolling_betas2(groupby_permno, window=11):
    groupby_permno=groupby_permno.reset_index().drop("index", axis=1).reset_index()
    num_obs = groupby_permno.shape[0]
    temp_list = list()
    for i in range(num_obs):
        if i < window:
            temp_list.append(list(np.full(4, np.nan)))
        else:
            X = np.hstack((np.ones((window+1, 1)), groupby_permno.iloc[i - window:i + 1][["Mkt-RF", "SMB", "HML", "UMD"]].values))
            y = groupby_permno.iloc[i-window:i+1]["excessret"].values
            coeffs = list(np.dot(np.linalg.inv(np.dot(X.T,X)),np.dot(X.T,y)))[1:]
            temp_list.append(coeffs)

    new_cols_betas = pd.DataFrame(np.array(list(chain(*temp_list))).reshape(num_obs, 4),
                                  columns=["beta-Mkt-RF", "beta-SMB", "beta-HML", "beta-UMD"]).reset_index()
    return pd.merge(groupby_permno, new_cols_betas, on="index", how="left")


stocks_data.groupby("PERMNO").apply(rolling_betas2)

Обратите внимание, что, поскольку это 12-месячный период, первые 11 наблюдений не будут иметь рассчитанных коэффициентов - входными данными регрессии являются данные за предыдущий 11 месяц плюс данные текущего месяца и, следовательно, np.nan. Например, запас А имеет информацию с января 2008 года по декабрь 2010 года, тогда коэффициент с января 2008 года по ноябрь 2008 года отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...