使用pandas,使用group进行线性拟合需要太长时间

时间:2014-04-28 01:08:29

标签: python pandas scikit-learn

我有一个从csv文件导入的pandas数据帧。我需要使用用户在&#39 ;;'中定义的两个或更多列进行线性拟合。 string,其中一个dataframe列定义分组。代码很简单:

    from pandas import DataFrame
    from sklearn import linear_model

    def fit(data, x_names, y_name, fit_by):
        x_names = x_names.split(sep=';')
        data['_out_'] = data[y_name]  #may need to create equation later
        data.replace([inf, -inf], nan, inplace=True)
        data.dropna(subset=x_names, inplace=True)
        phi = data.groupby(fit_by).apply(lambda x: fit_group_func(x, x_names))
        phi.reset_index(inplace=True)
        phi = phi.pivot(index=fit_by, columns='level_1', values=0)
        phi.reset_index(inplace=True)
        x_names.insert(0, fit_by)
        phi.columns = x_names
        return phi

    def fit_group_func(df, x_names):
        model = linear_model.BayesianRidge()
        return DataFrame(model.fit(df[x_names], df['_out_']).coef_.tolist())

当数据有147830行时,此代码运行良好,我的意思是没有时间投诉。问题发生在1881201行,它真的很慢,2小时后没有任何回复,所以我杀死了这个任务。

我还注意到我的处理器正在按预期使用(15%一个核心),直到我达到fit_group_func时它降到零并且不时变为1%并再次下降。

注意:我更改了代码以便在拟合时具有功能,但没有更好的事情发生。以前读过这行:

        phi = data.groupby(fit_by).apply(lambda x: DataFrame(model.fit(x[x_names], x['_out_']).coef_.tolist())

有人可以帮我弄清楚如何优化此代码并使其更快?我目前正试图在拥有32 GB RAM和8核处理器的Windows PC上运行它。我也可以访问带有20核处理器的96 GB RAM,但我不认为我的问题在于核心或RAM的数量,除非我可以在多处理器模式下运行代码或其他什么。

1 个答案:

答案 0 :(得分:0)

我想出了问题所在。我在一个带有新anaconda python安装的linux机器上运行脚本,它没有错误,因此升级了许多软件包,问题就消失了。

出于信息目的,ipython在使用WinPython-64bit-3.3.3.3时被挂起,在升级它工作的包之后(不确定哪一个升级了很多)。最后我安装了WinPython-64bit-3.3.5.0,问题也不存在。