我使用的是 Pandas 0.8.1,目前无法更改版本。如果较新的版本将有助于解决以下问题,请在评论而不是答案中注明。此外,这是针对研究复制项目的,因此即使在仅添加一个新数据点后重新运行回归可能很愚蠢(如果数据集很大),我仍然必须这样做。谢谢!
在 Pandas 中,有一个参数rolling
选项,但似乎暗示这需要选择窗口大小或使用整个数据样本作为默认值。我希望以累积的方式使用所有数据。window_type
pandas.ols
我正在尝试对pandas.DataFrame
按日期排序的 a 进行回归。对于每个索引i
,我想使用从最小日期到 index 日期的可用数据进行回归i
。所以窗口在每次迭代时有效地增长一个,所有数据都是从最早的观察中累积使用的,并且没有数据从窗口中丢弃。
我编写了一个函数(如下)apply
来执行此操作,但速度慢得令人无法接受。相反,有没有办法pandas.ols
直接执行这种累积回归?
以下是关于我的数据的更多细节。我有一个pandas.DataFrame
包含标识符列、日期列、左侧值列和右侧值列。我想使用groupby
基于标识符进行分组,然后对由左侧和右侧变量组成的每个时间段执行累积回归。
这是我可以apply
在标识符分组对象上使用的函数:
def cumulative_ols(
data_frame,
lhs_column,
rhs_column,
date_column,
min_obs=60
):
beta_dict = {}
for dt in data_frame[date_column].unique():
cur_df = data_frame[data_frame[date_column] <= dt]
obs_count = cur_df[lhs_column].notnull().sum()
if min_obs <= obs_count:
beta = pandas.ols(
y=cur_df[lhs_column],
x=cur_df[rhs_column],
).beta.ix['x']
###
else:
beta = np.NaN
###
beta_dict[dt] = beta
###
beta_df = pandas.DataFrame(pandas.Series(beta_dict, name="FactorBeta"))
beta_df.index.name = date_column
return beta_df