【python】python multiprocessing多进程处理dataframe,快得飞起~
建模过程中的特征工程工作往往是最耗时的大工程,很多场景下要使用pandas对数据进行加工处理,但pandas对数据的处理不能像Lightgbm训练数据一样自动设置了满线程运算(通过num_threads参数调控),导致其对数据的处理效率非常低下,尤其是在一个多核服务器上处理数据时,如果不做特殊处理,pandas对数据的运算只能使用一个核,是对时间和资源的极大浪费,本篇博客就来分享一下如何使用multiprocessing库充分利用计算资源,提高运行效率。
首先读入数据,指定变量。
import pandas as pd
import numpy as np
df = pd.read_csv('file.csv')
var_list = [x for x in df if x!='overdue_flag']
这里以var_cross函数为例,该函数的功能是对所有变量分箱进行两两组合(比如性别男且年龄30-35岁),找到坏账率明显区别于整体客群(明显高于或低于整体客群坏账率)的组合方式,记录下来,并将这样的组合以独热编码的方式(命中这样一个组合的打标为1,否则打标为0)生成一个新的变量。该函数返回两个dataframe,df_res是所有新生成的独热变量,res记录了哪些变量的哪些分箱进行组合,以及组合后的坏账率。(只为演示如何多线程处理,可以不对这个函数功能进行深究。)
def var_cross(res_col, target = 'overdue_flag', bad_thresh=0.12, good_thresh=0.04, num_rate=0.02, lift_rate=1.2):
res = pd.DataFrame()
df_res = pd.DataFrame()
for group_col in res_col:
group_df = df[list(group_col)+[target]].copy()
for num_col in group_df.select_dtypes(include=[np.number]):
if group_df[num_col].value_counts().shape[0]>=10:
group_df[num_col] = pd.qcut(group_df[num_col],10,duplicates='drop').astype(str)
tmp = group_df.groupby(list(group_col) if isinstance(group_col,tuple) else group_col)[target].agg({
'count','mean'})
for item in tmp.iterrows():
if (item[1]['count']>df.shape[0]*num_rate)&((item[1]['mean']>bad_thresh)|(item[1]['mean']<good_thresh)):
br1 = df.loc[df[group_col[0]]==item