Понимание сообщения об ошибке:
ValueError: матрицы endog и exog имеют разные размеры
Хорошо, неплохо.Эндогенная матрица и экзогенная матрица имеют разные размеры.И модуль предоставляет эту страницу , которая сообщает, что эндогенные факторы внутри системы и экзогенные факторы вне ее .
Некоторая отладка
Проверьте, какие формы мы получаем для наших массивов.Для этого нам нужно разобрать этот единственный вкладыш и вывести .shape
аргументов или, возможно, вывести первую горстку каждого из них.Также закомментируйте строку с ошибкой.Итак, мы обнаруживаем, что получаем:
chunk [490]
factor [1000 4]
chunk [510]
factor [1000 4]
О!Вот оно.Мы ожидали, что фактор также будет разбит на части.Это должно быть [490 4] в первый раз и [510 4] во второй раз.Примечание: поскольку категории назначаются случайным образом, они будут отличаться каждый раз.
Так что в основном у нас слишком много информации в этой функции.Мы можем использовать блок, чтобы увидеть, какие факторы выбрать, отфильтровать факторы, чтобы они были именно такими, и тогда все будет работать.
Просмотр определений функций в документах:
class statsmodels.regression.linear_model.OLS(endog, exog=None, missing='none', hasconst=None, **kwargs)
Мыпросто передают два аргумента, а остальные являются необязательными.Давайте посмотрим на два, которые мы проходим.
endog (как массив) - 1-я эндогенная переменная ответа.Зависимая переменная.
exog (в виде массива) - массив nobs xk, где nobs - количество наблюдений, а k - количество регрессоров ...
Ah, endog
и exog
снова.endog
является 1-мерным массивом.Пока все хорошо, форма 490
работает.exog
nobs? О, это число наблюдений.Таким образом, это двумерный массив, и в этом случае нам нужна форма 490
на 4
.
Эта конкретная проблема:
beta_exposure
должна быть:
def beta_exposure(chunk, factors=None):
factors = factors.loc[factors.index.isin(chunk.index)]
return sm.OLS(np.asarray(chunk), np.asarray(factors)).fit().params
Проблема в том, что вы применяете beta_exposures к каждой части списка (она рандомизирована, поэтому, скажем, 490 элементов для Financial
и 510 для Tech
), но factors=factors1
всегда дает вам 1000 значений (groupby
код не касается этого).
См. http://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html и http://www.statsmodels.org/dev/endog_exog.html для ссылок, которые я использовал, исследуя это.