最近在用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.
빈 상태에서 작업하는 것이 가장 좋습니다. df에 새 값을 모두 쓴 다음
을 병합하지만 때로는 직접 추가하는 것이 불가피할 때도 있습니다
2. 삭제하는 것이 더 빠릅니다
del 문을 직접 사용
3. 원래 값을 포함하는 병합 아이디어를 사용하여
도 변경
할당이 느리다고 생각하지 않습니다
self.user_params.loc[user,'bias']는 첫 번째 수준 인덱스에서 두 번째 수준 인덱스를 가져오는 것과 동일하며 이는 매우 느립니다
항목과 사용자를 넣을 수 있나요? 두 개의 데이터 프레임으로 나누는 것은 어떻습니까?
loc이 가장 느립니다. 대신 ix를 사용해 보세요. 루프를 구성하려면 iterrow를 사용하는 것이 가장 좋습니다.