我使用Pandas 0.8.1,目前我无法更改版本。如果较新的版本能够帮助解决以下问题,请在评论中注明而不是回答。此外,这是针对研究复制项目的,因此即使在追加一个新数据点后重新运行回归可能很愚蠢(如果数据集较大),我仍然必须这样做。谢谢!累计OLS与Python Pandas
在熊猫,没有为window_type
参数pandas.ols
一个rolling
选项,但似乎暗示,这需要一个窗口大小或使用整个数据样本为默认的一些选择。我正在寻求以累积方式使用所有数据。
我想在日期排序的pandas.DataFrame
上运行回归。对于每个指数i
,我想使用可用数据从最低日期到指数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
你有看过'pd.expanding_apply()'吗? – Zelazny7 2013-02-26 19:03:10
这似乎是在一个新的版本,但我一定会看看。谢谢! – ely 2013-02-26 19:59:56
@EMS如果无法升级,expanding_apply实际上只是语法糖。如果您指定rolling_apply,并且窗口大小为整个集合的长度并且min_periods等于1,那么您将获得相同的展开窗口行为 – 2013-02-27 00:23:27