最近在用pandas做一个机器学习的项目,训练集大概2G。我用的dataFrame来操作数据,对训练集做了一次groupby和mean的操作,速度还挺快的,但把得到的结果赋值给用户参数(也是一个dataframe表)的时候,速度缺特别慢,请问这是什么原因呢?
训练集大概有7000多万行,做groupby和mean操作大概十几分钟也就完成了,但赋值操作缺超级慢,每秒钟大概只能赋值50条左右,差距太大了。其中赋值语句大概是这样操作的:
dataframeA.loc[user,'']=dataframeB.loc[user,'']。两张dataFrame表都很大,都是百万级的,不知道是不是和量级较大有关,但千万级的训练集做groupby也没什么压力啊,而且这个机器学习项目,会经常使用和修改表中的参数,如果都这么慢的话,可能就无法正常使用了,哪位大神有什么好的解释或者建议吗?非常感谢了。部分代码如下,有什么细节没有说清楚的话可以问我,我再详细解释下。
def get_average_rating(self):
self.u = log_train['Result'].mean()
print 'u is ',self.u
i,j = 0,0
user_mean_rate = log_train.groupby('UserId').agg({'Result':np.mean})
item_mean_rate = log_train.groupby('ItemId').agg({'Result':np.mean})
#计算bias
print 'calc bias start'
start_time = time.time()
for user in train_users:
i += 1
if i%2000==0:
print '2000 used time',time.time()-start_time
start_time = time.time()
self.user_params.loc[user,'bias'] = user_mean_rate.loc[user,'Result']-self.u
for item in train_items:
self.item_params.loc[item,'bias'] = item_mean_rate.loc[item,'Result']-self.u
print 'bias total used time',time.time()-start_time
Pandas には、DataFrame の行をループするための df.iterrows() のジェネレーターがあり、これが最も効率的です。
詳細については、ドキュメントを参照してください:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iterrows.html
私はこれほど大きなことをしたことはありませんが、私の経験では、df を 1 つずつ操作しないのが最善です。基本的には遅く、列全体の操作ははるかに高速です。
1.
空の値をすべて df に書き込んでから、
をマージするのが最善ですが、場合によっては直接追加することが避けられない
2. del ステートメントを直接使用します
3. マージアイデアも使用して
を変更し、元の値をカバーします
割り当てが遅いとは思いません
self.user_params.loc[user,'bias'] は、第 1 レベルのインデックスから第 2 レベルのインデックスを取得するのと同じですが、これは非常に遅いはずです
loc が最も遅いです。代わりに ix を使用してみてください。ループを構築するには iterrows を使用するのが最善です。