【发布时间】:2015-12-20 05:18:08
【问题描述】:
给定下面的多索引多列数据框,我想将 LinearRegression 应用于此数据框的每个块,例如“索引(X,1),A 列”。并将预测的数据帧计算为 df_result。
A B
X 1 1997-01-31 -0.061332 0.630682
1997-02-28 -2.671818 0.377036
1997-03-31 0.861159 0.303689
...
1998-01-31 0.535192 -0.076420
...
1998-12-31 1.430995 -0.763758
Y 1 1997-01-31 -0.061332 0.630682
1997-02-28 -2.671818 0.377036
1997-03-31 0.861159 0.303689
...
1998-01-31 0.535192 -0.076420
...
1998-12-31 1.430995 -0.763758
这是我尝试过的:
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
N = 24
dates = pd.date_range('19970101', periods=N, freq='M')
df=pd.DataFrame(np.random.randn(len(dates),2),index=dates,columns=list('AB'))
df2=pd.concat([df,df],keys=[('X','1'),('Y','1')])
regr = LinearRegression()
# df_result will be reassined, copy the index and metadata from df2
df_result=df2.copy()
# I know the double loop below is not a clever idea. What is the right way?
for row in df2.index.to_series().unique():
for col in df2.columns:
#df2 can contain missing values
lenX=np.count_nonzero(df2.ix[row[:1],col].notnull().values.ravel())
X=np.array(range(lenX)).reshape(lenX,1)
y=df2.ix[row[:1],col]
y=y[y.notnull()]
# train the model
regr.fit(X,y)
df_result.ix[row[:1],col][:lenX] = regr.predict(X)
问题是上面的双循环使得计算速度很慢,100kb的数据集要十多分钟。这样做的pythonic方法是什么?
编辑:
上面代码最后一行的第二个问题是我正在使用数据帧切片的副本。 “df_result”的某些列未通过此操作更新。
EDIT2:
原始数据的某些列可能包含缺失值,我们不能直接对它们应用回归。例如,
df2.ix[('X','1','1997-12-31')]['A']=np.nan
df2.ix[('Y','1','1998-12-31')]['A']=np.nan
【问题讨论】:
-
所以你想在 0 级执行线性回归对吗?所以 X 的所有行或第 1 级的所有行,所以该级别的每个组?
-
@EdChum 我想在每一列的级别 (0,1) 上执行 LR,日期范围始终是从 1997-01-31 到 1998-12-31。
标签: python numpy pandas scikit-learn linear-regression