У меня есть DataFrame df1
:биннинговых данных в равных размерах коробки и применить МНК для каждого бина
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm
df1 = pd.DataFrame(np.random.randn(3000,1), index= pd.date_range('1/1/1990', periods=3000), columns = {"M"})
Я хотел бы группировать элементы в размере коробки = 10, установите их с помощью МНК и вычислить Y_t
, где Y_t
обозначает ряд прямых линий.
Другими словами, я хотел бы взять первые 10 значений, поместив их с помощью OLS (Y_t = b * X_t + a_0) и получить значения Y_t
для этих 10 значений. Снова сделайте то же самое для следующих 10 значений (не катящееся окно!) И т. Д. И т. Д.
Мой подход
Первый вопрос, который я столкнулся в том, что я не мог соответствовать элементы, используя DateTime
значения в качестве предикторов, поэтому я определил новый DataFrame df_fit
, который содержит две колонки A
и B
. Колонка A
содержит целые числа от 0 до 9, и столбец B
значения df1
в группах из 10 элементов:
def compute_yt(df,i,bs):
df_fit = pd.DataFrame({"B": np.arange(1,bs+1),\
"A": df.reset_index().loc[i*bs:((i+1)*bs-1), "M"]})
fit = sm.ols(formula = "A ~ B", data = df_fit).fit()
yt = fit.params.B*df_fit["B"] + fit.params.Intercept
return yt
Где bs
является размер коробки (10 в этом примере), i
представляет собой индекс, который позволяет подметать по всем значениям.
Наконец,
result = [compute_yt(df1,n,l) for n in np.arange(0,round(len(df1)/l)-1)]
result =
Name: B, dtype: float64, 840 -0.249590
841 -0.249935
842 -0.250280
843 -0.250625
844 -0.250970
845 -0.251315
846 -0.251660
847 -0.252005
848 -0.252350
849 -0.252695
Name: B, dtype: float64, 850 -0.252631
851 -0.252408
... ...
Где result
это список, который должен содержать значения для прямой линии подходит.
Итак, мои вопросы заключаются в следующем:
Есть ли способ запустить МНК, используя значения DateTime в качестве предсказателей?
Я хотел бы использовать представление списка для построения DataFrame (с той же формой, что и
df1
), содержащей значенияy_t
. Это относится к вопросу (1) в том смысле, что я хотел бы получить временные ряды для этих значений.Есть ли более «питонический» способ написать этот код? То, как я нарезал DataFrame, кажется, не слишком подходит.
на сегодняшний день вещи, очевидные варианты будут просто преобразовать в целое число 'astype (np.int64)' или использовать DT аксессор (например, 'dt.year') или комбинацию дт аксессорах. – JohnE
Я не знаю, если это больше, чем питона, чем то, что вы сделали, но вы можете использовать 'pd.cut' или' pd.qcut' для binning. – JohnE