我有一个从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的数量,除非我可以在多处理器模式下运行代码或其他什么。
答案 0 :(得分:0)
我想出了问题所在。我在一个带有新anaconda python安装的linux机器上运行脚本,它没有错误,因此升级了许多软件包,问题就消失了。
出于信息目的,ipython在使用WinPython-64bit-3.3.3.3时被挂起,在升级它工作的包之后(不确定哪一个升级了很多)。最后我安装了WinPython-64bit-3.3.5.0,问题也不存在。