我尝试按日期对数据帧组的结果进行线性回归,并将结果聚合到另一个数据帧上。到目前为止我使用的是中间系列:
数据框类似于
marker date variable identifier value
EA 2007-01-01 0.33 55 123
EA 2007-01-01 0.73 56 1123
EA 2007-01-01 0.51 57 123
EA 2007-02-01 0.13 55 4446
EA 2007-02-01 0.23 57 667
EA 2007-03-01 0.82 55 5675
EA 2007-03-01 0.88 56 1
EB 2007-01-01 0.13 45 123
EB 2007-01-01 0.74 46 33234
EB 2007-01-01 0.56 47 111
EB 2007-02-01 0.93 45 42657
EB 2007-02-01 0.23 47 12321355
EB 2007-03-01 0.82 45 9897
EB 2007-03-01 0.38 46 786
EB 2007-03-01 0.19 47 993845
代码段:
import statsmodels as sm
import pandas as pd
reg_results = pd.Series(name='reg_results')
mean_results = pd.Series(name='mean_results')
for date, group in df.groupby(df.index.date):
formula = sm.formula.ols('value ~ variable', data=group).fit()
reg_results.set_value(date.strftime("%Y-%m-%d"), formula.params['Intercept'] + formula.params['variable']*group['variable'])
mean_results.set_value(date.strftime("%Y-%m-%d"), group.mean()['variable'])
final_df = pd.DataFrame()
final_df = pd.concat([reg_results, mean_results], axis=1)
还有其他操作,例如组中的第二个groupby等,所以我可以为每个要创建的操作创建一个系列,这非常复杂。有没有办法一步到位,或者至少没有中间序列?
答案 0 :(得分:1)
除了
之外,你的代码看起来还不错我建议您使用groupby
/ apply
返回Series
(请参阅Returning Multiple Values From Apply)。
concat
似乎在错误的轴上
这类似于您的代码(我刚刚登录的计算机没有安装statsmodels
)
res = df.groupby(df.date).apply(lambda g: pd.Series({'mean': g.variable.mean(), 'min': g.variable.min()}))
(请注意,在此示例中,df.date
,您有点不同。)
这就像你的OLS一样,每个群体都要做一些事情,以及多个回归值。在您的情况下,您将使用一个函数来获取一个组并返回一系列OLS结果。
现在我们已经拥有了它,它只是
pd.concat([df, res], axis=1)
请注意axis=1
- it means to concat horizontally,我相信这就是您的意思。